「合宿」 - Bluetooth Low Energy +iPhone ハンズオン ワークショップ403 Forbidden6月1日(合)わふう 上原 昭宏(有)トリガーデバイス 佐藤 忠彦13年5月31日金曜日
目次• Bluetooth Low Energyって?• センサータグを使う• キーホルダーを操る• iOSらしいBluetooth LEの使い方?13年5月31日金曜日
Bluetooth Low Energy13年5月31日金曜日
Bluetoothの歴史13年5月31日金曜日
Bluetoothの歴史13年5月31日金曜日
Bluetoothの歴史2007V2.1 EDR13年5月31日金曜日
Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed13年5月31日金曜日
Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy13年5月31日金曜日
Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension13年5月31日金曜日
Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension2006Wibree13年5月31日金曜日
Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension2006Wibree2010V4.0 Low Energy=...
Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension2006Wibree2010V4.0 Low Energy=...
Bluetooth Low Energyとは13年5月31日金曜日
Bluetooth Low Energyとは13年5月31日金曜日
Bluetooth Low Energyとは13年5月31日金曜日
Bluetooth SMART ロゴ• SMART / SMART READY13年5月31日金曜日
iOSとBTLE• iOSデバイスのBluetooth4対応• iPhone4S (2011年10月発売) 以降のApple社製品 、iOS5 / iOS6• BTLE対応アプリのストア承認• Made for iPhone(MFi) NDA締...
BTLEの使いどころ13年5月31日金曜日
BTLEの使いどころ13年5月31日金曜日
BTLEの使いどころ13年5月31日金曜日
BTLEの使いどころ13年5月31日金曜日
BTLEの使いどころ• 運動、健康、近接...13年5月31日金曜日
BTLEの使いどころ• 運動、健康、近接...• Appcessory13年5月31日金曜日
BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット13年5月31日金曜日
BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット• ぶっちゃけ13年5月31日金曜日
BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット• ぶっちゃけ• ハードメーカがスマフォで売れるぜは死亡フラグ13年5月31日金曜日
BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット• ぶっちゃけ• ハードメーカがスマフォで売れるぜは死亡フラグ• 異世界にようこそ13年5月31日金曜日
Sensor Tagで遊ぶ13年5月31日金曜日
http://goo.gl/d3HUL13年5月31日金曜日
http://goo.gl/Sf3p713年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
プロジェクト例13年5月31日金曜日
http://www.kickstarter.com13年5月31日金曜日
http://getpebble.com13年5月31日金曜日
http://www.kickstarter.com/projects/alphaheartrate/alpha-the-holy-grail-of-heart-rate-look-ma-no-hand13年5月31日金曜日
http://www.kickstarter.com/projects/embraceplus/embrace-a-smart-piece-of-wearable-technology13年5月31日金曜日
http://www.kickstarter.com/projects/667986286/wave-a-lighted-wristband-controlled-by-your-smartp13年5月31日金曜日
http://www.kickstarter.com/projects/kennygibbs/helios-bars-transform-any-bike-into-a-smart-bike13年5月31日金曜日
http://www.automatic.com13年5月31日金曜日
http://www.kickstarter.com/projects/806146824/melon-a-headband-and-mobile-app-to-measure-your-fo13年5月31日金曜日
http://www.switch-science.com/catalog/978/13年5月31日金曜日
http://www.lumoback.com13年5月31日金曜日
プロトタイピング• 汎用か、特殊か• 市販品? 特別なセンサが必要?• アプリケーションとハード開発• 電波を出すもの• 電波法のもとで承認13年5月31日金曜日
ハードウェア• 部品として• センサーまで搭載したもの• 市販品でSDKがあるもの13年5月31日金曜日
TI Sensor tagIR temperature SensorHumidity SensorPressure SensorAccelerometerGyroscopeMagnetometerhttp://www.ti.com/tool/c...
NODEhttp://www.variabletech.com13年5月31日金曜日
市販品:フィットネス• http://www.wahoofitness.com• 心拍、体重、自転車のトレーニング、速度• SDKがある13年5月31日金曜日
Konashihttp://konashi.ux-xu.com13年5月31日金曜日
RFduinohttp://www.rfduino.com13年5月31日金曜日
ファームウェア開発• Texus Instruments社 CC2541• 開発環境 : IAR Embedded Workbench(~4000ドル位)• iPhoneから無線で、ファームウェアアップデート (プロトコルスタック ver1.3...
• RF回路部分を小さな基板にまとめたもの• ハード側に手を入れるときに• 開発:スクリプト/C言語• 認証• 電波法 (各国ごとに1万ドルくらい)• Bluetooth 製品登録 (1万ドルくらい)モジュールhttp://www.bluegi...
アプリ開発• CoreBluetooth / SDK• techBASIC• BASICスクリプト• http://www.byteworks.us/Byte_Works/techBASIC.html• Building iPhone and ...
目次• キーホルダーを使ってみる• CoreBluetoothの使い方• プロトコルの理解13年5月31日金曜日
手元のデバイス確認• iOS5/6の iPhone4S以降のiOSデバイス• BTLE キーホルダ(BSHSBTPT01BK)• Xcode 4.5.1以上• ファイルhttp://goo.gl/CGFwG13年5月31日金曜日
実際に動かしてみる13年5月31日金曜日
サンプルコードを開く• ソースコード• https://github.com/reinforce-lab/CoreBluetooth_samples• 短縮URL http://goo.gl/FhrBW• プロジェクト BSHSBTPT01_s...
実行する1. MacにiPhone(iPod touch)を接続2. 左上のプルダウンメニューから、ターゲットに実機を選択3. Runアイコンを押して動かす13年5月31日金曜日
Bluetoothの設定13年5月31日金曜日
Bluetoothの設定13年5月31日金曜日
Bluetoothの設定設定→Bluetooth13年5月31日金曜日
Bluetoothの設定設定→Bluetooth13年5月31日金曜日
Bluetoothの設定設定→Bluetooth13年5月31日金曜日
13年5月31日金曜日
RSSI : 受信信号強度 Received signal strength indicationRSSIの値が、最も大きいもの(符号がマイナスなので数値が小さいもの)を選択13年5月31日金曜日
RSSI : 受信信号強度 Received signal strength indicationRSSIの値が、最も大きいもの(符号がマイナスなので数値が小さいもの)を選択13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
CoreBluetoothの機能:受信信号強度RSSI:受信信号強度電力(dBm) = 10log電力(mW)絶対値をあてにはしない一桁違う=10違う実験離す(3.2倍の距離で1/10)向きを変える(指向性)用途距離の目安13年5月31日金曜日
CoreBluetoothの機能:受信信号強度RSSI:受信信号強度電力(dBm) = 10log電力(mW)絶対値をあてにはしない一桁違う=10違う実験離す(3.2倍の距離で1/10)向きを変える(指向性)用途距離の目安13年5月31日金曜日
Immediate Alertサービスサービス = BTLEの機能Immediate Alert直ちにアラートを鳴らす一番下のボタンVibration, Buzzer常時接続だから動作13年5月31日金曜日
Immediate Alertサービスサービス = BTLEの機能Immediate Alert直ちにアラートを鳴らす一番下のボタンVibration, Buzzer常時接続だから動作13年5月31日金曜日
Link lossサービスBTLEの機能 = サービスLink loss無線接続が切れた時の、動作Vibration, Buzzer設定->BluetoothでOFF13年5月31日金曜日
Link lossサービスBTLEの機能 = サービスLink loss無線接続が切れた時の、動作Vibration, Buzzer設定->BluetoothでOFF13年5月31日金曜日
BTLEのしくみ13年5月31日金曜日
チェックポイント• CoreBluetoothフレームワークの作り、動き• BTLEの規格(考え方)を素直に反映• 振る舞いに関係する要素• 通信によるもの、iOSの動作、アプリの作り• どこをどう手直しすればいいのか?• アプリだけ見ていても...
パケット通信13年5月31日金曜日
ネットワーク・トポロジ• スター型• 接続数の上限がない• スキャッタネットはない• ペリフェラルが同時に2つのセントラルと接続セントラル(Central)ペリフェラル(Peripheral)13年5月31日金曜日
ネットワーク・トポロジ• スター型• 接続数の上限がない• スキャッタネットはない• ペリフェラルが同時に2つのセントラルと接続セントラル(Central)ペリフェラル(Peripheral)13年5月31日金曜日
ネットワーク・トポロジ• スター型• 接続数の上限がない• スキャッタネットはない• ペリフェラルが同時に2つのセントラルと接続セントラル(Central)ペリフェラル(Peripheral)✗13年5月31日金曜日
無線でビットを送る13年5月31日金曜日
無線でビットを送る13年5月31日金曜日
無線でビットを送る13年5月31日金曜日
BTLEの電波の使い方引用: http://www.digikey.com/us/es/techzone/wireless/resources/articles/bluetooth-low-energy-technology.html13年5月...
BTLEの電波の使い方引用: http://www.digikey.com/us/es/techzone/wireless/resources/articles/bluetooth-low-energy-technology.htmlhttp:...
ペリフェラルの発見• アドバタイズメント• パケットを送信• 20ミリ秒~1.3秒周期• デバイス名などの情報AdAdAdAd13年5月31日金曜日
ペリフェラルの発見• アドバタイズメント• パケットを送信• 20ミリ秒~1.3秒周期• デバイス名などの情報AdAdAdAd13年5月31日金曜日
余談 : 低消費電力の工夫AdttAdAdAdAdペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫Adt受信tAdAdAdAdペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫Ad Adt受信tAdAdAdAdペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫Ad Adt受信tAdAdAdAdペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫Ad Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫• 消費電力Ad Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫• 消費電力• 受信はとても食うAd Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫• 消費電力• 受信はとても食う• 受信の時間が長いAd Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
余談 : 低消費電力の工夫• 消費電力• 受信はとても食う• 受信の時間が長い• セントラルの役目Ad Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
余談 : 通信の工夫パケットttペリフェラルセントラル 返信13年5月31日金曜日
余談 : 通信の工夫パケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
余談 : 通信の工夫• チャネルごとにパケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなうパケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなう• チャネルを切り替えるパケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなう• チャネルを切り替える• 何回か応答がなければ、切断パケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなう• チャネルを切り替える• 何回か応答がなければ、切断パケットt受信tペリフェラルセントラル 返信受信13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
適応周波数ホッピング13年5月31日金曜日
まとめ• スター型• アドバタイズメント・パケット• 適応周波数ホッピング13年5月31日金曜日
CoreBluetoothを使う13年5月31日金曜日
ペリフェラルの発見(アドバタイズメント・パケットの受信)13年5月31日金曜日
フレームワークの追加13年5月31日金曜日
フレームワークの追加13年5月31日金曜日
フレームワークの追加13年5月31日金曜日
フレームワークの追加#import "KeyFobController.h"#import <CoreBluetooth/CoreBluetooth.h>@interface KeyFobController()<CBCentralManage...
フレームワークの追加• CoreBluetooth.frameworkを追加• #import <CoreBluetooth/CoreBluetooth.h>• CBCentralManagerDelegate,CBPeripheralDele...
モデルセントラル(Central)ペリフェラル(Peripheral)CBCentralManagerCBPeripheral1. CBCentralManagerのインスタンスを作る2. CBPeriperalを見つけて取得13年5月31日金曜日
KeyFobController.m 98行KeyFobController.m 280行13年5月31日金曜日
KeyFobController.m 98行KeyFobController.m 280行13年5月31日金曜日
ペリフェラルの発見• アドバタイズメント• パケットを送信• 20ミリ秒~1.3秒周期• デバイス名などの情報AdAdAdAd13年5月31日金曜日
KeyFobController.m 206行13年5月31日金曜日
KeyFobController.m 206行13年5月31日金曜日
KeyFobController.m 206行13年5月31日金曜日
-(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLos...
-(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLos...
-(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLos...
-(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLos...
アドバタイズメントのフィルタ• 重複を許すか• 通常はNO• 近接ならYES• ”受信したとき”に通知• サービス(機能)でフィルタAdAdAdAd13年5月31日金曜日
// デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、advertisement...
// デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、advertisement...
// デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、advertisement...
// デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、advertisement...
アドバタイズメントで取れる情報 (1/1)• 名前、送信電力、その他• CBAdvertisementDataLocalNameKey• CBAdvertisementDataTxPowerLevelKey• CBAdvertisementDa...
アドバタイズメントで取れる情報 (2/2)• CBPeripheral インスタンス• UUID : 128-bitの識別番号• 一度でも接続したことがあれば≠nil• UUIDは、iPhoneごとに異なる• RSSI : 受信信号強度• 接続...
接続と切断13年5月31日金曜日
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
-(void)connect:(PeripheralContainer *)c {//ターゲットを発見、接続します//この時点でperipheralはcentral managerに保持されていません。//少なくとも接続が完了するまでの間、pe...
接続と切断までのまとめ• BTLEのアドバタイズメントと接続/切断• クラシックBTとの振る舞いの差異• ペアリングはない• iOSは接続に無関係• iOSのBTデバイスリストに表示されない13年5月31日金曜日
サービスとキャラクタリスティクスそしてプロファイル13年5月31日金曜日
プロトコルスタックApplicationsGATTATTL2CAPPHYLink LayerApplicationsCore BluetoothApplicationsXPCBTserver13年5月31日金曜日
プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserverペリフェラル=データベースハンドル,タイプ,値13年5...
プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserverサービス=クラスキャラクタリスティクス=プロパティ13...
プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserver• キャラクタリスティクス• 制御/動作指定• センサ...
プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserverペリフェラル=データベースハンドル,タイプ,値13年5...
サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlFind...
サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlImme...
サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlImme...
サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlImme...
プロファイルの実装ApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplications • プロファイルがアプリ側• 任意の振る舞い、OK• すべてがアプリの管理...
プロファイルの実装ApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserver• プロファイルがアプリ側• 任意の振る舞い、OK• ...
プロファイルの実装ApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserver• プロファイルがアプリ側• 任意の振る舞い、OK• ...
まとめ• GATT (Generic Attribute Profile)• サービス、キャラクタリスティクス• プロファイル(振る舞い)はアプリが実装• デバイスドライバ相当• クラシックBluetooth• OS管理(ヘッドセット、キーボード...
サービスとキャラクタリスティクスを見てみる13年5月31日金曜日
http://goo.gl/oYjrc13年5月31日金曜日
http://goo.gl/oYjrc13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
• UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
CBフレームワークの使い方:サービスとキャラクタリスティクスのリスティング13年5月31日金曜日
// 接続- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p {// サービスを探しますself.periphera...
// 接続- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p {// サービスを探しますself.periphera...
//発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error {for (CBServi...
//発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error {for (CBServi...
//発見したサービスに対して、Characteristicsを探します- (void)peripheral:(CBPeripheral *)p didDiscoverServices:(NSError *)error {for (CBServi...
まとめ• BTLE• 超低消費電力、なんとなくつながる• iOSとBTLE• MFi不要、一般開発者権限• 振るまいと機能の分離• プロファイルはアプリ次第13年5月31日金曜日
バックグラウンドアプリ• バックグラウンド動作• デバイス発見頻度は∼12分に1回くらい• 電話通知のデモンストレーション13年5月31日金曜日
13年5月31日金曜日
KeyFobController.m 115行目13年5月31日金曜日
心拍センサ• メーカのSDK• Appleなどのサンプル• BTLEのプロファイル13年5月31日金曜日
http://api.wahoofitness.com13年5月31日金曜日
http://www.wahoofitness.com/api/?returnFull=1&13年5月31日金曜日
13年5月31日金曜日
http://developer.apple.com/library/mac/#samplecode/HeartRateMonitor/Introduction/Intro.html13年5月31日金曜日
http://developer.apple.com/library/mac/#samplecode/HeartRateMonitor/Introduction/Intro.html13年5月31日金曜日
h.org/gatt/profiles/Pages/ProfilesHome.aspx13年5月31日金曜日
13年5月31日金曜日
http://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml13年5月31日金曜日
13年5月31日金曜日
http://www.ti.com/tool/cc2540dk-miniCC2540/2541 mini development kit100ドル13年5月31日金曜日
http://processors.wiki.ti.com/index.php/BLE_sniffer_guide13年5月31日金曜日
まとめ• 市販品であればSDK• 標準プロファイルであればCB• 未公開ならスニッフィング• 開発分担• プロファイルまで含めてハード側13年5月31日金曜日
オリジナル開発• ハードウェア+ドライバ相当が切り口• デモ(動作確認、検証)アプリが大事• ペアリングのユーザインタフェース• アプリの振る舞い、ハードの仕様13年5月31日金曜日
ハードウェアが絡む開発• 挙動 = ハード × 通信 × iOS(BTserver)• iOS6.0での悲劇• 本当のデバイスの切断が30秒後• スニッフィングしないとわからない• ハード単体?• 責任の分界点、デモアプリ• ネットワークアプリ...
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
情報源• 目的• 基礎知識、入門知識• 最新情報の収集• 分野• ハードウェア• アプリ• サービス13年5月31日金曜日
Appleからの情報• https://developer.apple.com/videos/wwdc/2012/• Session 703: Core Bluetooth 101• Session 705 Advanced CoreBluet...
サービス、動向• Facebook BTLEグループ• https://www.facebook.com/groups/563064710384459/• Kickstarter ?• http://www.kickstarter.com/di...
半導体会社の情報• Texus Instruments社• http://www.tij.co.jp/product/jp/cc2540• http://processors.wiki.ti.com/index.php/Category:Blu...
書籍• AppleのBluetoothアクセサリ設計指針• Bluetooth Low Energy Handbook• http://www.amazon.co.jp/Bluetooth-Low-Energy-Developers-ebook...
Upcoming SlideShare
Loading in …5
×

20130601 btleハンズオンワークショップ

3,018 views

Published on

2013年6月1日に開催されてた、「合宿」 - Bluetooth Low Energy + iPhone ハンズオン ワークショップ ( http://connpass.com/event/2381/ )のプレゼンテーション資料。CoreBluetoothからBluetooth Low Energyのハードウェアを使うことを目的に、アプリ側からみた周辺機器の振る舞いを完全に理解するための基礎知識として、通信規格にまで踏み込んだ、やや深めの資料。

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,018
On SlideShare
0
From Embeds
0
Number of Embeds
104
Actions
Shares
0
Downloads
42
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

20130601 btleハンズオンワークショップ

  1. 1. 「合宿」 - Bluetooth Low Energy +iPhone ハンズオン ワークショップ403 Forbidden6月1日(合)わふう 上原 昭宏(有)トリガーデバイス 佐藤 忠彦13年5月31日金曜日
  2. 2. 目次• Bluetooth Low Energyって?• センサータグを使う• キーホルダーを操る• iOSらしいBluetooth LEの使い方?13年5月31日金曜日
  3. 3. Bluetooth Low Energy13年5月31日金曜日
  4. 4. Bluetoothの歴史13年5月31日金曜日
  5. 5. Bluetoothの歴史13年5月31日金曜日
  6. 6. Bluetoothの歴史2007V2.1 EDR13年5月31日金曜日
  7. 7. Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed13年5月31日金曜日
  8. 8. Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy13年5月31日金曜日
  9. 9. Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension13年5月31日金曜日
  10. 10. Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension2006Wibree13年5月31日金曜日
  11. 11. Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension2006Wibree2010V4.0 Low Energy= 3.0 + LE13年5月31日金曜日
  12. 12. Bluetoothの歴史2007V2.1 EDR2009V3.0 High Speed2010V4.0 Low Energy2004Bluetooth LowEnd Extension2006Wibree2010V4.0 Low Energy= 3.0 + LELowEnergy13年5月31日金曜日
  13. 13. Bluetooth Low Energyとは13年5月31日金曜日
  14. 14. Bluetooth Low Energyとは13年5月31日金曜日
  15. 15. Bluetooth Low Energyとは13年5月31日金曜日
  16. 16. Bluetooth SMART ロゴ• SMART / SMART READY13年5月31日金曜日
  17. 17. iOSとBTLE• iOSデバイスのBluetooth4対応• iPhone4S (2011年10月発売) 以降のApple社製品 、iOS5 / iOS6• BTLE対応アプリのストア承認• Made for iPhone(MFi) NDA締結不要 (ロゴ掲載には必要)• ハードウェアの提出は求められるかも• 開発環境• CoreBluetoothフレームワーク (一般開発者が使える)• 従来BTをつかった独自機器開発• MFi必須。13年5月31日金曜日
  18. 18. BTLEの使いどころ13年5月31日金曜日
  19. 19. BTLEの使いどころ13年5月31日金曜日
  20. 20. BTLEの使いどころ13年5月31日金曜日
  21. 21. BTLEの使いどころ13年5月31日金曜日
  22. 22. BTLEの使いどころ• 運動、健康、近接...13年5月31日金曜日
  23. 23. BTLEの使いどころ• 運動、健康、近接...• Appcessory13年5月31日金曜日
  24. 24. BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット13年5月31日金曜日
  25. 25. BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット• ぶっちゃけ13年5月31日金曜日
  26. 26. BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット• ぶっちゃけ• ハードメーカがスマフォで売れるぜは死亡フラグ13年5月31日金曜日
  27. 27. BTLEの使いどころ• 運動、健康、近接...• Appcessory• ハード、スマフォ、ネット• ぶっちゃけ• ハードメーカがスマフォで売れるぜは死亡フラグ• 異世界にようこそ13年5月31日金曜日
  28. 28. Sensor Tagで遊ぶ13年5月31日金曜日
  29. 29. http://goo.gl/d3HUL13年5月31日金曜日
  30. 30. http://goo.gl/Sf3p713年5月31日金曜日
  31. 31. 13年5月31日金曜日
  32. 32. 13年5月31日金曜日
  33. 33. 13年5月31日金曜日
  34. 34. プロジェクト例13年5月31日金曜日
  35. 35. http://www.kickstarter.com13年5月31日金曜日
  36. 36. http://getpebble.com13年5月31日金曜日
  37. 37. http://www.kickstarter.com/projects/alphaheartrate/alpha-the-holy-grail-of-heart-rate-look-ma-no-hand13年5月31日金曜日
  38. 38. http://www.kickstarter.com/projects/embraceplus/embrace-a-smart-piece-of-wearable-technology13年5月31日金曜日
  39. 39. http://www.kickstarter.com/projects/667986286/wave-a-lighted-wristband-controlled-by-your-smartp13年5月31日金曜日
  40. 40. http://www.kickstarter.com/projects/kennygibbs/helios-bars-transform-any-bike-into-a-smart-bike13年5月31日金曜日
  41. 41. http://www.automatic.com13年5月31日金曜日
  42. 42. http://www.kickstarter.com/projects/806146824/melon-a-headband-and-mobile-app-to-measure-your-fo13年5月31日金曜日
  43. 43. http://www.switch-science.com/catalog/978/13年5月31日金曜日
  44. 44. http://www.lumoback.com13年5月31日金曜日
  45. 45. プロトタイピング• 汎用か、特殊か• 市販品? 特別なセンサが必要?• アプリケーションとハード開発• 電波を出すもの• 電波法のもとで承認13年5月31日金曜日
  46. 46. ハードウェア• 部品として• センサーまで搭載したもの• 市販品でSDKがあるもの13年5月31日金曜日
  47. 47. TI Sensor tagIR temperature SensorHumidity SensorPressure SensorAccelerometerGyroscopeMagnetometerhttp://www.ti.com/tool/cc2541dk-sensor13年5月31日金曜日
  48. 48. NODEhttp://www.variabletech.com13年5月31日金曜日
  49. 49. 市販品:フィットネス• http://www.wahoofitness.com• 心拍、体重、自転車のトレーニング、速度• SDKがある13年5月31日金曜日
  50. 50. Konashihttp://konashi.ux-xu.com13年5月31日金曜日
  51. 51. RFduinohttp://www.rfduino.com13年5月31日金曜日
  52. 52. ファームウェア開発• Texus Instruments社 CC2541• 開発環境 : IAR Embedded Workbench(~4000ドル位)• iPhoneから無線で、ファームウェアアップデート (プロトコルスタック ver1.3)13年5月31日金曜日
  53. 53. • RF回路部分を小さな基板にまとめたもの• ハード側に手を入れるときに• 開発:スクリプト/C言語• 認証• 電波法 (各国ごとに1万ドルくらい)• Bluetooth 製品登録 (1万ドルくらい)モジュールhttp://www.bluegiga.com/BLE112_Bluetooth_Smart_module13年5月31日金曜日
  54. 54. アプリ開発• CoreBluetooth / SDK• techBASIC• BASICスクリプト• http://www.byteworks.us/Byte_Works/techBASIC.html• Building iPhone and iPad Electronic Projects• http://shop.oreilly.com/product/0636920029281.do13年5月31日金曜日
  55. 55. 目次• キーホルダーを使ってみる• CoreBluetoothの使い方• プロトコルの理解13年5月31日金曜日
  56. 56. 手元のデバイス確認• iOS5/6の iPhone4S以降のiOSデバイス• BTLE キーホルダ(BSHSBTPT01BK)• Xcode 4.5.1以上• ファイルhttp://goo.gl/CGFwG13年5月31日金曜日
  57. 57. 実際に動かしてみる13年5月31日金曜日
  58. 58. サンプルコードを開く• ソースコード• https://github.com/reinforce-lab/CoreBluetooth_samples• 短縮URL http://goo.gl/FhrBW• プロジェクト BSHSBTPT01_samples/first_sample/KeyFobSample.xcodeproj13年5月31日金曜日
  59. 59. 実行する1. MacにiPhone(iPod touch)を接続2. 左上のプルダウンメニューから、ターゲットに実機を選択3. Runアイコンを押して動かす13年5月31日金曜日
  60. 60. Bluetoothの設定13年5月31日金曜日
  61. 61. Bluetoothの設定13年5月31日金曜日
  62. 62. Bluetoothの設定設定→Bluetooth13年5月31日金曜日
  63. 63. Bluetoothの設定設定→Bluetooth13年5月31日金曜日
  64. 64. Bluetoothの設定設定→Bluetooth13年5月31日金曜日
  65. 65. 13年5月31日金曜日
  66. 66. RSSI : 受信信号強度 Received signal strength indicationRSSIの値が、最も大きいもの(符号がマイナスなので数値が小さいもの)を選択13年5月31日金曜日
  67. 67. RSSI : 受信信号強度 Received signal strength indicationRSSIの値が、最も大きいもの(符号がマイナスなので数値が小さいもの)を選択13年5月31日金曜日
  68. 68. 13年5月31日金曜日
  69. 69. 13年5月31日金曜日
  70. 70. CoreBluetoothの機能:受信信号強度RSSI:受信信号強度電力(dBm) = 10log電力(mW)絶対値をあてにはしない一桁違う=10違う実験離す(3.2倍の距離で1/10)向きを変える(指向性)用途距離の目安13年5月31日金曜日
  71. 71. CoreBluetoothの機能:受信信号強度RSSI:受信信号強度電力(dBm) = 10log電力(mW)絶対値をあてにはしない一桁違う=10違う実験離す(3.2倍の距離で1/10)向きを変える(指向性)用途距離の目安13年5月31日金曜日
  72. 72. Immediate Alertサービスサービス = BTLEの機能Immediate Alert直ちにアラートを鳴らす一番下のボタンVibration, Buzzer常時接続だから動作13年5月31日金曜日
  73. 73. Immediate Alertサービスサービス = BTLEの機能Immediate Alert直ちにアラートを鳴らす一番下のボタンVibration, Buzzer常時接続だから動作13年5月31日金曜日
  74. 74. Link lossサービスBTLEの機能 = サービスLink loss無線接続が切れた時の、動作Vibration, Buzzer設定->BluetoothでOFF13年5月31日金曜日
  75. 75. Link lossサービスBTLEの機能 = サービスLink loss無線接続が切れた時の、動作Vibration, Buzzer設定->BluetoothでOFF13年5月31日金曜日
  76. 76. BTLEのしくみ13年5月31日金曜日
  77. 77. チェックポイント• CoreBluetoothフレームワークの作り、動き• BTLEの規格(考え方)を素直に反映• 振る舞いに関係する要素• 通信によるもの、iOSの動作、アプリの作り• どこをどう手直しすればいいのか?• アプリだけ見ていてもわからない、かも• BTLEとハードとアプリ、3つをおさえておく13年5月31日金曜日
  78. 78. パケット通信13年5月31日金曜日
  79. 79. ネットワーク・トポロジ• スター型• 接続数の上限がない• スキャッタネットはない• ペリフェラルが同時に2つのセントラルと接続セントラル(Central)ペリフェラル(Peripheral)13年5月31日金曜日
  80. 80. ネットワーク・トポロジ• スター型• 接続数の上限がない• スキャッタネットはない• ペリフェラルが同時に2つのセントラルと接続セントラル(Central)ペリフェラル(Peripheral)13年5月31日金曜日
  81. 81. ネットワーク・トポロジ• スター型• 接続数の上限がない• スキャッタネットはない• ペリフェラルが同時に2つのセントラルと接続セントラル(Central)ペリフェラル(Peripheral)✗13年5月31日金曜日
  82. 82. 無線でビットを送る13年5月31日金曜日
  83. 83. 無線でビットを送る13年5月31日金曜日
  84. 84. 無線でビットを送る13年5月31日金曜日
  85. 85. BTLEの電波の使い方引用: http://www.digikey.com/us/es/techzone/wireless/resources/articles/bluetooth-low-energy-technology.html13年5月31日金曜日
  86. 86. BTLEの電波の使い方引用: http://www.digikey.com/us/es/techzone/wireless/resources/articles/bluetooth-low-energy-technology.htmlhttp://jp.yamaha.com/products/musical-instruments/keyboards/pianica/p-32d/?mode=model13年5月31日金曜日
  87. 87. ペリフェラルの発見• アドバタイズメント• パケットを送信• 20ミリ秒~1.3秒周期• デバイス名などの情報AdAdAdAd13年5月31日金曜日
  88. 88. ペリフェラルの発見• アドバタイズメント• パケットを送信• 20ミリ秒~1.3秒周期• デバイス名などの情報AdAdAdAd13年5月31日金曜日
  89. 89. 余談 : 低消費電力の工夫AdttAdAdAdAdペリフェラルセントラル13年5月31日金曜日
  90. 90. 余談 : 低消費電力の工夫Adt受信tAdAdAdAdペリフェラルセントラル13年5月31日金曜日
  91. 91. 余談 : 低消費電力の工夫Ad Adt受信tAdAdAdAdペリフェラルセントラル13年5月31日金曜日
  92. 92. 余談 : 低消費電力の工夫Ad Adt受信tAdAdAdAdペリフェラルセントラル13年5月31日金曜日
  93. 93. 余談 : 低消費電力の工夫Ad Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
  94. 94. 余談 : 低消費電力の工夫• 消費電力Ad Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
  95. 95. 余談 : 低消費電力の工夫• 消費電力• 受信はとても食うAd Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
  96. 96. 余談 : 低消費電力の工夫• 消費電力• 受信はとても食う• 受信の時間が長いAd Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
  97. 97. 余談 : 低消費電力の工夫• 消費電力• 受信はとても食う• 受信の時間が長い• セントラルの役目Ad Adt受信tAdAdAdAd接続処理ペリフェラルセントラル13年5月31日金曜日
  98. 98. 余談 : 通信の工夫パケットttペリフェラルセントラル 返信13年5月31日金曜日
  99. 99. 余談 : 通信の工夫パケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
  100. 100. 余談 : 通信の工夫• チャネルごとにパケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
  101. 101. 余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなうパケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
  102. 102. 余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなう• チャネルを切り替えるパケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
  103. 103. 余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなう• チャネルを切り替える• 何回か応答がなければ、切断パケットt受信tペリフェラルセントラル 返信13年5月31日金曜日
  104. 104. 余談 : 通信の工夫• チャネルごとに• 送信、受信をおこなう• チャネルを切り替える• 何回か応答がなければ、切断パケットt受信tペリフェラルセントラル 返信受信13年5月31日金曜日
  105. 105. 適応周波数ホッピング13年5月31日金曜日
  106. 106. 適応周波数ホッピング13年5月31日金曜日
  107. 107. 適応周波数ホッピング13年5月31日金曜日
  108. 108. 適応周波数ホッピング13年5月31日金曜日
  109. 109. 適応周波数ホッピング13年5月31日金曜日
  110. 110. 適応周波数ホッピング13年5月31日金曜日
  111. 111. 適応周波数ホッピング13年5月31日金曜日
  112. 112. まとめ• スター型• アドバタイズメント・パケット• 適応周波数ホッピング13年5月31日金曜日
  113. 113. CoreBluetoothを使う13年5月31日金曜日
  114. 114. ペリフェラルの発見(アドバタイズメント・パケットの受信)13年5月31日金曜日
  115. 115. フレームワークの追加13年5月31日金曜日
  116. 116. フレームワークの追加13年5月31日金曜日
  117. 117. フレームワークの追加13年5月31日金曜日
  118. 118. フレームワークの追加#import "KeyFobController.h"#import <CoreBluetooth/CoreBluetooth.h>@interface KeyFobController()<CBCentralManagerDelegate, CBPeripheralDelegate> {CBCentralManager *_centralManager;13年5月31日金曜日
  119. 119. フレームワークの追加• CoreBluetooth.frameworkを追加• #import <CoreBluetooth/CoreBluetooth.h>• CBCentralManagerDelegate,CBPeripheralDelegate を実装#import "KeyFobController.h"#import <CoreBluetooth/CoreBluetooth.h>@interface KeyFobController()<CBCentralManagerDelegate, CBPeripheralDelegate> {CBCentralManager *_centralManager;13年5月31日金曜日
  120. 120. モデルセントラル(Central)ペリフェラル(Peripheral)CBCentralManagerCBPeripheral1. CBCentralManagerのインスタンスを作る2. CBPeriperalを見つけて取得13年5月31日金曜日
  121. 121. KeyFobController.m 98行KeyFobController.m 280行13年5月31日金曜日
  122. 122. KeyFobController.m 98行KeyFobController.m 280行13年5月31日金曜日
  123. 123. ペリフェラルの発見• アドバタイズメント• パケットを送信• 20ミリ秒~1.3秒周期• デバイス名などの情報AdAdAdAd13年5月31日金曜日
  124. 124. KeyFobController.m 206行13年5月31日金曜日
  125. 125. KeyFobController.m 206行13年5月31日金曜日
  126. 126. KeyFobController.m 206行13年5月31日金曜日
  127. 127. -(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID,_immediateAlertServiceUUID, nil];// スキャンにはオプションが指定できます。// いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。// 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。// デフォルトでNOです。NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumbernumberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];// デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。// このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケットの(2.4GHzの)受信処理で、RF回路は電力を消費します。[_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions];}KeyFobController.m 206行13年5月31日金曜日
  128. 128. -(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID,_immediateAlertServiceUUID, nil];// スキャンにはオプションが指定できます。// いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。// 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。// デフォルトでNOです。NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumbernumberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];// デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。// このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケットの(2.4GHzの)受信処理で、RF回路は電力を消費します。[_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions];}KeyFobController.m 206行13年5月31日金曜日
  129. 129. -(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID,_immediateAlertServiceUUID, nil];// スキャンにはオプションが指定できます。// いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。// 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。// デフォルトでNOです。NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumbernumberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];// デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。// このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケットの(2.4GHzの)受信処理で、RF回路は電力を消費します。[_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions];}KeyFobController.m 206行13年5月31日金曜日
  130. 130. -(void)startScanning {// BLEデバイスのスキャン時には、検索対象とするサービスを指定することが推奨ですNSArray *scanServices = [NSArray arrayWithObjects:_linkLossServiceUUID,_immediateAlertServiceUUID, nil];// スキャンにはオプションが指定できます。// いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。// 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。// デフォルトでNOです。NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumbernumberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];// デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。// このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケットの(2.4GHzの)受信処理で、RF回路は電力を消費します。[_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions];}KeyFobController.m 206行13年5月31日金曜日
  131. 131. アドバタイズメントのフィルタ• 重複を許すか• 通常はNO• 近接ならYES• ”受信したとき”に通知• サービス(機能)でフィルタAdAdAdAd13年5月31日金曜日
  132. 132. // デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、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].dataisEqualToData:targetUUID.data]) return;*/NSString *localName = [advertisementDataobjectForKey:CBAdvertisementDataLocalNameKey];if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) {PeripheralContainer *c = [[PeripheralContainer alloc] init];c.peripheral = p;c.RSSI = RSSI;[self findPeripheral:c];}}KeyFobController.m 318行13年5月31日金曜日
  133. 133. // デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、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].dataisEqualToData:targetUUID.data]) return;*/NSString *localName = [advertisementDataobjectForKey:CBAdvertisementDataLocalNameKey];if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) {PeripheralContainer *c = [[PeripheralContainer alloc] init];c.peripheral = p;c.RSSI = RSSI;[self findPeripheral:c];}}KeyFobController.m 318行13年5月31日金曜日
  134. 134. // デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、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].dataisEqualToData:targetUUID.data]) return;*/NSString *localName = [advertisementDataobjectForKey:CBAdvertisementDataLocalNameKey];if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) {PeripheralContainer *c = [[PeripheralContainer alloc] init];c.peripheral = p;c.RSSI = RSSI;[self findPeripheral:c];}}受信信号強度パケット・データKeyFobController.m 318行13年5月31日金曜日
  135. 135. // デバイスの発見時処理を行います。// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見するかもしれません。// アドバタイズメント・パケットに含まれる情報は、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].dataisEqualToData:targetUUID.data]) return;*/NSString *localName = [advertisementDataobjectForKey:CBAdvertisementDataLocalNameKey];if(localName != nil && [localName isEqualToString:kTargetDeviceName] ) {PeripheralContainer *c = [[PeripheralContainer alloc] init];c.peripheral = p;c.RSSI = RSSI;[self findPeripheral:c];}}受信信号強度パケット・データKeyFobController.m 318行13年5月31日金曜日
  136. 136. アドバタイズメントで取れる情報 (1/1)• 名前、送信電力、その他• CBAdvertisementDataLocalNameKey• CBAdvertisementDataTxPowerLevelKey• CBAdvertisementDataManufacturerDataKey• この3つの情報はキャッシュされない• 周囲へ一斉通知(ブロードキャスト)• LocalNameに、識別番号や、状態を入れたり13年5月31日金曜日
  137. 137. アドバタイズメントで取れる情報 (2/2)• CBPeripheral インスタンス• UUID : 128-bitの識別番号• 一度でも接続したことがあれば≠nil• UUIDは、iPhoneごとに異なる• RSSI : 受信信号強度• 接続してreadRSSI:を呼び出せば≠nil13年5月31日金曜日
  138. 138. 接続と切断13年5月31日金曜日
  139. 139. -(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];}KeyFobController.m 256行13年5月31日金曜日
  140. 140. -(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];}KeyFobController.m 256行13年5月31日金曜日
  141. 141. -(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];}必ずretainKeyFobController.m 256行13年5月31日金曜日
  142. 142. -(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];}必ずretainKeyFobController.m 256行13年5月31日金曜日
  143. 143. -(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];}必ずretainKeyFobController.m 256行13年5月31日金曜日
  144. 144. -(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];}- (void)centralManager:(CBCentralManager *)centraldidConnectPeripheral:(CBPeripheral *)p;- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;必ずretainKeyFobController.m 256行13年5月31日金曜日
  145. 145. -(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];}- (void)centralManager:(CBCentralManager *)centraldidConnectPeripheral:(CBPeripheral *)p;- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;必ずretaindelegateで通知KeyFobController.m 256行13年5月31日金曜日
  146. 146. 接続と切断までのまとめ• BTLEのアドバタイズメントと接続/切断• クラシックBTとの振る舞いの差異• ペアリングはない• iOSは接続に無関係• iOSのBTデバイスリストに表示されない13年5月31日金曜日
  147. 147. サービスとキャラクタリスティクスそしてプロファイル13年5月31日金曜日
  148. 148. プロトコルスタックApplicationsGATTATTL2CAPPHYLink LayerApplicationsCore BluetoothApplicationsXPCBTserver13年5月31日金曜日
  149. 149. プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserverペリフェラル=データベースハンドル,タイプ,値13年5月31日金曜日
  150. 150. プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserverサービス=クラスキャラクタリスティクス=プロパティ13年5月31日金曜日
  151. 151. プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserver• キャラクタリスティクス• 制御/動作指定• センサー値/外界の状態• (装置の)動作状態/内部状態サービス=クラスキャラクタリスティクス=プロパティ13年5月31日金曜日
  152. 152. プロトコルスタックApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserverペリフェラル=データベースハンドル,タイプ,値13年5月31日金曜日
  153. 153. サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlFind MEProfileProximityProfileデバイス発見切断時の警告13年5月31日金曜日
  154. 154. サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlImmediateAlert ServiceTx PowerServiceLink LossAlert Service振動やブザーを出力送信電力の値切断時の振る舞い指定Find MEProfileProximityProfileデバイス発見切断時の警告13年5月31日金曜日
  155. 155. サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlImmediateAlert ServiceTx PowerServiceLink LossAlert Service振動やブザーを出力送信電力の値切断時の振る舞い指定Find MEProfileProximityProfileデバイス発見切断時の警告13年5月31日金曜日
  156. 156. サービスとプロファイル(振る舞い)http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xmlImmediateAlert ServiceTx PowerServiceLink LossAlert Service振動やブザーを出力送信電力の値切断時の振る舞い指定Find MEProfileProximityProfileデバイス発見切断時の警告ユースケース ハード仕様13年5月31日金曜日
  157. 157. プロファイルの実装ApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplications • プロファイルがアプリ側• 任意の振る舞い、OK• すべてがアプリの管理下• 発見• 接続/切断• 読み書き• iOSはいっさい関係してこない13年5月31日金曜日
  158. 158. プロファイルの実装ApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserver• プロファイルがアプリ側• 任意の振る舞い、OK• すべてがアプリの管理下• 発見• 接続/切断• 読み書き• iOSはいっさい関係してこない13年5月31日金曜日
  159. 159. プロファイルの実装ApplicationsCore BluetoothGATTATTL2CAPPHYLink LayerApplicationsApplicationsXPCBTserver• プロファイルがアプリ側• 任意の振る舞い、OK• すべてがアプリの管理下• 発見• 接続/切断• 読み書き• iOSはいっさい関係してこない13年5月31日金曜日
  160. 160. まとめ• GATT (Generic Attribute Profile)• サービス、キャラクタリスティクス• プロファイル(振る舞い)はアプリが実装• デバイスドライバ相当• クラシックBluetooth• OS管理(ヘッドセット、キーボード...)13年5月31日金曜日
  161. 161. サービスとキャラクタリスティクスを見てみる13年5月31日金曜日
  162. 162. http://goo.gl/oYjrc13年5月31日金曜日
  163. 163. http://goo.gl/oYjrc13年5月31日金曜日
  164. 164. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  165. 165. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  166. 166. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  167. 167. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  168. 168. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  169. 169. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  170. 170. • UUIDで識別• 16-bit / 128-bit• 読み(read)/書き(write)/通知(notify)13年5月31日金曜日
  171. 171. CBフレームワークの使い方:サービスとキャラクタリスティクスのリスティング13年5月31日金曜日
  172. 172. // 接続- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p {// サービスを探しますself.peripheral.delegate = self;[p discoverServices:[NSArray arrayWithObjects:_linkLossServiceUUID,_immediateAlertServiceUUID,_txPowerServiceUUID,_batteryLevelServiceUUID,nil]];}#define kImmediateAlertServiceUUID @"1802"#define kLinkLossServiceUUID @"1803"#define kAlertLevelUUID @"2A06"..._linkLossServiceUUID = [CBUUID UUIDWithString:kLinkLossServiceUUID];_immediateAlertServiceUUID = [CBUUID UUIDWithString:kImmediateAlertServiceUUID];_alertLevelUUID = [CBUUID UUIDWithString:kAlertLevelUUID];KeyFobController.m 343行KeyFobController.m 104行13年5月31日金曜日
  173. 173. // 接続- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)p {// サービスを探しますself.peripheral.delegate = self;[p discoverServices:[NSArray arrayWithObjects:_linkLossServiceUUID,_immediateAlertServiceUUID,_txPowerServiceUUID,_batteryLevelServiceUUID,nil]];}#define kImmediateAlertServiceUUID @"1802"#define kLinkLossServiceUUID @"1803"#define kAlertLevelUUID @"2A06"..._linkLossServiceUUID = [CBUUID UUIDWithString:kLinkLossServiceUUID];_immediateAlertServiceUUID = [CBUUID UUIDWithString:kImmediateAlertServiceUUID];_alertLevelUUID = [CBUUID UUIDWithString:kAlertLevelUUID];KeyFobController.m 343行KeyFobController.m 104行13年5月31日金曜日
  174. 174. //発見したサービスに対して、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];}}KeyFobController.m 367行KeyFobController.m 396行13年5月31日金曜日
  175. 175. //発見したサービスに対して、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];}}KeyFobController.m 367行KeyFobController.m 396行13年5月31日金曜日
  176. 176. //発見したサービスに対して、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];}}KeyFobController.m 367行KeyFobController.m 396行13年5月31日金曜日
  177. 177. まとめ• BTLE• 超低消費電力、なんとなくつながる• iOSとBTLE• MFi不要、一般開発者権限• 振るまいと機能の分離• プロファイルはアプリ次第13年5月31日金曜日
  178. 178. バックグラウンドアプリ• バックグラウンド動作• デバイス発見頻度は∼12分に1回くらい• 電話通知のデモンストレーション13年5月31日金曜日
  179. 179. 13年5月31日金曜日
  180. 180. KeyFobController.m 115行目13年5月31日金曜日
  181. 181. 心拍センサ• メーカのSDK• Appleなどのサンプル• BTLEのプロファイル13年5月31日金曜日
  182. 182. http://api.wahoofitness.com13年5月31日金曜日
  183. 183. http://www.wahoofitness.com/api/?returnFull=1&13年5月31日金曜日
  184. 184. 13年5月31日金曜日
  185. 185. http://developer.apple.com/library/mac/#samplecode/HeartRateMonitor/Introduction/Intro.html13年5月31日金曜日
  186. 186. http://developer.apple.com/library/mac/#samplecode/HeartRateMonitor/Introduction/Intro.html13年5月31日金曜日
  187. 187. h.org/gatt/profiles/Pages/ProfilesHome.aspx13年5月31日金曜日
  188. 188. 13年5月31日金曜日
  189. 189. http://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml13年5月31日金曜日
  190. 190. 13年5月31日金曜日
  191. 191. http://www.ti.com/tool/cc2540dk-miniCC2540/2541 mini development kit100ドル13年5月31日金曜日
  192. 192. http://processors.wiki.ti.com/index.php/BLE_sniffer_guide13年5月31日金曜日
  193. 193. まとめ• 市販品であればSDK• 標準プロファイルであればCB• 未公開ならスニッフィング• 開発分担• プロファイルまで含めてハード側13年5月31日金曜日
  194. 194. オリジナル開発• ハードウェア+ドライバ相当が切り口• デモ(動作確認、検証)アプリが大事• ペアリングのユーザインタフェース• アプリの振る舞い、ハードの仕様13年5月31日金曜日
  195. 195. ハードウェアが絡む開発• 挙動 = ハード × 通信 × iOS(BTserver)• iOS6.0での悲劇• 本当のデバイスの切断が30秒後• スニッフィングしないとわからない• ハード単体?• 責任の分界点、デモアプリ• ネットワークアプリ13年5月31日金曜日
  196. 196. 13年5月31日金曜日
  197. 197. 13年5月31日金曜日
  198. 198. 13年5月31日金曜日
  199. 199. 13年5月31日金曜日
  200. 200. 13年5月31日金曜日
  201. 201. 13年5月31日金曜日
  202. 202. 情報源• 目的• 基礎知識、入門知識• 最新情報の収集• 分野• ハードウェア• アプリ• サービス13年5月31日金曜日
  203. 203. Appleからの情報• https://developer.apple.com/videos/wwdc/2012/• Session 703: Core Bluetooth 101• Session 705 Advanced CoreBluetooth• Apple Bluetooth Mailing list• https://lists.apple.com/mailman/listinfo/bluetooth-dev13年5月31日金曜日
  204. 204. サービス、動向• Facebook BTLEグループ• https://www.facebook.com/groups/563064710384459/• Kickstarter ?• http://www.kickstarter.com/discover/recently-launched13年5月31日金曜日
  205. 205. 半導体会社の情報• 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年5月31日金曜日
  206. 206. 書籍• AppleのBluetoothアクセサリ設計指針• Bluetooth Low Energy Handbook• http://www.amazon.co.jp/Bluetooth-Low-Energy-Developers-ebook/dp/B009XDA1G8/• Building iPhone and iPad Electronic Projects• http://shop.oreilly.com/product/0636920029281.do• Bluetooth4 Core Specificaiton (辞書的に)13年5月31日金曜日

×