iOS藍(lán)牙開發(fā)

這篇文章主要包括iOS藍(lán)牙開發(fā)的簡介以及如果進行藍(lán)牙開發(fā), 具體的藍(lán)牙知識不再詳細(xì)介紹了.

iOS藍(lán)牙開發(fā)的實現(xiàn)基本上都是基于<CoreBlueTooth.framework>這個框架的, 這是目前世界上最流行的框架
可用于第三方藍(lán)牙設(shè)備交互, 必須要支持藍(lán)牙4.0
硬件至少是4s, 系統(tǒng)至少是iOS6
藍(lán)牙4.0以低功耗著稱, 一般也叫BLE(BlueTooth Low Energy)

Core Bluetooth的基本常識


  • 每個藍(lán)牙4.0設(shè)備都是通過服務(wù)(Service)和特征(Characteristic)來展示自己的
  • 一個設(shè)備包含一個或多個服務(wù), 每個服務(wù)下面又包含若干個特征
  • 特征是與人交互的最小單位
  • 服務(wù)特征都是用UUID來唯一標(biāo)識的, 通過UUID就能區(qū)別不同的服務(wù)和特征
  • 設(shè)備里面各個服務(wù)和特征的功能, 都是由藍(lán)牙設(shè)備硬件廠商提供, 比如哪些是用來交互, 哪些可以獲取模塊信息等等.

Core Bluetooth的開發(fā)步驟


建立中心設(shè)備:

CBCentralManager *manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

掃描外設(shè):
#pragma mark 1
//掃描語句:寫nil表示掃描所有的藍(lán)牙外設(shè),如果傳上面的kServiceUUID, 那么只能掃描出這個Service的Peripherals
[self.manager scanForPeripheralsWithServices:nil options:nil];

#pragma mark 2 == 發(fā)現(xiàn)外設(shè)
/**
 成功掃描到了藍(lán)牙會自動進入:didDiscoverPeripheral這個函數(shù)

 @param peripheral peripheral.name 掃描到的藍(lán)牙的名字
 @param RSSI 距離
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSString *localName = [[advertisementData objectForKey:@"kCBAdvDataLocalName"] lowercaseString];
    NSString *peripheralName = [peripheral.name lowercaseString];
   NSLog(@"廣播--:%@ 設(shè)備--:%@ 距離--:%@",localName, peripheralName, RSSI);

    //要連接藍(lán)牙的名
    NSString *MyBlueToothName = @"要連接藍(lán)牙的名";
    self.peripheral = peripheral;

    /**
     連接設(shè)備
     */
    if ([localName isEqualToString:MyBlueToothName ]|| [peripheralName isEqualToString:MyBlueToothName]) {
        self.peripheral.delegate = self;
        [self connect:peripheral];
    }
}

#pragma mark 3 == 成功連接Peripheral
/**
 連接設(shè)備成功后會調(diào)用該方法
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
    //傳nil會尋找所有服務(wù)
    NSLog(@"連接成功");
    [peripheral discoverServices:nil];
    //連接成功, 停止掃描
    [self.manager stopScan];
}

/**
連接失敗會調(diào)用該方法
*/
 - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"連接失敗---%@", error);
}
連接外設(shè):
//連接指定的設(shè)備
- (BOOL)connect:(CBPeripheral *)peripheral
{
    NSLog(@"正在連接指定設(shè)備");
    
    [self.manager connectPeripheral:peripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];

    return (YES);  
}
掃描外設(shè)中的服務(wù)和特征:
#pragma mark 4 == 發(fā)現(xiàn)服務(wù)
/**
 找到server后會調(diào)用該方法
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{ 
    if (peripheral != self.peripheral) {
        NSLog(@"Wrong peripheral");
        return;
    }
    if (error) {
        NSLog(@"Error---%@", error);
        return;
    }

    if (!error) {
        for (CBService *service in peripheral.services) {
            NSLog(@"serviceUUID:%@", service.UUID.UUIDString);
            //發(fā)現(xiàn)特定服務(wù)的特征值
            if ([service.UUID.UUIDString isEqualToString:kServiceUUID]) {
                [service.peripheral discoverCharacteristics:nil forService:service];
            return;
            }
        }
    }
}

#pragma mark 5 == 發(fā)現(xiàn)Characteristics

/**
 找到Characteristics后會調(diào)用該方法
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    if (peripheral != self.peripheral) {
        NSLog(@"Wrong peripheral");
        return;
    }
    if (error) {
        NSLog(@"Error---%@", error);
        return;
    }
    
    // 遍歷服務(wù)中所有的特征值
    for (CBCharacteristic *characteristic in [service characteristics])
    {
        // 找到我們需要的特征
        if ([characteristic.UUID isEqual:kCharacteristicUUID])
        {
            NSLog(@"serviceUUID--:%@", service.UUID);
            NSLog(@"CharacteristicsUUID--:%@", characteristic.UUID);
        
            self.characteristic = characteristic;
        
            /**
                找到特征以后進行的操作
             */
