说明与备忘
1、传统蓝牙指的是那些蓝牙4.0以前,蓝牙4.0及以后也叫低功耗蓝牙;传统蓝牙连接方式是无法和低功耗蓝牙模块建立通信通道的,因为通信的协议是不一样的。低功耗蓝牙是用GATT这种属性传输协议,而传统蓝牙则是通过Socket的方式进行数据的传输。
2、android 4.3(API 18)版本以下的对应的是传统蓝牙;android 4.3以上的是低功耗蓝牙;android 4.3至5.0版本的调用方法和android 5.0以上的调用方法也不一样;android蓝牙权限在6.0以上增加了一个模糊定位的权限,不开启部分手机无法发出扫描蓝牙的广播。
2、使用场景:Android App通过手机蓝牙去连接蓝牙设备,即App为主设备,蓝牙设备为从设备,或者说App为客户端,蓝牙设备为服务端;
2、蓝牙使用步骤:打开蓝牙——搜索设备——设备配对——连接设备——接收发送数据——断开连接关闭蓝牙。
3、在实际开发中,搜索设备和设备配对的步骤建议不放在App的蓝牙控制流程中,因为该步骤不稳定,很有很能搜索不到设备。App中只需要打开蓝牙并从已配对的设备中去连接设备,没有已配对的设备则提醒用户通过手机的蓝牙配对设备。这样个人感觉用户体验更好。
两个坑及解决办法
Android App和传统蓝牙建立Socket连接的两种方式:
1、通过反射调用BluetoothDevice的createRfcommSocket的方法:
BluetoothSocket socket = (BluetoothSocket) dev.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(dev, 1);
该方式的坑在于连接不稳定,成功率较低;
2、通过UUID,代码如下:
String uuidValue = "00001101-0000-1000-8000-00805F9B34FB";
UUID mactekHartModemUuid = UUID.fromString(uuidValue);
BluetoothSocket socket = dev.createRfcommSocketToServiceRecord(mactekHartModemUuid);
该方式的坑在于必须使用Android的SSP(协议栈默认)的UUID:
00001101-0000-1000-8000-00805F9B34FB
才能正常和外部的,也是SSP串口的蓝牙设备去连接。