Discover BLE Device
BLE跟一般Bluetooth一樣,它需要經過掃描週邊方式取得可接受BLE連線的週邊,再經過指定的方式與週邊連線,但CB提供功能,這些動作需要經過程式的控制來啟動掃描與停止掃描的動作,這章我們要完成掃描週邊的動作,一方面也可以確認BLE運作是否正常。
建立Xcode專案與配置UI
- 首先建立名為BluetoothLE-Scan的專案,再將視圖轉至Storyboard上面,我們要進行UI的配置工作。
- Button元件配置2個按鍵分別是Scan與Stop
- 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。