AndroidBoy蓝牙开发一年了,来分享一下低功耗蓝牙ble开发经验
蓝牙的基础入门问题
1.怎么区分经典蓝牙和ble蓝牙?
- 经典蓝牙
功耗比ble蓝牙高
连接了能传输语音的是经典蓝牙,市面上的蓝牙音箱是经典蓝牙
经典蓝牙连接的时候要配对,ble蓝牙则不用配对 - ble蓝牙
功耗很低,电池通常能用很久,(最重要的特性)
需要特定app才能连接的是ble蓝牙,比如各种蓝牙智能产品
Android 4.3版本开始支持ble蓝牙
ble蓝牙传输数据如果不设置mtu,20个byte一个包,所以数据传输比较慢
2.ble蓝牙的主机和从机是什么?
主机可以主动扫描连接蓝牙,一个主机可以连接多个从机
Android手机默认设置是作为主机,但是Android5.1之后有API可以作为从机
从机一般是设备,一个从机只能连一个主机,
3.Android手机可以连接多个ble设备吗?
蓝牙4.0ble的最多可以同时连接7个设备,这是有SIG标准决定的
修改协议栈可以增加到8个,
如果想要连接多个的话,可以升级蓝牙到4.2,具备mesh功能;
Android开发中遇到的奇怪问题
1.Android10 蓝牙权限,定位权限都获取了但是还是搜索不到蓝牙?
Android10 要打开位置信息才能搜索到设备,而且请求的权限是
Manifest.permission.ACCESS_FINE_LOCATION
要做一个判断,判断位置信息是否打开
2.Android手机搜索蓝牙,突然搜索不到?
Android 7.0限制搜索蓝牙30秒7次,再多搜索不到的,所以不要频繁搜索
3.直接用mac地址去连接蓝牙,有时候能连接上,有时候连接不上
能连接上是因为之前已经搜索过了,但是没有搜索到过就连接不上
可以关掉手机蓝牙,然后打开,不要搜索,直接去连,你会发现连不上
可能是Android底层做了什么机制,
4.蓝牙经常连接失败,怎么增加稳定性?
蓝牙设备普遍有这个毛病,连接失败是常有的事,需要做一个连接失败重连,
一般3次重连就能达到很高的成功率
5.代码里面明明断开了蓝牙连接,但是却搜索不到蓝牙设备(偶现)?
测试的Android手机好像都有这个毛病,确实断不开,
尤其是高版本的Android
不懂是Android手机的问题还是设备的问题
最好做一个指令可以让设备主动断开,Android这边发断开指令再断开,双重保险
6.蓝牙数据包没收到,但是设备又发了是什么情况?
这种情况称为丢包
蓝牙如果连续发送数据包,几十个数据包可能就会有几个收不到
解决方法是做重发机制,协议在包里面加上包总数和编号,收不到可以重发
开发蓝牙ble的建议
1.为了可以用mac直连,建议把扫描的mac地址缓存到内存里面,下次可以判断直连
2.连接蓝牙要做超时处理
3.发送数据失败要做判断,重发或者提示
4.发送数据成功要做超时处理,否则接收不到数据就会卡住
5.蓝牙协议包最好不要超20字节,否则分包挺麻烦的,后续处理也麻烦
我的框架
针对上面的问题,开发了自己的框架
特点:
1.核心代码不到1000行,全部代码不到10个类,注释齐全
2.针对上面提到的蓝牙mac直接连接,蓝牙搜索不到,连接重试,连接超时发送超时等问题做了处理