SlideShare a Scribd company logo
1 of 206
Download to read offline
「合宿」 - Bluetooth Low Energy +
iPhone ハンズオン ワークショップ
403 Forbidden
6月1日
(合)わふう 上原 昭宏
(有)トリガーデバイス 佐藤 忠彦
13年5月31日金曜日
目次
• Bluetooth Low Energyって?
• センサータグを使う
• キーホルダーを操る
• iOSらしいBluetooth LEの使い方?
13年5月31日金曜日
Bluetooth Low Energy
13年5月31日金曜日
Bluetoothの歴史
13年5月31日金曜日
Bluetoothの歴史
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
2009
V3.0 High Speed
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
2009
V3.0 High Speed
2010
V4.0 Low Energy
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
2009
V3.0 High Speed
2010
V4.0 Low Energy
2004
Bluetooth Low
End Extension
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
2009
V3.0 High Speed
2010
V4.0 Low Energy
2004
Bluetooth Low
End Extension
2006
Wibree
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
2009
V3.0 High Speed
2010
V4.0 Low Energy
2004
Bluetooth Low
End Extension
2006
Wibree
2010
V4.0 Low Energy
= 3.0 + LE
13年5月31日金曜日
Bluetoothの歴史
2007
V2.1 EDR
2009
V3.0 High Speed
2010
V4.0 Low Energy
2004
Bluetooth Low
End Extension
2006
Wibree
2010
V4.0 Low Energy
= 3.0 + LE
Low
Energy
13年5月31日金曜日
Bluetooth Low Energyとは
13年5月31日金曜日
Bluetooth Low Energyとは
13年5月31日金曜日
Bluetooth Low Energyとは
13年5月31日金曜日
Bluetooth SMART ロゴ
• SMART / SMART READY
13年5月31日金曜日
iOSとBTLE
• iOSデバイスのBluetooth4対応
• iPhone4S (2011年10月発売) 以降のApple社製品 、iOS5 / iOS6
• BTLE対応アプリのストア承認
• Made for iPhone(MFi) NDA締結不要 (ロゴ掲載には必要)
• ハードウェアの提出は求められるかも
• 開発環境
• CoreBluetoothフレームワーク (一般開発者が使える)
• 従来BTをつかった独自機器開発
• MFi必須。
13年5月31日金曜日
BTLEの使いどころ
13年5月31日金曜日
BTLEの使いどころ
13年5月31日金曜日
BTLEの使いどころ
13年5月31日金曜日
BTLEの使いどころ
13年5月31日金曜日
BTLEの使いどころ
• 運動、健康、近接...
13年5月31日金曜日
BTLEの使いどころ
• 運動、健康、近接...
• Appcessory
13年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/d3HUL
13年5月31日金曜日
http://goo.gl/Sf3p7
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
13年5月31日金曜日
プロジェクト例
13年5月31日金曜日
http://www.kickstarter.com
13年5月31日金曜日
http://getpebble.com
13年5月31日金曜日
http://www.kickstarter.com/projects/alphaheartrate/alpha-
the-holy-grail-of-heart-rate-look-ma-no-hand
13年5月31日金曜日
http://www.kickstarter.com/projects/embraceplus/embrace-
a-smart-piece-of-wearable-technology
13年5月31日金曜日
http://www.kickstarter.com/projects/667986286/wave-a-
lighted-wristband-controlled-by-your-smartp
13年5月31日金曜日
http://www.kickstarter.com/projects/
kennygibbs/helios-bars-transform-any-bike-
into-a-smart-bike
13年5月31日金曜日
http://www.automatic.com
13年5月31日金曜日
http://www.kickstarter.com/projects/806146824/melon-a-
headband-and-mobile-app-to-measure-your-fo
13年5月31日金曜日
http://www.switch-science.com/catalog/978/
13年5月31日金曜日
http://www.lumoback.com
13年5月31日金曜日
プロトタイピング
• 汎用か、特殊か
• 市販品? 特別なセンサが必要?
• アプリケーションとハード開発
• 電波を出すもの
• 電波法のもとで承認
13年5月31日金曜日
ハードウェア
• 部品として
• センサーまで搭載したもの
• 市販品でSDKがあるもの
13年5月31日金曜日
TI Sensor tag
IR temperature Sensor
Humidity Sensor
Pressure Sensor
Accelerometer
Gyroscope
Magnetometer
http://www.ti.com/tool/
cc2541dk-sensor
13年5月31日金曜日
NODE
http://www.variabletech.com
13年5月31日金曜日
市販品:フィットネス
• http://www.wahoofitness.com
• 心拍、体重、自転車のトレーニング、速度
• SDKがある
13年5月31日金曜日
Konashi
http://konashi.ux-xu.com
13年5月31日金曜日
RFduino
http://www.rfduino.com
13年5月31日金曜日
ファームウェア開発
• Texus Instruments社 CC2541
• 開発環境 : IAR Embedded Workbench
(~4000ドル位)
• iPhoneから無線で、ファームウェアアッ
プデート (プロトコルスタック ver1.3)
13年5月31日金曜日
• RF回路部分を小さな基板にまとめたもの
• ハード側に手を入れるときに
• 開発:スクリプト/C言語
• 認証
• 電波法 (各国ごとに1万ドルくらい)
• Bluetooth 製品登録 (1万ドルくらい)
モジュール
http://www.bluegiga.com/
BLE112_Bluetooth_Smart_module
13年5月31日金曜日
アプリ開発
• CoreBluetooth / SDK
• techBASIC
• BASICスクリプト
• http://www.byteworks.us/Byte_Works/
techBASIC.html
• Building iPhone and iPad Electronic Projects
• http://shop.oreilly.com/product/
0636920029281.do
13年5月31日金曜日
目次
• キーホルダーを使ってみる
• CoreBluetoothの使い方
• プロトコルの理解
13年5月31日金曜日
手元のデバイス確認
• iOS5/6の iPhone4S以降のiOSデバイス
• BTLE キーホルダ(BSHSBTPT01BK)
• Xcode 4.5.1以上
• ファイル
http://goo.gl/CGFwG
13年5月31日金曜日
実際に動かしてみる
13年5月31日金曜日
サンプルコードを開く
• ソースコード
• https://github.com/reinforce-lab/CoreBluetooth_samples
• 短縮URL http://goo.gl/FhrBW
• プロジェクト BSHSBTPT01_samples/first_sample/
KeyFobSample.xcodeproj
13年5月31日金曜日
実行する
1. MacにiPhone(iPod touch)を接続
2. 左上のプルダウンメニューから、ターゲット
に実機を選択
3. Runアイコンを押して動かす
13年5月31日金曜日
Bluetoothの設定
13年5月31日金曜日
Bluetoothの設定
13年5月31日金曜日
Bluetoothの設定
設定→Bluetooth
13年5月31日金曜日
Bluetoothの設定
設定→Bluetooth
13年5月31日金曜日
Bluetoothの設定
設定→Bluetooth
13年5月31日金曜日
13年5月31日金曜日
RSSI : 受信信号強度 Received signal strength indication
RSSIの値が、最も大きいもの
(符号がマイナスなので数値が小さいもの)を選択
13年5月31日金曜日
RSSI : 受信信号強度 Received signal strength indication
RSSIの値が、最も大きいもの
(符号がマイナスなので数値が小さいもの)を選択
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でOFF
13年5月31日金曜日
Link lossサービス
BTLEの機能 = サービス
Link loss
無線接続が切れた時の、動
作
Vibration, Buzzer
設定->BluetoothでOFF
13年5月31日金曜日
BTLEのしくみ
13年5月31日金曜日
チェックポイント
• CoreBluetoothフレームワークの作り、動き
• BTLEの規格(考え方)を素直に反映
• 振る舞いに関係する要素
• 通信によるもの、iOSの動作、アプリの作り
• どこをどう手直しすればいいのか?
• アプリだけ見ていてもわからない、かも
• BTLEとハードとアプリ、3つをおさえておく
13年5月31日金曜日
パケット通信
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.html
13年5月31日金曜日
BTLEの電波の使い方
引用: http://www.digikey.com/us/es/techzone/wireless/resources/articles/
bluetooth-low-energy-technology.html
http://jp.yamaha.com/products/musical-instruments/keyboards/pianica/p-32d/?mode=model
13年5月31日金曜日
ペリフェラルの発見
• アドバタイズメント
• パケットを送信
• 20ミリ秒~1.3秒周期
• デバイス名などの情報
Ad
Ad
Ad
Ad
13年5月31日金曜日
ペリフェラルの発見
• アドバタイズメント
• パケットを送信
• 20ミリ秒~1.3秒周期
• デバイス名などの情報
Ad
Ad
Ad
Ad
13年5月31日金曜日
余談 : 低消費電力の工夫
Ad
t
t
Ad
Ad
Ad
Ad
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
Ad
t
受信
t
Ad
Ad
Ad
Ad
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
接続
処理
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
• 消費電力
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
接続
処理
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
• 消費電力
• 受信はとても食う
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
接続
処理
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
• 消費電力
• 受信はとても食う
• 受信の時間が長い
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
接続
処理
ペリフェラル
セントラル
13年5月31日金曜日
余談 : 低消費電力の工夫
• 消費電力
• 受信はとても食う
• 受信の時間が長い
• セントラルの役目
Ad Ad
t
受信
t
Ad
Ad
Ad
Ad
接続
処理
ペリフェラル
セントラル
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日金曜日
余談 : 通信の工夫
• チャネルごとに
• 送信、受信をおこなう
• チャネルを切り替える
• 何回か応答がなければ、切断
パケット
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()
<CBCentralManagerDelegate, CBPeripheralDelegate> {
CBCentralManager *_centralManager;
13年5月31日金曜日
フレームワークの追加
• CoreBluetooth.frameworkを追加
• #import <CoreBluetooth/
CoreBluetooth.h>
• CBCentralManagerDelegate,
CBPeripheralDelegate を実装
#import "KeyFobController.h"
#import <CoreBluetooth/CoreBluetooth.h>
@interface KeyFobController()
<CBCentralManagerDelegate, CBPeripheralDelegate> {
CBCentralManager *_centralManager;
13年5月31日金曜日
モデル
セントラル
(Central)
ペリフェラル
(Peripheral)
CBCentralManager
CBPeripheral
1. 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秒周期
• デバイス名などの情報
Ad
Ad
Ad
Ad
13年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:_linkLossServiceUUID,
_immediateAlertServiceUUID, nil];
// スキャンにはオプションが指定できます。
// いまあるオプションは、ペリフェラルを見つけた時に重複して通知するか、の指定です。
// 近接検出など、コネクションレスでデバイスの状態を取得する用途などでは、これをYESに設定します。
// デフォルトでNOです。
NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber
numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
// デバイスのスキャン開始。iPhoneはアドバタイズメント・パケットの受信を開始します。
// このスキャンは、明示的に停止しない限り、スキャンし続けます。このスキャンは、アドバタイズメント・パケ
ットの(2.4GHzの)受信処理で、RF回路は電力を消費します。
[_centralManager scanForPeripheralsWithServices:scanServices options:scanOptions];
}
KeyFobController.m 206行
13年5月31日金曜日
-(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];
}
KeyFobController.m 206行
13年5月31日金曜日
-(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];
}
KeyFobController.m 206行
13年5月31日金曜日
-(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];
}
KeyFobController.m 206行
13年5月31日金曜日
アドバタイズメントのフィルタ
• 重複を許すか
• 通常はNO
• 近接ならYES
• ”受信したとき”に通知
• サービス(機能)でフィルタ
Ad
Ad
Ad
Ad
13年5月31日金曜日
// デバイスの発見時処理を行います。
// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す
るかもしれません。
// アドバタイズメント・パケットに含まれる情報は、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];
}
}
KeyFobController.m 318行
13年5月31日金曜日
// デバイスの発見時処理を行います。
// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す
るかもしれません。
// アドバタイズメント・パケットに含まれる情報は、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];
}
}
KeyFobController.m 318行
13年5月31日金曜日
// デバイスの発見時処理を行います。
// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す
るかもしれません。
// アドバタイズメント・パケットに含まれる情報は、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];
}
}
受信信号強度パケット・データ
KeyFobController.m 318行
13年5月31日金曜日
// デバイスの発見時処理を行います。
// スキャンで指定したサービスがあるデバイスのみが通知されますが、同じような機能を持った対象外の装置を発見す
るかもしれません。
// アドバタイズメント・パケットに含まれる情報は、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];
}
}
受信信号強度パケット・データ
KeyFobController.m 318行
13年5月31日金曜日
アドバタイズメントで取れる情報 (1/1)
• 名前、送信電力、その他
• CBAdvertisementDataLocalNameKey
• CBAdvertisementDataTxPowerLevelKey
• CBAdvertisementDataManufacturerDataKey
• この3つの情報はキャッシュされない
• 周囲へ一斉通知(ブロードキャスト)
• LocalNameに、識別番号や、状態を入れたり
13年5月31日金曜日
アドバタイズメントで取れる情報 (2/2)
• CBPeripheral インスタンス
• UUID : 128-bitの識別番号
• 一度でも接続したことがあれば≠nil
• UUIDは、iPhoneごとに異なる
• RSSI : 受信信号強度
• 接続してreadRSSI:を呼び出せば≠nil
13年5月31日金曜日
接続と切断
13年5月31日金曜日
-(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日金曜日
-(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日金曜日
-(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];
}
必ずretain
KeyFobController.m 256行
13年5月31日金曜日
-(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];
}
必ずretain
KeyFobController.m 256行
13年5月31日金曜日
-(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];
}
必ずretain
KeyFobController.m 256行
13年5月31日金曜日
-(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 *)central
didConnectPeripheral:(CBPeripheral *)p;
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:
(CBPeripheral *)peripheral error:(NSError *)error;
必ずretain
KeyFobController.m 256行
13年5月31日金曜日
-(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 *)central
didConnectPeripheral:(CBPeripheral *)p;
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:
(CBPeripheral *)peripheral error:(NSError *)error;
必ずretain
delegateで通知KeyFobController.m 256行
13年5月31日金曜日
接続と切断までのまとめ
• BTLEのアドバタイズメントと接続/切断
• クラシックBTとの振る舞いの差異
• ペアリングはない
• iOSは接続に無関係
• iOSのBTデバイスリストに表示されない
13年5月31日金曜日
サービスとキャラクタリスティクス
そしてプロファイル
13年5月31日金曜日
プロトコルスタック
Applications
GATT
ATT
L2CAP
PHY
Link Layer
Applications
Core Bluetooth
Applications
XPC
BTserver
13年5月31日金曜日
プロトコルスタック
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications
XPC
BTserver
ペリフェラル=データベース
ハンドル,タイプ,値
13年5月31日金曜日
プロトコルスタック
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications
XPC
BTserver
サービス=クラス
キャラクタリスティクス
=プロパティ
13年5月31日金曜日
プロトコルスタック
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications
XPC
BTserver
• キャラクタリスティクス
• 制御/動作指定
• センサー値/外界の状態
• (装置の)動作状態/内部状態
サービス=クラス
キャラクタリスティクス
=プロパティ
13年5月31日金曜日
プロトコルスタック
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications
XPC
BTserver
ペリフェラル=データベース
ハンドル,タイプ,値
13年5月31日金曜日
サービスとプロファイル(振る舞い)
http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml
Find ME
Profile
Proximity
Profile
デバイス発見
切断時の警告
13年5月31日金曜日
サービスとプロファイル(振る舞い)
http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml
Immediate
Alert Service
Tx Power
Service
Link Loss
Alert Service
振動やブザー
を出力
送信電力
の値
切断時の
振る舞い指定
Find ME
Profile
Proximity
Profile
デバイス発見
切断時の警告
13年5月31日金曜日
サービスとプロファイル(振る舞い)
http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml
Immediate
Alert Service
Tx Power
Service
Link Loss
Alert Service
振動やブザー
を出力
送信電力
の値
切断時の
振る舞い指定
Find ME
Profile
Proximity
Profile
デバイス発見
切断時の警告
13年5月31日金曜日
サービスとプロファイル(振る舞い)
http://developer.bluetooth.org/gatt/profiles/Pages/ProfileViewer.aspx?u=org.bluetooth.profile.find_me.xml
Immediate
Alert Service
Tx Power
Service
Link Loss
Alert Service
振動やブザー
を出力
送信電力
の値
切断時の
振る舞い指定
Find ME
Profile
Proximity
Profile
デバイス発見
切断時の警告
ユースケース ハード仕様
13年5月31日金曜日
プロファイルの実装
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications • プロファイルがアプリ側
• 任意の振る舞い、OK
• すべてがアプリの管理下
• 発見
• 接続/切断
• 読み書き
• iOSはいっさい関係してこない
13年5月31日金曜日
プロファイルの実装
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications
XPC
BTserver
• プロファイルがアプリ側
• 任意の振る舞い、OK
• すべてがアプリの管理下
• 発見
• 接続/切断
• 読み書き
• iOSはいっさい関係してこない
13年5月31日金曜日
プロファイルの実装
Applications
Core Bluetooth
GATT
ATT
L2CAP
PHY
Link Layer
ApplicationsApplications
XPC
BTserver
• プロファイルがアプリ側
• 任意の振る舞い、OK
• すべてがアプリの管理下
• 発見
• 接続/切断
• 読み書き
• iOSはいっさい関係してこない
13年5月31日金曜日
まとめ
• GATT (Generic Attribute Profile)
• サービス、キャラクタリスティクス
• プロファイル(振る舞い)はアプリが実装
• デバイスドライバ相当
• クラシックBluetooth
• OS管理(ヘッドセット、キーボード...)
13年5月31日金曜日
サービスとキャラクタリスティクスを
見てみる
13年5月31日金曜日
http://goo.gl/oYjrc
13年5月31日金曜日
http://goo.gl/oYjrc
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日金曜日
• UUIDで識別
• 16-bit / 128-bit
• 読み(read)/書き(write)/通知(notify)
13年5月31日金曜日
CBフレームワークの使い方:
サービスとキャラクタリスティクスの
リスティング
13年5月31日金曜日
// 接続
- (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日金曜日
// 接続
- (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日金曜日
//発見したサービスに対して、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.characteristics
uuid:_batteryLevelUUID];
_batteryLevelSwitchCharacteristics = [self
findCharacteristics:service.characteristics uuid:_batteryLevelSwitchUUID];
[p setNotifyValue:YES forCharacteristic:_batteryLevelSwitchCharacteristics];
[p readValueForCharacteristic:_batteryLevelCharacteristics];
[p readValueForCharacteristic:_batteryLevelSwitchCharacteristics];
}
}
KeyFobController.m 367行
KeyFobController.m 396行
13年5月31日金曜日
//発見したサービスに対して、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.characteristics
uuid:_batteryLevelUUID];
_batteryLevelSwitchCharacteristics = [self
findCharacteristics:service.characteristics uuid:_batteryLevelSwitchUUID];
[p setNotifyValue:YES forCharacteristic:_batteryLevelSwitchCharacteristics];
[p readValueForCharacteristic:_batteryLevelCharacteristics];
[p readValueForCharacteristic:_batteryLevelSwitchCharacteristics];
}
}
KeyFobController.m 367行
KeyFobController.m 396行
13年5月31日金曜日
//発見したサービスに対して、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.characteristics
uuid:_batteryLevelUUID];
_batteryLevelSwitchCharacteristics = [self
findCharacteristics:service.characteristics uuid:_batteryLevelSwitchUUID];
[p setNotifyValue:YES forCharacteristic:_batteryLevelSwitchCharacteristics];
[p readValueForCharacteristic:_batteryLevelCharacteristics];
[p readValueForCharacteristic:_batteryLevelSwitchCharacteristics];
}
}
KeyFobController.m 367行
KeyFobController.m 396行
13年5月31日金曜日
まとめ
• 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.com
13年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.html
13年5月31日金曜日
http://developer.apple.com/library/mac/#samplecode/
HeartRateMonitor/Introduction/Intro.html
13年5月31日金曜日
h.org/gatt/profiles/Pages/ProfilesHome.aspx
13年5月31日金曜日
13年5月31日金曜日
http://developer.bluetooth.org/gatt/services/Pages/
ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml
13年5月31日金曜日
13年5月31日金曜日
http://www.ti.com/tool/cc2540dk-mini
CC2540/2541 mini development kit
100ドル
13年5月31日金曜日
http://processors.wiki.ti.com/index.php/BLE_sniffer_guide
13年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日金曜日
情報源
• 目的
• 基礎知識、入門知識
• 最新情報の収集
• 分野
• ハードウェア
• アプリ
• サービス
13年5月31日金曜日
Appleからの情報
• 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-dev
13年5月31日金曜日
サービス、動向
• Facebook BTLEグループ
• https://www.facebook.com/groups/
563064710384459/
• Kickstarter ?
• http://www.kickstarter.com/discover/
recently-launched
13年5月31日金曜日
半導体会社の情報
• 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.com
13年5月31日金曜日
書籍
• 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日金曜日

