最近在使用Bluetooth+LE+for+iOS+and+Android+v2.3这个插件开发基于安卓设备的蓝牙模块。
蓝牙模块大概分成七步:
1.建立中心角色2.扫描外设(discover)
3.连接外设(connect)
4.扫描外设中的服务和特征(discover)
4.1 获取外设的services
4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值5.与外设做数据交互(explore and interact)
6.订阅Characteristic的通知
7.断开连接(disconnect)
权限
安卓设备的软件开发首先要配置权限,找到AndroidManifest.xml文件。
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
申请蓝牙权限,安卓6.0以后可能需要特殊处理。
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
初始化蓝牙
/// <summary> /// 初始化蓝牙 /// </summary> public void InitBluetooth() { BluetoothLEHardwareInterface.Initialize(true, false, delegate { Show("蓝牙初始化成功!"); Invoke("ScanBluetooth", 0.1f); }, delegate (string errorInfo) { Show("蓝牙初始化失败!"); }); }
我们通常把app设置为centeral端,第一个参数表示是否把app设置为centeral端,第二个参数表示是否设置为peripheral端。
搜索蓝牙设备
蓝牙初始化成功后,开始搜索蓝牙设备,第一个参数表示是否根据UUID来搜索制定的蓝牙设备,null表示搜索所有蓝牙设备。
/// <summary> /// 搜索蓝牙设备 /// </summary> public void ScanBluetooth() { Show("开始搜索蓝牙设备..."); BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) => { Show("已搜索到蓝牙设备"); AddPeripheral(name, address); }, (address, name, rssi, advertisingInfo) => { Show("新信息"); if (advertisingInfo != null) BluetoothLEHardwareInterface.Log(string.Format("Device: {0} RSSI: {1} Data Length: {2} Bytes: {3}", name, rssi, advertisingInfo.Length, BytesToString(advertisingInfo))); //log address name rssi advertisingInfo }); }
检查蓝牙合法性
搜索到蓝牙设备后,我们需要检查一下是不是我们想要连接的蓝牙设备
/// <summary> /// 检查蓝牙合法性 /// </summary> void AddPeripheral(string name, string address) { bleName = name.ToString(); bleAddress = address.ToString(); if (bleName == "Thingy") { Show("遥控器已上线"); ConnectBluetooth(); } else { Show("错误的设备,重新搜索"); ScanBluetooth(); } }
连接到蓝牙设备
确定是我们要连接的设备后,开始连接
/// <summary> /// 连接到蓝牙 /// </summary> public void ConnectBluetooth() { Show("开始连接到蓝牙:"); BluetoothLEHardwareInterface.ConnectToPeripheral(bleAddress, (address) => { Show("蓝牙连接成功!"); SubscribeBluetoothMsg(); },(address, serviceUUID) => { },(address, serviceUUID, characteristicUUID) => { }, delegate { }); }
第一个回调函数只会在第一次连接到设备后被调用,在收到广告数据的情况下第二个回调会被调用。
输出信息 方便观察
把信息加上时间头,输出到UI上,方便我们观察进度。
public Text debug; /// <summary> /// 将信息输出到UI上 方便观察 /// </summary> /// <param name="str">输出的值 不需要加换行符</param> void Show(string str) { debug.text += (DateTime.Now.ToString("hh:mm:ss") + ":\t" + str + "\n"); }