Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Bluetooth LE                体験講座              ドリームコア 1F モバイル・コア                     3月22日                 (合)わふう 上原 昭宏13年3...
目次              • Bluetooth Low Energyって?              • キーホルダーをいじってみる              • iOSらしいBluetooth LEの使い方?13年3月25日月曜日
Bluetooth Low Energyとは13年3月25日月曜日
Bluetooth Low Energyとは              •   超低消費電力無線通信                  •   コイン電池(CR2032、直径2cm、3.2mm厚)で1~2年の無線通信13年3月25日月曜日
Bluetooth Low Energyとは              •   超低消費電力無線通信                  •   コイン電池(CR2032、直径2cm、3.2mm厚)で1~2年の無線通信              ...
Bluetooth Low Energyとは              •   超低消費電力無線通信                  •   コイン電池(CR2032、直径2cm、3.2mm厚)で1~2年の無線通信              ...
BTLEの使いどころ13年3月25日月曜日
BTLEの使いどころ13年3月25日月曜日
BTLEの使いどころ13年3月25日月曜日
BTLEの使いどころ                  •   運動、健康、近接...13年3月25日月曜日
BTLEの使いどころ                  •   運動、健康、近接...                  •   Appcessory13年3月25日月曜日
BTLEの使いどころ                  •   運動、健康、近接...                  •   Appcessory                  •   ハード、スマフォ、ネット13年3月25日月曜日
BTLEの使いどころ                  •   運動、健康、近接...                  •   Appcessory                  •   ハード、スマフォ、ネット             ...
BTLEの使いどころ                  •   運動、健康、近接...                  •   Appcessory                  •   ハード、スマフォ、ネット             ...
BTLEの使いどころ                  •   運動、健康、近接...                  •   Appcessory                  •   ハード、スマフォ、ネット             ...
iOSとBTLE         •    iOSデバイスのBluetooth4対応              •   iPhone4S (2011年10月発売) 以降のApple社製品 、iOS5 / iOS6         •    BT...
実際に動かしてみる13年3月25日月曜日
デバイスの確認              • iOS5/6の iPhone4S以降のiOSデバイス              • BTLE キーホルダ(BSHSBTPT01BK)              • Xcode 4.5.1以上13年3...
サンプルコードを開く     •    ソースコード         •    https://github.com/reinforce-lab/CoreBluetooth_samples         •    プロジェクト first_sa...
keyfobと接続              •   デバイス一覧                  •   RSSIが一番大きい(マイナスの数字が小さい)                      行を選択              •   ...
keyfobと接続              •   デバイス一覧                  •   RSSIが一番大きい(マイナスの数字が小さい)                      行を選択              •   ...
keyfobと接続              •   デバイス一覧                  •   RSSIが一番大きい(マイナスの数字が小さい)                      行を選択              •   ...
BTLEデバイスとの通信手順              • デバイスの発見              • 接続              • 読み書き              • 切断13年3月25日月曜日
コードを読んでみる13年3月25日月曜日
フレームワークの追加13年3月25日月曜日
フレームワークの追加13年3月25日月曜日
フレームワークの追加13年3月25日月曜日
フレームワークの追加               #import "KeyFobController.h"               #import <CoreBluetooth/CoreBluetooth.h>               ...
フレームワークの追加                  #import "KeyFobController.h"                  #import <CoreBluetooth/CoreBluetooth.h>         ...
デバイスの発見13年3月25日月曜日
ネットワーク・トポロジ                          • スター型                          • 接続数の上限がない                           • クラシックBTは7    ...
データモデル     セントラル                     ペリフェラル      (Central)                 (Peripheral)        CBCentralManager           ...
ペリフェラル・デバイスの発見                             • アドバタイズメント              Ad              • パケットを送信                   Ad        ...
13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
-(void)startScanning {      // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です      NSArray *scanServices = [NSArray arrayWithObje...
-(void)startScanning {      // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です      NSArray *scanServices = [NSArray arrayWithObje...
-(void)startScanning {      // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です      NSArray *scanServices = [NSArray arrayWithObje...
-(void)startScanning {      // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です      NSArray *scanServices = [NSArray arrayWithObje...
アドバタイズメントのフィルタ                             •   重複を許すか              Ad                 •   通常はNO                   Ad      ...
// デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisem...
// デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisem...
// デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisem...
// デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisem...
アドバタイズメントで取れる情報 (1/1)         • 名前、送信電力、その他              • CBAdvertisementDataLocalNameKey              • CBAdvertisementD...
アドバタイズメントで取れる情報 (2/2)         • CBPeripheral インスタンス              •   UUID : 128-bitの識別番号                  •   一度でも接続したことがあ...
接続と切断13年3月25日月曜日
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。    //少なくとも接...
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。    //少なくとも接...
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。            ...
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。            ...
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。            ...
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。            ...
-(void)connect:(PeripheralContainer *)c {    //ターゲットを発見、接続します     //この時点でperipheralはcentral managerに保持されていません。            ...
サービスとキャラクタリスティクス                 そしてプロファイル13年3月25日月曜日
プロトコルスタック              Applications              Applications               Applications               Core Bluetooth     ...
プロトコルスタック              Applications              Applications               Applications               Core BluetoothXPC  ...
プロトコルスタック              Applications              Applications               Applications               Core BluetoothXPC  ...
プロトコルスタック              Applications              Applications               Applications               Core BluetoothXPC  ...
プロトコルスタック              Applications              Applications               Applications               Core BluetoothXPC  ...
プロトコルスタック              Applications              Applications               Applications               Core BluetoothXPC  ...
プロトコルスタック              Applications              Applications               Applications               Core BluetoothXPC  ...
プロトコルスタック              Applications              Applications       サービス=クラス               Applications                   ...
プロトコルスタック              Applications              Applications          サービス=クラス               Applications                ...
サービスとキャラクタリスティクス                 そしてプロファイル13年3月25日月曜日
サービスと振る舞いの分離デバイス発見              Find ME               Profile              Proximity               Profile   切断時の警告         ...
サービスと振る舞いの分離デバイス発見              Find ME                                             Immediate               振動やブザー        ...
サービスと振る舞いの分離デバイス発見              Find ME                                             Immediate               振動やブザー        ...
サービスと振る舞いの分離ユースケース                                                                                ハード仕様デバイス発見             ...
プロファイルの実装              Applications              Applications               Applications     • プロファイルがアプリ側               C...
プロファイルの実装              Applications              Applications               Applications     • プロファイルがアプリ側XPC             ...
プロファイルの実装              Applications              Applications               Applications     • プロファイルがアプリ側XPC             ...
サービスとキャラクタリスティクスを                見てみる13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
• UUIDで識別           • 16-bit / 128-bit          • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
サービスとキャラクタリスティクスの               リスティング13年3月25日月曜日
#define kImmediateAlertServiceUUID @"1802"    #define kLinkLossServiceUUID       @"1803"    #define kAlertLevelUUID       ...
#define kImmediateAlertServiceUUID @"1802"    #define kLinkLossServiceUUID       @"1803"    #define kAlertLevelUUID       ...
//発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error {    for (CBS...
//発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error {    for (CBS...
//発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error {    for (CBS...
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:     (CBCharacteristic *)characteristic erro...
まとめ              • BTLE               • 超低消費電力、なんとなくつながる              • iOSとBTLE               • MFi不要、一般開発者権限            ...
開発体制              •   ハード+プロファイル部分を担当すべし                  •   無線接続と振る舞い                  •   デモアプリで動作確認、責任分界              ...
参考13年3月25日月曜日
情報源(1/3)              •   https://developer.apple.com/videos/wwdc/2012/                  •   Session 703: Core Bluetooth 1...
情報源(2/3)              •   Texus Instruments社                  •   http://www.tij.co.jp/product/jp/cc2540                  ...
情報源(3/3)              •   AppleのBluetoothアクセサリ設計指針 (おすすめ)              •   Bluetooth Low Energy Handbook (おすすめ)           ...
ぶっちゃけ13年3月25日月曜日
• CoreBluetoothを使う必要あるの?               • API公開(Wahoo、NODE、konashi...)               • ハード販売、サービス展開               • 自分で開発展開...
オリジナル開発              •   半導体買ってきて回路を作ると                  •   BT認証 1万ドル、電波法 40万円(実費)。                  •   1万台以上作るなら       ...
•   ペリフェラルの設計                  •   http://e2e.ti.com/support/low_power_rf/f/538/t/225290.aspx                  •   リファレンス設...
こまったときの    •    何が何やら、わけがわかんないよ        •     通信の把握が勝利の        •     TI社のCC2540開発キットでパケットスニファ        •     iOS6.0で、切断時にiOSが...
今時のBTLE              • BTLEデバイス、Over-the-airでファーム更新              • Kickstarterむっちゃでてる              • 10万台の呪い。日本、しんでる      ...
他のプラットホーム              •   Android                  • チップメーカ独自スタック、公式BTLE対応なし                  •   できることはiOSと同じ。GATTを叩ける。 ...
あどばんす13年3月25日月曜日
• アプリ               • バックグラウンド               • CBPeripheralManager              • ハード開発              • 情報源13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
Central         Central                 client                                          Peripheral                   Perip...
• サンプルファイル              • ペリフェラル(デバイス)              •13年3月25日月曜日
Central                                              Peripheral              CBCentralManager                             ...
iOS5                  iOS6  Main Objects              CBCentralManager           CBPeripheralManager  Data                ...
Central                                   Peripheral                        Ad                         Ad                 ...
discover and connect              CBCentralManager             Periphearl device          scanForPeripheralsWithServices  ...
Central              Peripheral              CBService                                             Service                ...
CBPeripheral        CBPeripheralDelegate              discoverServices                                 didDiscoverServices...
CBPeripheral             CBPeripheralDelegate    readValueForCharacteristic                     didUpdateValueForCharacter...
• Scan and Connect              • Reconnecting using UUID              • Already connected?              •13年3月25日月曜日
discover and connect              CBCentralManager       Periphearl device               retrievePeripherals              ...
iOS background              • Background app               • Scan and advertise               • Connect               • In...
• Foreground app               • High-intensity scanning              • Bacground app/screen off               • Low-inten...
• Ad               • Name               • Tx Power               • Service UUID               • Service Data              ...
• 16-bit UUID               • assigned by Bluetooth SIG               • http://develper/bluetooth.org              • 128-b...
• Centralがキャッシュするもの               • 発見したServiceとCharacteristics               • Valueはキャッシュされない               •13年3月25日月曜日
ペアリング              • ペアリング              • 接続する、認証されてないー>拒否              • Insufficient Authentication              • ペアリング、...
BTLE available?              • CBCentralManager               • delegate CBCentralManagerDelegate               • state CB...
13年3月25日月曜日
Bluetooth Smart ready と ready              •   2種類の周辺機器                  •   デュアル・モード = クラシックBT + LE 両方搭載                 ...
ちょっと規格の話13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
13年3月25日月曜日
Upcoming SlideShare
Loading in …5
×

iOSアプリ開発者のための Bluetooth Low Energy体験講座

179,986 views

Published on

2013年3月22日に大垣市ドリームコアで開催したiOS開発者向けBluetooth Low Energyハンズオンの資料です。
BTLEデバイスと連携するアプリケーション開発、また企画立案に役立つ開発情報を盛り込みました。
実際に動くコードを使って、CoreBluetoothフレームワークおよびBTLEのプロトコルスタック(GATT,ATT)を詳しく、掘り下げています。

Published in: Technology

iOSアプリ開発者のための Bluetooth Low Energy体験講座

  1. 1. Bluetooth LE 体験講座 ドリームコア 1F モバイル・コア 3月22日 (合)わふう 上原 昭宏13年3月25日月曜日
  2. 2. 目次 • Bluetooth Low Energyって? • キーホルダーをいじってみる • iOSらしいBluetooth LEの使い方?13年3月25日月曜日
  3. 3. Bluetooth Low Energyとは13年3月25日月曜日
  4. 4. Bluetooth Low Energyとは • 超低消費電力無線通信 • コイン電池(CR2032、直径2cm、3.2mm厚)で1~2年の無線通信13年3月25日月曜日
  5. 5. Bluetooth Low Energyとは • 超低消費電力無線通信 • コイン電池(CR2032、直径2cm、3.2mm厚)で1~2年の無線通信 • Bluetooth4で統合 • Bluetooth4 = Bluetooth3 + Low Energy (BTLE) • 2.4GHz(2400~2480MHz)。クラシックBTと異なる変調方式、チャネル。13年3月25日月曜日
  6. 6. Bluetooth Low Energyとは • 超低消費電力無線通信 • コイン電池(CR2032、直径2cm、3.2mm厚)で1~2年の無線通信 • Bluetooth4で統合 • Bluetooth4 = Bluetooth3 + Low Energy (BTLE) • 2.4GHz(2400~2480MHz)。クラシックBTと異なる変調方式、チャネル。 • 少量データ、低頻度 • 例:<20バイト、秒に1回。フィットネス、医療13年3月25日月曜日
  7. 7. BTLEの使いどころ13年3月25日月曜日
  8. 8. BTLEの使いどころ13年3月25日月曜日
  9. 9. BTLEの使いどころ13年3月25日月曜日
  10. 10. BTLEの使いどころ • 運動、健康、近接...13年3月25日月曜日
  11. 11. BTLEの使いどころ • 運動、健康、近接... • Appcessory13年3月25日月曜日
  12. 12. BTLEの使いどころ • 運動、健康、近接... • Appcessory • ハード、スマフォ、ネット13年3月25日月曜日
  13. 13. BTLEの使いどころ • 運動、健康、近接... • Appcessory • ハード、スマフォ、ネット • ぶっちゃけ13年3月25日月曜日
  14. 14. BTLEの使いどころ • 運動、健康、近接... • Appcessory • ハード、スマフォ、ネット • ぶっちゃけ • ハードメーカがスマフォで 売れるぜは死亡フラグ13年3月25日月曜日
  15. 15. BTLEの使いどころ • 運動、健康、近接... • Appcessory • ハード、スマフォ、ネット • ぶっちゃけ • ハードメーカがスマフォで 売れるぜは死亡フラグ • 異世界にようこそ13年3月25日月曜日
  16. 16. iOSとBTLE • iOSデバイスのBluetooth4対応 • iPhone4S (2011年10月発売) 以降のApple社製品 、iOS5 / iOS6 • BTLE対応アプリのストア承認 • Made for iPhone(MFi) NDA締結不要 (ロゴ掲載には必要) • ハードウェアの提出は求められるかも • 開発環境 • CoreBluetoothフレームワーク (一般開発者が使える) • 従来BT • MFi必須。13年3月25日月曜日
  17. 17. 実際に動かしてみる13年3月25日月曜日
  18. 18. デバイスの確認 • iOS5/6の iPhone4S以降のiOSデバイス • BTLE キーホルダ(BSHSBTPT01BK) • Xcode 4.5.1以上13年3月25日月曜日
  19. 19. サンプルコードを開く • ソースコード • https://github.com/reinforce-lab/CoreBluetooth_samples • プロジェクト first_sample/KeyFobSample.xcodeproj13年3月25日月曜日
  20. 20. keyfobと接続 • デバイス一覧 • RSSIが一番大きい(マイナスの数字が小さい) 行を選択 • Immediate alert • Buzzerを押す13年3月25日月曜日
  21. 21. keyfobと接続 • デバイス一覧 • RSSIが一番大きい(マイナスの数字が小さい) 行を選択 • Immediate alert • Buzzerを押す13年3月25日月曜日
  22. 22. keyfobと接続 • デバイス一覧 • RSSIが一番大きい(マイナスの数字が小さい) 行を選択 • Immediate alert • Buzzerを押す13年3月25日月曜日
  23. 23. BTLEデバイスとの通信手順 • デバイスの発見 • 接続 • 読み書き • 切断13年3月25日月曜日
  24. 24. コードを読んでみる13年3月25日月曜日
  25. 25. フレームワークの追加13年3月25日月曜日
  26. 26. フレームワークの追加13年3月25日月曜日
  27. 27. フレームワークの追加13年3月25日月曜日
  28. 28. フレームワークの追加 #import "KeyFobController.h" #import <CoreBluetooth/CoreBluetooth.h> @interface KeyFobController() <CBCentralManagerDelegate, CBPeripheralDelegate> { CBCentralManager *_centralManager;13年3月25日月曜日
  29. 29. フレームワークの追加 #import "KeyFobController.h" #import <CoreBluetooth/CoreBluetooth.h> @interface KeyFobController() <CBCentralManagerDelegate, CBPeripheralDelegate> { CBCentralManager *_centralManager; • CoreBluetooth.frameworkを追加 • #import <CoreBluetooth/CoreBluetooth.h> • CBCentralManagerDelegate, CBPeripheralDelegate を実装13年3月25日月曜日
  30. 30. デバイスの発見13年3月25日月曜日
  31. 31. ネットワーク・トポロジ • スター型 • 接続数の上限がない • クラシックBTは7 • 役割が非対称 セントラル • ペリフェラルがより低消 (Central) 費電力 ペリフェラル (Peripheral)13年3月25日月曜日
  32. 32. データモデル セントラル ペリフェラル (Central) (Peripheral) CBCentralManager CBPeripheral13年3月25日月曜日
  33. 33. ペリフェラル・デバイスの発見 • アドバタイズメント Ad • パケットを送信 Ad • 20ミリ秒~1.3秒周期 Ad • デバイス名などの情報 Ad13年3月25日月曜日
  34. 34. 13年3月25日月曜日
  35. 35. 13年3月25日月曜日
  36. 36. 13年3月25日月曜日
  37. 37. -(void)startScanning { // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です NSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID, _immediateAlertServiceUUID, nil]; // スキャンにはオプションが指定できます。 // いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。 // 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。 // デフォルトでNOです。 NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; // デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。 // このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケ ットの(2.4GHzの)受信処理で、RF回路は電力を消費します。 [_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions]; }13年3月25日月曜日
  38. 38. -(void)startScanning { // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です NSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID, _immediateAlertServiceUUID, nil]; // スキャンにはオプションが指定できます。 // いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。 // 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。 // デフォルトでNOです。 NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; // デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。 // このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケ ットの(2.4GHzの)受信処理で、RF回路は電力を消費します。 [_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions]; }13年3月25日月曜日
  39. 39. -(void)startScanning { // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です NSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID, _immediateAlertServiceUUID, nil]; // スキャンにはオプションが指定できます。 // いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。 // 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。 // デフォルトでNOです。 NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; // デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。 // このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケ ットの(2.4GHzの)受信処理で、RF回路は電力を消費します。 [_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions]; }13年3月25日月曜日
  40. 40. -(void)startScanning { // BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨です NSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID, _immediateAlertServiceUUID, nil]; // スキャンにはオプションが指定できます。 // いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。 // 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。 // デフォルトでNOです。 NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; // デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。 // このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケ ットの(2.4GHzの)受信処理で、RF回路は電力を消費します。 [_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions]; }13年3月25日月曜日
  41. 41. アドバタイズメントのフィルタ • 重複を許すか Ad • 通常はNO Ad • 近接ならYES Ad • ”受信したとき”に通知 • サービス(機能)でフィルタ Ad13年3月25日月曜日
  42. 42. // デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisementDataから得られます。デバイス名などで判別 します。 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)p advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { // 同一機種が周囲に複数あるとき、自分がもっているものだけに接続するには、UUIDが同じかを判定します。 // !!注意!! iOS6では、一度も接続したことがない装置のUUIDはnilになります。一度でも接続すればUUIDが 取れます。ここでは、一度は接続したことがある前提でUUIDを比較しています。 /* CBUUID *targetUUID = [CBUUID UUIDWithString:@"00000000-0000-0000-2F0C-F0289947EA35"]; if(peripheral.UUID == nil || ! [[CBUUID UUIDWithCFUUID:peripheral.UUID].data isEqualToData:targetUUID.data]) return; */ NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) { PeripheralContainer *c = [[PeripheralContainer alloc] init]; c.peripheral = p; c.RSSI = RSSI; [self findPeripheral:c]; } }13年3月25日月曜日
  43. 43. // デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisementDataから得られます。デバイス名などで判別 します。 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)p advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { // 同一機種が周囲に複数あるとき、自分がもっているものだけに接続するには、UUIDが同じかを判定します。 // !!注意!! iOS6では、一度も接続したことがない装置のUUIDはnilになります。一度でも接続すればUUIDが 取れます。ここでは、一度は接続したことがある前提でUUIDを比較しています。 /* CBUUID *targetUUID = [CBUUID UUIDWithString:@"00000000-0000-0000-2F0C-F0289947EA35"]; if(peripheral.UUID == nil || ! [[CBUUID UUIDWithCFUUID:peripheral.UUID].data isEqualToData:targetUUID.data]) return; */ NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) { PeripheralContainer *c = [[PeripheralContainer alloc] init]; c.peripheral = p; c.RSSI = RSSI; [self findPeripheral:c]; } }13年3月25日月曜日
  44. 44. // デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisementDataから得られます。デバイス名などで判別 します。 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)p advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { パケット・データ 受信信号強度 // 同一機種が周囲に複数あるとき、自分がもっているものだけに接続するには、UUIDが同じかを判定します。 // !!注意!! iOS6では、一度も接続したことがない装置のUUIDはnilになります。一度でも接続すればUUIDが 取れます。ここでは、一度は接続したことがある前提でUUIDを比較しています。 /* CBUUID *targetUUID = [CBUUID UUIDWithString:@"00000000-0000-0000-2F0C-F0289947EA35"]; if(peripheral.UUID == nil || ! [[CBUUID UUIDWithCFUUID:peripheral.UUID].data isEqualToData:targetUUID.data]) return; */ NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) { PeripheralContainer *c = [[PeripheralContainer alloc] init]; c.peripheral = p; c.RSSI = RSSI; [self findPeripheral:c]; } }13年3月25日月曜日
  45. 45. // デバイスの発見時処理を行います。 // スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す るかもしれません。 // アドバタイズメント・パケットに含まれる情報は、advertisementDataから得られます。デバイス名などで判別 します。 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)p advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { パケット・データ 受信信号強度 // 同一機種が周囲に複数あるとき、自分がもっているものだけに接続するには、UUIDが同じかを判定します。 // !!注意!! iOS6では、一度も接続したことがない装置のUUIDはnilになります。一度でも接続すればUUIDが 取れます。ここでは、一度は接続したことがある前提でUUIDを比較しています。 /* CBUUID *targetUUID = [CBUUID UUIDWithString:@"00000000-0000-0000-2F0C-F0289947EA35"]; if(peripheral.UUID == nil || ! [[CBUUID UUIDWithCFUUID:peripheral.UUID].data isEqualToData:targetUUID.data]) return; */ NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) { PeripheralContainer *c = [[PeripheralContainer alloc] init]; c.peripheral = p; c.RSSI = RSSI; [self findPeripheral:c]; } }13年3月25日月曜日
  46. 46. アドバタイズメントで取れる情報 (1/1) • 名前、送信電力、その他 • CBAdvertisementDataLocalNameKey • CBAdvertisementDataTxPowerLevelKey • CBAdvertisementDataManufacturerDataKey • この3つの情報はキャッシュされない • LocalName以外はペリフェラルの設計次第 • 周囲へ一斉通知(ブロードキャスト) • 送信電力とRSSIから距離概算13年3月25日月曜日
  47. 47. アドバタイズメントで取れる情報 (2/2) • CBPeripheral インスタンス • UUID : 128-bitの識別番号 • 一度でも接続したことがあれば≠nil • RSSI : 受信信号強度 • 接続してreadRSSI:を呼び出せば≠nil • 切断しても同じUUIDを見つけて再接続 • LocalNameに、識別番号や、状態を入れたり13年3月25日月曜日
  48. 48. 接続と切断13年3月25日月曜日
  49. 49. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];}13年3月25日月曜日
  50. 50. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];}13年3月25日月曜日
  51. 51. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 必ずretain //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];}13年3月25日月曜日
  52. 52. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 必ずretain //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];}13年3月25日月曜日
  53. 53. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 必ずretain //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];}13年3月25日月曜日
  54. 54. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 必ずretain //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];} - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p; - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral: (CBPeripheral *)peripheral error:(NSError *)error;13年3月25日月曜日
  55. 55. -(void)connect:(PeripheralContainer *)c { //ターゲットを発見、接続します //この時点でperipheralはcentral managerに保持されていません。 必ずretain //少なくとも接続が完了するまでの間、peripheralをアプリ側で保持します。 //接続処理はタイムアウトしません。接続に失敗すれば centralManager:didFailToConnectPeripheral:error //接続処理を中止するには、peripheralを開放するか、明示的に cancelPeripheralConnection を呼び出します self.peripheral = c.peripheral; [_centralManager connectPeripheral:self.peripheral options:nil];}-(void)disconnect { // 切断処理をします。_peripheralをnilにするなどの、切断完了後処理は、 // centralManager:didDisconnectPeripheral:error: // で行います。 [_centralManager cancelPeripheralConnection:self.peripheral];} - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p; - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral: (CBPeripheral *)peripheral error:(NSError *)error; delegateで通知13年3月25日月曜日
  56. 56. サービスとキャラクタリスティクス そしてプロファイル13年3月25日月曜日
  57. 57. プロトコルスタック Applications Applications Applications Core Bluetooth GATT ATT L2CAP Link Layer PHY13年3月25日月曜日
  58. 58. プロトコルスタック Applications Applications Applications Core BluetoothXPC BTserver GATT ATT L2CAP Link Layer PHY13年3月25日月曜日
  59. 59. プロトコルスタック Applications Applications Applications Core BluetoothXPC BTserver GATT ATT L2CAP Link Layer PHY13年3月25日月曜日
  60. 60. プロトコルスタック Applications Applications Applications Core BluetoothXPC BTserver GATT ATT L2CAP Link Layer PHY13年3月25日月曜日
  61. 61. プロトコルスタック Applications Applications Applications Core BluetoothXPC BTserver GATT ATT L2CAP Link Layer ペリフェラル=データベース PHY ハンドル,タイプ,値13年3月25日月曜日
  62. 62. プロトコルスタック Applications Applications Applications Core BluetoothXPC BTserver GATT ATT L2CAP Link Layer PHY13年3月25日月曜日
  63. 63. プロトコルスタック Applications Applications Applications Core BluetoothXPC BTserver GATT ATT L2CAP Link Layer サービス=クラス キャラクタリスティクス PHY =プロパティ13年3月25日月曜日
  64. 64. プロトコルスタック Applications Applications サービス=クラス Applications キャラクタリスティクス Core BluetoothXPC =プロパティ BTserver GATT ATT L2CAP Link Layer PHY13年3月25日月曜日
  65. 65. プロトコルスタック Applications Applications サービス=クラス Applications キャラクタリスティクス Core BluetoothXPC =プロパティ BTserver GATT • キャラクタリスティクス ATT • 制御/動作指定 L2CAP • センサー値/外界の状態 Link Layer PHY • (装置の)動作状態/内部状態13年3月25日月曜日
  66. 66. サービスとキャラクタリスティクス そしてプロファイル13年3月25日月曜日
  67. 67. サービスと振る舞いの分離デバイス発見 Find ME Profile Proximity Profile 切断時の警告 http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml13年3月25日月曜日
  68. 68. サービスと振る舞いの分離デバイス発見 Find ME Immediate 振動やブザー Profile Alert Service を出力 Tx Power 送信電力 Proximity Service Profile の値 切断時の警告 Link Loss 切断時の Alert Service 振る舞い指定 http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml13年3月25日月曜日
  69. 69. サービスと振る舞いの分離デバイス発見 Find ME Immediate 振動やブザー Profile Alert Service を出力 Tx Power 送信電力 Proximity Service Profile の値 切断時の警告 Link Loss 切断時の Alert Service 振る舞い指定 http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml13年3月25日月曜日
  70. 70. サービスと振る舞いの分離ユースケース ハード仕様デバイス発見 Find ME Immediate 振動やブザー Profile Alert Service を出力 Tx Power 送信電力 Proximity Service Profile の値 切断時の警告 Link Loss 切断時の Alert Service 振る舞い指定 http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml13年3月25日月曜日
  71. 71. プロファイルの実装 Applications Applications Applications • プロファイルがアプリ側 Core Bluetooth • 任意の振る舞い、OK • すべてがアプリの管理下 GATT • 発見 ATT L2CAP • 接続/切断 Link Layer • 読み書き PHY • iOSはいっさい関係してこない13年3月25日月曜日
  72. 72. プロファイルの実装 Applications Applications Applications • プロファイルがアプリ側XPC Core Bluetooth • 任意の振る舞い、OK BTserver • すべてがアプリの管理下 GATT • 発見 ATT L2CAP • 接続/切断 Link Layer • 読み書き PHY • iOSはいっさい関係してこない13年3月25日月曜日
  73. 73. プロファイルの実装 Applications Applications Applications • プロファイルがアプリ側XPC Core Bluetooth • 任意の振る舞い、OK BTserver • すべてがアプリの管理下 GATT • 発見 ATT L2CAP • 接続/切断 Link Layer • 読み書き PHY • iOSはいっさい関係してこない13年3月25日月曜日
  74. 74. サービスとキャラクタリスティクスを 見てみる13年3月25日月曜日
  75. 75. 13年3月25日月曜日
  76. 76. 13年3月25日月曜日
  77. 77. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  78. 78. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  79. 79. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  80. 80. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  81. 81. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  82. 82. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  83. 83. • UUIDで識別 • 16-bit / 128-bit • 読み(read)/書き(write)/通知(notify)13年3月25日月曜日
  84. 84. サービスとキャラクタリスティクスの リスティング13年3月25日月曜日
  85. 85. #define kImmediateAlertServiceUUID @"1802" #define kLinkLossServiceUUID @"1803" #define kAlertLevelUUID @"2A06" ... _linkLossServiceUUID = [CBUUID UUIDWithString:kLinkLossServiceUUID]; _immediateAlertServiceUUID = [CBUUID UUIDWithString:kImmediateAlertServiceUUID]; _alertLevelUUID = [CBUUID UUIDWithString:kAlertLevelUUID];// 接続- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p { // サービスを探します self.peripheral.delegate = self; [p discoverServices:[NSArray arrayWithObjects: _linkLossServiceUUID, _immediateAlertServiceUUID, _txPowerServiceUUID, _batteryLevelServiceUUID, nil]];}13年3月25日月曜日
  86. 86. #define kImmediateAlertServiceUUID @"1802" #define kLinkLossServiceUUID @"1803" #define kAlertLevelUUID @"2A06" ... _linkLossServiceUUID = [CBUUID UUIDWithString:kLinkLossServiceUUID]; _immediateAlertServiceUUID = [CBUUID UUIDWithString:kImmediateAlertServiceUUID]; _alertLevelUUID = [CBUUID UUIDWithString:kAlertLevelUUID];// 接続- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p { // サービスを探します self.peripheral.delegate = self; [p discoverServices:[NSArray arrayWithObjects: _linkLossServiceUUID, _immediateAlertServiceUUID, _txPowerServiceUUID, _batteryLevelServiceUUID, nil]];}13年3月25日月曜日
  87. 87. //発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error { for (CBService *service in p.services) { if ([service.UUID.data isEqualToData:_linkLossServiceUUID.data]) { [p discoverCharacteristics:[NSArray arrayWithObjects: _alertLevelUUID, nil] forService:service]; } else if ([service.UUID.data isEqualToData:_immediateAlertServiceUUID.data]) { [p discoverCharacteristics:[NSArray arrayWithObjects: _alertLevelUUID, nil] forService:service]; } }}- (void)peripheral:(CBPeripheral *)p didDiscoverCharacteristicsForService:(CBService*)service error:(NSError *)error{ if ([service.UUID.data isEqualToData:_batteryLevelServiceUUID.data]) { _batteryLevelCharacteristics = [self findCharacteristics:service.characteristicsuuid:_batteryLevelUUID]; _batteryLevelSwitchCharacteristics = [selffindCharacteristics:service.characteristics uuid:_batteryLevelSwitchUUID]; [p setNotifyValue:YES forCharacteristic:_batteryLevelSwitchCharacteristics]; [p readValueForCharacteristic:_batteryLevelCharacteristics]; [p readValueForCharacteristic:_batteryLevelSwitchCharacteristics]; }}13年3月25日月曜日
  88. 88. //発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error { for (CBService *service in p.services) { if ([service.UUID.data isEqualToData:_linkLossServiceUUID.data]) { [p discoverCharacteristics:[NSArray arrayWithObjects: _alertLevelUUID, nil] forService:service]; } else if ([service.UUID.data isEqualToData:_immediateAlertServiceUUID.data]) { [p discoverCharacteristics:[NSArray arrayWithObjects: _alertLevelUUID, nil] forService:service]; } }}- (void)peripheral:(CBPeripheral *)p didDiscoverCharacteristicsForService:(CBService*)service error:(NSError *)error{ if ([service.UUID.data isEqualToData:_batteryLevelServiceUUID.data]) { _batteryLevelCharacteristics = [self findCharacteristics:service.characteristicsuuid:_batteryLevelUUID]; _batteryLevelSwitchCharacteristics = [selffindCharacteristics:service.characteristics uuid:_batteryLevelSwitchUUID]; [p setNotifyValue:YES forCharacteristic:_batteryLevelSwitchCharacteristics]; [p readValueForCharacteristic:_batteryLevelCharacteristics]; [p readValueForCharacteristic:_batteryLevelSwitchCharacteristics]; }}13年3月25日月曜日
  89. 89. //発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error { for (CBService *service in p.services) { if ([service.UUID.data isEqualToData:_linkLossServiceUUID.data]) { [p discoverCharacteristics:[NSArray arrayWithObjects: _alertLevelUUID, nil] forService:service]; } else if ([service.UUID.data isEqualToData:_immediateAlertServiceUUID.data]) { [p discoverCharacteristics:[NSArray arrayWithObjects: _alertLevelUUID, nil] forService:service]; } }}- (void)peripheral:(CBPeripheral *)p didDiscoverCharacteristicsForService:(CBService*)service error:(NSError *)error{ if ([service.UUID.data isEqualToData:_batteryLevelServiceUUID.data]) { _batteryLevelCharacteristics = [self findCharacteristics:service.characteristicsuuid:_batteryLevelUUID]; _batteryLevelSwitchCharacteristics = [selffindCharacteristics:service.characteristics uuid:_batteryLevelSwitchUUID]; [p setNotifyValue:YES forCharacteristic:_batteryLevelSwitchCharacteristics]; [p readValueForCharacteristic:_batteryLevelCharacteristics]; [p readValueForCharacteristic:_batteryLevelSwitchCharacteristics]; }}13年3月25日月曜日
  90. 90. - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic: (CBCharacteristic *)characteristic error:(NSError *)error { uint8_t b; if(characteristic == _txPowerCharacteristic) { [characteristic.value getBytes:&b length:1]; self.txPower = b; LSB-first (Least Significant Byte First)13年3月25日月曜日
  91. 91. まとめ • BTLE • 超低消費電力、なんとなくつながる • iOSとBTLE • MFi不要、一般開発者権限 • 振るまいと機能の分離 • プロファイルはアプリ次第13年3月25日月曜日
  92. 92. 開発体制 • ハード+プロファイル部分を担当すべし • 無線接続と振る舞い • デモアプリで動作確認、責任分界 • ドキュメント、読める? • 納品後のトラブル (iOSの振舞い変化)13年3月25日月曜日
  93. 93. 参考13年3月25日月曜日
  94. 94. 情報源(1/3) • https://developer.apple.com/videos/wwdc/2012/ • Session 703: Core Bluetooth 101 • Session 705 Advanced Core Bluetooth • Apple Bluetooth Mailing list • https://lists.apple.com/mailman/listinfo/ bluetooth-dev13年3月25日月曜日
  95. 95. 情報源(2/3) • Texus Instruments社 • http://www.tij.co.jp/product/jp/cc2540 • http://processors.wiki.ti.com/index.php/ Category:BluetoothLE? DCMP=blestack&HQS=ble-wiki • Nordic Semiconductor社 • https://www.nordicsemi.com • BlueGiga • http://www.bluegiga.com13年3月25日月曜日
  96. 96. 情報源(3/3) • AppleのBluetoothアクセサリ設計指針 (おすすめ) • Bluetooth Low Energy Handbook (おすすめ) • Bluetooth4 Core Specificaiton (辞書的に)13年3月25日月曜日
  97. 97. ぶっちゃけ13年3月25日月曜日
  98. 98. • CoreBluetoothを使う必要あるの? • API公開(Wahoo、NODE、konashi...) • ハード販売、サービス展開 • 自分で開発展開 • ハードウェア開発? • 半導体/モジュール (組込開発) • iOSでペリフェラル開発 (iOS6から)13年3月25日月曜日
  99. 99. オリジナル開発 • 半導体買ってきて回路を作ると • BT認証 1万ドル、電波法 40万円(実費)。 • 1万台以上作るなら • モジュール • 日本の認証OKなのが4月から続々。 • BlueGiga、おすすめ • BASICみたいなスクリプト開発。 • 冗談みたいなお手軽さ。13年3月25日月曜日
  100. 100. • ペリフェラルの設計 • http://e2e.ti.com/support/low_power_rf/f/538/t/225290.aspx • リファレンス設計/コード • 必要な場面 • 制御が入るとか、応答速度が必要とか • RFチップ+外付けマイコン • RFチップ+RFチップ内蔵マイコン • 開発環境 TI社 8051互換 ~40万円、Nordic Semi.社 Cortex-M0 ~20万円 (32kBまで無償 版あり)13年3月25日月曜日
  101. 101. こまったときの • 何が何やら、わけがわかんないよ • 通信の把握が勝利の • TI社のCC2540開発キットでパケットスニファ • iOS6.0で、切断時にiOSが1分ほど接続保持ー>アドバタ イズ出ない13年3月25日月曜日
  102. 102. 今時のBTLE • BTLEデバイス、Over-the-airでファーム更新 • Kickstarterむっちゃでてる • 10万台の呪い。日本、しんでる • 覚えていますか • 記憶にすら残らない、NECカシオの MEDIASとリモッピとG-SHOCK。まじ、 ショック13年3月25日月曜日
  103. 103. 他のプラットホーム • Android • チップメーカ独自スタック、公式BTLE対応なし • できることはiOSと同じ。GATTを叩ける。 • BT3/4混在、Android4。 • ねらってもできない統一性のなさ • 5月のGoogle IO、ドコモの健康なんとか? • Windows Phone8 •公式スタックなし、BT3が最新機種 • Windows8 •ハード認定要件にBT4、スタック公式サポート13年3月25日月曜日 • C+でドライバ
  104. 104. あどばんす13年3月25日月曜日
  105. 105. • アプリ • バックグラウンド • CBPeripheralManager • ハード開発 • 情報源13年3月25日月曜日
  106. 106. 13年3月25日月曜日
  107. 107. 13年3月25日月曜日
  108. 108. 13年3月25日月曜日
  109. 109. 13年3月25日月曜日
  110. 110. Central Central client Peripheral Peripheral server13年3月25日月曜日
  111. 111. • サンプルファイル • ペリフェラル(デバイス) •13年3月25日月曜日
  112. 112. Central Peripheral CBCentralManager CBPeripheralManager CBPeripheral CBCentral13年3月25日月曜日
  113. 113. iOS5 iOS6 Main Objects CBCentralManager CBPeripheralManager Data CBPeripheral CBCentral Objects CBService CBMutableService CBCharacteristics CBMutableCharacteri13年3月25日月曜日
  114. 114. Central Peripheral Ad Ad Ad13年3月25日月曜日
  115. 115. discover and connect CBCentralManager Periphearl device scanForPeripheralsWithServices didDiscoverPeripheral stopScan connectPeripheral didConnectPeripheral13年3月25日月曜日
  116. 116. Central Peripheral CBService Service CBCharacteristic Characteristic Characteristic13年3月25日月曜日
  117. 117. CBPeripheral CBPeripheralDelegate discoverServices didDiscoverServicesdiscoverCharacteristics:forService didDiscoverCharacteristicsForSer vice13年3月25日月曜日
  118. 118. CBPeripheral CBPeripheralDelegate readValueForCharacteristic didUpdateValueForCharacteristics setNotifyValue:forCharacteristic didUpdateValueForCharacteristics13年3月25日月曜日
  119. 119. • Scan and Connect • Reconnecting using UUID • Already connected? •13年3月25日月曜日
  120. 120. discover and connect CBCentralManager Periphearl device retrievePeripherals didRetrievePeripherals connectPeripheral didConnectPeripheral13年3月25日月曜日
  121. 121. iOS background • Background app • Scan and advertise • Connect • Interact • “Start and stop”concept • Info.plist13年3月25日月曜日
  122. 122. • Foreground app • High-intensity scanning • Bacground app/screen off • Low-intensity scanning •13年3月25日月曜日
  123. 123. • Ad • Name • Tx Power • Service UUID • Service Data • Max: 31 bytes13年3月25日月曜日
  124. 124. • 16-bit UUID • assigned by Bluetooth SIG • http://develper/bluetooth.org • 128-bit UUID • assigned by you! • コマンドライン uuidgen13年3月25日月曜日
  125. 125. • Centralがキャッシュするもの • 発見したServiceとCharacteristics • Valueはキャッシュされない •13年3月25日月曜日
  126. 126. ペアリング • ペアリング • 接続する、認証されてないー>拒否 • Insufficient Authentication • ペアリング、暗号化 • AES-128、公開13年3月25日月曜日
  127. 127. BTLE available? • CBCentralManager • delegate CBCentralManagerDelegate • state CBCentralManagerState • unknown -> 遷移 • 使う前にチェック13年3月25日月曜日
  128. 128. 13年3月25日月曜日
  129. 129. Bluetooth Smart ready と ready • 2種類の周辺機器 • デュアル・モード = クラシックBT + LE 両方搭載 • シングル・モード = LEのみ • 接続問題 • シングル・モード デバイスはクラシックBTとつながらない • SMART READY (デュアル) / SMART (シングル) ロゴ http://www.bluetooth.com/Pages/Smart-Logos.aspx13年3月25日月曜日
  130. 130. ちょっと規格の話13年3月25日月曜日
  131. 131. 13年3月25日月曜日
  132. 132. 13年3月25日月曜日
  133. 133. 13年3月25日月曜日
  134. 134. 13年3月25日月曜日
  135. 135. 13年3月25日月曜日

×