蓝牙开发注意:
1.蓝牙分包发送 (超过20个字节需要进行分包)
参考:http://www.jianshu.com/p/5f1e92adfaa0 http://www.jianshu.com/p/29bd630077b4
2.分包接收(需要与外设进行字节协议处理)
思路:收到的数据流第一个字节作为标志位,01表示开始,10表示继续,00表示结束
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
NSData *data = characteristic.value;//接收到的二进制数据流
if (data.length == 0) {//如果没有数据则忽视
return;
}
NSData *subData = [data subdataWithRange:NSMakeRange(0, 1)];//标志位:0x01表示开始 0x10表示继续 0x00表示结束
NSData *reallyData = [data subdataWithRange:NSMakeRange(1, data.length - 1)];//真正的数据流
//转换为标志位的第一个字节
Byte *flagByte = (Byte *)[subData bytes];
UInt16 flag = flagByte[0];
//分包接收
if (flag == START_BYTE) {//0x01代表开始
_receiveData = [NSMutableData data];
[_receiveData appendData:reallyData];
}else if(flag == CONTINUE_BYTE){//0x10代表继续
[_receiveData appendData:reallyData];
}else if(flag == END_BYTE){//0x00代表结束
[_receiveData appendData:reallyData];
[[self delegate] bleDidReceiveData:_receiveData length:(int)characteristic.value.length];//代理回调
}
}
3.不中断扫描周边指定的服务,达到的效果有,只搜索约定好的外设类型,如某一公司的蓝牙设备
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
//针对指定的服务特征值进行搜索
[self.CM scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:SERVICE_UUID]] options:options];
4.如果要达到靠近设备即连接,需要根据RSSI值计算手机与蓝牙设备的距离
https://jingyan.baidu.com/article/2d5afd69c926b185a2e28e1f.html (此处公式比较靠谱)