2015年11月5日木曜日

OpenBlocks 600D向けDebian8ファームウェアの非公式(Unofficial)リリースについて

非公式となりますが、OpenBlocks 600D向けのDebian8パッケージを公開しました。

レポジトリは以下の場所となります。

http://ftp.plathome.co.jp/pub/OBS600/unofficial/debian/jessie/


本公パッケージの公開にあたり、カスタマーケア等でのサポートは行っておりませんのでご了承の上ご利用願います。
 
OBS600用ファームウェア 4.1.8-0の更新手順を記述します。

前準備


Debian6、Debian7のパッケージは使用できません。

ラムディスクモード時のflashに保存しているパッケージとストレージ併用モード時のCFに保存しているパッケージは消去する必要があります。

また、自作したプログラムは共有ライブラリを使用している場合は動作しない可能性があります。staticで作成したプログラムは動作すると思われます。


ラムディスクモードで使用していた場合


FLASH ROMのユーザ領域を初期化します。
  1. 必要なファイルはバックアップをとってください。
  2. shutdown後、INITボタンを押しながら電源ONしてください。
  3. 以下のコマンドでFLASH領域を初期化してください。
    # flashcfg -e
    

ストレージ併用モード(CF)で使用していた場合


CFをフォーマットします。
  1. 必要なファイルはバックアップをとってください。
  2. 以下のコマンドでストレージ併用モードを解除します。
    # e2label /dev/sda1 ""
    
  3. shutdown後、INITボタンを押しながら電源ONしてください。
  4. 再起動したら、念のため以下のコマンドでFLASH領域を初期化します。(必要なファイルがあった場合はバックアップをとっておいてください。)
    # flashcfg -e
    
  5. 以下のコマンドでCFをフォーマットした後、リブートします。
    # mkfs.ext4 -L DEBIAN /dev/sda1
    # reboot
    
前準備は完了です。

ファームウェアの更新


更新の手順は今までのDebianファームウェアと同じです。
まず、Debian8のファームウェアファイルを用意します。

2015/10/19時点:

http://ftp.plathome.co.jp/OBS600/unofficial/jessie/4.1.8-0/kernel-image-4.1.8-0.deb

以下のコマンドでインストールします。

# dpkg -i kernel-image-4.1.8-0.deb

インストール終了後、再起動してください。

補足


今回のファームウェアにおいては、(あまりにも使いにくいという理由で)systemdではなく、sysvinitに変更を行っています。



補足その2 (2015/11/26)

uboot-imageがないというご指摘があり、現在修正作業を行っています。
当面の回避策は以下の通りです。

以下のファイル
 
http://ftp.plathome.co.jp/pub/OBS600/unofficial/jessie/4.1.8-0/uImage.initrd.obs600 
 

をダウンロードします。

以下のコマンドを実行します。
# flashcfg -f uImage.initrd.obs600
 
 

2015年4月17日金曜日

[.tested] TI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイ マルチデバイス対応 [BX1]

今回は、以前ご紹介したTI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイのマルチデバイス対応の実装方法についてご紹介します。


OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison

1. 事前準備


ネットワークへの接続、bluetoothの設定、開発環境および関連ツールのインストール、node.jsのインストールにつきましては前々回の記事を参照してください。

2. センサーゲートウェイソフトウェアの構築


ソフトウェアを構築するディレクトリを作成します。

# mkdir multi_device
# cd multi_device

今回必要なモジュールを導入します。
libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。

# aptitude update
# aptitude install libbluetooth-dev
# npm install async
# npm install getmac
# npm install mqtt
# npm install sensortag

次に、ゲートウェイプログラムを作成します。
今回は温度データを取得し、Bluemixへ送信するサンプルです。

# vi multi_st2b.js

multi_st2b.js


var SensorTag = require('sensortag');
var async = require('async');
var mqtt = require('mqtt');
var getmac = require('getmac');

// constants
var u_port = "1883";
var pub_topic = "iot-2/evt/sample/fmt/json";
var qs_org = "quickstart";
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";
var qs_type = "iotsample-ti-bbst";

// globals
var org = qs_org;
var type = qs_type;
var host = qs_host;
var deviceId;
var clientId;

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/');
});

