CBCEntralManagerDelegateProtocol リファレンス 日本語訳

これは、Apple社のCBCentralManagerクラスドキュメント http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBCentralManagerDelegate_Protocol/translated_content/CBCentralManagerDelegate.html から、CoreBluetooth開発の理解に必要最低限の情報を日本語に意訳したものです。

CBCentralManagerDelegate プロトコルは、CBCentralのデリゲートのプロトコルです。

CBCentralManagerDelegateは、-[centralManagerDidUpdateState:] のみがrequiredです。その他は optional です。

インスタンス・メソッド

- (void)centralManagerDidUpdateState:(CBCentralManager *)central;

セントラル・マネージャのステートが更新された時に、呼ばれます。

引数:

  • central
    • ステートが変化したセントラルマネージャ。

議論:

詳細は “state” プロパティを参照してください。

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

ペリフェラルとの接続が確立したときに、呼ばれます。

«««< HEAD

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

ペリフェラルとの既存の接続が切断した時に、呼ばれます。

======= centralManager:didDisconnectPeripheral:error: Invoked whenever an existing connection with the peripheral is torn down.

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

ペリフェラルとの既存の接続が切断した時に、呼ばれます。

centralManager:didDiscoverPeripheral:advertisementData:RSSI: Invoked when the central discovers a peripheral while scanning.

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;

セントラルがスキャン中にペリフェラルを発見した時に、呼ばれます。

CBCentralManagerクラスリファレンス、日本語訳

これは、Apple社のCBCentralManagerクラスドキュメント http://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CBCentralManager_Class/から、CoreBluetooth開発の理解に必要最低限の情報を日本語に意訳したものです。

プロパティ

@property(assign, nonatomic) id delegate;

セントラル・マネージャのイベントを受け取るデリゲートを設定します。

@property(readonly) CBCentralManagerState state;

セントラル・マネージャの状態を表します。セントラル・マネージャをインスタンスしたときは初期値CBCentralStateUnknownです。この値が変化した瞬間に、デリゲートのコールバック - (void)centralManagerDidUpdateState:(CBCentralManager *)central が呼ばれます。

CBCentralManagerState列挙型は、以下の値を取ります。

typedef NS_ENUM(NSInteger, CBCentralManagerState) {
	CBCentralManagerStateUnknown = 0,
	CBCentralManagerStateResetting,
	CBCentralManagerStateUnsupported,
	CBCentralManagerStateUnauthorized,
	CBCentralManagerStatePoweredOff,
	CBCentralManagerStatePoweredOn
};
  • CBCentralManagerStateUnknown = 0,
    • 初期値です。すぐに更新されます。
  • CBCentralManagerStateResetting,
    • システムサービスとの接続が一時的に失なわれました。すぐに更新されます。
  • CBCentralManagerStateUnsupported,
    • Bluetooth Low EnergyのCentral/Clientをサポートしていません。
  • CBCentralManagerStateUnauthorized,
    • このアプリケーションは、Bluetooth Low EnergyのCentral/Client使う認可がありません。
  • CBCentralManagerStatePoweredOff,
    • Bluetoothがオフになっています。
  • CBCentralManagerStatePoweredOn
    • Bluetoothがオンで、かつ、いま利用できます。

インスタンスメソッド

- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;

ペリフェラルへの、ペンディング状態もしくは接続している接続を、キャンセルします。

connectPeripheral:options: Establish a connection to the peripheral.

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(NSDictionary *)options;

ペリフェラルへの接続を確立します。引数optionsで接続のオプションを指定出来ます。 CBConnectPeripheralOptionNotifyOnIiscoonectionKey を参照してください。

このメソッドはタイムアウトをしません。ペンディングされた接続をキャンセルするには、cancelPeripheralConnections: を使います。

- (CBCentralManager *)initWithDelegate:(id)delegate queue:(dispatch_queue_t)queue;

指定したデリゲートとディスパッチキューで、セントラルマネージャを初期化します。

Macbook Airにお茶をこぼす前にできること

Macbook Airにお茶をこぼす前に、できることがあるのではと思ったので、写真をとってみた。

/post/2013-01-23-do-not-spill-tea-on-mba/dangerous.jpg

まず危険な状態。 手を前後に動かす、その動線上にお湯のみがあり、さらに、お湯のみが机の端に近いので、お湯のみを床に落として割る可能性も高い。

危険な状態:

  • お湯のみのお茶をMacbook Airにこぼす
  • お湯のみを床に落として割る

原因:

  • お湯のみが机の上に置いてある
  • 手の動線上にお湯のみがある

そもそも、開発しながらお茶を飲まない、お湯のみを机に置かない、という根本的な原因の取り除きもあるけれども、それは行き過ぎると、極端な話、死ぬ可能性があるから生きるのをやめる、になるので、ここではそこまでは問わない。

/post/2013-01-23-do-not-spill-tea-on-mba/best_but_not_convienient.jpg

