iOS 藍(lán)牙通訊---簡單的實(shí)現(xiàn)與藍(lán)牙發(fā)送和接受數(shù)據(jù)

首先描述一下我的使用場景,通過手機(jī)給藍(lán)牙板子發(fā)送相應(yīng)的數(shù)據(jù)(即指令)讓藍(lán)牙板子做出相應(yīng)的操作;(如藍(lán)牙鎖的開鎖關(guān)鎖操作)!!!!!!!!!!!!!!

首先我們需要導(dǎo)入系統(tǒng)藍(lán)牙框架的框架頭文件

#import<CoreBluetooth/CoreBluetooth.h>

其次我們需要遵循兩個(gè)藍(lán)牙協(xié)議<CBCentralManagerDelegate,CBPeripheralDelegate>

然后就可以寫我們的藍(lán)牙代碼了.....

首先我們要在使用地方創(chuàng)建一下藍(lán)牙中心管理者如下:

@property(nonatomic,strong)CBCentralManager*mgr; ? //把中心管理者聲明成一個(gè)屬性方便使用

@property(nonatomic,strong)CBPeripheral*bluetoothPeripheral; //當(dāng)前連接的管理者 ?發(fā)送數(shù)據(jù)的時(shí)候要用的

self.mar = [[CBCentralManageralloc]init];

同時(shí)要設(shè)置代理的

self.mar.delegate = self;

設(shè)置完代理就會(huì)調(diào)用一下方法:

//這個(gè)方法是判斷藍(lán)牙狀態(tài)的

- (void)centralManagerDidUpdateState:(CBCentralManager*)central{

switch(central.state) {

caseCBManagerStateUnknown://藍(lán)牙狀態(tài)未知

{

}

break;

caseCBManagerStateResetting://重置中

{

}

break;

caseCBManagerStateUnsupported://不支持藍(lán)牙

{

}

break;

caseCBManagerStateUnauthorized://藍(lán)牙未授權(quán)

{

}

break;

caseCBManagerStatePoweredOff://藍(lán)牙關(guān)閉狀態(tài)

{

}

break;

caseCBManagerStatePoweredOn://藍(lán)牙開啟狀態(tài)

{

//2.利用中心設(shè)備掃描外部設(shè)備

/*

如果指定數(shù)組代表只掃描指定的設(shè)備

*/

[self.mgr scanForPeripheralsWithServices:niloptions:nil];//如果藍(lán)牙未開啟狀態(tài)就執(zhí)行掃描藍(lán)牙設(shè)備方法

}

break;

default:

break;

}

}

//調(diào)用掃描藍(lán)牙方法之后,如果掃描到藍(lán)牙設(shè)備就會(huì)調(diào)用一下代理方法的

