iOS 蓝牙开发要点纪录

蓝牙开发注意:

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 (此处公式比较靠谱)

你可能感兴趣的:(iOS 蓝牙开发要点纪录)