More Related Content

More from akihiro uehara

第4回目大垣iBeaconハッカソン
第4回目大垣iBeaconハッカソン第4回目大垣iBeaconハッカソン
第4回目大垣iBeaconハッカソンakihiro uehara
 
2014年3月8日 スマートフォン勉強会 プレゼン資料
2014年3月8日 スマートフォン勉強会 プレゼン資料2014年3月8日 スマートフォン勉強会 プレゼン資料
2014年3月8日 スマートフォン勉強会 プレゼン資料akihiro uehara
 
2014年2月26日第3回iBeaconハッカソン~バス編~
2014年2月26日第3回iBeaconハッカソン~バス編~2014年2月26日第3回iBeaconハッカソン~バス編~
2014年2月26日第3回iBeaconハッカソン~バス編~akihiro uehara
 
20140129 i beaconハッカソン
20140129 i beaconハッカソン20140129 i beaconハッカソン
20140129 i beaconハッカソンakihiro uehara
 
20131217 i beaconハッカソン
20131217 i beaconハッカソン20131217 i beaconハッカソン
20131217 i beaconハッカソンakihiro uehara
 
iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013
iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013
iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013akihiro uehara
 
Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)
Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)
Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)akihiro uehara
 
20131026 i beaconワークショップ
20131026 i beaconワークショップ20131026 i beaconワークショップ
20131026 i beaconワークショップakihiro uehara
 