function onDiscover(sensorTag) {
  console.log('discovered: ' + sensorTag.uuid + ', type = ' + sensorTag.type);

  sensorTag.on('disconnect', function() {
    console.log('disconnected! ' + sensorTag.uuid);
  });

  async.series([
      function(callback) {
        console.log('connectAndSetUp');
        sensorTag.connectAndSetUp(callback);
      },
      function(callback) {
        console.log('readDeviceName: ' + sensorTag.uuid);
        sensorTag.readDeviceName(function(error, deviceName) {
          console.log('\tdevice name = ' + deviceName);
          callback();
        });
      },
      function(callback) {
        console.log('enableIrTemperature');
        sensorTag.enableIrTemperature(callback);
      },
      function(callback) {
        setTimeout(callback, 2000);
      },
      function(callback) {
        sensorTag.on('irTemperatureChange', function(objectTemperature, ambientTemperature) {

          var tagData = {};
          tagData.d = {};

          tagData.d.deviceid = deviceId;
          tagData.d.uuid = sensorTag.uuid;
          tagData.d.rssi = sensorTag.rssi;
          tagData.d.proximity = sensorTag.proximity;
          tagData.d.objectTemperature = objectTemperature.toFixed(1);
          tagData.d.ambientTemperature = ambientTemperature.toFixed(1);

          tagData.toJson = function() {
            return JSON.stringify(this);
          };

          console.log(pub_topic, tagData.toJson());
          console.log(tagData.toJson());
          client.publish(pub_topic, tagData.toJson() );

          console.log(sensorTag.uuid);
            console.log('\tobject temperature = %d °C', objectTemperature.toFixed(1));
            console.log('\tambient temperature = %d °C', ambientTemperature.toFixed(1))
        });

        console.log('setIrTemperaturePeriod');
        sensorTag.setIrTemperaturePeriod(1000, function(error) {
          console.log('notifyIrTemperature');
          sensorTag.notifyIrTemperature(function(error) {
          });
        });
      },
      function(callback) {
        console.log('disableIrTemperature');
        sensorTag.disableIrTemperature(callback);
      },
    ]
  );
}

SensorTag.discoverAll(onDiscover);

3. センサーゲートウェイソフトウェアの起動


TI CC2541 SensorTagを複数用意し、上記で作成したJavascriptプログラムを起動します。

root@bx1:~/multi_device# node multi_st2b.js
34:95:db:28:41:0e
MQTT clientId = d:quickstart:iotsample-ti-bbst:3495db28410e
createClient is deprecated, use connect instead
MAC address = 3495db28410e
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db28410e/sensor/

ここでは2台で試してみました。それぞれのセンサータグのサイドボタンを押すと、以下のようなメッセージが表示され、BluemixへMQTTによるデータ送信を開始します。

discovered: 5c313ec119a5, type = cc2540
connectAndSetUp
discovered: 5c313ebff12e, type = cc2540
connectAndSetUp

4. Bluemix側の設定


Bluemix側は、前々回前回と同じテンプレートが利用できます。



今回は温度データのみですが、データを追加したい場合はインストールしたsensortagモジュール(node_modules/sensortag)にあるtest.jsなどを参照して、必要なデータを追加してください。

5. 最後に


今回は、TI CC2541 Sensor Tagを複数接続する例を紹介しました。
さらに詳しい情報が知りたい方は
https://github.com/sandeepmistry/node-sensortag
を参照してください。

2015年3月13日金曜日

[.tested] 受信したiBeaconの情報をIBM Bluemixで処理するためのゲートウェイ [BX1]


スマホをビーコンの受信機とした位置情報の取得は、現在各地で実証実験が行われているところですが、小型で安価なビーコンタグの普及の加速により、その逆の形として、ビーコンを取り付けたモノや人の位置情報をビーコンの受信機により検知し、クラウド処理する事案が増えています。

今回は、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

以下の3行をrc.localに追加します。

bluetooth_rfkill_event &
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


2. ibeaconゲートウェイソフトウェアの構築


ソフトウェアを構築するディレクトリを作成します。

# mkdir ibeacon
# cd ibeacon

node.jsを使用してibeaconの送受信を行うbleaconモジュールを導入します。
bleaconの導入には、 libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。

# aptitude update
# aptitude install libbluetooth-dev
# npm install bleacon

bluemixへデータを送信するためのMQTTクライアントライブラリおよび、getmacライブラリをインストールします。

# npm install mqtt
# 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() );

});

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"}}

デバッグ用に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);
});

root@bx1:~/ibeacon# node discover.js
{ uuid: '1ae18c1c6c7b4aedb1664462634da855',
  major: 0,
  minor: 0,
  measuredPower: -82,
  rssi: -49,
  accuracy: 0.22312232579283153,
  proximity: 'immediate' }

4. 最後に


iBeaconのハードウェアレポートに関しては、若干古い情報にはなりますが、以下のページが参考になると思います。

The Hitchhikers Guide to iBeacon Hardware: A Comprehensive Report by Aislelabs



2015年3月11日水曜日

[.tested] TI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイ [BX1]

この1月24日,25日に、天王洲のSamurai Startup Islandにおいて、

「IoTハック新年会2015」

を行いました。
このイベントは、IBMとSamurai Incubateが共催で『日常生活で使うモノ』をテーマ行うアイディアソン、ハッカソンで、クラウド環境としては、IBM BlueMix、デバイスとしては、TI CC2541センサータグ、ゲートウェイとして、OpenBlocks BX1を用意しています。

