记一次Android传统蓝牙建立连接的坑

说明与备忘

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串口的蓝牙设备去连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不死鸟JGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值