20130902 btleハンズオンワークショップ
20130902 btleハンズオンワークショップ20130902 btleハンズオンワークショップ
20130902 btleハンズオンワークショップakihiro uehara
 
20120216 デブサミ 座談会
20120216 デブサミ 座談会20120216 デブサミ 座談会
20120216 デブサミ 座談会akihiro uehara
 
Ot oduino i_phoneアクセプレゼンpart2
Ot oduino i_phoneアクセプレゼンpart2Ot oduino i_phoneアクセプレゼンpart2
Ot oduino i_phoneアクセプレゼンpart2akihiro uehara
 
OTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼン
OTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼンOTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼン
OTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼンakihiro uehara
 
未踏2次 iPhoneソフトウェアモデム開発プロジェクト
未踏2次 iPhoneソフトウェアモデム開発プロジェクト未踏2次 iPhoneソフトウェアモデム開発プロジェクト
未踏2次 iPhoneソフトウェアモデム開発プロジェクトakihiro uehara
 
20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー
20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー
20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナーakihiro uehara
 

More from akihiro uehara (15)

第4回目大垣iBeaconハッカソン
第4回目大垣iBeaconハッカソン第4回目大垣iBeaconハッカソン
第4回目大垣iBeaconハッカソン
 
2014年3月8日 スマートフォン勉強会 プレゼン資料
2014年3月8日 スマートフォン勉強会 プレゼン資料2014年3月8日 スマートフォン勉強会 プレゼン資料
2014年3月8日 スマートフォン勉強会 プレゼン資料
 
