わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

BLE モジュールリスト

モジュールは、通信機能を1つの小さい基板にまとめたもので、
製品の基本回路部分に無線通信機能を追加するときによく使われます。

高周波を送受信する回路は、特性を確保するために回路基板設計に特別の配慮がいること、また電波法や通信規格の認証が必要になります。そこで、それらをモジュールに盛り込み、そのモジュールを製品基板に搭載することで、それらの厄介な部分にかかわらず、製品が設計できるメリットが得られます。

ここでは、どのようにモジュールを選ぶかを、実際のモジュールのリストとともに解説します。次に、モジュールを使わず自社で設計するメリットはどこにあるのかを述べます。

まとめ

  • iPhone 4以前の機種
    • Bluetooth2.0 (クラシックBluetooth)
    • MFi を取得して、クラシックBluetooth SPPで開発。
    • 電池交換、もしくは充電電池内蔵が必要。連続動作時間は1週間程度。
  • iPhone 4S以降の機種(Bluetooth4)
    • MFi取得でSPP、またはBLEで開発。
    • BLEならば、コイン型電池で1年程度の連続動作。
  • Android
    • Bluetooth2,3とBluetooth4を搭載したものが混在。
    • クラシック Bluetooth SPPで開発
  • WindowsPhone8
    • Androidと同様。

ます。携帯端末として、iPhone/iPadのiOS、Android、Windows Phone8を考えます。それぞれの端末は:

  • iPhone/iPad
    • iPhone 4以前の機種: Bluetooth2.0 (クラシックBluetooth) → MFi を取得して、SPPで開発。
    • iPhone 4S以降の機種: Bluetooth4 (クラシックBluetooth + Low Energy) → MFi取得でSPP、またはBLEで開発。
  • Android → SPPで開発。
    • Bluetooth2,3とBluetooth4を搭載したものが混在。
    • Bluetooth Low Energyのプロトコルスタックは、ハードウェア・メーカが独自に提供している状態で、Googleから公式のLow Energyのプロトコルスタックは出ていない。
  • WindowsPhone8 → SPPで開発。機種がBluetooth4ならばBLEが使える。
    • Android同様、クラシックBluetoothとBluetooth4が混在。
      Bluetoothを搭載したAndroid に対応

Bluetoothのモジュールには、デュアルモードとシングルモード、の2種類があります:

  • デュアルモード: 超低消費電力ではないが、Bluetooth機器全てとつながる
    • クラシックBluetoothとLow Energyを両方搭載したもの。両方に接続できる。
    • Bluetooth対応機器全てと繋がるが、電池の交換もしくは充電が必要になる。
  • シングルモード: 超低消費電力。Bluetooth 4対応機器とつながる。
    • Bluetooth Low Energyのみを搭載したもの。クラシックBluetoothとは接続できない。
    • コイン型電池で1年単位の動作。

BLEを選ぶべきか

機器をつなぐ無線通信規格は

  • WiFi
  • クラシックBluetooth
  • Bluetooth Low Energy

などがあります。このほかに、ANT、ZigBeeなどのセンサーネットワーク向けに開発された規格もあります。このうちANTは、iPhone向けにドック接続のトランシーバが提供されていますから、ANT接続を求められることがあるかもしれません。

BLEを使う場面

モジュールの話に入る前に、そもそも論として、BLEを選ぶべきかどうかをみてみます。BLEを選ぶメリットは:

  1. iOSデバイス(iPhone4S以降)と接続できる (MFiプログラムが必須ではない)
  2. コイン型電池で1年以上の連続接続

です。

もしもiPhone4以前の機種と接続することを求められたら、MFiプログラムを取得して認証チップの提供の元、クラシックBluetooth シリアルポートプロファイル(以下、SPP)で、通信部分を実装します。

また、Android/WindowsPhone8との接続も求められた場合も、クラシックBluetooth SPPで接続します。Android/WindowsPhone8は、最新機種のいくつかはBluetooth4を搭載していますが、まだ多くの機種はBluetooth2もしくは3を搭載しています。接続機種を、Bluetooth4を搭載したものに限定できる場合は、BLEのみの提供も可能ですが、機種が限定できずOSの種類で接続先を指定される場合は、クラシックBluetoothを採用する他ありません。

クラシックBluetoothを採用した時点で、“電池で1年の連続動作”は得られません。1週間程度で電池がなくなるので、おそらく充電電池を採用する必要があるでしょう。これは、電源周りの設計や、電池の扱いなどの製造での管理など、様々なコストをかさ上げします。

もしも、クラシックBluetoothも使えるように、かつBLEの利点をすべて満たせと要求されたならば、その案件からは裸足で逃げ出すべきです。

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

Bluetoothモジュールには、Low Energyのみを搭載したシングル・モードと、クラシックBluetoothとLow Energy両方を搭載したデュアル・モードのものの、2種類があります。それぞれ、用いる半導体自体が別のものです。

接続対象が、iPhone4S以降のiOSデバイスのみでよいなら、シングル・モードでよいでしょう。Android/WindowsPhone8との接続も必要ならば、デュアル・モードを選択します。

もしも、キーホルダーのような、デバイス自体が小さいことが必要な場合は、BLEだけなら、コイン型電池を使い安価に製造ができます。もしもクラシックBluetoothも求められると、充電電池を使わざるを得ず、またユーザに充電の手間をかけさせるので、そもそも論として、製品として売れるのか?という疑問が生じます。

ラジコンのような、モータのように電力消費量が大きなものが場合は、そもそも通信の超低消費電力は必要ありません。それならば、クラシックBluetoothとBLEが両方使えるデュアルモードのBluetoothモジュールを採用しても、電源周りのコストをあげることはありません。

モジュールの価格は、目安としてシングルモードで10ドル程度、デュアルモードで10~15ドル程度です。
デュアルモードは数ドルコストが高くなりがちです。

BLEを選択する場面

