CoreBluetooth For Central (3)

Discover BLE Device

BLE跟一般Bluetooth一樣,它需要經過掃描週邊方式取得可接受BLE連線的週邊,再經過指定的方式與週邊連線,但CB提供功能,這些動作需要經過程式的控制來啟動掃描與停止掃描的動作,這章我們要完成掃描週邊的動作,一方面也可以確認BLE運作是否正常。

建立Xcode專案與配置UI

  • 首先建立名為BluetoothLE-Scan的專案,再將視圖轉至Storyboard上面,我們要進行UI的配置工作。

  • Button元件配置2個按鍵分別是ScanStop

  • Label元件配置1個,內容可以寫上你可以識別的或是Discover BLE Device

  • 最後整個配置如下圖所示,可以試著操作看看

開始寫功能

CB在使用時,有些過程及程式碼內容是必要的,每章節下來部分內容會沿用之前程式碼的內容,在這只針對新增的部分進行說明,詳細內容請自行下載程式碼對照使用。

Scan

UI與程式碼的配置
  • 我們使用拖、拉的方式建立Button的Action,如果您對於Xcode有基本操作的話,可以自行先行建立。

  • Connection 選擇Action、Name 填上 buttonScan ,完成後按下Connect,UI Button與程式的連結,

可以在標頭檔案(.h)與程式碼(.m)看到已自動建立程式碼,

之後只要在UI上按下Scan按鍵就會對應到

//-----------start-----------
    - (IBAction)buttonScan:(id)sender {
    :
    }
//------------end------------

Scan按鍵的行為功能
  • 無論如何,在使用CB功能時請務必要引入
//-----------start-----------
    #import <CoreBluetooth/CoreBluetooth.h>
//------------end------------

  • 加入Scan程式碼:
//-----------start-----------
    [CM scanForPeripheralsWithServices:nil options:nil];
//------------end------------

所以內容:

//-----------start-----------
    - (IBAction)buttonScan:(id)sender {
        [CM scanForPeripheralsWithServices:nil options:nil];
        NSLog(@"Scan");
    }
//------------end------------

  • 加入Delegate,當抓到BLE週邊時,CB會將資訊傳至
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

所以我們要增加程式碼將資料印出來

    NSLog(@"%@\n",peripheral);
    NSLog(@"%@\n",advertisementData);
    NSLog(@"%@\n",RSSI);

Stop

UI與程式碼的配置

整個配置的方法與Scan的方式相同,在Name上填入buttonStop

Stop按鍵的行為功能

CB中要停止掃描的Method為stopScan,這是屬於CBCentralManager物件所提供的。

  • 加入Stop程式碼:
    [CM stopScan];

所以內容:

    - (IBAction)buttonStop:(id)sender {

        [CM stopScan];
        NSLog(@"stopScan");
    }

測試功能

整個程式完成後我們可以來看一下最後的結果,這裡以iPad做為Device來展示程式,執行之前請記得要開啟藍牙功能,

程式的執行畫面:

Scan

按下按鍵後會看一下Log上的顯示

    2014-01-21 16:25:56.685 BluetoothLE-Scan[6123:60b] Scan
    2014-01-21 16:25:56.924 BluetoothLE-Scan[6123:60b] <CBPeripheral: 0x14d3f810 identifier = 9D027D39-5A77-3B6B-   BC45-5A1E00115269, Name = "TI BLE Keyfob", state = disconnected>
    2014-01-21 16:25:56.926 BluetoothLE-Scan[6123:60b] {
        kCBAdvDataChannel = 37;
        kCBAdvDataIsConnectable = 0;
    }
    2014-01-21 16:25:56.929 BluetoothLE-Scan[6123:60b] -60
    2014-01-21 16:25:56.960 BluetoothLE-Scan[6123:60b] <CBPeripheral: 0x14d44600 identifier = B10F4C1D-A316-18AA-9E1D-  FE64D26B1FA0, Name = "(null)", state = disconnected>
    2014-01-21 16:25:56.962 BluetoothLE-Scan[6123:60b] {
        kCBAdvDataChannel = 38;
        kCBAdvDataIsConnectable = 1;
    }
    2014-01-21 16:25:56.963 BluetoothLE-Scan[6123:60b] -94

Log上顯示:

  • identifier:週邊的UUID,其ID為設備的唯一值,每個設備都會有不同的UUID,連線時也是利用此UUID進行連線

  • Name:週邊的名稱,這裡看到的是”TI BLE Keyfob”名稱。

  • state:連線狀態,如果有連線就會得到 connected 範例中得到的訊息是 disconnected (斷線),代表目前週邊未進行任何連線。

  • kCBAdvDataChannel:週邊的廣播通道號碼,Bluetooth是使用跳頻的方式連線,所以每一次得到的號碼也不同。

  • kCBAdvDataIsConnectable:週邊是否能被連線。

Log之中的 -60、-94這值為RSSI值,這值代表iDevice得到BLE週邊訊號的強度,

另一個例子:

    2014-01-21 16:51:40.195 BluetoothLE-Scan[6145:60b] Scan
    2014-01-21 16:51:40.220 BluetoothLE-Scan[6145:60b] <CBPeripheral: 0x16569be0 identifier = 419D6B15-1F6C-    EE7B-7751-2748ACA0D7C3, Name = "DannySerialApp", state = disconnected>
    2014-01-21 16:51:40.224 BluetoothLE-Scan[6145:60b] {
        kCBAdvDataChannel = 37;
        kCBAdvDataIsConnectable = 1;
        kCBAdvDataLocalName = DannySimpleBLE;
        kCBAdvDataServiceUUIDs =     (
            "Unknown (<fff0>)"
        );
        kCBAdvDataTxPowerLevel = 0;
    }
    2014-01-21 16:51:40.225 BluetoothLE-Scan[6145:60b] -43
    2014-01-21 16:51:40.331 BluetoothLE-Scan[6145:60b] <CBPeripheral: 0x16679130 identifier = D9BFA6BC-DAD3-B29B-1031-  AA1CCC09B910, Name = "(null)", state = disconnected>
    2014-01-21 16:51:40.333 BluetoothLE-Scan[6145:60b] {
        kCBAdvDataChannel = 37;
        kCBAdvDataIsConnectable = 1;
    }
    2014-01-21 16:51:40.335 BluetoothLE-Scan[6145:60b] -93

如果有提供其他的連線服務的話,會看到kCBAdvDataServiceUUIDs會有內容。

Stop

按鍵立即停止掃描功能,會在Log上看到stopScan。

範例程式