標籤:seq 一個 duplicate uppercase char tis mat uuid read
1.建立中心裝置,並設定代理
一般情況下,手機是中心裝置,藍牙裝置是外圍裝置。
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
1.建立之後,會進入到改變藍芽狀態的代理方法中。
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
```
在這個方法中,可以判斷藍芽的狀態,進行相應的操作。
CBCentralManagerStateUnknown = CBManagerStateUnknown,CBCentralManagerStateResetting = CBManagerStateResetting,CBCentralManagerStateUnsupported = CBManagerStateUnsupported,CBCentralManagerStateUnauthorized = CBManagerStateUnauthorized,CBCentralManagerStatePoweredOff = CBManagerStatePoweredOff,CBCentralManagerStatePoweredOn = CBManagerStatePoweredOn,
2.當藍芽的狀態是開啟的時候,開始掃描外圍裝置。如果藍芽支援後台模式,那麼要指定服務的UUID,否則在後台斷開之後,串連不上藍芽,不支援背景話,就設定成nil。option:CBCentralManagerScanOptionAllowDuplicatesKey 如果為YES,會讓中心裝置不斷的監聽外部裝置的訊息,NO則不能。如果為YES可能會很耗電,根據需求設定就好。
if (central.state == CBCentralManagerStatePoweredOn) { [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil]; }
3.當掃描到外圍裝置的時候,就會進入下面方法。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<<span style="color: #00b1ff">NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;
在這個方法中,我們可以根據不同的條件來篩選我們需要串連的外圍裝置,我這邊是根據名字來篩選的。匹配到你需要的裝置之後,就開始串連這個裝置了。
if ([peripheral.name isEqualToString:kPeripheralName]) { peripheral.delegate = self; self.selectedPeripheral = peripheral; // 開始串連裝置 [self.centralManager connectPeripheral:self.selectedPeripheral options:nil]; }
4.串連成功和失敗都會進入代理方法。
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error ;- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
這裡暫停一下,
如果你附近就一個需要串連的藍芽,那麼直接判斷名字來串連就好了,但是如果像藍芽鎖這種,附近可能名字一樣的藍芽有很多,那麼你怎麼知道你要串連的是哪一個藍芽呢?那麼,在這個時候,就要根據藍芽的mac地址來區分了。因為iOS7之後,蘋果就無法擷取裝置的mac地址,所以現在的藍芽大部分是將藍芽的mac地址寫在藍牙裝置系統的sevrice裡面,一般UUID是180A(Device Information),而特徵的UUID 是2A23(System ID)。根據你需要串連的藍芽的mac地址,來串連。
好了繼續剛才說的,掃描相應的特徵。
for (CBService *service in peripheral.services) { if ([service.UUID isEqual:[CBUUID UUIDWithString:@"180A"]]) { [self.selectedPeripheral discoverCharacteristics:nil forService:service]; } }
5.掃描到特徵之後,進入代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;```在這裡就可以進行讀寫的操作了。讀資料有兩種方式,一種是read,一種是notify。我們可以用LightBlue來看到這個特徵是否是支援notify,一般固定不變的資料都是用read,會有改變的資料用notify。
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]) {
// 這裡是讀取Mac地址,資料固定,用readValueForCharacteristic,不用setNotifyValue:setNotifyValue
[self.selectedPeripheral readValueForCharacteristic:characteristic];
}
}
6.讀取到資料的時候,進入代理方法。
- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;
```
在這雷根據公司定下的資料規則來解析資料就好了。
我這邊把mac地址的解析出來了,當例子來看吧。
NSString *orStr = characteristic.value.description;if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]) { NSMutableString *macString = [[NSMutableString alloc] init]; [macString appendString:[[orStr substringWithRange:NSMakeRange(16, 2)] uppercaseString]]; [macString appendString:@":"]; [macString appendString:[[orStr substringWithRange:NSMakeRange(14, 2)] uppercaseString]]; [macString appendString:@":"]; [macString appendString:[[orStr substringWithRange:NSMakeRange(12, 2)] uppercaseString]]; [macString appendString:@":"]; [macString appendString:[[orStr substringWithRange:NSMakeRange(5, 2)] uppercaseString]]; [macString appendString:@":"]; [macString appendString:[[orStr substringWithRange:NSMakeRange(3, 2)] uppercaseString]]; [macString appendString:@":"]; [macString appendString:[[orStr substringWithRange:NSMakeRange(1, 2)] uppercaseString]];}
7.寫入資料
iOS學習筆記之藍芽(有關藍牙裝置mac地址處理) 2