Intel EdisonをiBeacon化する.

概要

今回はNode.jsのモジュールであるnode-bleconを使ってIntel EdisonをiBeacon化してみる.

Intel EdisonでLチカした後にすることもないし積んでるわ,みたいな人はiBeacon化してリポ挿してチャリとかバッグにでもつけておけばいいんじゃないですかね+。:.゚+。:.゚+。:.゚(๑>◡╹๑)(๑╹◡<๑):.。+゚:.。+゚:.。+゚

手順

  1. EdisonのBluetoothをオンにする
  2. bluez5-devの導入
  3. bleaconを導入する
  4. コード記述とPCを使った動作確認

1. EdisonのBluetoothをオンにする

デフォルトではBluetoothがオフになっているので,オンにしておきましょう.

$ rfkill unblock bluetooth
$ hciconfig hci0 up

2. bluez5-devの導入

デフォルトだとBluetooth.hというヘッダがなくてbleaconを導入しても動作しないので,Bluetoothを扱うためのパッケージを導入します.
その前にパッケージのアップデート./etc/opkg/base-feeds.conf へ以下を追加.

# /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

したらアップデートしておく.

$ opkg update
$ opkg upgrade

準備ができたらbluez5-devというパッケージをインストールする.

$ opkg install bluez5-dev

3. bleaconを導入する

Node.jsを使ってiBeaconを実現するモジュールとして,bleaconがある.今回はこれを利用するので,npmを使って導入しておく.

# テキトーにプロジェクト用ディレクトリをきる.
$ mkdir test_bleacon
$ cd test_bleacon
$ npm install bleacon

4. コード記述と動作確認

4-1. ibeaconにするためのコード

以下のコードをibeacon.jsみたいなjsファイルを作って記述する.複数のibeaconを使うようなシステムを組むときには,uuidをuuidgenコマンドとか使ってつくろう.

// ibeacon.js
var bleacon = require('bleacon');
var uuid = 'e2c56db5dffb48d2b060d0f5a71096e0';
var major = 0; // 0 - 65535
var minor = 0; // 0 - 65535
var measuredPower = -59; 

bleacon.startAdvertising(uuid, major, minor, measuredPower);

動作させる.

$ node ibeacon.js

このままだとホントに動いてるかよくわからないので,動作確認用プログラムを作る.

4-2. 動作確認用PC側プログラムの作成

bleaconはibeaconを検出するプログラムとしても使える.なので,PCにbleaconを導入して確認する.以下はPCで作業する.
PCの場合,bluez5-devを導入する必要はなく,PC側のBluetooth機能だけオンにしておく必要がある.

$ mkdir test_bleacon
$ cd test_bleacon
$ npm install bleacon

iBeaconを検出するコードをつくる.

//detect_ibeacon.js
var bleacon = require('bleacon');
bleacon.startScanning();

bleacon.on('discover', function(bleacon) {
       console.log(bleacon);
});

実行して検出できるか確認する.4-1でつくったibeaconプログラムを動作させておく.

$ node detect_ibeacon.js

4-3. 動作結果

すると,以下の様な感じで検出される.1ペアの中括弧でくくられたJSONっぽいやつが1回の検出で得られたデータ.rssiにもとづいて,Proximityが算出される.ここでは,Edisonを動かしたことによってimmediate〜nearに変化していることが分かる.

{ uuid: 'aebd140fa4884c39a5e6057f22f27ef5',
  major: 0,
  minor: 0,
  measuredPower: -59,
  rssi: -42,
  accuracy: 0.34164432192825195,
  proximity: 'immediate' }
{ uuid: 'aebd140fa4884c39a5e6057f22f27ef5',
  major: 0,
  minor: 0,
  measuredPower: -59,
  rssi: -42,
  accuracy: 0.34164432192825195,
  proximity: 'immediate' }
{ uuid: 'aebd140fa4884c39a5e6057f22f27ef5',
  major: 0,
  minor: 0,
  measuredPower: -59,
  rssi: -65,
  accuracy: 1.4609012747687342,
  proximity: 'near' }
{ uuid: 'aebd140fa4884c39a5e6057f22f27ef5',
  major: 0,
  minor: 0,
  measuredPower: -59,
  rssi: -64,
  accuracy: 1.3714628775092443,
  proximity: 'near' }

今後やりたいこと

ひと月くらい前に,BluetoothLEの仕様とか実装についてがっつり調べていたので,Central, Peripheralとして動作させる方法とか把握しておきたい.
前回のエントリで使ったIoT Analyticsも便利なんだけど,iOSAndroid端末にBLE経由でデータ収容する方法も把握しておきたいなあ〜と思ってる.