蓝牙收发数据长度的问题
程序员文章站
2022-06-25 08:10:23
最近公司固件工程师在调试时发现一个问题,蓝牙设备和安卓APP可以正常通讯,但是和iOS APP总是传输数据超时,之后断开连接,应该是程序问题,之前遇到过一次,但是只有那一次,想偷下懒所以就没改,这次又出现了就不得不改了。用xcode运行项目,打开log,在 方法中输出了接收到的数据,发现接收到的数据 ......
最近公司固件工程师在调试时发现一个问题,蓝牙设备和安卓app可以正常通讯,但是和ios app总是传输数据超时,之后断开连接,应该是程序问题,之前遇到过一次,但是只有那一次,想偷下懒所以就没改,这次又出现了就不得不改了。用xcode运行项目,打开log,在
- (void)peripheral:(cbperipheral *)peripheral didupdatevalueforcharacteristic:(cbcharacteristic *)characteristic error:(nserror *)error
方法中输出了接收到的数据,发现接收到的数据总长度时对的,但是分包发送每次接收到的数据长度和其他的设备不一样,而代码里面写的是按照分包的长度来接收的,所以就导致最后拼接的数据不对,那就需要改动了,虽然这部分代码已经用了一年多了,那也没办法,有问题必须得改呀。
根据log看岀接收到的数据格式是这样的:5b24xxxx 5b05xxxx,其中第一字节固定为5b,第二字节为本次发送数据总长度。如果有36字节数据,分3次接收10+10+10+6,然而部分读卡器不是按照这种顺序发的,可能是9+8+9+9+1这样发的,所以就不能根据固定长度来接收数据。
每次接收数据前先清空之前的数据:
self.receivedata = [[nsmutabledata alloc] initwithcapacity:50];
然后接收数据,并拼接到receivedata中:
[_receivedata appenddata:characteristic.value];
每次接收完数据都检查receivedata,看其长度是否等于第一个字节:
if (bytes[1] == 0x24 && _receivedata.length == 0x24 && [bleutil verifyreceiveddata:_receivedata]) {}
如果等于表明本次数据接收完毕,检查数据格式是否正确,如果正确再继续下面的操作。
这样只判断数据总长度就可以了,不用判断分包接收的数据,完美解决上面的问题。
推荐阅读
-
Echarts之悬浮框中的数据排序问题
-
Oracle数据库表名支持的最大长度是多少
-
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
-
SQL Server 数据库调整表中列的顺序操作方法及遇到问题
-
oracle数据库查询没问题,正常显示两个汉字;但是java后台Hibernate查询的时候只显示第一个汉字怎么解决?
-
在使用JSON格式处理数据时应该注意的问题小结
-
用Excel 表格制作彩票走势图完美解决数据的连线问题
-
详解vue2父组件传递props异步数据到子组件的问题
-
解决vue动态为数据添加新属性遇到的问题
-
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题