//            //我們可以使用readValueForCharacteristic:來讀取數(shù)據(jù),如果數(shù)據(jù)是不斷更新的,則可以使用setNotifyValue:forCharacteristic:來實現(xiàn)只要有新數(shù)據(jù)踩衩,就獲取
//            [self.peripheral readValueForCharacteristic:self.characteristic];
              [self.peripheral setNotifyValue:YES forCharacteristic:self.characteristic];
        
        
            break;
        }  
    }
}
利用特征與外設(shè)做數(shù)據(jù)交互
#pragma mark 6 == 獲取設(shè)備返回的數(shù)據(jù)
/**
讀取到數(shù)據(jù)就會調(diào)用該方法
*/
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    NSData *data = characteristic.value;

    //
    NSLog(@"data = %@", data);
}

#pragma mark Other == 數(shù)據(jù)交互

/**
 向設(shè)備寫數(shù)據(jù)

 @param data 要寫入的數(shù)據(jù)
 */
- (void)writeValue:(NSData *)data
{
    [self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];
}

/**
 當(dāng)writeValue: forCharacteristic: type:方法被調(diào)用的時候就會調(diào)用該方法
 */
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

{
    //查詢數(shù)據(jù)是否寫入
    NSLog(@"%@", characteristic.value);
}
斷開連接
#pragma mark == 外設(shè)斷開連接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
    NSLog(@"連接中斷---%@", error);
}
這只是藍(lán)牙開發(fā)的一個流程, 真正用到項目中的話還是需要自己不斷學(xué)習(xí)和了解才能運用到藍(lán)牙項目當(dāng)中. 不過當(dāng)你真正了解了藍(lán)牙的相關(guān)知識就會發(fā)現(xiàn), 實際上比想象的要更簡單.

附上demo鏈接, 如有不懂, 請下載demo另行查看:
https://github.com/LeoTnT/BlueToothDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末相满,一起剝皮案震驚了整個濱河市锅知,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖商膊,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宠进,居然都是意外死亡晕拆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門材蹬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实幕,“玉大人,你說我怎么就攤上這事堤器±ケ樱” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵闸溃,是天一觀的道長整吆。 經(jīng)常有香客問我拱撵,道長,這世上最難降的妖魔是什么表蝙? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任裕膀,我火速辦了婚禮,結(jié)果婚禮上勇哗,老公的妹妹穿的比我還像新娘昼扛。我一直安慰自己,他們只是感情好欲诺,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布抄谐。 她就那樣靜靜地躺著,像睡著了一般扰法。 火紅的嫁衣襯著肌膚如雪蛹含。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天塞颁,我揣著相機與錄音浦箱,去河邊找鬼。 笑死祠锣,一個胖子當(dāng)著我的面吹牛酷窥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伴网,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蓬推,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了澡腾?” 一聲冷哼從身側(cè)響起沸伏,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎动分,沒想到半個月后毅糟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡澜公,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年姆另,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛瘸。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜕青,死狀恐怖苟蹈,靈堂內(nèi)的尸體忽然破棺而出糊渊,到底是詐尸還是另有隱情,我是刑警寧澤慧脱,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布渺绒,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宗兼。R本人自食惡果不足惜躏鱼,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殷绍。 院中可真熱鬧染苛,春花似錦、人聲如沸主到。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽登钥。三九已至畔师,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牧牢,已是汗流浹背看锉。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塔鳍,地道東北人伯铣。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像轮纫,于是被迫代替她去往敵國和親懂傀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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