1. 程式人生 > >iOS開發 之 可穿戴裝置 藍芽4.0 BLE 開發

iOS開發 之 可穿戴裝置 藍芽4.0 BLE 開發

1 前言

當前有越來越多的可穿戴裝置使用了藍芽4.0 BLE(Bluetooth Low Energy)。對於iOS開發而言,Apple之前專門推出CoreBluetooth的Framework來支援BLE的開發。對於硬體開發有了解的朋友應該知道,在之前使用低版本的藍芽的裝置,要連線到iOS裝置上,需要註冊MFI,擁有MFI協議才能進行相應的開發。如果大家關注我之前對LEGO EV3的研究,就可以發現,EV3是使用了藍芽2.1,因此需要MFI協議來進行開發。

本文將一步一步講解如何使用CoreBluetooth框架來與各種可穿戴裝置進行通訊,使用 小米手環 來進行基本的測試。
小米手環

2 開發環境

1 Macbook Pro Mac OS X 10.10
2 Xcode 6.3.2
3 iPhone 5s v8.1
4 小米手環

3 基本流程

要開發藍芽,需要對整個通訊過程有個基本瞭解。這裡我摘錄一些Apple官方的文件Core Bluetooth Programming Guide的圖片來加以說明。這個文件其實對於開發的流程寫的是非常的清楚,大家最好可以看一下。

3.1 可穿戴裝置與iOS互聯方式

可穿戴裝置與iOS互聯

從上面這幅圖可以看到,我們的iOS裝置是Central,用來接收資料和傳送命令,而外設比如小米手環是Peripheral,向外傳輸資料和接收命令。我們要做的就是通過Central來連線Peripheral,然後實現資料的接收和控制指令的傳送。在做到這一步之後,再根據具體的硬體,對接收到的資料進行parse解析。

3.2 可穿戴裝置藍芽的資料結構

可穿戴裝置藍芽的資料結構

這裡用的是心率裝置來做說明,每個外設Peripheral都有對應的服務Service,比如這裡是心率Service。一個外設可以有不止一個s、Service。每個service裡面可以有多個屬性Characteristic,比如這裡有兩個Characteristic,一個是用來測量心率,一個是用來定位位置。

那麼很關鍵的一點是每個Service,每個Characteristic都是用UUID來確定的。UUID就是每個Service或Characteristic的identifier。

大家可以在iPhone上下載LightBlue這個應用。可以在這裡檢視一些裝置的UUID。
LightBlue

在實際使用中,我們都是要通過UUID來獲取資料。這點非常重要。
在CoreBluetooth中,其具體的資料結構圖如下:
這裡寫圖片描述

4 Step-By-Step 上手BLE開發

4.1 Step 1 建立CBCentralManager

從名字上大家可以很清楚的知道,這個類是用來管理BLE的。我們也就是通過這個類來實現連線。

先建立一個:

@property (nonatomic,strong) CBCentralManager *centralManager;

dispatch_queue_t centralQueue = dispatch_queue_create("com.manmanlai", DISPATCH_QUEUE_SERIAL);
        self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue];

然後關鍵在於CBCentralManagerDelegate的使用。這個之後再講。

4.2 Step 2 尋找CBPeripheral外設

有了CBCentralManager,接下來就是尋找CBPeripheral外設,方法很簡單:

[self.centralManager scanForPeripheralsWithServices:@[] options:nil];

這裡的Service就是對應的UUID,如果為空,這scan所有service。

4.3 Step 3 連線CBPeripheral

在上一步中,如果找到了裝置,則CBCentralManager的delegate會呼叫下面的方法:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"name:%@",peripheral);
    if (!peripheral || !peripheral.name || ([peripheral.name isEqualToString:@""])) {
        return;
    }

    if (!self.peripheral || (self.peripheral.state == CBPeripheralStateDisconnected)) {
        self.peripheral = peripheral;
        self.peripheral.delegate = self;
        NSLog(@"connect peripheral");
        [self.centralManager connectPeripheral:peripheral options:nil];
    }

}

我們在這裡建立了一個CBPeripheral的物件,然後直接連線
CBPeripheral的物件也需要設定delegate.

4.4 Step 4 尋找Service

如果Peripheral連線成功的話,就會呼叫delegate的方法:

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    if (!peripheral) {
        return;
    }

    [self.centralManager stopScan];

    NSLog(@"peripheral did connect");
    [self.peripheral discoverServices:nil];


}

我們這裡先停止Scan,然後讓Peripheral外設尋找其Service。

4.5 Step 5 尋找Characteristic

找到Service後會呼叫下面的方法:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    NSArray *services = nil;

    if (peripheral != self.peripheral) {
        NSLog(@"Wrong Peripheral.\n");
        return ;
    }

    if (error != nil) {
        NSLog(@"Error %@\n", error);
        return ;
    }

    services = [peripheral services];
    if (!services || ![services count]) {
        NSLog(@"No Services");
        return ;
    }

    for (CBService *service in services) {
        NSLog(@"service:%@",service.UUID);
        [peripheral discoverCharacteristics:nil forService:service];

    }

}

