スマホをビーコンの受信機とした位置情報の取得は、現在各地で実証実験が行われているところですが、小型で安価なビーコンタグの普及の加速により、その逆の形として、ビーコンを取り付けたモノや人の位置情報をビーコンの受信機により検知し、クラウド処理する事案が増えています。
今回は、ibeaconの信号を受信し、uuid、受信したゲートウェイのデバイスID、電波強度であるrssiをIBMのBluemixで処理するためのゲートウェイソフトウェアの例を紹介します。
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。
<検証環境>
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison
1. 事前準備
・ネットワークへの接続
BX1 を外部ネットワークに接続可能な状態にします。本体にSIMを入れることにより3G通信も可能ですが、開発環境の構築や、パッケージの入手などはWifi 環境に接続するか、USB分岐ケーブルにUSB-Etherアダプタなどを利用して有線LAN接続することをおすすめします。
以下、WebUIの無い、先行開発キットでの手順となります。
・bluetoothの設定
Bluetoothは、初期状態ではblockしてありますので、rfkillコマンドによりunblockしてください。
具体的には、以下の手順で手動で行うか、
# bluetooth_rfkill_event &
# rfkill unblock bluetooth
# rfkill unblock bluetooth
以下の3行をrc.localに追加します。
bluetooth_rfkill_event &
sleep 1
rfkill unblock bluetooth
sleep 1
rfkill unblock bluetooth
・node.jsのインストール
node.jsのインストール方法は、前回の記事を参照してください。
---
WebUIのインストールされた製品を使用される場合は、node.jsパッケージはインストール済、かつbluetooth設定はWebUIより行いますので、以下の手順でnpmだけを追加インストールしてください。
# export TMPDIR=/var/tmp
# curl -L https://npmjs.org/install.sh | sh
# curl -L https://npmjs.org/install.sh | sh
2. ibeaconゲートウェイソフトウェアの構築
ソフトウェアを構築するディレクトリを作成します。
# mkdir ibeacon
# cd ibeacon
# cd ibeacon
node.jsを使用してibeaconの送受信を行うbleaconモジュールを導入します。
bleaconの導入には、 libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。
# aptitude update
# aptitude install libbluetooth-dev
# npm install bleacon
# aptitude install libbluetooth-dev
# npm install bleacon
bluemixへデータを送信するためのMQTTクライアントライブラリおよび、getmacライブラリをインストールします。
# npm install mqtt
# npm install getmac
# npm install getmac
次に、ゲートウェイプログラムを作成します。
# vi ib2b.js
ib2b.js
var bleacon = require("bleacon");
var mqtt = require('mqtt');
var getmac = require('getmac');
// constants
var u_port = "1883";
var s_port = "8883";
var pub_topic = "iot-2/evt/sample/fmt/json";
var sub_topic = "iot-2/cmd/blink/fmt/json";
var qs_org = "quickstart";
var reg_domain = ".messaging.internetofthings.ibmcloud.com";
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";
var qs_type = "iotsample-ti-bbst";
var configFile = "./device.cfg";
var ledPath ="/sys/class/leds/beaglebone:green:usr";
var caCerts = ["./IoTFoundation.pem", "IoTFoundation-CA.pem"];
// globals
var org = qs_org;
var type = qs_type;
var host = qs_host;
var deviceId;
var clientId;
var password;
var username;
getmac.getMac(function(err, macAddress) {
if (err) throw err;
console.log(macAddress);
deviceId = macAddress.replace(/:/g, '').toLowerCase();
clientId = "d:" + org + ":" + type + ":" + deviceId;
console.log('MQTT clientId = ' + clientId);
client = mqtt.createClient(u_port, host, {
clientId : clientId,
keepalive : 30
});
console.log('MAC address = ' + deviceId);
console.log('Go to the following link to see your device data;');
console.log('http://quickstart.internetofthings.ibmcloud.com/#/device/' + deviceId + '/sensor/');
bleacon.startScanning();
});
bleacon.on('discover', function(bleacon) {
var tagData = {};
tagData.d = {};
// console.log(bleacon);
tagData.d.deviceid = deviceId;
tagData.d.uuid = bleacon.uuid;
tagData.d.rssi = bleacon.rssi;
tagData.d.proximity = bleacon.proximity;
tagData.toJson = function() {
return JSON.stringify(this);
};
console.log(pub_topic, tagData.toJson());
console.log(tagData.toJson());
client.publish(pub_topic, tagData.toJson() );
});
var mqtt = require('mqtt');
var getmac = require('getmac');
// constants
var u_port = "1883";
var s_port = "8883";
var pub_topic = "iot-2/evt/sample/fmt/json";
var sub_topic = "iot-2/cmd/blink/fmt/json";
var qs_org = "quickstart";
var reg_domain = ".messaging.internetofthings.ibmcloud.com";
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";
var qs_type = "iotsample-ti-bbst";
var configFile = "./device.cfg";
var ledPath ="/sys/class/leds/beaglebone:green:usr";
var caCerts = ["./IoTFoundation.pem", "IoTFoundation-CA.pem"];
// globals
var org = qs_org;
var type = qs_type;
var host = qs_host;
var deviceId;
var clientId;
var password;
var username;
getmac.getMac(function(err, macAddress) {
if (err) throw err;
console.log(macAddress);
deviceId = macAddress.replace(/:/g, '').toLowerCase();
clientId = "d:" + org + ":" + type + ":" + deviceId;
console.log('MQTT clientId = ' + clientId);
client = mqtt.createClient(u_port, host, {
clientId : clientId,
keepalive : 30
});
console.log('MAC address = ' + deviceId);
console.log('Go to the following link to see your device data;');
console.log('http://quickstart.internetofthings.ibmcloud.com/#/device/' + deviceId + '/sensor/');
bleacon.startScanning();
});
bleacon.on('discover', function(bleacon) {
var tagData = {};
tagData.d = {};
// console.log(bleacon);
tagData.d.deviceid = deviceId;
tagData.d.uuid = bleacon.uuid;
tagData.d.rssi = bleacon.rssi;
tagData.d.proximity = bleacon.proximity;
tagData.toJson = function() {
return JSON.stringify(this);
};
console.log(pub_topic, tagData.toJson());
console.log(tagData.toJson());
client.publish(pub_topic, tagData.toJson() );
});
3. ゲートウェイソフトウェアの起動
ibeaconの送信機を用意して、上記で作成したJavascriptプログラムを起動します。
root@bx1:~/ibeacon# node ib2b
34:95:db:28:41:d2
MQTT clientId3 = d:quickstart:iotsample-ti-bbst:3495db2841d2
createClient is deprecated, use connect instead
MAC address = 3495db2841d2
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db2841d2/sensor/
iot-2/evt/sample/fmt/json {"d":{"deviceid":"3495db2841d2","uuid":"1ae18c1c6c7b4aedb1664462634da855","rssi":-56,"proximity":"immediate"}}
34:95:db:28:41:d2
MQTT clientId3 = d:quickstart:iotsample-ti-bbst:3495db2841d2
createClient is deprecated, use connect instead
MAC address = 3495db2841d2
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db2841d2/sensor/
iot-2/evt/sample/fmt/json {"d":{"deviceid":"3495db2841d2","uuid":"1ae18c1c6c7b4aedb1664462634da855","rssi":-56,"proximity":"immediate"}}
デバッグ用にBluemixへ送信するデータの内容をコンソール出力していますので、不要な場合は削除してください。
3. Bluemix側の設定
Bluemix側は、前回と同じテンプレートが利用できます。
JSON形式で出力されるデータは、
deviceid: ゲートウェイのアドレス
uuid: 検出したibeaconのuuid
rssi: 電波強度
proximity: 相対距離の情報
となります。
bleaconライブラリで得られるパラメータを追加したい場合は、以下のJavascriptプログラムの出力を参考にしてください。
discover.js
var Bleacon = require("bleacon");
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
console.dir(bleacon);
});
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
console.dir(bleacon);
});
root@bx1:~/ibeacon# node discover.js
{ uuid: '1ae18c1c6c7b4aedb1664462634da855',
major: 0,
minor: 0,
measuredPower: -82,
rssi: -49,
accuracy: 0.22312232579283153,
proximity: 'immediate' }
{ uuid: '1ae18c1c6c7b4aedb1664462634da855',
major: 0,
minor: 0,
measuredPower: -82,
rssi: -49,
accuracy: 0.22312232579283153,
proximity: 'immediate' }
4. 最後に
iBeaconのハードウェアレポートに関しては、若干古い情報にはなりますが、以下のページが参考になると思います。
0 件のコメント:
コメントを投稿