Androidのメモとか

ポキオの日記です。今日も遅延してない。

Raspberry PiのBLEをNode.jsのnobleから叩いてmicro:bitを見つけてみる

ちょっと癖があるね。

ポキオ Raspberry Pi BLE Central noble

前回まで

RPiのBLEをnobleから叩いてました。

relativelayout.hatenablog.com

今回は、micro:bitのBLE機能を有効にして、RPiからmicro:bitをスキャンしてみようと思います。

relativelayout.hatenablog.com

ちなみに、micro:bitは電池ケースにくっつけて給電できるようにしています。

とりあえずスキャン

フツーにScanすれば良いんですが。

var noble = require('noble')

noble.on('discover', function(peripheral){
    console.log(peripheral)
})

noble.startScanning()

startScanning()のオプションでGATTのサービスのUUIDを指定することができ、これによってスキャン結果をそのサービスがあるペリフェラルにフィルタできるようで。試しにmicro:bitのサービスを指定してスキャンをしてみました。

たとえば、加速度サービスのUUIDはe95d0753-251d-470a-a062-fa1922dfa9a8なので、

noble.startScanning(['e95d0753251d470aa062fa1922dfa9a8'], false)

みたいに叩けばよいはず。これで叩いてみると・・・なぜかmicro:bitが見つかりません・・・。

接続しないとサービスがわからない?

そんなのもんなのかなぁ思い、改めてオプション無しでstartScanning()して、見つかったmicro:bitのプロパティを見てみると・・・。

Peripheral {
  _noble: 
   Noble {
    (中略)
 },
  id: 'xxxxxxxxxxxx',
  uuid: 'xxxxxxxxxxxx',
  address: 'xx:xx:xx:xx:xx:xx',
  addressType: 'random',
  connectable: true,
  advertisement: 
   { localName: 'BBC micro:bit [xxxxx]',
     txPowerLevel: undefined,
     manufacturerData: undefined,
     serviceData: [],
     serviceUuids: [],
     solicitationServiceUuids: [],
     serviceSolicitationUuids: [] },
  rssi: -33,
  services: null,
  state: 'disconnected' }

serviceUuidsが空っぽですねぇ。これが空なのでUUIDでフィルタができなかったのでしょうか・・・。とはいえ、localNameにはちゃんとmicro:bitと入っているので、とりあえずワークアラウンドとしてlocalNameでフィルタするしかないんですかね・・・。たとえばこんな感じ。

var noble = require('noble')

noble.on('discover', function (peripheral) {
    var localName = peripheral.advertisement.localName

    if (localName && localName.startsWith('BBC micro:bit')) {
        console.log('micro:bit found!')
    }
})

noble.startScanning()

うーん、ちょっとダサいけど、動いてそうだしこれで行くか・・・。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。