我們根據找到的service尋找其對應的Characteristic。

4.6 Step 6 找到Characteristic後讀取資料

找到Characteristic後會呼叫下面的delegate方法:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    NSLog(@"characteristics:%@",[service characteristics]);
    NSArray *characteristics = [service characteristics];

    if (peripheral != self.peripheral) {
        NSLog(@"Wrong Peripheral.\n");
        return ;
    }

    if (error != nil) {
        NSLog(@"Error %@\n", error);
        return ;
    }

    self.characteristic = [characteristics firstObject];
    //[self.peripheral readValueForCharacteristic:self.characteristic];
    [self.peripheral setNotifyValue:YES forCharacteristic:self.characteristic];

這裡我們可以使用readValueForCharacteristic:來讀取資料。如果資料是不斷更新的,則可以使用setNotifyValue:forCharacteristic:來實現只要有新資料,就獲取。

4.7 Step 7 處理資料

讀到資料後會呼叫delegate方法:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
   NSData *data = characteristic.value;
   // Parse data ...

}

4.8 Step 8 向裝置寫資料

這個很簡單,只要使用:

[self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];

data是NSData型別。

5 實驗

使用小米手環實驗,得到如下結果:

2015-06-10 16:52:31.607 KetherDemo[13786:1792995] scaning device
2015-06-10 16:52:33.474 KetherDemo[13786:1793032] name:<CBPeripheral: 0x1700e4380, identifier = 6FF833E3-93C1-28C6-CBC0-74A706AAAE31, name = LS_SCA16, state = disconnected>
2015-06-10 16:52:33.475 KetherDemo[13786:1793032] connect peripheral
2015-06-10 16:52:37.538 KetherDemo[13786:1793031] peripheral did connect
2015-06-10 16:52:37.984 KetherDemo[13786:1793031] service:FEE7
2015-06-10 16:52:37.985 KetherDemo[13786:1793031] service:Device Information
2015-06-10 16:52:38.099 KetherDemo[13786:1793032] characteristics:(
    "<CBCharacteristic: 0x17409c250, UUID = FEC8, properties = 0x20, value = (null), notifying = NO>",
    "<CBCharacteristic: 0x17409c200, UUID = FEC7, properties = 0x8, value = (null), notifying = NO>"
)
2015-06-10 16:52:38.100 KetherDemo[13786:1793032] Kether did connect
2015-06-10 16:52:38.101 KetherDemo[13786:1793032] Kether did connect
2015-06-10 16:52:38.280 KetherDemo[13786:1793031] characteristics:(
    "<CBCharacteristic: 0x17009f270, UUID = Manufacturer Name String, properties = 0x2, value = (null), notifying = NO>",
    "<CBCharacteristic: 0x17009f2c0, UUID = Model Number String, properties = 0x2, value = (null), notifying = NO>",
    "<CBCharacteristic: 0x17009f310, UUID = Serial Number String, properties = 0x2, value = (null), notifying = NO>",
    "<CBCharacteristic: 0x17009eb90, UUID = Hardware Revision String, properties = 0x2, value = (null), notifying = NO>",
    "<CBCharacteristic: 0x17009f0e0, UUID = Firmware Revision String, properties = 0x2, value = (null), notifyi``

 = NO>",

6 小結

通過上面的方法,我們就可以輕鬆的對BLE進行開發。實際上比想象的要簡單。

【本文為原創文章,轉載請註明出處:blog.csdn.net/songrotek】

相關推薦

iOS開發 穿戴裝置 4.0 BLE 開發

1 前言 當前有越來越多的可穿戴裝置使用了藍芽4.0 BLE(Bluetooth Low Energy)。對於iOS開發而言,Apple之前專門推出CoreBluetooth的Framework來支援BLE的開發。對於硬體開發有了解的朋友應該知道,在之前使用低

Android 4.0(ble)開發的解決方案

   最近,隨著智慧穿戴式裝置、智慧醫療以及智慧家居的普及,藍芽開發在移動開中顯得非常的重要。由於公司需要,研究了一下,藍芽4.0在Android中的應用。以下是我的一些總結。           1.先介紹一下關於藍芽4.0中的一些名詞吧:               

4.0 BLE SimpleBLEPeripheral_新增新CHAR值及UUID

      UUID, 就是用來唯一識別一個特徵值的ID. handle,就是對應的attribute 的一個控制代碼。 所有對特徵值的操作,都是通過對UUID 的搜尋得到對應的handle之後,通過handle來操作

4.0 BLE 資料傳輸 (二)

轉載自: https://blog.csdn.net/rfidunion/article/details/79711055   在第一部分我們瞭解了幾個專業詞彙,接下來我們再瞭解一下資料的傳送 一、資料傳送 在BLE協議棧中進行資料傳送分為兩個方面,一個事GATT的cl

4.0 BLE 資料傳輸 (一)

原文地址:http://blog.sina.com.cn/s/blog_869234dc0102uxl3.html   在這之前我們得先了解一下一些專業詞彙: 1、profile  profile可以理解為一種規範,一個標準的通訊協議,它存在於從機中。 藍芽組織規

4.0 BLE 資料傳輸 (一)

一、簡介 本文主要講解藍芽資料傳輸一。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart RF(主晶片CC2541) 三、 宣告:喝水不忘挖井人,轉載請註明出處。 原文地址:http

4.0 BLE 資料傳輸(五)

原文地址:http://blog.sina.com.cn/s/blog_869234dc0102uxse.html相信看了《藍芽4.0 BLE  資料傳輸(四)》,大家應該知道怎麼通過傳送特徵值來控制CC2540了,不說別的,就用這個,點亮一個LED就能忽悠一下我們老師,期末

4.0 BLE 模組問答

轉自: http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=432353 一、 藍芽4.0模組基礎理論問答 1、什麼是藍芽4.0,藍芽4.0較之前版本藍芽的區別。 藍芽4.0 共3種工作模式,普通藍芽

4.0 BLE 資料傳輸(四)

原文地址:http://blog.sina.com.cn/s/blog_869234dc0102uxos.html今天我們做一個簡單的資料傳輸實驗,就是用TI提供的lightblue 來點亮控制LED首先我們來看一下用手機APP來控制led,我是用app來控制cc2540這個

4.0/BLE協議棧學習筆記(一)

 需要的軟體工具: 1、BLE協議棧(BLE-CC254x-1.4.0) 2、IAR開發軟體(IAR Embedded Workbench8.20.2) 注:1.4.0協議棧使用8.2

android 4.0 ble 低功耗

一:概述 這段時間做了藍芽4.0的專案,就是一個藍芽裝置控制手機進行拍照。並且有很多按鍵,不同的按鍵對應到手機上有不同的功能,並且組合起來也有不同的功能。 低功耗藍芽有中央裝置後周邊裝置的概念手機就是一箇中央裝置,像我這次試用的一個控制器, 我試過小

iOS開發(玩轉)不看此文,枉做開發

前言: 之前詳細談過不少關於HTTP協議的知識點,TCP/IP也通過tcpdump做過簡單的介紹,但網路協議的本質其實是連線,裝置或者端之間連線的方式有多種,常見的http或者基於tcp的socket只是森林一葉,還有些不那麼常見的協議比如藍芽。適當腦洞,也能玩出不少新花樣

iOS開發4.0技術完美實現

前言 前端時間,同學在做專案過程中遇到關於藍芽方面的問題,今天我就給大家進行詳細的進行講解下藍芽在iOS開發中的具體實現.在介紹藍芽前,大家要搞清楚什麼是藍芽? 什麼是藍芽? 隨著藍芽低功耗技術BLE(Bluetooth Low Energy)的發展,

ios開發4.0技術

前言 前端時間,同學在做專案過程中遇到關於藍芽方面的問題,今天我就給大家進行詳細的進行講解下藍芽在iOS開發中的具體實現.在介紹藍芽前,大家要搞清楚什麼是藍芽? 什麼是藍芽? 隨著藍芽低功耗技術BLE(Bluetooth Low Energy)的發展

Android開發低功耗(4.0)開發全記錄

主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法

Android開發經典2.0開發全記錄

前言部分 最近因為需要開始藍芽相關開發,所以在網上搜索了很多內容,並且結合自己的開發過程做了一個總結,先儲備上,也許可能幫到正在做藍芽開發的同學。 藍芽很早就是android裝置上基本通訊功能了,只是以前的沒有那麼多藍芽裝置,現在藍芽裝置種類繁多,所以經常會有人遇到藍芽相關的開發

波光和仁寶簽訂開發AR穿戴裝置的戰略合作協議

拉斯維加斯--(美國商業資訊)--用於增強現實(AR)可穿戴裝置的衍射波導元件的領先設計商和製造商波光(WaveOptics),已與全球領先的智慧裝置和膝上型電腦製造商之一仁寶(Compal)結成了戰略合作伙伴關係。   該協議使仁寶和波光能夠為不斷髮展的AR智慧眼鏡市場開發AR可穿戴

iOS開發(二):iOS 4.0中心模式 程式碼實現

上一篇簡單介紹了藍芽的部分基礎知識,詳細的東西大家可以去github上搜babyBluetooth,裡面有一些學習資料 iOS連線外設的流程 建立中心管理者 掃描外設 discoverPeripheral 連線外設 connectPeripheral

iOS開發4.0的各種親身經歷踩過得坑

1.首先建立這個三個引數 @property (nonatomic,strong)CBCentralManager * manager; @property (nonatomic,strong)CBPeripheral * peripheral;

android開發手機與微控制器模組通訊

之前兩篇都是在說與手機的連線,連線方法,和主動配對連線,都是手機與手機的操作,做起來還是沒問題的,但是最終的目的是與微控制器的藍芽模組的通訊。 下面是到目前為止嘗試的與微控制器的通訊方法,沒有成功,但是從思路上來說沒有問題,最大的問題是與微控制器配對的時候,微控制器的藍芽