peripheral模式的流程:
1. 設(shè)置CBPeripheralManagerDelegate的委托,初始化外圍設(shè)備
2. 檢測外設(shè)的藍(lán)牙狀態(tài)
3. 創(chuàng)建服務(wù)(service)和特征(characteristics)
4. 開始廣播 (中心設(shè)備收到廣播后連接外設(shè)卵蛉,并進(jìn)行一系列的請求)
5. 響應(yīng)center的操作
* 讀寫characteristics
* 訂閱和取消訂閱characteristics
實(shí)現(xiàn)步驟:
1. 初始化外設(shè)
self.periperalMgr = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
2. 檢測外設(shè)的藍(lán)牙狀態(tài)后創(chuàng)建服務(wù)(service)和特征(characteristics)
#pragma mark - CBPeripheralManagerDelegate -
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {
/*
CBManagerStateUnknown = 0, // 未知
CBManagerStateResetting, // 重置中
CBManagerStateUnsupported, // 不支持
CBManagerStateUnauthorized, // 未驗證
CBManagerStatePoweredOff, // 關(guān)閉
CBManagerStatePoweredOn, // 開啟
*/
if(peripheral.state == CBManagerStatePoweredOn) {
// 2. 創(chuàng)建服務(wù)(Service)和特征(Characteristics)
[self setup];
}
}
3.創(chuàng)建服務(wù)和特征
// 安裝特征和服務(wù)
- (void)setup {
// 創(chuàng)建服務(wù)的UUID
CBUUID *serviceUUID = [CBUUID UUIDWithString:SERVICE_UUID];
// 創(chuàng)建服務(wù)
CBMutableService *service = [[CBMutableService alloc] initWithType:serviceUUID primary:YES];
// 創(chuàng)建特征的UUID
CBUUID *characteristicUUID = [CBUUID UUIDWithString:CHARACTERISTIC_UUID];
// 注意: value設(shè)置為nil 創(chuàng)建一個可讀寫闽撤,可訂閱的characteristic
CBMutableCharacteristic *characteristic = [[CBMutableCharacteristic alloc] initWithType:characteristicUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable];
// 把特征放進(jìn)服務(wù)中
service.characteristics = @[characteristic];
// 把服務(wù)器添加到外設(shè)中
//添加后就會調(diào)用代理的- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error
[self.periperalMgr addService:service];
}
4.開始廣播
- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error
{
// 開始廣播
[self.periperalMgr startAdvertising:@{
CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:SERVICE_UUID]]
}];
}
//peripheral開始發(fā)送advertising
- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error
{
}
5.響應(yīng)center操作
//中心設(shè)備讀characteristics請求
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request{
//判斷是否有讀數(shù)據(jù)的權(quán)限
if (request.characteristic.properties & CBCharacteristicPropertyRead) {
NSData *data = request.characteristic.value;
[request setValue:data];
//對請求作出成功響應(yīng)
[self.periperalMgr respondToRequest:request withResult:CBATTErrorSuccess];
}else{
[self.periperalMgr respondToRequest:request withResult:CBATTErrorWriteNotPermitted];
}
}
//中心設(shè)備寫characteristics請求
- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests{
CBATTRequest *request = requests[0];
//判斷是否有寫數(shù)據(jù)的權(quán)限
if (request.characteristic.properties & CBCharacteristicPropertyWrite) {
//需要轉(zhuǎn)換成CBMutableCharacteristic對象才能進(jìn)行寫值
CBMutableCharacteristic *myCharacteristic =(CBMutableCharacteristic *)request.characteristic;
myCharacteristic.value = request.value;
[self.periperalMgr respondToRequest:request withResult:CBATTErrorSuccess];
}else{
[self.periperalMgr respondToRequest:request withResult:CBATTErrorWriteNotPermitted];
}
}