单次发送的数据过大,蓝牙模块内部接收缓冲区只有20个字节
BLE_SEND_MAX_LEN是蓝牙单次可处理最大字节长度
//分包发送蓝牙数据
-(void)sendMsgWithSubPackage:(NSData*)msgData
Peripheral:(CBPeripheral*)peripheral
Characteristic:(CBCharacteristic*)character
{
for (int i = 0; i < [msgData length]; i += BLE_SEND_MAX_LEN) {
// 预加 最大包长度,如果依然小于总数据长度,可以取最大包数据大小
if ((i + BLE_SEND_MAX_LEN) < [msgData length]) {
NSString *rangeStr = [NSString stringWithFormat:@"%i,%i", i, BLE_SEND_MAX_LEN];
NSData *subData = [msgData subdataWithRange:NSRangeFromString(rangeStr)];
NSLog(@"%@",subData);
[self writeCharacteristic:peripheral
characteristic:character
value:subData];
//根据接收模块的处理能力做相应延时
usleep(20 * 1000);
}
else {
NSString *rangeStr = [NSString stringWithFormat:@"%i,%i", i, (int)([msgData length] - i)];
NSData *subData = [msgData subdataWithRange:NSRangeFromString(rangeStr)];
[self writeCharacteristic:peripheral
characteristic:character
value:subData];
usleep(20 * 1000);
}
}
}
网友评论
characteristic:character
value:subData]; 这个是哪个方法??
而且iOS本身就是有流控的,连续多少次writeValue都没有关系,BTServer进程会接管并暂存缓冲数据做RF流控,虽然不清楚其缓冲区具体能做多大的流控,但我至今还没遇到过BTServer的缓冲区溢出造成writeValue被丢弃的情况。
如果仅仅是顾虑外设的应用层对数据的处理速度不足以支撑RF层接收数据的速度,从而造成HCI缓冲区溢出丢包,那何不实测外设的应用层处理速度然后增加射频的连接间隔以达到负载均衡的目的,这岂不是比手机应用层在sleep,而蓝牙射频持续发空包保持连接要合理的多?
如果数据是完整单元(就是说有确定的开始和结束边界,比如一个zip压缩包或者一个txt文件),那么即使writeValue的数据量大于20字节也是没必要手动分包的。
CoreBlueTooth会自动根据writeValue中的NSData字节长度与ATT_MTU-3来做比较,超过MTU的话会在L2CAP层采用writeLongValue协议发送,即在数据报文的报头中通过标记逻辑链路标识符10(开始包)和01(延续包)的方式来发送。
而在外设中通过prepareWrite Event来进行延续包的缓存直到发现下一个开始包(包括空的开始包在内)为止,触发executeWrite Event来结束这个长数据包的接收。
也就是说外设应用层根据事件类型就可以区分多次传输组成整包的开始和结束,并在结束后进行一次性处理执行,没有必要给业务数据增加额外的边界标示并手动分包。
当然这样的话需要嵌入式工程师配合调整固件程序以支持writeLongValue,但我觉得这个方式比校验额外添加的边界再手工组包要简单和直白的多。
从性能来说 可以通过修改波特率等方法来用好每一秒射频连接
但是对用户来说 本就是几十字节的内容 多次失败和多几秒的等待
哪个体验更好呢
2017-07-05 17:17:44.149 BabyBluetoothAppDemo[469:96293] subData=<00007461 696c756f 7761>
2017-07-05 17:17:44.149 BabyBluetoothAppDemo[469:96293] 发送msg =
2017-07-05 17:17:44.171 BabyBluetoothAppDemo[469:96293] 70
2017-07-05 17:17:44.171 BabyBluetoothAppDemo[469:96293] subData=<6e675459 45520000 0005>
2017-07-05 17:17:44.172 BabyBluetoothAppDemo[469:96293] 发送msg = ngTYER
2017-07-05 17:17:44.193 BabyBluetoothAppDemo[469:96293] 80
2017-07-05 17:17:44.194 BabyBluetoothAppDemo[469:96293] subData=<00000032 30313254 5045>
2017-07-05 17:17:44.194 BabyBluetoothAppDemo[469:96293] 发送msg =
2017-07-05 17:17:44.216 BabyBluetoothAppDemo[469:96293] 90
2017-07-05 17:17:44.217 BabyBluetoothAppDemo[469:96293] subData=<31000000 0b000000 7461>
2017-07-05 17:17:44.217 BabyBluetoothAppDemo[469:96293] 发送msg = 1
2017-07-05 17:17:44.239 BabyBluetoothAppDemo[469:96293] 100
2017-07-05 17:17:44.240 BabyBluetoothAppDemo[469:96293] subData=<696c756f 77616e67 0000>
2017-07-05 17:17:44.240 BabyBluetoothAppDemo[469:96293] 发送msg = iluowang
2017-07-05 17:17:44.262 BabyBluetoothAppDemo[469:96293] 110
2017-07-05 17:17:44.262 BabyBluetoothAppDemo[469:96293] subData=<00000000 00000000 0000>
2017-07-05 17:17:44.262 BabyBluetoothAppDemo[469:96293] 发送msg =
这中间msg= 后面没有数据,打印subData 也都是0 这种情况怎么处理,我现在是用两个手机,一个中心,一个外设,传输一段MP3的听力文件