? ??? ??? ??? ??? ??iOS 藍(lán)牙連接獲取MAC地址的方法
iOS自從7以后就無法從API直接獲取設(shè)備的MAC地址,只能用UUID來標(biāo)識(shí)設(shè)備,要注意的是同一個(gè)設(shè)備在不同手機(jī)上顯示的UUID不相同
解決辦法
1:把它加到藍(lán)牙的廣播包里,但是這樣的話對(duì)硬件來說負(fù)擔(dān)很大 而且芯片會(huì)不穩(wěn)定
2:有的設(shè)備可以通過 “180A”這個(gè)服務(wù)來發(fā)現(xiàn)特征,再來讀取 “2A23”這個(gè)特征值,可以獲得Mac地址(如果你的藍(lán)牙設(shè)備不支持這樣獲取,你可以跟硬件工程師溝通,來獲得Mac地址,添加一個(gè)獲取地址命令或者增加一個(gè)含地址的特征值都可以很容易的獲取)
這里著重介紹方法二:
1:藍(lán)牙連接的流程
a.建立中心設(shè)備管理者
b.掃描外設(shè)
c.連接外設(shè)
d.掃描外設(shè)中的服務(wù)
e.掃描外設(shè)中的特征
f.訂閱或讀取特征值
g.獲取外設(shè)中的數(shù)據(jù)
a:建立中心設(shè)備管理者
// 創(chuàng)建之后會(huì)馬上檢查藍(lán)牙的狀態(tài),nil默認(rèn)為主線程
self.centralManager = [[CBCentralManager alloc] initWithDelegate:selfqueue:nil]
b:掃描外設(shè)
// 藍(lán)牙狀態(tài)發(fā)生改變,這個(gè)方法一定要實(shí)現(xiàn)
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
// 藍(lán)牙狀態(tài)可用
if (central.state == CBCentralManagerStatePoweredOn) {
// 如果藍(lán)牙支持后臺(tái)模式,一定要指定服務(wù),否則在后臺(tái)斷開連接不上,如果不支持,可設(shè)為nil, option里的CBCentralManagerScanOptionAllowDuplicatesKey默認(rèn)為NO, 如果設(shè)置為YES,允許搜索到重名,會(huì)很耗電
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil]; }}
c.連接外設(shè)
/**
* 發(fā)現(xiàn)設(shè)備
* @param peripheral 設(shè)備
* @param advertisementData 廣播內(nèi)容
* @param RSSI 信號(hào)強(qiáng)度
*/- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber*)RSSI{
// 判斷是否是你需要連接的設(shè)備
if([peripheral.name isEqualToString:kPeripheralName]) {? ? ? ?
peripheral.delegate =self;
// 一定要記得把外設(shè)保存起來
self.selectedPeripheral = peripheral;
// 開始連接設(shè)備
[self.centralManager connectPeripheral:self.selectedPeripheral options:nil];? ? }}
d.掃描外設(shè)中的服務(wù)
/**
* 已經(jīng)連接上設(shè)備
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
// 停止掃描
[self.centralManager stopScan];
// 發(fā)現(xiàn)服務(wù)
[self.selectedPeripheral discoverServices:nil];
}
e.掃描外設(shè)中的特征
/**
* 已經(jīng)發(fā)現(xiàn)服務(wù)
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError*)error{for(CBService *serviceinperipheral.services) {
if([service.UUID isEqual:[CBUUID UUIDWithString:kServiceUUID]]) {
// 根據(jù)你要的那個(gè)服務(wù)去發(fā)現(xiàn)特性
[self.selectedPeripheral discoverCharacteristics:nilforService:service];? ? ? ?
}
// 這里我是根據(jù) 180A 用來獲取Mac地址,沒什么實(shí)際作用,可刪掉
if([service.UUID isEqual:[CBUUID UUIDWithString:@"180A"]]) {? ? ? ? ? ? [self.selectedPeripheral discoverCharacteristics:nilforService:service];? ?
? ? }? ?
}}
f.訂閱或讀取特征值
/**
* 已經(jīng)發(fā)現(xiàn)特性
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError*)error{
for(CBCharacteristic *characteristicinservice.characteristics) {
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]) {
// 這里是讀取Mac地址, 可不要, 數(shù)據(jù)固定, 用readValueForCharacteristic, 不用setNotifyValue:setNotifyValue
[self.selectedPeripheral readValueForCharacteristic:characteristic];? ? ? ?
}
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:kCharacteristicUUID]]) {
// 訂閱特性,當(dāng)數(shù)據(jù)頻繁改變時(shí),一般用它, 不用readValueForCharacteristic
[peripheral setNotifyValue:YESforCharacteristic:characteristic];
}
g.獲取外設(shè)中的數(shù)據(jù)
/**
* 數(shù)據(jù)更新的回調(diào)
*/
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError*)error{
//獲取mac地址
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]){ NSString*value = [NSString stringWithFormat:@"%@",characteristic.value]; NSMutableString*macString = [[NSMutableString alloc]init];
[macString appendString:[[value substringWithRange:NSMakeRange(16,2)]uppercaseString]];
[macString appendString:@":"];
[macString appendString:[[value substringWithRange:NSMakeRange(14,2)]uppercaseString]];
[macString appendString:@":"];
[macString appendString:[[value substringWithRange:NSMakeRange(12,2)]uppercaseString]];
[macString appendString:@":"];
[macString appendString:[[value substringWithRange:NSMakeRange(5,2)]uppercaseString]];
[macString appendString:@":"];
[macString appendString:[[value substringWithRange:NSMakeRange(3,2)]uppercaseString]];
[macString appendString:@":"];
[macString appendString:[[value substringWithRange:NSMakeRange(1,2)]uppercaseString]];
NSLog(@"MAC地址是macString:%@",macString); }
//這里寫其他的BLE接收參數(shù)處理方法
}
設(shè)備連接斷開
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError*)error{
// 讓它自動(dòng)重連
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil];}
這是系統(tǒng)代理方法,如果要主動(dòng)斷開需要調(diào)用
- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;這個(gè)方法
寫入數(shù)據(jù)成功的回調(diào)
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError*)error{
// 讀取數(shù)據(jù)
[self.selectedPeripheral readValueForCharacteristic:characteristic];}