まとめると:

  • iOSデバイスと接続する場合
    • MFiプログラムに参加するほど企業が大きくない、弁護士コストが大きい場合
  • 電池が、商品の価格とユーザの使い勝手を大きく決める場面
    • 1次電池で充電不要で安価に、かつ電源スイッチ不要で、電池切れ=製品寿命

です。

1から設計するか、モジュールを利用するか

半導体を購入して1から設計する場合でも、モジュールを利用する場合でも、結果としてできあってくる電気回路は、基板がわかれているか否かの配置が異なるだけで、回路としては同じものになります。

モジュールは設計や許認可のコストが含まれています。目安として製造台数が1万台を超えるあたりから、自社で開発するコストメリットがでてきます。

1から設計した場合は、回路の設計自由度が得られます。モジュールは小さいとはいえ、2cm x 1cm 程度の大きさがあります。極端に小さいものが必要な場合など、任意の配置の回路基板を設計したいならば、1から設計します。

また、電波を発信するものは、他の機器の無線通信を妨害しないように、各国が定める電波法のもとで、技術適合の認証を受けなくてはなりません。その費用は、目安として:

  • 日本 TELEC 80万円
  • 欧米 CE 220万円
  • 米国 FCC 170万円

です。さらに、製品にBluetoothのロゴを使うならば、Bluetooth対応製品として認証および製品登録が必要です。その費用は:

  • Bluetooth SIG 参加 年会費 1万ドル (90万円)
  • 認証テスト 5万円?

です。BLEの認証テストの費用は、クラシックBluetoothに比べれば、とても安価で済みます。ですが、SIGの企業会員の年会費が必要になります。

モジュールを利用した場合は、この電波法の許認可およびBluetoothの製品登録にかかる時間と費用を省略できます。また、モジュールは、半導体メーカが開発する開発環境をより使いやすく、より簡便になるように、モジュール提供会社が工夫をしています。それらを使うと、1から設計する場合よりも、短い時間で設計を終えることができます。

モジュールは少数多品種の製品を製造するときに、特に大きなコストのメリットが得られます。コストだけでみたときの、数量による分岐点を考えてみます。

仮に、1から設計した時の製造費用を5ドル、モジュール単価を10ドルとすれば、価格差は5ドルです。日本国内だけで販売する場合は、認証などの費用が180万円かかります。さらに欧米でも販売するならば、それは540万円になります。これから、目安として、4000個および1万個が、モジュール採用の分岐点になります。

核になるのは半導体

様々なモジュールが各社から出ていますが、
BLEに限らず、BluetoothやWiFiなど、無線通信を実現する核になるのは半導体です。
BLEの半導体を一般に広く販売しているのは、以下の2社です。この2社の半導体の製品ラインナップを見ておけば、どのような無線通信機能を実現できるか、を押さえられます:

2013年1月時点での組み合わせは:

  • シングルモード(BLEのみ)
  • デュアルモード(クラシックBluetooth+LE)
  • ANT+デュアルモードBluetooth
  • WiFi+ANT+デュアルモードBluetooth

です。BLE+ANTという組み合わせは、ありません。

Bluetooth Low EnergyとANTそれぞれの半導体のリストは以下のものになります:

Bluetooth Low Energy:

  • NordicSemiconductor社
    • nRF51822
      • ARM Cortex-M0を内蔵したSoC。
    • nRF8001/8002
      • 8001はradio。8002は8001にFSMを実装しkeyfobに特化したもの。
  • TexusInstruments社
    • CC2564 (デュアルモード)
    • CC2540/41/41S
      • いずれも8051互換のマイコン内蔵したSoc。
      • 41は40からUSBインタフェースを省略したもの。
      • 41Sは、41をradioにしたもの。外部マイコンからの利用に特化。ファーム書き換えはできないが、ペリフェラルの設定を起動時に外部から読み込むため、外部マイコンから設定を変更することはできる、みたい。

ついでにANT:

-NordicSemiconductor社

- nRF51422
- nRF24AP2-1CH/-8CH
  • TexusInstruments社
    • CC2570/CC2571

半導体は、高周波通信と通信制御だけを聴許するradioと呼ぶ石と、
無線通信のための高周波回路と、通信を制御するためのプロセッサまで入ったもの、に分類できます。
また、BLEでは、後者のものは、内臓マイコンにユーザのプログラムも実行できるようになっています。このようなシステム全体が1つのチップに収めたものを、システム・オン・チップ(System On Chip、以下SoC)と呼びます。

ゼロから開発する場合はSoCワンチップにして実装面積とコストを最小にできます。また自社で扱いやすいマイコンがあったり既存製品に搭載したマイコンを使いたいならば、SoCには通信の基本部分だけを処理させて、外部のマイコンに上位の通信処理を置く構成も、とれます。

これらはSoCのなかのファームウェアで実現しているので、いずれの場合でも、モジュールを利用できます。

モジュールの選定

  • 各国の電波法の技術適合認証を取得しているか
  • 米国の再輸出規制(EAR)対象か
  • モジュールの単価、大きさ、内蔵アンテナの位置やコネクタの位置
  • 開発環境
  • 供給の安定さ

Bluegiga

  • スクリプト言語の開発環境がある。
    • モジュール内部のSoCのマイコンでユーザのプログラムを動かせられる。
  • 開発キットは3.6万円程度
  • モジュール単価は~10ドル前後

Apple Bluetooth Accessory Design Guideline , Bluetooth Low Energy部分の日本語訳

これは、Apple社のBluetooth Accessory Design Guidelines for Apple Products (R6)
https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdfのうち、Bluetooth Low Eneryに関連する部分を日本語訳したものです。17ページ目から20ページ目までを訳しています。

Bluetooth Low Energy

Bluetooth4.0仕様は、バッテリーリソースが限られたアクセサリをターゲットにした新しい無線通信技術、Bluetooth Low Energyを含みます。
もしBluetooth LEがサポートされていれば、アクセサリーはこの章のガイドラインに従うべきです。