今回は、上記ハッカソンで使用した、OpenBlocks BX1側のTI CC2541 SensorTagデバイスゲートウェイ実装方法について紹介します。



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

以下の3行をrc.localに追加します。

bluetooth_rfkill_event &
sleep 1
rfkill unblock bluetooth

・開発環境および関連ツールのインストール

node.jsをビルドするためには、開発環境が必要です。(IO開発ボード付きセットの場合は開発環境をプリインストールしています)
また、今回必要になるパッケージ類を以下の手順でインストールします。

# aptitude update
# tasksel install standard
# aptitude install build-essential
# aptitude install git

・node.jsのインストール

node.jsはdebianのパッケージを使用せず、最新版を以下のサイトから入手し、ビルドしています。

Node.js

# wget http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
# tar xvzf  http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
# cd node-v0.12.0
# ./configure
# make -j3
# make install

2. センサーゲートウェイソフトウェアの構築


IBM Internet of Thingsの以下のレシピページより、BeagleBone用のゲートウェイプログラムを入手します。

Texas Instruments BeagleBone with SensorTag - Internet of Things:

# git clone http://github.com/ibm-messaging/iot-beaglebone

以下のディレクトリに移動し、setup.shを編集し、checkInstall bluezの行をコメントアウトします。
(bluezはすでにインストールされているものを使用します。debian wheezyのaptで導入されるものは、BLEに対応していないバージョンのため使用しません)

     :
# checkInstall bluez
checkInstall libbluetooth-dev
  :

編集後、setup.shにより、動作環境の構築を行います。

#./setup.sh

次に、ゲートウェイプログラム本体の若干の修正を行います。
これは、beaglebone向けに書かれていて、データを受け取りLEDを点滅させる記述があるのですが、 このLEDの点灯処理部分だけをコメントアウトしてしまいます。
ここは、OpenBlocksのLEDの仕様で書き換えれば同様にBluemix側からLEDの点灯処理ができるのですが、今回は行っていません。

# vi iot_sensortag.js

50行以下を以下の様に編集します。

// LED functions
// run asynchronously, callbacks just trap unexpected errors
function ledWrite(extra, content, callback) {
//  fs.writeFile(ledPath+extra, content, function(err) {
//      if (err) throw err;
//  });
//  if (callback) callback();
}

2. センサーゲートウェイソフトウェアの起動


TI CC2541 SensorTagを用意し、編集したJavascriptプログラムを起動します。

root@bx1:~/iot-beaglebone/samples/nodejs# node iot_sensortag.js
Press the side button on the SensorTag to connect

メッセージに従い、センサータグのサイドボタンを押すと、接続を行い、BluemixへMQTTによるデータ送信を開始します。

root@bx1:~/iot-beaglebone/samples/nodejs# node iot_sensortag.js
Press the side button on the SensorTag to connect
SensorTag connected
Discovering services and characteristics
Device name = TI BLE Sensor Tag
System id = 34:b1:f7:0:0:d5:d5:2a
Serial number = N.A.
Firmware revision = 1.01 (Feb  7 2013)
Hardware revision = N.A.
Software revision = N.A.
Manufacturer name = Texas Instruments
Enable IR temperature
Enable accelerometer
Enable humidity sensor
Enable magnetometer
Enable barometer
Enable gyroscope
MQTT clientId = d:quickstart:iotsample-ti-bbst:98f170697445
MQTT Connected
Sending data
MAC address = 98f170697445
Go to the following link to see your device data;
http://quickstart.internetofthings.ibmcloud.com/#/device/98f170697445/sensor/

3. Bluemix側の設定


Bluemixは、試用期間が30日あり、登録して30日間は無料ですべての機能を試すことが出来ます。
(無料期間終了後は、クレジットカードの登録が必要ですが、375GB時間までは無料で使用できるようになっています)

カタログのボイラープレートより、左上のNode-Redを使用したInternet of Things Foundationアプリケーションを選択します。


インスタンスを起動します


最初に簡単なサンプルプレートがありますので、この左側のIBM IoT App Inに、上記で立ち上げたゲートウェイソフトウェア起動時に表示されるMAC Addressを入力します。


Deployし、すぐ右にあるDevice Dataのdebugタブを引き出すと、右のDebugウィンドウに、センサータグからデータがJSON形式で送信されていることが確認出来ます。


 様々な機能が用意されていますので、あとはPaaS側で処理を作成していくことになります。
この環境はそのまま実稼働環境へと移行させることも出来ます。


4. 最後に


今回は、TI CC2541 Sensor Tagを利用した例を紹介しました。
ibeacon仕様のビーコンタグのデータをBluemixへ送信するテストプログラムも作成していますので、次回ご紹介します。