首先描述一下我的使用場景,通過手機(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ì)您有用的地方!!!!!!