1、获取蓝牙mac地址
因为安卓不能得到uuid,所以,在要同步的时候要将uuid转换成mac地址,下面是转换方法
[peripheral discoverServices:@[[CBUUID UUIDWithString:@"xxxx"]]]; [service discoverCharacteristics:@[[CBUUID UUIDWithString:@"xxxx"]]]; [peripheral readValueForCharacteristic:characteristic] NSString *value = [NSString stringWithFormat:@"%@",characteristic.value]; NSMutableString *valueMuStr = [[NSMutableString alloc] init];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(16, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(14, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(12, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(5, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(3, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(1, 2)] uppercaseString]];
最后得到这么一串东西 00:C0:4B:3A:12:AB ,这里只是给出转换的方法,并没有做优化。
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(16, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(14, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(12, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(5, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(3, 2)] uppercaseString]];
[valueMuStr appendString:@":"];
[valueMuStr appendString:[[value substringWithRange:NSMakeRange(1, 2)] uppercaseString]];
最后得到这么一串东西 00:C0:4B:3A:12:AB ,这里只是给出转换的方法,并没有做优化。
2、关于假连接
假连接,是系统蓝牙显示连接上了设备,可是不能进行通讯。
假连接的原因,是因为连接上了peripheral,可是在调用 [peripheral discoverServices:nil];这个方法的时候,没有能发现服务。也就是说获取不到读、写等的特征值 (characteristics),所以不能进行通讯。
由于在这种状态下,不会有任何地方有通知回调的来知道读取不到服务列表,所以,我比较笨的方法是,在里面做一个超时的处理,如果发现没有读取到服务列表,重新断开,然后再进行连接。
还有一种原因就是,在重连的时候出现假连接,有可能是没有清空缓存。这里所说的缓存是数组的缓存和蓝牙连接的缓存。数组的缓存就直接在重连时清空就好。系统的缓存。
CBUUID *uuid = [CBUUID UUIDWithString:BTDevInfo_ServiceUUID];
NSArray *arr =[_centralManager retrieveConnectedPeripheralsWithServices:@[uuid]];
if (arr.count) {
for (CBPeripheral *peripheral in arr) {
[_centralManager cancelPeripheralConnection:peripheral];
}
}
苹果官方文档也有说明,即使是调用断开连接,也有可能会不能完成。导致没有能断开连接。所以,有可能是,调用了,系统还是会显示已连接的状态。
3、蓝牙断开连接系统提示
连接上蓝牙之后,在关闭系统蓝牙或者离开蓝牙区域,而app在后台运行的时候,会接收到一条蓝牙断开的消息推送。
这里是带参连接peripheral,这个参数是number类型。想要去掉这个蓝牙提示,在调用连接的时候将这个设为NO就好。
[self.centralManager connectPeripheral:pheral
options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
4、其他的基本的蓝牙连接之类的问题,网上已经很多了,就不去掺和了。如果哪里说的不对,希望指正。