2014年2月26日第3回iBeaconハッカソン~バス編~
2014年2月26日第3回iBeaconハッカソン~バス編~2014年2月26日第3回iBeaconハッカソン~バス編~
2014年2月26日第3回iBeaconハッカソン~バス編~
 
20140129 i beaconハッカソン
20140129 i beaconハッカソン20140129 i beaconハッカソン
20140129 i beaconハッカソン
 
20131217 i beaconハッカソン
20131217 i beaconハッカソン20131217 i beaconハッカソン
20131217 i beaconハッカソン
 
iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013
iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013
iOS7でのBluetooth LE活用 @ MOSA Software Meeting 2013
 
Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)
Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)
Bluetooth LE +スマートフォン勉強会@関西(2013年11月2日)
 
20131026 i beaconワークショップ
20131026 i beaconワークショップ20131026 i beaconワークショップ
20131026 i beaconワークショップ
 
20130902 btleハンズオンワークショップ
20130902 btleハンズオンワークショップ20130902 btleハンズオンワークショップ
20130902 btleハンズオンワークショップ
 
20120216 デブサミ 座談会
20120216 デブサミ 座談会20120216 デブサミ 座談会
20120216 デブサミ 座談会
 
MY LIFE AS A KIGURUMI
MY LIFE AS A KIGURUMIMY LIFE AS A KIGURUMI
MY LIFE AS A KIGURUMI
 
Ot oduino i_phoneアクセプレゼンpart2
Ot oduino i_phoneアクセプレゼンpart2Ot oduino i_phoneアクセプレゼンpart2
Ot oduino i_phoneアクセプレゼンpart2
 
OTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼン
OTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼンOTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼン
OTOduino_iPhoneアクセサリ開発_ギークラボ6月28日_プレゼン
 
未踏2次 iPhoneソフトウェアモデム開発プロジェクト
未踏2次 iPhoneソフトウェアモデム開発プロジェクト未踏2次 iPhoneソフトウェアモデム開発プロジェクト
未踏2次 iPhoneソフトウェアモデム開発プロジェクト
 
20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー
20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー
20100701 01 ツイッター浜名湖_プレゼン_i_phoneで動くロボットセミナー
 

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