左上にお湯のみを移動した。動線にひっかからないので、トラブルは解消できそうだが、右利きなので、左にあるお湯のみまで手を伸ばすのが不便だ。

/post/2013-01-23-do-not-spill-tea-on-mba/better_somehow_dangerous.jpg

右上にお湯のみを移動した。動線は、あまり、ひっかからないだろう。左に置くよりもちょっと危険だが、お湯のみに手を伸ばすのは便利がいい。お湯のみの位置は、こうすることにした。

UTF-8なURLを書くとOctpressのページ生成で例外が発生する

本文にURLを入れていると http://tmpurl.com/何か のように、リンク先URLにUTF-8の文字が入っていると、rake generate してもページ生成に失敗します。その時のエラーメッセージは:

unchanged sass/screen.scss
/usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/maruku-0.6.0/lib/maruku/input/parse_doc.rb:22:in `<top (required)>': iconv will be deprecated in the future, use String#encode instead.
Configuration from ~/_config.yml
Building site: source -> public
~/plugins/raw.rb:11:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
	from ~/plugins/raw.rb:11:in `unwrap'
	from ~/plugins/octopress_filters.rb:18:in `post_filter'
	from ~/plugins/octopress_filters.rb:33:in `post_render'
	from ~/plugins/post_filters.rb:124:in `block in post_render'
	from ~/plugins/post_filters.rb:123:in `each'
	from ~/plugins/post_filters.rb:123:in `post_render'
	from ~/plugins/post_filters.rb:151:in `transform'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/convertible.rb:84:in `do_layout'
	from ~/plugins/post_filters.rb:167:in `do_layout'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/post.rb:189:in `render'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:193:in `block in render'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:192:in `each'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:192:in `render'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:40:in `process'
	from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/bin/jekyll:250:in `<top (required)>'
	from /usr/local/bin/jekyll:23:in `load'
	from /usr/local/bin/jekyll:23:in `<main>'

対処方法は、URLをエンコードしておけばよいです。私は以下のTwitter投稿用ブックマークレットでリンク先をTwitter投稿フォームに表示させて、そのエンコードされたURLを使うことにしました。

iOS Bluetooth Low Energyの開発 その1

これは、岐阜人材育成講座でおこなった、CoreBluetoothフレームワークの解説の要約です。 白板は、以下の画像です:

/post/2013-01-21-ios-ble-introduction/20130121_img_1477.jpg

Bluetooth Low Enerygとは

Bluetooth Low Energy(以下、BLEと省略)は、Bluetooth4で追加された超低消費電力の通信仕様です。例えば直径20mm 厚み3.2mmのコイン型1次リチウムイオン電池 CR2032 (3V 220mAh)で1〜2年間、接続してデータを送信し続ける状態での連続動作時間が得られます。

超低消費電力のRF通信規格には、BLEの他にANT, ANT+, ZigBeeなどがあります。BLEはBluetoothのブランド力、およびいち早くiPhoneおよびMacに採用されていることから、超低消費電力の通信規格として強い普及力があります。iPhoneに採用されたこと、またBluetoothに含まれることから、スマートフォンとの接続ではBLEが標準です。

Bluetooth4はBluetooth3にLow Energyの技術を追加したものです。Low Energyの技術は、それまでのBluetooth3とは全く別の技術です。そのため、Bluetooth3までの技術をクラシックBluetoothと呼び、Bluetooth Low Energyと区別することがあります。ここでもBluetooth3までの技術をクラシックBluetoothと呼びます。

クラシックBluetoothとBLEの使い分けは、必要な通信速度、製品製造コスト、電池の充電および交換が製品の利用場面に適しているか、などを考慮して決めます。

BLE、規格の狙い

BLEは

  • 超低消費電力
  • ペリフェラルが安価に作れる
  • BLEの認証のものとで、多種多様なペリフェラル開発が可能

を主眼に規格が作られています。

###超低消費電力 超低消費電力は、BLEの最も大きな狙いです。クラシックBTはリチウムイオン電池でも2週間程度で電池容量を使い果たすため、都度電池の交換もしくは充電が必要でした。この電池の交換および充電を実現するハードウェアは開発と製造にコストがかかります。またユーザに電池交換/充電を求めることが、クラシックBTが使える利用場面を狭めることがあります。

コイン型1次リチウムイオン電池 CR2032 (3V 220mAh)で1〜2年間、接続してデータを送信し続けるられるほどの超低消費電力であれば、電池が切れる=製品寿命とすることができますから、(ゴミの分別はおいておいて、いわゆる)使い捨てすら可能です。

BLEの超低消費電力は、クラシックBTと全く同じ機能を超低消費電力とするものではありません。物理的に電波を出して1ビットのデータを送受信するために必要な電力は、クラシックBTでもBLEでも、そうは違いはありません。

BLEは、例えば1秒に20バイト程度のデータを送受信するような、データのやり取り頻度は低いけれども、無線接続自体は長期間維持できる応用分野を想定した規格です。データ通信速度も物理層で1Mbpsです。クラシックBTは、ヘッドセットやパーソナル・エリア・ネットワーク(PAN)のような、特定の端末と接続すること(ペアリング)、常時データ通信があること、また高いデータ・レート(~3Mbps)が必要とされる、場面を想定した規格です。

このため、クラシックBTとBLEは、利用場面が全く違います。BLEは、Keyfobのように、常時スマートフォンと無線接続をし続けなければならないもの、またフィットネスの心拍センサーやセンサーネットワークのように、データ量は多くないが一定時間ごとにデータを収集し続ける応用分野に、非常に適しています。

###ペリフェラルが安価、また多種多様な開発が可能 BLEには、セントラルとペリフェラルという概念があります。通常、iPhoneがセントラル、心拍センサーなどの周辺装置がペリフェラルになります。無線通信をするためには、接続状態の管理や、パケットの送受信のタイミング制御などが必要になります。これには、CPUを使いますし、また電波の送信受信の電力も必要です。BLEは、ペリフェラルが安価に製造できるように、演算や電池を消費する機能をセントラルに寄せて、ペリフェラルが極めて簡単な構造ですむようにしています。

BLEのネットワークは、1つのセントラルに多数のペリフェラルが接続するピコネット、です。

クラシックBTとBLEでは、プロファイルの考え方が違います。クラシックBTは、通信の振る舞いとハードウェアの振る舞いをあわせてプロファイルとして定義していました。一方で、BLEはハードウェアの振る舞いは何も定義しません。

BLEはサービスという概念で、値の読み出しと書き出しの基本的な振る舞いのみを定義します。例えば電池残量のサービスは、電池残量の値読み出し方法と、その値の意味(ビット割り当てなど)の定義が与えられています。この電池残量のサービスは、様々なBLEデバイスが利用します。例えば、keyfobならば内蔵電池の残量通知に使います。これがもしも、電気自動車ならば、それは電気自動車の主電池残量を意味するでしょう。サービスという概念で、ハードウェアと切り離して定義されているので、抽象化され、サービスを多くの機器で横断して利用することができます。Custom Profile Development

BLEでは、128-bitのGUIDを割り当てたサービスを、開発者が独自に定義して実装することができます。従って、BLEは認証のもとで“任意のハードウェア”が開発できます。BLEでは、一般には定義されていない多種多様なハードウェアでも、独自に定義をすることで開発ができます。

BLEは、サービスを識別するIDに、16−bitのIDと128−bitのIDのいずれかを割り当てできます。16-bitは、BluetoothのSIGが定義したサービスに割り当てられます。このIDは勝手に定義して使うことは許されません。

クラシックBTでは、ハードウェアの振る舞いまで含めてプロファイルが定義されています。このため、プロファイルに定義されていないハードウェアの開発では、シリアルポートプロファイル(SPP)という、シリアル通信のプロファイルを使います。

クラシックBluetoothとBLE

クラシックBluetoothとBLEは、2.4GHzという同じ周波数帯を使っていますが、物理層の変調方式からして方式が違います。ですが、電波を送受信する回路(以下、RF回路)は、クラシックBluetoothとBLEで共用できます。したがって、BT3にBLEを追加したBT4の半導体は、コストの高いRF回路を別に設ける必要がなく、開発コストの利点があります。

Bluetooth SMART READYとSMART

BLE対応デバイスには、Bluetooth SMART READYとSMARTという2種類のロゴがあります。

BLEは、BT3にBLEを追加したものです。iPhoneのように、従来のクラシックBTとBLE両方に接続できる、いわゆる通常のBT4デバイスが、Bluetooth SMART READYになります。一方で、BLEしか実装していないデバイス、心拍計やkeyfobのようなペリフェラルも、BT4対応デバイスです。これはBLEでしか通信ができないので、Bluetooth SMARTと呼びます。

Bluetooth SMARTの製品は、Bluetooth SMART READYの製品と接続できます。ですがBluetooth(BT3以前のクラシックBT)とは接続ができません。Bluetooth SMART READYの製品は、すべてのBluetooth対応機器と接続ができます。ややこしいのですが、BLEだけ、を搭載したペリフェラル相当の機器にもBluetoothロゴをつけるための、区別です。

Bluetooth SMART READY/SMART対応機器のリストは、http://www.bluetooth.com/Pages/Bluetooth-Smart-Devices-List.aspx にあります。

シングルモードとデュアルモード

BLEでペリフェラルに対応する機器は、シングルモードとデュアルモードの2種類があります。シングルモードは、BLEのみを搭載したものをいいます。デュアルモードは、BLEに加えてクラシックBTにも接続できるものをいいます。デュアルモードは、通常、クラシックBTのシリアルポートプロファイル(SPP)でも接続できるように設計します。半導体メーカから、シングルモード、デュアルモード、それぞれのICが開発、提供されています。