Role

Bluetoothアクセサリーは、Bluetooth4.0仕様 Volume3, Part C, Section 2.2.2.3 に定義されているPeripheral role 、
もしくはSection 2.2.2.1に定義されているBroadcaster roleの、いずれかを実装すべきです。

Advertising Channels

Bluetoothアクセサリーは、アドバタイズのイベントの都度、すべての3つのアドバタイジング・チャネル(37, 38, および39)でアドバタイズすべきです。
Bluetooth 4.0 仕様, Volume 6, Part B, Section 4.4.2.1 を参照。

Advertising PDU

Bluetoothアクセサリーは、次のうちいずれか1つのアドバタイジングPDUを使うべきです:

  • ADV_IND
  • ADV_NOCONN_IND
  • ADV_SCAN_IND

ADV_DIRECT_IND は使うべきではありません。
Bluetooth 4.0 仕様, Volume 6, Part B, Section 2.3.1 を参照。

Advertising Data

Bluetoothアクセサリに送信されたアドバタイジング・データは、
Bluetooth 4.0 仕様, Volume 3, Part C, Section 11 に記述されているように、
次の情報の少なくとも1つを含むべきです:

  • Flags
  • TX Power Level
  • Local Name
  • Services

例えば、もしも電力消費量を低減する必要がある、あるいはすべてのアドバタイズメント・データがアドバタイジングPDUに収まりきらなかったならば、
アクセサリは、Local Name およびTX Power levelデータをSCAN_RSP PDUに置くかもしれません。
Apple製品は、その状態によっては、常にアクティブスキャンをするとは限らないことに、注意してください。

Primary servicesは常にアドバタイジングPDUでアドバタイズされるべきです。
Secondary servicesはアドバタイズされるべきではありません。
アクセサリの主たる利用方法で重要ではないサービスは、もしもアドバタイジングPDUの領域が限られているならば、無視されるかもしれません。

アドバタイジング・データおよびSCAN_RSP PDUのスキャン・レスポンス・データは、
Bluetooth 4.0 仕様, Volume 3, Part C, Section 18 のフォーマットガイドラインに従うべきです:
長さフィールドの次に、AD TypeおよびAD Dataが続きます。

Advertising Interval

Bluetoothアクセサリのアドバタイジング間隔は、
それがアクセサリの発見にかかる時間と接続パフォーマンスに影響するため、
注意深く考慮されるべきです。
電源がバッテリーのアクセサリでは、そのバッテリーリソースもまた考慮すべきでしょう。

Apple製品に発見されるには、Bluetoothアクセサリは、まず最初に、すくなくとも30秒は推奨される20ミリ秒のアドバタイジング間隔を使うべきです。
もしもアクセサリが最初の30秒以内に発見されなければ、アクセサリはバッテリー電力を節約することを選択して、アドバタイジング間隔を長くするかもしれません。
Apple製品が発見する確率を上げるために、Appleはより以下のより長い間隔のいずれかを使うことを推奨します。

  • 645 ミリ秒
  • 768 ミリ秒
  • 961 ミリ秒
  • 1065 ミリ秒
  • 1294 ミリ秒

注意: より長いアドバタイジング間隔は、通常、より長い発見時間と接続時間をもたらします。

Connection Parameters

Bluetoothアクセサリは、LE接続に使われた接続パラメータに責任があります。
アクセサリーは、
適切な時間にL2CAPコネクション・パラメータ・アップデート・リクエストを送信して、
その利用方法にとて適切な接続パラメータを要求すべきです。
詳細は、Bluetooth 4.0 仕様, Volume 3, Part A, Section 4.20 を参照してください。

もしも次の全てのルールに従っていない場合は、その接続パラメータ要求は却下されるかもしれません:

  • IntervalMax *(Slve Latency +1) <= 2 秒
  • Interval Min >= 20 ミリ秒
  • Interval Min + 20ミリ 秒 <= Interval Max
  • Slave Latency <= 4
  • connSupervisionTimeout <= 6 秒
  • Interval Max (Slave Latency +1) 3 < connSupervisionTimeout

Apple製品は、Peripheral Preferred Connection Parameters characteristic のパラメータを読んだり、利用したりしません。
Bluetooth 4.0 仕様, Volume 3, Part C, Section 12.5 を参照。

Privacy

Bluetoothアクセサリーは、すべての状況で、Resolvable Private Addressを解決できるべきです。
プライバシーへの懸念のため、Apple製品は
Bluetooth 4.0 仕様, Volume 3, Part C, Section 10.8
に定義されたランダムデバイスアドレスを使うでしょう。

Permissions

Bluetoothアクセサリーは、serviceとcharacteristicsを発見するために、
ペアリング、認証、または暗号化といった特別な許可を求めるべきではありません。
characteristicの値 または descriptorの値にアクセスするときに限り、それは特別な許可を求めるかもしれません。
Bluetooth 4.0 仕様, Volume 3, Part G, Section 8.1, 5節を参照。

Pairing

Bluetoothアクセサリーはペアリングを要求すべきではありません。
セキュリティの理由で、アクセサリーがCentralとbonded relationship を必要とするならば、
適切であるように、
PeripheralはATTリクエストをInsufficient Authenticaion error codeで却下するでしょう。
Bluetooth 4.0 仕様, Volume 3, Part F, Section 4 を参照。

結果として、Apple製品は必要なセキュリティ手順を進めるでしょう。

ペアリングは、Apple製品次第で、ユーザの認証を要求するでしょう。

Services

Generic Access Profile Service

BluetoothアクセサリーはDevice Name characteristic、
Bluetooth 4.0 仕様, Volume 3, Part C, Section 12.1、
を実装すべきです。Device Name Characteristicは書き込み可能であるべきです。

Generic Attribute Profile Service