- (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI

{ ? ? ? ? ?

// ?參數(shù) ?peripheral ? 是掃描到的所有藍(lán)牙外設(shè)的集合 ? 每一個(gè)藍(lán)牙都包含多個(gè)屬性 (name :藍(lán)牙名稱 ? ? uuid:唯一標(biāo)示 ? 等一些屬性 ? )我們可以通過判斷藍(lán)牙名稱或是uuid 來連接相應(yīng)的藍(lán)牙設(shè)備

peripheral.delegate=self; ? ? ?//設(shè)置連接藍(lán)牙外設(shè)的代理?

[self.mgr connectPeripheral:peripheraloptions:nil];? //連接藍(lán)牙

[self.mgr stopScan]; //停止掃描

}

設(shè)置完連接藍(lán)牙的方法后就要出現(xiàn)連接狀態(tài)的方法了需要調(diào)用一下以下有幾個(gè)方法

/**

*連接外設(shè)成功調(diào)用

*/

- (void)centralManager:(CBCentralManager*)central didConnectPeripheral:(CBPeripheral*)peripheral

{

每個(gè)藍(lán)牙還包括 服務(wù) ,服務(wù)里邊又有特征 ;所以我們連接上藍(lán)牙之后還需要掃描一下連接到的藍(lán)牙外設(shè)中的服務(wù) ??

//掃描外設(shè)中得服務(wù)

[peripheral discoverServices:nil]; ??

}

//外設(shè)連接失敗

- (void)centralManager:(CBCentralManager*)central didFailToConnectPeripheral:(CBPeripheral*)peripheral error:(NSError*)error

{

NSLog(@"%s, line = %d, %@=連接失敗",__FUNCTION__, __LINE__, peripheral.name);

}

/**

*丟失連接

*/

- (void)centralManager:(CBCentralManager*)central didDisconnectPeripheral:(CBPeripheral*)peripheral error:(NSError*)error

{

[self.peripherals removeObject:peripheral];

NSLog(@"丟失連接");

}

設(shè)置完掃描服務(wù)就會(huì)調(diào)用一下方法 ,?

#pragma makr - CBPeripheralDelegate

/**

*只要掃描到服務(wù)就會(huì)調(diào)用

*

*@param peripheral服務(wù)所在的外設(shè)

*/

- (void)peripheral:(CBPeripheral*)peripheral didDiscoverServices:(NSError*)error

{

//獲取外設(shè)中所有掃描到得服務(wù) ? ?

NSArray*services = peripheral.services;

for(CBService*serviceinservices) {

NSLog(@"%@",service.UUID.UUIDString);

//由于每個(gè)藍(lán)牙中的服務(wù)也是有好多個(gè)的, 所以應(yīng)該找到我們拿到需要的服務(wù)

FFF0 是我做項(xiàng)目時(shí)鎖需要的服務(wù)標(biāo)識(shí) 所以就這樣判斷了

//if ([service.UUID.UUIDString isEqualToString:@"FFF0"])

if([service.UUID.UUIDStringisEqualToString:@"FFE0"])

{

//從需要的服務(wù)中查找需要的特征

//從peripheral中得service中掃描特征

[peripheral discoverCharacteristics:nilforService:service];

}

}

}

/**

*只要掃描到特征就會(huì)調(diào)用

*

*@param peripheral特征所屬的外設(shè)

*@param service特征所屬的服務(wù)

*/

- (void)peripheral:(CBPeripheral*)peripheral didDiscoverCharacteristicsForService:(CBService*)service error:(NSError*)error

{

//拿到服務(wù)中所有的特診

NSArray*characteristics =service.characteristics;

//遍歷特征,拿到需要的特征處理

for(CBCharacteristic* characteristicincharacteristics) {

if([characteristic.UUID.UUIDStringisEqualToString:@"FFE1"]) {

[peripheralsetNotifyValue:YESforCharacteristic:characteristic];

self.characteristic= characteristic;

[CommonToolbleSenderData:kObtainIDbluetoothPeripheral:self.bluetoothPeripheralcharacteristic:characteristic];

}

}

}

//更新特征的value的時(shí)候會(huì)調(diào)用(凡是從藍(lán)牙傳過來的數(shù)據(jù)都要經(jīng)過這個(gè)回調(diào),簡單的說這個(gè)方法就是你拿數(shù)據(jù)的唯一方法)你可以判斷是否

- (void)peripheral:(CBPeripheral*)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError*)error

{

if(error) {

NSLog(@"接受數(shù)據(jù)出現(xiàn)錯(cuò)誤%@ -- line = %d",error,__LINE__);

}else{

NSString*content = [[NSStringalloc]initWithData:characteristic.valueencoding:NSUTF8StringEncoding];

}

}

這樣就可以拿到藍(lán)牙給我們發(fā)送的數(shù)據(jù)?

下面這行代碼是我們給藍(lán)牙發(fā)送數(shù)據(jù)的代碼,寫在你的觸發(fā)事件中就好了,不過還要注意一點(diǎn)就是發(fā)送數(shù)據(jù)一定要按照藍(lán)牙所接受數(shù)據(jù)的格式發(fā)送

//self.bluetoothPeripheral ?這個(gè)參數(shù)是你鏈接的藍(lán)牙設(shè)備的 對(duì)應(yīng)的對(duì)象

[self.bluetoothPeripheral writeValue:dataforCharacteristic:characteristictype:CBCharacteristicWriteWithoutResponse];

就這樣你就可以與藍(lán)牙設(shè)備發(fā)送數(shù)據(jù) 并且接受來自藍(lán)牙設(shè)備返回的數(shù)據(jù)了!!!!!!!!!!!!

讀者如有不清楚的地方可以隨時(shí)留言詢問.謝謝您的閱讀!!!希望對(duì)您有用的地方!!!!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容