2013/11/23

[ble]BLEを試してみたい (2)

Android4.4のUSBデバッグアイコンが、いつも気になる。
キットカットなんだろうとは思うけど、なんか、なかなか、ねぇ。

image

  • チョーク4本
  • いかだ
  • お風呂のふた
  • 本の背表紙

4.4も、最初はKがつくパイの名前だったと思う。KがつくパイといえばKidney Pieが思いつくんだけど、あれはお菓子じゃなくて料理なのかな?


では、サンプルソースもあることだし、まねをしながら同じようなアプリを作ってみよう。
作りながらメモを書いていくだけなので、途中で間違ってしまう可能性有りだ。
ちゃんとした説明は、以下のページがよさそうだった。
【連載】Bluetooth LE (5) Android 4.3 で Bluetooth LE 機器を使う

じゃあ書かんでいいやん、と思われるだろうが、勉強の一環だ。

 

AndroidManifest

まずは、Android Manifestだろう。
uses-featureとuses-permissionを追加するようだ。

image

android.hardware.bluetooth_le

 

image

android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN

それぞれ、通信許可と検索許可らしい。
ペアリングが済んでいたらADMINはいらないのかな? まあ後で試そう。

いつも思うのだが、uses-permissionはコンボボックスで選択できるのに、uses-featureはテキスト入力なので、うろ覚えで選択ができない。
こっちもコンボボックスにしてくれないものか。

サンプルではServiceがあるので、そのための記述があるけど、まあ後で考えよう。

 

BLE peripheralのスキャン(の下調べ)

まず、対象の機器を探そう。
RC-S390はボタンを長押しすると「私はここよ!」みたいなモードになるらしい。
たぶん、これが「Advertising」という状態なんだろう。
Interface誌の説明では、Advertisingとかはリンク層の動作らしい。
まだGATTとかのアプリは絡んでこない。

Advertising→Connecting、という流れだそうな。
Core_V4.0[zip]を見ると、p.2263に状態の一覧らしきものがあった。

  • Standby
  • Advertising
  • Scanning
  • Initiating
  • Connection

まず最初はStandby。
Initial Setup→Random Device Address→White Lists、という過程を経ないとadvertising/scanning/initiatingにできなさそうだ。
PDFでは、Host A/LL Aだけがやってるけど、これはHost B/LL Bでも同じなのかな?
どちらかがCentralで、どちらかがPeripheralになると思うのだが。。。

Advertisingは「by enabling advertising」とあるので、Standby状態から「advertisingになりたい」という要求を受けないと遷移しないのだろう。
RC-S390では、そのトリガがボタンの長押しということか。
UndirectedとDirectedの2種類があるらしい。PDFのシーケンス図を見ると、Undirectedでは"Advert"が飛んでいるが、Directedだと"LL_DIRECT_IND"が飛んでいる。。。何を見たらいいんだ。。。

 

PDFのp.1639にGAPと機能の必須/オプションみたいな表がある。
GAPは、Generic Access Profileの略らしいが、もうこの際細かいことはどうでもよい。
PeripheralとかCentralという文字が出てきてるので、この表を見ると何かわかりそうな気がする。

  • StandbyはCentralもPeripheralも必須
  • AdvertisingはPeripheral必須
  • ScanningはCentral必須
  • InitiatingもCentral必須
  • Connectionは、CentralはMaster必須、PeripheralはSlave必須

ということらしい(MはMandatoryだろうけど、Eはなんだろう。。。)。
Advertisingに2種類あると書いたが、Undirectedが必須で、Directedはオプショナル(なんかタイプが44つあるみたいで、Connectable undirected eventってのが必須)。
後で出てくるScannningも、Activeは必須(正確にはC1)で、Passiveはオプショナル。
(でも「オプショナル」っていいつつ、普通載せるけど、ってことあるしなぁ。。)

 

さて、基礎知識を身につけたところで、再挑戦。
Standbyは、CentralもPeripheralも実施する。
そしてPeripheralはAdvertisingを開始し、CentralはScanningを開始。
CentralがScanningしてPeripheralを見つけたら、Initiatingする。
Initiatingは、PeripheralとしてはAdvertに対してCONNECT_REQが返ってくる動作に見えるようだ。そこまで含めて"Advertising"ということか。
Initiatingが終わると、接続完了ってことで、たぶんConnection状態になるんだと思う。

調べるのが面倒なので推測だが、Connection状態になると、「切断」ってやらない限りは接続が切れないようになってるんじゃなかろうか。
そうじゃないと、RC-S390をつなげたiPad miniが電源とか切ってても、アプリを起動したらAdvertisingしなくても使えるようになることの説明がつかない。
まあ、相手がいなかったら切断するってしくみにすることもできるんだろうけど、プロトコルとして制約がないってことなんじゃなかろうか。
ほら、NFCのLLCPだと一定時間内に応答がなかったら切断シーケンスに入るから、それとは違うということをいいたいのだよ。

 

脱線したが、スキャン動作は、ペアリングとは別として「必要」ということだ。
じゃあペアリングはなんなんだ? なくてもよいのか??
これもInterface誌にあった。
リンク層の接続はAdvertisingとかでやるが、ペアリングはもう少し上の層での認証接続とのことだ。通信する相手が正しいかどうかの確認を行うということか。
だから、ペアリングしなくてもRC-S390は見えたが、サービス取得などができなかったということのは、まだ接続してよい相手として認められていなかったからだろう。
なお、Interface誌の説明ではペアリングにも4種類あり、自動で承認するタイプもあるんだって。
へー。

 

また脱線してしまった。。。
長くなりすぎたので、今回はここまで。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。