iOS中蓝牙与打印机连接使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中蓝牙与打印机连接使用相关的知识,希望对你有一定的参考价值。
参考技术A 公司最近帮一家物流公司做一个员工使用的APP,需要用到蓝牙去连接设备打印运单信息,下面记录一些在对接蓝牙打印时候遇到的问题,也总结一下其他技术文章中的一些知识点供大家参考,网上也有别人做好的第三方BabyBluetooth,这个第三方也可以在我们找的几种设备上正常打印,同学们可以去看看这个怎么使用,有问题的地方希望大家提出来。1、服务(services):蓝牙外设对外广播的时候一定会有一个服务,有些时候也可以是有多个服务,服务下面包含一些特性,服务可以理解成一个模块的窗口;
2、特征(characteristic):特征存在于服务下面的,一个服务下面可以有多个特征,特征可以理解成具体实现功能的窗口,一般的特性都会有value,也就是特征值,是特征和外界交互的最小单位;
3、UUID:蓝牙上的唯一标示符,为了区分不同服务和特征,就用UUID来表示。
1、导入苹果系统蓝牙框架<CoreBluetooth/CoreBluetooth.h>
2、遵循两个蓝牙框架相关的协议<CBCentralManagerDelegate,CBPeripheralDelegate>
3、新建两个实例属性,一个特征属性
@property (nonatomic, strong) CBCentralManager *centralManager; //中心管理者
@property (nonatomic, strong) CBPeripheral *peripheral; //连接到的外设
@property (nonatomic, strong) CBCharacteristic *characteristic; //特征
4、实例化CBCentralManager对象进行蓝牙管理
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; //创建实例进行蓝牙管理
在实例化该对象之后,就会触发下面这个必须实现的代理方法,否则在实例化之后会闪退,在该方法里面也可以获取到蓝牙的状态,可以在此处提示用户去打开蓝牙
客户的需求里面有下次进入该界面自动连接设备的功能,开始做的时候是实例化之后马上开始连接之前的设备,但是总是连接不上。实际上等这个回调函数调用之后就可以连接了,包括去搜索也是一样,如果大家操作相关功能之后没有效果,可能是这个函数还没调用的原因,怎么连接之前的设备一会会讲到。
5.扫描蓝牙设备(根据SERVICE_UUID来扫描外设,如果不设置则扫描所有蓝牙设备)
执行扫描动作之后,如果扫描到外设了,就会自动回调下面的协议方法
6.连接外围设备
连接外围设备,中心管理者连接外设成功,如果连接成功就会回调这个协议方法
/** 连接失败的回调 */
/** 断开连接 */
7、获取外围设备服务和特征
peripheral调用discoverServices方法之后,在下面的回调函数中发现服务
peripheral调用查询对应服务下面的特征之后,会在下面的回调函数中返回
到现在打印所需要的所有内容都获取到了,就可以往打印机发送数据了
8、从外围设备读取数据
凡是从蓝牙传过来的数据都要经过这个回调,简单的说这个方法就是你拿数据的唯一方法,你可以判断是否 从外围设备读数据
9、向蓝牙设备写数据
这里说明怎么连接上一次或者之前连接的设备,可以保存之前设备的标识,进入App之后通过这个标识实例化服务来进行链接;通过这种方式不行的同学可以试试保存这个标识,下次进入的时候后台扫描设备,判断那个设备的标识和存储的一样,连接表示一样的那个...
关于蓝牙打印的知识暂时分享到这里,下面贴出参考的文章
蓝牙的连接和数据的读写
Android开发之蓝牙连接打印机
代码很简单,直接一个布局文件和一个activity。需要的朋友可以直接将这两部分粘贴复制到项目中即可。
Activity部分:
package com.anhua.bluetooth; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; import com.example.imooc_weixinfragment.R; import android.app.Activity; import android.app.ProgressDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class BluetoothActivity extends Activity implements OnClickListener { private ListView unbondDevices = null; private ListView bondDevices = null; private Context context = null; private BluetoothAdapter bluetoothAdapter = BluetoothAdapter .getDefaultAdapter(); private ArrayList<BluetoothDevice> unbondDeviceslist = null; // 用于存放未配对蓝牙设备 private ArrayList<BluetoothDevice> bondDeviceslist = null;// 用于存放已配对蓝牙设备 private ListView unbondDevicesListView = null; private ListView bondDevicesListView = null; private Button searchDevices;// 搜索蓝牙设备Button private TextView deviceName;// 蓝牙设备的名字 private TextView connectState = null;//蓝牙设备连接状态 private String address;// 蓝牙地址 private ImageView returnButton; private boolean isConnection = false; private BluetoothDevice devices = null; private static BluetoothSocket bluetoothSocket = null; private static final UUID uuid = UUID .fromString("00001101-0000-1000-8000-00805F9B34FB"); private static OutputStream outputStream = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.context = this; requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.bluetooth_layout); unbondDeviceslist = new ArrayList<BluetoothDevice>(); bondDeviceslist = new ArrayList<BluetoothDevice>(); this.initIntentFilter(); initView(); init(); } private void init() { deviceName=(TextView) findViewById(R.id.device_name); connectState=(TextView) findViewById(R.id.connect_state); unbondDevices = (ListView) this.findViewById(R.id.unbondDevices); bondDevices = (ListView) this.findViewById(R.id.bondDevices); searchDevices = (Button) this.findViewById(R.id.searchDevices); unbondDevicesListView = (ListView) findViewById(R.id.unbondDevices); bondDevicesListView = (ListView) findViewById(R.id.bondDevices); returnButton = (ImageView) this.findViewById(R.id.return_Bluetooth_btn); this.setSearchDevices(searchDevices); searchDevices.setOnClickListener(this); returnButton.setOnClickListener(this); } public void setSearchDevices(Button searchDevices) { this.searchDevices = searchDevices; } /** * 初始化界面 */ public void initView() { if (this.isOpen()) { System.out.println("蓝牙有开!"); } if (!this.isOpen()) { System.out.println("蓝牙没开!"); this.searchDevices.setEnabled(false); } } @Override protected void onDestroy() { // TODO Auto-generated method stub this.disconnect(); super.onDestroy(); } /** * 添加已绑定蓝牙设备到ListView */ private void addBondDevicesToListView() { ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); int count = this.bondDeviceslist.size(); System.out.println("已绑定设备数量:" + count); for (int i = 0; i < count; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("deviceName", this.bondDeviceslist.get(i).getName()); data.add(map);// 把item项的数据加到data中 } String[] from = { "deviceName" }; int[] to = { R.id.device_name }; SimpleAdapter simpleAdapter = new SimpleAdapter(this.context, data, R.layout.bonddevice_item, from, to); // 把适配器装载到listView中 this.bondDevicesListView.setAdapter(simpleAdapter); this.bondDevicesListView .setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { deviceName.setVisibility(View.VISIBLE); connectState.setVisibility(View.VISIBLE); BluetoothDevice device = bondDeviceslist.get(arg2); address = device.getAddress();// 获取蓝牙地址 devices=bluetoothAdapter.getRemoteDevice(address); deviceName.setText(getDeviceName()); // 一上来就先连接蓝牙设备 boolean flag = connect(); if (flag == false) { // 连接失败 connectState.setText("连接失败!"); } else { // 连接成功 connectState.setText("连接成功!"); } } }); } /** * 添加未绑定蓝牙设备到ListView */ private void addUnbondDevicesToListView() { ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); int count = this.unbondDeviceslist.size(); System.out.println("未绑定设备数量:" + count); for (int i = 0; i < count; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("deviceName", this.unbondDeviceslist.get(i).getName()); data.add(map);// 把item项的数据加到data中 } String[] from = { "deviceName" }; int[] to = { R.id.undevice_name }; SimpleAdapter simpleAdapter = new SimpleAdapter(this.context, data, R.layout.unbonddevice_item, from, to); // 把适配器装载到listView中 unbondDevicesListView.setAdapter(simpleAdapter); // 为每个item绑定监听,用于设备间的配对 unbondDevicesListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { try { Method createBondMethod = BluetoothDevice.class .getMethod("createBond"); createBondMethod.invoke(unbondDeviceslist.get(arg2)); // 将绑定好的设备添加的已绑定list集合 bondDeviceslist.add(unbondDeviceslist.get(arg2)); // 将绑定好的设备从未绑定list集合中移除 unbondDeviceslist.remove(arg2); addBondDevicesToListView(); addUnbondDevicesToListView(); } catch (Exception e) { Toast.makeText(context, "配对失败!", Toast.LENGTH_SHORT).show(); } } }); } private void initIntentFilter() { // 设置广播信息过滤 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // 注册广播接收器,接收并处理搜索结果 context.registerReceiver(receiver, intentFilter); } /** * 打开蓝牙 */ public void openBluetooth(Activity activity) { Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE); activity.startActivityForResult(enableBtIntent, 1); } /** * 关闭蓝牙 */ public void closeBluetooth() { this.bluetoothAdapter.disable(); } /** * 判断蓝牙是否打开 * * @return boolean */ public boolean isOpen() { return this.bluetoothAdapter.isEnabled(); } /** * 搜索蓝牙设备 */ public void searchDevices() { this.bondDeviceslist.clear(); this.unbondDeviceslist.clear(); // 寻找蓝牙设备,android会将查找到的设备以广播形式发出去 this.bluetoothAdapter.startDiscovery(); } /** * 添加未绑定蓝牙设备到list集合 * * @param device */ public void addUnbondDevices(BluetoothDevice device) { System.out.println("未绑定设备名称:" + device.getName()); if (!this.unbondDeviceslist.contains(device)) { this.unbondDeviceslist.add(device); } } /** * 添加已绑定蓝牙设备到list集合 * * @param device */ public void addBandDevices(BluetoothDevice device) { System.out.println("已绑定设备名称:" + device.getName()); if (!this.bondDeviceslist.contains(device)) { this.bondDeviceslist.add(device); } } /** * 蓝牙广播接收器 */ private BroadcastReceiver receiver = new BroadcastReceiver() { ProgressDialog progressDialog = null; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() == BluetoothDevice.BOND_BONDED) { addBandDevices(device); } else { addUnbondDevices(device); } } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { progressDialog = ProgressDialog.show(context, "请稍等...", "搜索蓝牙设备中...", true); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action)) { System.out.println("设备搜索完毕"); progressDialog.dismiss(); addUnbondDevicesToListView(); addBondDevicesToListView(); } } }; /** * 获取设备名称 * * @return String */ public String getDeviceName() { return devices.getName(); } /** * 连接蓝牙设备 */ public boolean connect() { if (!this.isConnection) { try { bluetoothSocket = this.devices .createRfcommSocketToServiceRecord(uuid); bluetoothSocket.connect(); outputStream = bluetoothSocket.getOutputStream(); this.isConnection = true; if (this.bluetoothAdapter.isDiscovering()) { System.out.println("关闭适配器!"); this.bluetoothAdapter.isDiscovering(); } } catch (Exception e) { Toast.makeText(this.context, "连接失败!", 1).show(); return false; } Toast.makeText(this.context, this.devices.getName() + "连接成功!", Toast.LENGTH_SHORT).show(); return true; } else { return true; } } /** * 断开蓝牙设备连接 */ public static void disconnect() { System.out.println("断开蓝牙设备连接"); try { bluetoothSocket.close(); outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.searchDevices: this.searchDevices(); break; case R.id.return_Bluetooth_btn: finish(); break; default: break; } } }
布局文件部分:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/index" tools:context=".BluetoothActivity" > <LinearLayout android:id="@+id/openBluetooth_tb" android:layout_width="match_parent" android:layout_height="44dp" android:background="#24cf5f" android:orientation="horizontal" > <ImageView android:id="@+id/return_Bluetooth_btn" android:layout_width="match_parent" android:layout_height="20dp" android:layout_gravity="center" android:layout_weight="5" android:src="@drawable/back"/> <TextView android:layout_width="fill_parent" android:layout_height="44dp" android:layout_weight="1" android:gravity="center" android:paddingRight="40dp" android:text="@string/titie_activity_conn_blue_list" android:textColor="#FFFFFF" android:textSize="30px" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/openBluetooth_tb" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:visibility="gone" android:id="@+id/device_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="名称" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:visibility="gone" android:id="@+id/connect_state" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="42dp" android:text="状态" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <Button android:id="@+id/searchDevices" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="搜索设备" /> <View android:layout_width="match_parent" android:layout_height="3dp" android:layout_alignParentLeft="true" android:layout_below="@+id/searchDevices" android:background="@android:color/darker_gray" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="150dp" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="未配对设备" /> <ListView android:id="@+id/unbondDevices" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="3dp" android:layout_alignParentLeft="true" android:background="@android:color/darker_gray" /> <LinearLayout android:layout_width="match_parent" android:layout_height="190dp" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="已配对设备" /> <ListView android:id="@+id/bondDevices" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/linearLayout1" > </ListView> </LinearLayout> </LinearLayout> </RelativeLayout>
通过以上两部分就可以实现连接蓝牙打印机的功能。
以上是关于iOS中蓝牙与打印机连接使用的主要内容,如果未能解决你的问题,请参考以下文章