Bluetoothアクセサリーは、もしもそのアクセサリーが製品寿命の間にサービスを変更する能力がある場合に限り、Service Changed Characteristicを実装すべきです。

Apple製品は、
アクセサリーから前回読み込み(キャッシュされている)情報に頼ることができるかを決めるために、
Service Changed characteristicsを使います。
Bluetooth 4.0 仕様, Volume 3, Part G, Section 7.1 を参照してください。

Device Information Service

Bluetoothアクセサリーは、Device Information Serviceを実装すべきです。このサービスのサービスUUIDは、
アドバタイジング・データでアドバタイズされるべきではありません。
次のcharacteristicsがサポートされるべきです:

  • Manufacturer Name String
  • Model Number String
  • Firmware Revision String
  • Software Revision String

GATT Server

iOS6では、
iOSデバイスがBluetoothアクセサリーとして使えるように、
アプリケーションがGATTサーバにserviceやcharacteristicsを提供するかもしれません。
この章の推奨は、そのような場合のアクセサリーに適用します。

iOSデバイスは、
データベースの内容は任意の時点で変更できるので、
GAP Service Changed characteristicsを実装します。
したがって、Bluetoothアクセサリーは、
このcharacteristicsの
Characteristic Value Indication
をサポートして、indicationを受信したときは、そのデータベースの対応するキャッシュを無効にします。
Bluetooth 4.0 仕様, Volume 3, Part G, Section 7.1 を参照してください。

Bluetoothアクセサリーは、ATT/GATTリクエストとコマンドの利用を最小に、そして必要な物だけを送信すべきです。
例えば、
アクセサリが特定のサービスを探している時に、
GATT Discover All Services は使ってはなりません。
より少ない送信時間は、より少ない電力消費と等価であり、したがって、アクセサリーとApple製品の両方にとって、よりよいパフォーマンスをもたらします。

Bluetoothアクセサリーは、いかなるエラーも扱えるように十分に頑強であるべきです。
もしも、あるサービスをもつアプリケーションがフォアグラウンドになく、かつ、バックグラウンドで実行されるように明記されていないならば、
ペアリングとCharacteristicの値の読み込み/書き込みは、失敗するかもしれません。

もしも ATT Prepare Write Request が使われたら、
全てのキューイングされた属性は同じ
GATT Service に含まれます。

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

定数

CB_EXTERN NSString * const CBUUIDCharacteristicExtendedPropertiesString;

extended properties descriptorのUUIDの文字列表現です。
このデスクリプタに対応する値は、NSNumber オブジェクトです。

CB_EXTERN NSString * const CBUUIDCharacteristicUserDescriptionString;

user description descriptorのUUIDの文字列表現です。
このデスクリプタに対応する値は、NSString オブジェクトです。

CB_EXTERN NSString * const CBUUIDClientCharacteristicConfigurationString;

client configuration descriptor
のUUIDの文字列表現です。
このデスクリプタに対応する値は、NSNumber オブジェクトです。

CB_EXTERN NSString * const CBUUIDServerCharacteristicConfigurationString;

server configuration descriptor
のUUIDの文字列表現です。
このデスクリプタに対応する値は、NSNumber オブジェクトです。

CB_EXTERN NSString * const CBUUIDCharacteristicFormatString;

presentation format descriptor
のUUIDの文字列表現です。
このデスクリプタに対応する値は、NSData オブジェクトです。

CB_EXTERN NSString * const CBUUIDCharacteristicAggregateFormatString;

server configuration descriptor
のUUIDの文字列表現です。

CB_EXTERN NSString * const CBUUIDGenericAccessProfileString;

GAP
のUUIDの文字列表現です。

CB_EXTERN NSString * const CBUUIDGenericAttributeProfileString;

GATT
のUUIDの文字列表現です。

CB_EXTERN NSString * const CBUUIDDeviceNameString;

GAP device name
のUUIDの文字列表現です。

CB_EXTERN NSString * const CBUUIDAppearanceString;

GAP appearance UUID
のUUIDの文字列表現です。

CB_EXTERN NSString * const CBUUIDPeripheralPrivacyFlagString;

GAP privacy flag UUID
の文字列表現です。

CB_EXTERN NSString * const CBUUIDReconnectionAddressString;

GAP reconnection address UUID
の文字列表現です。

CB_EXTERN NSString * const CBUUIDPeripheralPreferredConnectionParametersString;

GAP preferred connection parameter UUID
の文字列表現です。

CB_EXTERN NSString * const CBUUIDServiceChangedString;

GATT service changed UUID
の文字列表現です。

CBUUID クラス

16-bitまたは128-bitのBluetooth UUIDを表すクラスです。
16-bit UUIDは、いうまでもなく、Bluetooth Base UUIDで事前に満たされています。
(訳者注:Bluetooth Low EnergyのUUIDは、128-bitが基本です。しかし、Bluetooth SIGが定義したものは16-bitの短縮形UUIDが使えます。この16-bitのUUIDは、Bluetooth Base UUIDという128-bit のUUIDの先頭の末尾16-bitを使うことで、実現しています。)

プロパティ

@property(nonatomic, readonly) NSData *data;

NSDataとしてのUUID

