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按鍵就會對應到
- (IBAction)buttonScan:(id)sender {
:
}
Scan按鍵的行為功能
- 無論如何,在使用CB功能時請務必要引入
#import <CoreBluetooth/CoreBluetooth.h>
- 加入Scan程式碼:
[CM scanForPeripheralsWithServices:nil options:nil];
所以內容:
- (IBAction)buttonScan:(id)sender {
[CM scanForPeripheralsWithServices:nil options:nil];
NSLog(@"Scan");
}
- 加入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。
您好 感謝您的教學,非常詳細 但是我下載執行過後,總是無法搜尋到周圍的裝置,Log上都沒有出現周邊的裝置 想請問為甚麼會發生這樣的問題? 我的周邊裝置是Mac,請問需要先配對嗎?
謝謝。
使用Bluetooth Low Energy不需要配對,一切由程式控制連接、斷線的動作 1.確定你的Mac是否有支援Bluetooth 4.0 Low Energy 2.確定您身邊已有開啟的Bluetooth 4.0 Low Energy的週邊,可以用iPhone or iPad使用LightBlue APP模擬BLE週邊
使用Bluetooth Low Energy不需要配對,一切由程式控制連接、斷線的動作 1.確定你的Mac是否有支援Bluetooth 4.0 Low Energy 2.確定您身邊已有開啟的Bluetooth 4.0 Low Energy的週邊,可以用iPhone or iPad使用LightBlue APP模擬BLE週邊