iOS 藍(lán)牙連接獲取MAC地址的方法

? ??? ??? ??? ??? ??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];}

原文連接:http://www.itdecent.cn/p/0ccfd53fc559

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容