/*!

  • @method UUIDWithString:
    *
  • @discussion
  • Creates a CBUUID with a 16-bit or 128-bit UUID string representation.
  • The expected format for 128-bit UUIDs is a string punctuated by hyphens, for example 68753A44-4D6F-1226-9C60-0050E4C00067.
    /

メソッド

+ (CBUUID )UUIDWithString:(NSString )theString;

16-bitもしくは128-bitのUUID文字列表記からCBUUIDを作ります。
128-bit UUIDはハイフンで区切られた文字列フォーマットを期待します。例: 68753A44-4D6F-1226-9C60-0050E4C00067 。
(訳者注:16-bitのUUIDは、4桁の16進表記文字列で与えます。先頭に0xをつける必要は、ありません。)

+ (CBUUID )UUIDWithData:(NSData )theData;

16-bitもしくは128-bitのデータコンテナからCBUUIDを作ります。

+ (CBUUID *)UUIDWithCFUUID:(CFUUIDRef)theUUID;

CFUUIDRef からCBUUIDを作ります。

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

これはCBServiceクラスのドキュメントを、CoreBluetoothを理解するために必要最小限の部分について、日本語訳したものです。

CBServiceクラスは、ペリフェラルのサービスまたはサービスのincluded serviceを表します。

プロパティ

@property(readonly, nonatomic) CBPeripheral *peripheral;

このサービスが属するペリフェラルへのポインタ。

@property(readonly, nonatomic) CBUUID *UUID;

サービスのBluetooth UUID

@property(readonly, nonatomic) BOOL isPrimary;

サービスのタイプ(primary または secondary)

@property(retain, readonly) NSArray *includedServices;

このサービスでこれまでに発見されたincluded serviceのリスト。

@property(retain, readonly) NSArray *characteristics;

このサービスでこれまでに発見されたcharacteristicのリスト。

CBMutableServiceクラス

CBPeripheralManagerを通してローカルデータベースに追加できる、ローカルサービスもしくはincluded serviceを作るのに使います。
一旦サービスが公開されたならば、キャッシュされて、それ以降は変更できません。
このクラスはCBServiceのすべてのプロパティに書き込み属性を追加します。

iOS6以降で有効です。

@property(retain, readwrite, nonatomic) CBUUID *UUID;

@property(readwrite, nonatomic) BOOL isPrimary;

@property(retain, readwrite) NSArray *includedServices;

@property(retain, readwrite) NSArray *characteristics;

- (id)initWithType:(CBUUID *)UUID primary:(BOOL)isPrimary;

サービスタイプとUUIDで初期化されたサービスを返します。

  • UUID
    • サービスのBluetooth UUID
  • isPrimary
    • サービスのタイプ(primary または secondary)

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

これはCBPeripheralManagerクラスのリファレンスを、CoreBluetoothを理解するために必要最小限の部分を日本語訳したものです。

CBPeripheralManagerクラスは、peripheral roleへの入り口です。
コマンドは、その状態がCBPeripheralManagerStatePoweredOn のときにだけ、発行されるべきです。
2つ以上のCBPeripheralManagerを同時に使うことはサポートされませんし、そうした場合には不定の振る舞いをするでしょう。

CBperipheralManagerクラスは、iOS6以降で利用できます

プロパティ

@property(assign, nonatomic) id delegate;

Peripheralイベントを受信するデリゲート。

@property(readonly) CBPeripheralManagerState state;

Peripheralの現在の状態。初期値はCBPeripheralManagerStateUnknown。
値更新は、required なデリゲートのメソッド
peripheralManagerDidUpdateState:
に提供されます。

@property(readonly) BOOL isAdvertising;

Peripheralが、今データをアドバタイズしているか、いなかを示します。

インスタンス・メソッド

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

イニシャライザです。Peripheral roleのイベントは、指定されたキューで処理されます。
もしもキューがnilならば、メインキューが使われるでしょう。

  • delegate
    • Peripheral roleイベントを受け取るデリゲート。
  • queue
    • イベントを処理するdispatch queue。

- (void)startAdvertising:(NSDictionary *)advertisementData;

アドバタイズメントを開始します。サポートされているアドバタイズメント・データ・タイプは、CBAdvertisementDataLocalNameKey と CBAdvertisementDataServiceUUIDsKey です。

アプリケーションがフォアグランドのときは、
初期のアドバタイズメント・データを、28バイトまで、
サポートされているアドバタイズメント・データ・タイプの任意の組み合わせに使えます。
もしこの領域を使い切ると、scan responseの10バイトを追加の領域として、ローカルネームに対してのみ、使えます。

このサイズは、新しいデータタイプそれぞれに必要な2バイトのヘッダ情報を含まないことに、注意してください。

割り当て領域に収まらなかったサービスUUIDsは、特別な”オーバフロー”領域に追加されます。したがって、それらのサービスUUIDは、
iOSデバイスが、それらを明示的にスキャンしたときにだけ、発見されます。

アプリケーションがバックグラウンドにあるときは、ローカルネームは使われず、すべてのサービスUUIDsは“オーバフロー”エリアに置かれます。

see peripheralManagerDidStartAdvertising:error:

seealso CBAdvertisementData.h

- (void)stopAdvertising;

アドバタイズを停止します。

- (void)setDesiredConnectionLatency:(CBPeripheralManagerConnectionLatency)latency forCentral:(CBCentral *)central;

すでにあるセントラルとの接続の、コネクション・レイテンシを希望する値に設定します。
コネクション・レイテンシの変更は保証されず、したがって結果として得られる遅延は、指定したものとは違うかもしれません。
もしも望むレイテンシが設定されないなら、接続が確立した時にセントラルが選んだレイテンシが使われます。
一般に、レイテンシを変更する必要はありません。

see CBPeripheralManagerConnectionLatency

- (void)addService:(CBMutableService *)service;

サービスと、それに関連付けられたcharacteristic(s)をローカルデータベースに公開します。もしもサービスがincluded serviceを含むなら、
まずincluded serviceが最初に公開されねばなりません。

  • service
    • GATTサービス

see peripheralManager:didAddService:error:

- (void)removeService:(CBMutableService *)service;

ローカルデータベースから、公開されたサービスを削除します。もしもサービスがincluded serviceを含むならば、まず最初にincluded serviceが削除されねばなりません。

- (void)removeAllServices;

ローカルデータベースから、すべての公開されているサービスを削除します。

- (void)respondToRequest:(CBATTRequest *)request withResult:(CBATTError)result;

peripheralManager:didReceiveReadRequest: もしくは peripheralManager:didReceiveWriteRequests: のデリゲートのメソッドで受信したリクエストに応答するのに使います。

  • request
    • セントラルから受信されたオリジナルのリクエスト
  • result
    • request を満たそうとした結果

see peripheralManager:didReceiveReadRequest:

see peripheralManager:didReceiveWriteRequests:

- (BOOL)updateValue:(NSData )value forCharacteristic:(CBMutableCharacteristic )characteristic onSubscribedCentrals:(NSArray *)centrals;

1つもしくはそれ以上のセントラルに、更新されたcharacteristicの値を、notificationもしくはindicationで送信します。

返り値は、アップデートが送信されたならばYES、送信キューが満杯ならばNO。
もしNOが返ってきたら、スペースが有効になった時に1度、デリゲートの peripheralManagerIsReadyToUpdateSubscribers: メソッドが呼ばれる。したがって、もしも望むならば、アップデートを再送信する。

  • value
    • notification/indicationで送信される値
  • characteristic
    • 値が変化したcharacteristic。
  • centrals
    • アップデートを受け取るCBCentralオブジェクトのリスト。characteristic を購読していないセントラルは無視されることに注意する。もしもnilならば、characteristicが購読するセントラルすべてが更新される。
      see peripheralManager:central:didSubscribeToCharacteristic:

see peripheralManager:central:didUnsubscribeFromCharacteristic:

see peripheralManagerIsReadyToUpdateSubscribers:

列挙型

CBPeripheralManagerState

CBperipheralManagerの現在の状態を表します。

  • CBPeripheralManagerStateUnknown
    • 不明な状態。すぐに更新されます。
  • CBPeripheralManagerStateResetting
    • システムサービス都の接続が、一時的に失われました。すぐにアップデートされます。
  • CBPeripheralManagerStateUnsupported
    • そのプラットフォームはBluetooth Low Energy Peripheral/Server roleをサポートしません。
  • CBPeripheralManagerStateUnauthorized
    • アプリケーションはBluetooth Low Energy Peripheral/Server roleを使う権限がありません。
  • CBPeripheralManagerStatePoweredOff
    • Bluetoothは現在電源がオフです。
  • CBPeripheralManagerStatePoweredOn
    • Bluetoothは現在電源がオンで、利用できます。

CBPeripheralManagerConnectionLatency

Peripheral-central接続の遅延時間は、メッセージがどれほどの頻度で交換できるか、を制御します。

  • CBPeripheralManagerConnectionLatencyLow
    • バッテリーの持ち時間よりも、素早い通信を優先します。
  • CBPeripheralManagerConnectionLatencyMedium
    • 通信の頻度とバッテリーの持ち時間とのバランスを取ります。
  • CBPeripheralManagerConnectionLatencyHigh
    • 素早い通信よりも、バッテリーの持ち時間を伸ばすことを優先します。

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

プロパティ

@property(readonly, nonatomic) CBCharacteristic *characteristic;

属するcharacteristicのポインタです。

/*!

  • @property UUID
    *
  • @discussion
  • The Bluetooth UUID of the descriptor.
    /

    @property(readonly, nonatomic) CBUUID *UUID;

    DescriptorのBluetooth UUIDです。

@property(retain, readonly) id value;

Descriptorのあちあです。様々なデスクリプタに対応するvalue typeの詳細は、CBUUIDクラスで定義されています。

CBMutableDescriptorクラス

iOS6以降で有効です。

- (id)initWithType:(CBUUID *)UUID value:(id)value;

サービスタイプとvalueで初期化されたdescriptorを返します。一旦親であるserviceが公開されたならば、valueは要求されて、ダイナミックに更新することはできません。

  • UUID
    • DescriptorのBluetooth UUID
  • value
    • Descriptorの値

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

iOS6以降で有効です。
CBATTRequestクラスは、セントラルからの読み出し/書き込み要求を表します。

プロパティ

@property(readonly, retain, nonatomic) CBCentral *central;

リクエストを発生させたセントラルです。

@property(readonly, retain, nonatomic) CBCharacteristic *characteristic;

値を読み書きするcharacteristicです。

/*!

  • @property offset
    *
  • @discussion The zero-based index of the first byte for the read or write.
    /

    @property(readonly, nonatomic) NSUInteger offset;

    0から始まる、読み書きする最初のバイト位置です。

@property(readwrite, copy) NSData *value;

読み書きするデータです。
読み出し要求では、value はnilで、respondToRequest:withResult: に返信する前に設定されるべきです。
書き込み要求では、valueは書き込まれるべき値を含んでいます。

CBCharacteristics/CBMutableCharacteristic クラスリファレンス 日本語訳

これはCBCharacteristicsクラスのうちCoreBlutoothを理解するために必要最小限の部分を日本語訳したものです。

CBCharacteristicsクラス

プロパティ

@property(readonly, nonatomic) CBService *service;

このcharacteristicが属するサービスへのポインタです。

@property(readonly, nonatomic) CBUUID *UUID;

characteristicのBluetooth UUID。

@property(readonly, nonatomic) CBCharacteristicProperties properties;

characteristicのプロパテイです。

@property(retain, readonly) NSData *value;

characteristicsの値です。

@property(retain, readonly) NSArray *descriptors;

このcharacteristicで、これまでに発見されたCBDescriptorsのリストです。

@property(readonly) BOOL isBroadcasted;

このcharacteristcが現在ブロードキャストされているか、否かを示します。

@property(readonly) BOOL isNotifying;

このcharacteristicが現在ノーティフィケーションされているか否かを示します。

CBMutableCharacteristics クラス

iOS6から有効です。
CBMutableCharacteristicsクラスは、CBCharacteristicクラスを継承します。

プロパティ

@property(assign, readwrite, nonatomic) CBAttributePermissions permissions;

characteristic valueの許可設定です。

see CBAttributePermissions

@property(retain, readwrite, nonatomic) CBUUID *UUID;

@property(assign, readwrite, nonatomic) CBCharacteristicProperties properties;

@property(retain, readwrite) NSData *value;

@property(retain, readwrite) NSArray *descriptors;

インスタンスメソッド

- (id)initWithType:(CBUUID )UUID properties:(CBCharacteristicProperties)properties value:(NSData )value permissions:(CBAttributePermissions)permissions;

返り値は、初期化されたcharacteristicです。

  • UUID
    • characteristicのBluetooth UUIDです。
  • properties
    • characteristicのプロパティです。
  • value
    • キャッシュされるcharacteristicの値です。もしもnilならば、値はダイナミックであり、オンデマンドで要求されます。
  • permissions
    • charactersticの値のパーミションです。

列挙型

CBAttributePermissions

ATT attributeの読み出し/書き込み/暗号化許可属性です。論理和で結合できます。

  • CBAttributePermissionsReadable
    • 読み出しのみ
  • CBAttributePermissionsWriteable
    • 書き込みのみ
  • CBAttributePermissionsReadEncryptionRequired
    • 信頼されたデバイスが、読み出し可能
  • CBAttributePermissionsWriteEncryptionRequired
    • 信頼されたデバイスが、書き込み可能

CBCharacteristicProperties

CBCharacteristicPropertiesは、そのcharacteristicの値がどのように使えるか、またはdescriptor(s)がアクセスできるかを示します。
論理和で結合させることができます。
特に明記がない限り、
CBPeripheralManager で公開されたローカルのcharacteristicsに対してプロパティは有効です。

  • CBCharacteristicPropertyBroadcast
    • characteristic configuration descriptorを使って、characteristicの値をブロードキャすることを許します。
    • local characteristcには許されていません。
  • CBCharacteristicPropertyRead
    • characteristicの値を読むことを許します。
  • CBCharacteristicPropertyWriteWithoutResponse
    • characteristicの値への、レスポンスがない書き込みを許可します。
  • CBCharacteristicPropertyWrite
    • characteristicの値への、書き込みを許可します。
  • CBCharacteristicPropertyNotify
    • characteristicの値の、レスポンスがないノーティフィケーションを許可します。
  • CBCharacteristicPropertyIndicate
    • characteristicの値の、インディケーションを許可します。
  • CBCharacteristicPropertyAuthenticatedSignedWrites
    • characteristicの値への、承認ありの書き込みを許可します。
  • CBCharacteristicPropertyExtendedProperties
    • もしも設定されていれば、追加のcharacteristicプロパティが、characteristic extended properties descriptorに定義されています。
    • local characteristicsには許されていません。
  • CBCharacteristicPropertyNotifyEncryptionRequired
    • もしも設定されていれば、信頼されたデバイスのみがcharacteristicの値のノーティフィケーションを有効に出来ます。
  • CBCharacteristicPropertyIndicateEncryptionRequired
    • もしも設定されていれば、信頼されたデバイスのみがcharacteristicの値のインディケーションを有効に出来ます。

CBPeripheralDelegateプロトコル リファレンス 日本語訳

これはApple社のhttp://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.htmlのうち、CoreBluetoothを理解するために必要最小限の部分を日本語訳したものです。

CBPeripheralDelegateプロトコルは、CBPeripheralのdelegateプロパティが実装すべきプロトコルです。
CBPeripheralDelegateプロトコルの、すべてのメソッドはoptionalです。

インスタンス・メソッド

- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService )service error:(NSError *)error;

-[discoverCharacteristics:forService:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたcharacteriticsは、それがあったならば、サービスの”characteristics”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

Invoked upon completion of a request.

- (void)peripheral:(CBPeripheral )peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[discoverDescriptorsForCharacteristic:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたdescriptorsは、それがあったならば、キャラクタリスティックの”descriptors”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

Invoked upon completion of a -[discoverIncludedServices:forService:] request.

- (void)peripheral:(CBPeripheral )peripheral didDiscoverIncludedServicesForService:(CBService )service error:(NSError *)error;

-[discoverIncludedServices:forService:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたservicesは、それがあったならば、サービスの”includedServices”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error;

-[discoverServices:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたservicesは、それがあったならば、ペリフェラルの”services”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[setNotifyValue:forCharacteristic:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

(訳者注:ここから先の説明があまりに素っ気いないのですが、原文そのままです。あまりにそっけないので、あとで解説を追加します。)

- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[readValueForCharacteristic:] リクエストが完了した、もしくはnotification/indicationを受信した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForDescriptor:(CBDescriptor )descriptor error:(NSError *)error;

-[readValueForDescriptor:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didWriteValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[writeValue:forCharacteristic:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didWriteValueForDescriptor:(CBDescriptor )descriptor error:(NSError *)error;

-[writeValue:forDescriptor:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheralDidUpdateRSSI:(CBPeripheral )peripheral error:(NSError )error;

-[readRSSI:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、ペリフェラルの”RSSI”プロパティは更新されています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

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

プロパティ

@property(assign, nonatomic) id delegate;

ペリフェラルのイベントを受信するデリゲートです。

@property(readonly, nonatomic) CFUUIDRef UUID;

ペリフェラルが、少なくとも一度システムから接続されたことがあれば、ペリフェラルにはUUIDが割り当てられます。(訳者注:逆にこれまで一度も接続したことがないペリフェラルでは、nilになります。接続は、他のアプリでの接続、iPhoneの電源オン/オフ、再起動に関係なく、一度でも接続したことがあるペリフェラルであれば、UUIDが割り当てらています。)

ペリフェラルを取得するために、後に
BCentralManager
に与えるために、このUUIDを保存しておけます。

@property(retain, readonly) NSString *name;

ペリフェラルの名前です。(訳者注:アドバタイズメント・データのローカル名を示します。通常は型番が与えらています。)

@property(retain, readonly) NSNumber *RSSI;

接続している間、接続のRSSIをデシベルで表します。

(訳者注:RSSIは、Received Signal Strength Indicatorの略称で、受信信号強度を表します。このRSSIは、RF送受信の半導体が出力する信号値をそのまま使っていると推測されます。物理的に絶対値が正しい値とは限りませんが、目安としては利用できるでしょう。信号レベルは対数で、デシベル(10log 信号電力)で表します。通常、-40 ~ -90dB程度の範囲です。マイナスになるほど、信号が弱いことを示します。)

@property(readonly) BOOL isConnected;

ペリフェラルが現在接続しているかを、示します。

@property(retain, readonly) NSArray *services;

ペリフェラルで発見されたサービスの、CBServiceオブジェクトのリストです。

メソッド

- (void)readRSSI;

接続の現在のRSSIを取得します。

see peripheralDidUpdateRSSI:error:

- (void)discoverServices:(NSArray *)serviceUUIDs;

ペリフェラルで有効なサービスを発見します。

  • serviceUUIDs
    • 発見すべきサービスのUUIDを表す、CBUUIDオブジェクトのリストです。もしもnilを与えると、ペリフェラルのすべてのサービスが発見されるでしょうが、とても遅くなり、従って推奨しません。

see peripheral:didDiscoverServices:

- (void)discoverIncludedServices:(NSArray )includedServiceUUIDs forService:(CBService )service;

指定したサービスのincluded serviceを発見します。
(訳者注: Bluetooth low energyのサービスは、オブジェクト指向でいうクラスの概念に相当します。いまあるサービスはそのまま提供しつつ、そのサービスの機能を拡張する仕組みが、included serviceで、ちょうどクラス継承の概念に相当します。)

  • includedServiceUUIDs
    • 発見すべきincluded serviceのUUIDを表すCBUUIDオブジェクトのリストです。もしもnilならば、サービスのすべてのincluded serviceが発見されますが、とても遅くなり、従って推奨しません。
  • service
    • プライマリGATTサービス

see peripheral:didDiscoverIncludedServicesForService:error:

- (void)discoverCharacteristics:(NSArray )characteristicUUIDs forService:(CBService )service;

サービスの指定したcharacteristicを発見します。

  • charactertisticsUUIDs
    • 発見すべきcharacteristicのUUIDを表すCBUUIDオブジェクトのリストです。もしnilならば、サービスのすべてのcharacteristicsが発見されますが、とても遅くなり、従って推奨しません。
  • service
    • GATTサービス

see peripheral:didDiscoverCharacteristicsForService:error:

- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;

characteriticの値を読みます。

  • characteristic
    • GATT characteristic

see peripheral:didUpdateValueForCharacteristic:error:

- (void)writeValue:(NSData )data forCharacteristic:(CBCharacteristic )characteristic type:(CBCharacteristicWriteType)type;

characteristicの値として、valueを書き込みます。

  • data
    • 書き込む値
  • characteristic
    • 書き込み対象のcharacteristic
  • type
    • 書き込みタイプ。characteristicへの書き込み完了を報告する/しないが設定できる。

see peripheral:didWriteValueForCharacteristic:error:

see CBCharacteristicWriteType

- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;

characteristicの値の、notification/indicationの有効/無効を背呈します。

characterisitcが、notification/indicationの両方を許可しているならば、notificationが使われます。
notification/indicationが有効になったとき、characteristicの値更新は、デリゲート
peripheral:didUpdateValueForCharacteristic:error:
に通知されます

更新を送るのは、選択したペリフェラルが行うものなので、
notification/indicationが有効である間、アプリケーションはその変更を処理できるように備えるべきです。

(訳者注:Bluetooth low energyは、接続先の装置の値更新をiPhone側にプッシュする仕組みがあります。それがnotificationとindicationです。この2つの違いは、通知の信頼性です。

  • notification
    • 接続先の装置からiPhoneに、値の更新を通知します。
    • notificationは通知だけの、信頼性のない通知です。iPhoneが接続先の装置に、値更新通知を受信したことを返しません。
  • indication
    • notificationと同じく、接続先の装置からiPhoneに、値の更新を通知します。
    • indicationは、iPhoneが接続先装置に値更新を受信したことを返信する、信頼性が確保された通知方法です。

例えば、室温やバッテリー残量のように、センサーなどの値変化を通知するが、一定周期で送信するため、通知データを取りこぼしても問題がない場合は、notificationを用いるなどします。

notification/indicationのいずれを実装しているかは、装置のファームウェア設計によります。readできるcharacteristicが、notification/indicationを実装しているとは限りません。iPhone側は、configutaionをみて、そのcharacteristicがnotification/indicationに対応しているかをみることしかできません。)

  • enabled
    • notification/indication を有効にすべきか、否かを設定します
  • characteristic
    • クライアントcharacteristic configuration descriptorを保持しているcharacteristic

see peripheral:didUpdateNotificationStateForCharacteristic:error:

seealso CBConnectPeripheralOptionNotifyOnNotificationKey

- (void)discoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic;

characteristicのdescriptor(s)を発見します。

  • characteristic
    • GATT characteristic

see peripheral:didDiscoverDescriptorsForCharacteristic:error:

- (void)readValueForDescriptor:(CBDescriptor *)descriptor;

descriptorの値を読みます。

  • descriptor
    • GATT characteristic descriptor

see peripheral:didUpdateValueForDescriptor:error:

- (void)writeValue:(NSData )data forDescriptor:(CBDescriptor )descriptor;

descriptorの値としてvalueを書き込みます。Client characteristic configuration descriptorはこのメソッドで書き込みはできません。
それには、 setNotifyValue:forCharacteristic: を使うべきです。

see peripheral:didWriteValueForCharacteristic:error:

###

列挙型

CBCharacteristicWriteType

  • CBCharacteristicWriteWithResponse = 0,
  • CBCharacteristicWriteWithoutResponse,