ラベル IoT の投稿を表示しています。 すべての投稿を表示
ラベル IoT の投稿を表示しています。 すべての投稿を表示

2017-10-24

OpenBlocks IoTシリーズ 基本ソフトウェアにより提供されるPLCクライアント(Modbus)機能について

PLCクライアント(Modbus)機能は、OpenBlocks IoT 基本ソフトウェア2.12より大幅に機能追加されました。

主として以下の項目があげられます。

・データタイプとして、符号のありなし、データサイズ(16bit/32bit)、ビッグ/リトルエンディアンの設定を追加
・データ取得の基準時刻の設定
・CSVファイルを用いた取得PLC対象の拡張

本機能の実装により、1入出力インタフェーズに対し、複数のデバイス、レジスタが割り付けられる場合に、基準時刻を指定してまとめてデータを取得することが可能となり,例えば、RS-485インタフェースに接続される複数のデバイスや、無線メッシュであるOKI SmartHopのRS-232C経由のmodbusペイロードなどでも、1つのデバイスインタフェースから複数個所のデータ(温度や電力データなど)を一定時間にまとめて取得出来るようになります。



本機能はOpenBlocks IoTシリーズすべてのモデルで使用が可能です。ご利用の際は、2.12あるいは今後実施されるそれ以降のアップデートバージョンであることを確認してください。
また、PLCとの接続には、対応したハードウェアインタフェースが必要となります。
各モデル別に、標準もしくは標準オプションとして用意される接続は以下の通りです。
  • OpenBlocks EX1/VX1
    イーサネット、Wifiによる有線/無線ネットワーク、RS-232C/RS-485によるシリアルインタフェースを標準搭載
  • OpenBlocks BX1/BX3(L)/BX5
    Wifiでのネットワーク接続を標準搭載。有線ネットワーク接続にはオプションのUSB二股ケーブルにUSBネットワークアダプタ、RS232C/RS485接続には、オプションのRS232C二股ケーブル、RS-485二股ケーブルを使用
  • BX0
    標準搭載のWifiとPoEケーブルによる、無線/優先のネットワーク接続

    (*) RS-485接続は2線式のみを標準もしくはオプション品にてサポート

今回は、本機能の設定方法について紹介します。
内容に関しては、OpenBlocks IoTシリーズデータ収集ガイドからの抜粋となりますので、詳細に関しては以下のドキュメントをご参照ください。




・PLCクライアント(マスター)の設定方法


本機能は、OpenBlocks IoT Family から Modbus プロトコルを用いて PLC 機器のレジスタ、コイルもしくはステータスを用いて定期的に読み込む(ポーリングを行う)場合に用います。


WEB UI の「サービス」→「基本」タブにおいて、「PD Handler PLC Client」 が「使用する」に設定されている場合、同タブの「取得
PLC 対象数」に応じた入力フォームが表示されます。

※「取得 PLC 対象」(PLC デバイス)とは、PLC 機器そのものではなく、対象となる PLC機器への接続方法の他、データを取得するため
の「読込方法」や「読込開始アドレス」、「読込レジスタ数」等の設定の組み合わせを意図します。
PLC デバイス毎に送信対象項目にて”送信する”を選択すると、PLC デバイスの送信設定の詳細を設定できます。

※「使用プロトコル」としてModbus TCP(ネットワーク)を選択した場合の表示


※「使用プロトコル」としてModbus RTUを選択した場合の表示



”送信する”を選択した場合には、左のように各項目が表示されます。

デバイス番号:
OpenBlocks IoT Family の WEB UI 内で管理している番号です。変更はできません。

ユーザーメモ:
PLC デバイスにデータに付加する任意の文字列を設定します。データを処理する際の識別子等に利用して下さい。

読込方法:
「レジスタ」(レジスタ出力)、「入力レジスタ」(レジスタ入力)、「コイル」(ディジタル出力)、「入力ステータス」(ディジタル入力)から選択します。
「コイル」または「入力ステータス」を選んだ場合は、”0”または”1”の並びが出力されます。

データタイプ:
読込方法を「レジスタ」、「入力レジスタ」を選択した際に、出力のデータタイプを以下から選択します。

・符号なし 16 ビット整数
・符号付き 16 ビット整数
・符号なし 32 ビット整数/リトルエンディアン
・符号付き 32 ビット整数/リトルエンディアン
・符号なし 32 ビット整数/ビッグエンディアン
・符号付き 32 ビット整数/ビッグエンディアン

読込開始アドレス:
読み込みたいデータが格納されている PLC 機器上の開始アドレスを設定します。

読込レジスタ数:
「読込方法」として「コイル」または「入力ステータス」は、読み込まれるビット数と解釈されます。
「開始アドレス」に設定されるアドレスから読み込むレジスタ数もしくビット数を設定します。


取得時間間隔[sec]:
PLC デバイスからデータを取得する時間間隔を数字で設定します。単位は秒です
後述の基準時刻制御を使用する場合、時間間隔は以下の値へと内部的に変更されます。

・86400[sec]使整数倍
・43200[sec]
・28800[sec]
・21600[sec]
・14400[sec]
・10800[sec]
・7200[sec]
・3600[sec]
・1800[sec]
・900[sec]
・60[sec]

基準時刻制御:
毎日定時にデータを取得する場合、本機能を有効とし基準時刻を設定しください。

基準時刻:
定時にデータを取得する際の基準時刻を設定します。HH:MM 形式となります。

タイムアウト[msec]:
PLC デバイスからデータを取得する際のタイムアウトを設定します。単位はミリ秒です。

使用プロトコル:
「Modbus TCP」、「Modbus RTU」のいずれかを選択します。
「Modbus TCP」はネットワーク、「ModbusRTU」はシリアルです。

ユニット ID:
PLC 機器の Modbus ユニット ID を設定します。ユニット ID は、1~247 または 255 の数値です。


PLC 接続アドレス(Modbus TCP)
接続する PLC 機器の IP アドレスを設定します。

PLC 接続ポート(Modbus TCP)
接続する PLC 機器の TCP ポート番号を設定します。 デフォルト値は、502 です。

読込デバイスファイル(ModbusRTU)
PLC 機器を接続するシリアルポートのデバイスファイル名を設定します。

ボー・レート(Modbus シリアル):
PLC 機器を接続するシリアルポートのボー・レートを選択します。

パリティビット(Modbus シリアル):
PLC 機器を接続するシリアルポートのパリティビットを選択します。

データビット(Modbus シリアル):
PLC 機器を接続するシリアルポートのデータビット数を選択します。

ストップビット(Modbus シリアル):
PLC 機器を接続するシリアルポートのストップビット数を選択します。

送信先設定:
“使用する”を選択した送信先に対してチェックボックスが選択できるようになります。
チェックを付けたクラウド等に対して、送信を行います。


デバイス ID サフィックス(PD):
PD Exchange に送信する際のデバイス ID のサフィックスを設定します。

クライアント ID (AWSIoT):
AWSIoTに送信する際のクライアント ID を設定します。Thing Shadows を使用する場合、クライアント ID が Thing Name となります。

Thing Shadows(AWSIoT):
AWSIoT に送信する際の Thing Shadows を使用するかの設定を選択します。

トピック名(AWSIoT):
AWSIoT に送信する際のトピックを設定します。Thing Shadows を使用する場合、トピックはクライアントIDをThing Nameとして自動生成されます。

証明書(AWSIoT):
AWSIoT に送信する際に使用するデバイスの証明書を設定します。

プライベートキー(AWSIoT):
AWSIoT に送信する際に使用するデバイスのプライベートキーを設定します。

デバイスタイプ(Watson IoT/Device):
Watson IoT(Device)に送信する際のデバイスタイプを設定します。

デバイス ID(Watson IoT/Device):
Watson IoT(Device)に送信する際のデバイスID を設定します。

パスワード(Watson IoT/Device):
Watson IoT(Device)に送信する際のパスワードを設定します。

デバイスタイプ(Watson IoT/Gateway):
Watson IoT(Gateway)に送信する際のデバイスタイプを設定します。


デバイス ID(Watson IoT/Gateway):
Watson IoT(Gateway)に送信する際のデバイス ID を設定します。

Event hubs 名:
Event hubs に送信する際の Event hubs 名を設定します。

SAS ポリシー:
Event hubs に送信する際の SAS ポリシーを設定します。

SAS キー:
Event hubs に送信する際の SAS キーを設定します。

デバイス ID(IoT Hub):
IoT Hubに送信する際のデバイス ID を設定します。

デバイスキー(IoT Hub):
IoT Hub に送信する際のデバイスキーを設定します。

Gatway Name(T4D):
Toami for docomo に送信する際に用いるGateway Name を設定します。

App key(T4D):
Toami for docomo に送信する際に用いる AppKey を設定します。

イベントタイプ(IoT デバイスハブ):
IoT デバイスハブ(Nifty)に送信する際に用いるイベントタイプを設定します。

デバイス ID(IoT デバイスハブ):
IoT デバイスハブ(Nifty)に送信する際に用いるデバイス ID を設定します。

API キー(IoT デバイスハブ):
IoT デバイスハブ(Nifty)に送信する際に用いる API キーを設定します。

ユニーク ID (MQTT):
MQTT サーバに送信する際のユニーク ID を設定します。ユニーク ID は、トピックのサフ
ィックスとして扱われます。トピックのプレフィックスは、MQTT サーバに設定されるトピ
ックプレフィックスです。プレフィックスとサフィックスの間は '/' で区切られ送信されます。

※一部を除くクラウドに紐付く設定情報は編集ボタンにより編集可能になります。既存の
デバイス不良等の差し替え時に以前のものと同様に扱う為に設定を同一にすることを推奨
します。(不良となったデバイスは送信対象設定を“送信しない”へ変更してください。)
※証明書及びプライベートキーはシステム→ファイル管理タブからアップロードしてくだ
さい。

・CSV ファイルを用いた「取得 PLC 対象」の拡張


/var/webui/upload_dir ディレクトリに pd-handler-plc-client.csv というファイル名の CSVファイルを置くことで、WEB UI 管理にて割り当てされた 1 デバイス番号に対して複数の「取得 PLC 対象」を割り当てることが可能です。
尚、pd-handler-plc-client.csv ファイルは WEB UI の「システム」→「ファイル管理」タブのアップロード機能により置くことが可能です。
また、CSV ファイルの書式は、次の通りです。

デバイス番号,ユニット ID,読込方式,データタイプ,読込開始アドレス,読込レジスタ数

※行の先頭が#または/の場合、コメント行として扱います。
※CSV 内の”等での動作は保証いたしません。

パラメタデータの形式説明
デバイス番号半角英数字WEB UIによりれたデバイス番号記載します
WEB UIに設定されていないデバイス番号無視されます
ユニット番号半角英数字PLC機器のModbusユニットIDを設定します。
ユニットIDは、1~247 または 255 を記載します。
方式半角英数字読込方式として、以下のいずれかを記載します
設定内容Web UI表記
bitsコイル
input_bits入力ステータス
registerレジスタ
input_register入力レジスタ
データタイプ半角英数字データタイプとして以下設定してください
なお、読込方式を"bits"または"input_bits"を設定した場合カラムは無視されます
設定内容WEB UI表記
u_int16符号なし16ビット整数
int16符号き16ビット整数
u_int32lsb符号なし32ビット整数
リトルエイディアン
int32lsb符号き32ビット整数
リトルエイディアン
u_int32msb符号なし32ビット整数
ビッグエイディアン
int32msb符号き32ビット整数
ビッグエイディアン
読込開始アドレス半角英数字みたいデータが格納されているPLC機器開始アドレスを設定します。先頭が"0x"の場合は16進数解釈されます
読込レジスタ半角数字みたいレジスタ記載します。


・記載例

#localname,unit_id,read_function,data_type,read_addr,read_registers
device_plc_client_0000001,15,bits,u_int16,0x130,37
device_plc_client_0000001,15,input_bits,u_int16,0x1c4,22
device_plc_client_0000001,15,registers,u_int16,0x160,3
device_plc_client_0000001,16,input_registers,u_int32lsb,0x108,1
device_plc_client_0000002,17,bits,u_int16,0x130,37
device_plc_client_0000002,18,input_bits,u_int16,0x1c4,22
device_plc_client_0000002,19,registers,int16,0x160,3
device_plc_client_0000002,20,input_registers,int32lsb,0x108,1
device_plc_client_0000003,30,bits,u_int16,0x130,37
device_plc_client_0000003,30,input_bits,u_int16,0x1c4,22
device_plc_client_0000003,31,registers,u_int16,0x160,3
device_plc_client_0000003,31,input_registers,u_int32msb,0x108,1
device_plc_client_0000004,32,bits,u_int16,0x130,37
46/80
device_plc_client_0000004,32,input_bits,u_int16,0x1c4,22
device_plc_client_0000004,33,registers,int16,0x160,3
device_plc_client_0000004,33,input_registers,int32msb,0x108,1

CSV ファイルに定義したデバイス番号の「取得 PLC 対象」は、WEB UI の設定内容(CSVの定義内容)は破棄され、CSV ファイルの内容が使用されます。そのため、CSV ファイルに定義したデバイス番号の設定ついては、1 デバイス番号として取得対象とする全ての「取得PLC 対象」を記載してください。


最後に


今回の機能強化は、ビルや、工場などでの環境測定や、機器データの取得に際し、必要と思われるものをほぼ実装した形となります。
当社IDMアプライアンスなどと合わせてご利用いただき、環境測定やモニタリングシステムの構築に役立てていただければと思います。

2016-08-05

OpenBlocks IoT シリーズをMicrosoft Azure IoT Hubへ接続し、Stream Analyticsを経由してPowerBIへデータを受け渡す手順について

OpenBlocks IoT シリーズの基本ソフトウェア 1.0.10より、Azure IoT HubおよびAzure Event HubへのWebUIでの接続設定に対応しました。
本記事では、Azure IoT Hubへの接続の手順、および、Stream Analytics jobを経由したPower BIへのデータの受け渡し手順について、解説しています。




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

<検証環境>
ゲートウェイ
 OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison
 IIJmio 高速モバイル/D SIM
センサー
 FWM8BLZ02A-109047 温度/3軸加速度センサービーコン (BLE)
クラウド
 Microsoft Azure

1. 事前準備


・アカウント

Microsft Azureのアカウントが必要です。
Microsoft Azureのサービスポリシーに従って適切に設定してください。

注意点としてはAzure IoT Hubや、Stream Analyticsなどは個人アカウントでも開始できますが、Power BIを使用する場合は、試用であっても学校または職場のアカウントが必要となり、gmailでの個人登録アカウントなどではサインアップできません。
また、職場のアカウントで無料サインアップ出来ない場合は、職場のMS Azure管理権限のある担当に相談してください。

2.Microsoft Azure IoT Hubのデプロイと設定


 Azureアカウントにサインインします。

 

新規メニューより、IoT Hubを検索します。



IoT Hubを選択し、作成を押し、IoTハブのパネルで名前、サブスクリプション、リソースグループ、場所を入力して、作成を押します。
IoTハブ名など、この先でリソース名として受け渡す可能性のあるものには"-"をつけないことをお勧めします。
例えば、Stream Analytics jobのクエリの記述パネルでは"-"は使用できません。

今回の設定例は以下の通り。

名前:
  obxbx1
価格とスケールティア
  S1 - Standard 400kメッセージ/ユニット/日 ( F1 Freeの場合は8kメッセージ/ユニット/日 )
IoT Hub ユニット
  1
Device-to-cloud パーティション
  4パーティション
サブスクリプション
  Microsoft Azure エンタープライズ
リソースグループ
  plathome-goto
場所
  東日本

ダッシュボードにピン留めする場合は、チェックボックスにチェックを入れます。

 

 デプロイが開始されます。



デプロイ完了を確認します。



3.Device Explorerの導入と設定


以下のドキュメントを参考に、導入と設定を進めていきます。

How to use Device Explorer for IoT Hub device

Getting Device Explorerの項目より、以下のDevice Explorerのダウンロードページを開きます

https://github.com/Azure/azure-iot-sdks/releases


ページの最下部にある、Downloadsより、

SetupDeviceExplorer.msi

をダウンロードし、インストールして下さい。

実行すると、以下のパネルが表示されます。



上記で作成した、Azure IoT Hubより、「すべての設定」から、「共有アクセスポリシー」のパネルを呼び出します。



iothubownerを選択します。



接続文字列ープライマリーキーをコピーします。



コピーした文字列を、Device ExplorerのIoT Hub Connection Stringの入力パネルに貼り付け、Updateを押します。



4.OpenBlocks IoT 基本ソフトウェアのWebUI設定

 
WebUIの初期設定、ネットワーク設定、BLEセンサービーコンの登録


OpenBlocks IoT Family向けWEB UIセットアップガイド

に従って設定してください。
今回は富士通コンポーネントの温度/3軸加速度センサー付きのBLEユニットを使用しています。

出力される項目が変わりますが、標準で対応しているセンサー付きのBLE製品としては、FCL製品以外では、CC2650STK/CC2451 Sensor Tagがあります。
また今後他社製品(ALPS/OMRON/他)にも対応予定ですが、ALPS IoT Smart module開発キット(BLE)は8月中旬以降リリース予定の1.0.11で、それ以外のデバイスは1.0.11より先のリリースで対応を予定しています。
アドバタイズデータにセンサーデータを載せるタイプの製品は、データであれば、ビーコン送信機能で送信可能ですが、送信するJSON上のデータが一連のデータ列のままdataとして名前付けされますので、クラウド側で変換する必要があります。

また、基本ソフトウェアのPD Handlerで標準対応している、EnOceanセンサ、Wi-SUNによるBルートでの電力計測データも利用出来ます。EnOceanセンサは変換モードを有効にすることで多くのアーミンセンサでプロファイルに応じてデータを変換可能ですが、対応していないものは変換前のデータのままrawモードでの送信となりますので、クラウド側で変換が必要となります。

カスタムハンドラを作成される場合は、最終的に扱いたいデータの構造でJSON形式の送信データを構成するといいでしょう。

・Azure IoT Hubへの送信設定


以下のドキュメントに従って設定を進めていきます。

OpenBlocks IoT Family向け データ収集ガイド


先に、送信先設定を行います。
MS Azure IoT Hubを「使用する」にチェックし、各項目を設定してください。

インターバル
 収集したデータを送信する間隔です。
 この例ではデータの送信確認のために5秒としています。
 (実際には5分~1時間以上に設定されることが多いと思います)
有効時間
 データ送信できない場合において、保持する時間を設定します。
 0を指定した場合、データ送信が完了するまで保持し続けます。
ドメイン名
 送信するIoT Hubのホスト名を設定します。
 デフォルトでは、azure-devices.net が入力されています。
ポート番号
 送信先のポート番号を設定します。通常は5671から変更する必要はありません。
IoT Hub名
 上記で設定したIoT Hub名を入力します。

デバイス一括設定
 ビーコン及びデバイスの送信対象設定が”送信する”となっている各対象の
 送信先設定を一括で有効/無効を選択できます。



デバイス情報送信設定を行います。
送信対象を、「送信する」にチェックし、各項目を設定してください。

センサー信号強度[dbm]
 センサーに信号強度を設定できる機種の場合、設定したい信号強度を入力します。
 設定した信号強度が無い場合、近似値またはデフォルト値が設定されます。
取得時間間隔[ms]
 センサーからデータを取得する時間間隔を数字で設定します。単位はmsecです。送信先設定
 送信先をチェックします。同時に2か所までの送信が可能です。
 IoT Hubにチェックします。
デバイスID(IoT Hub)
 デバイスIDを設定します。今回はBLEデバイスのMACアドレスを使用しています。

 上記で設定したIoT Hub名を入力します。
デバイスキー
 IoT Hubに送信する際のデバイスキーを設定します。
 今回デバイスキーは下記の手順によりDevice Explorerで取得しています。

デバイスキーの取得方法

Device Explorerの「Management」タブを開き、「Create」ボタンより入力パネルを出し、上記のWebUIにて使用するデバイスIDを入力して「Create」を押します。



「Device Created」と表示されたパネルの文字列をCtrl-A/Ctrl-Cとしてコピーします。



この文字列に含まれる、PrimaryKeyをデバイスキーとしてWebUIの画面で入力し、設定を保存してください。



5.Device Explorerによる通信確認


先に、WebUIの収集ログにより、pd-handler-stdout.logおよびpd-emitter-lite.logを確認して、センサービーコンとの通信確認、およびAzure IoT Hubとの通信確認を行います。

pd-handler-stdout.logの確認



pd-emitter-lite.logの確認




次に、Device Explorerの「Data」タブより「Monitor」ボタンを押して確認してください。




6.Power BIの準備


Power BIにサインイン出来るように、準備をします。
すでに、お使いの方はこの作業は必要ありません。
以下のページより、サインアップを進めてください。



冒頭に書いた通り、職場または学校のアカウントであれば無料でサインアップできます。
無料の使用範囲は、データ容量1GB/ユーザー、ストリーミングデータが10k行/時間となり、グループでのチームコラボレーションは出来ません。
職場のアカウントでサインアップ出来ない場合は、職場の担当者に相談して下さい。




6.Stream Analytics jobのデプロイと設定


Azureのダッシュボードより、Stream Analytics jobを追加します。
 


 作成を押します。

 

ジョブ名、サブスクリプション、リソースグループ、場所を設定し、作成を押します。
今回の設定例は以下の通りです。

名前:
  streamtobi
サブスクリプション
  Microsoft Azure エンタープライズ
リソースグループ
  plathome-goto
場所
  東日本



デプロイを待ちます。



作成済と表示されたのち、ジョブトポロジを設定します。



入力のパネルをクリックし、、「+追加」を押して設定を行います。



入力のエイリアスを入力し、ソースをIoT Hubにすると、各項目は自動的に設定されますので、問題がなければ作成を押してください。(今回は入力のエイリアスはobxbx1と設定しています)



出力のパネルをクリックし、、「+追加」を押して設定を行います。



出力エイリアスを設定して、シンクのメニューよりPower BIを選択します。
今回は、出力エイリアスはpowerbibx1と設定しています。



接続の承認ボタンを押すと、サインイン画面が出ますので、サインインを行うと承認が終了しますので、データセット名とテーブル名を入力して作成を行います。
今回は、データセット名をfclsensor、テーブル名をsensorとしています。



クエリをクリックして、編集し、保存します。



変換などを行わいない場合は、以下のように入出力のエイリアスを設定するだけです。


SELECT
    *
INTO
    powerbibx1
FROM
    obxbx1



全て設定が終了したら、開始ボタンを押すとストリーミングジョブを開始します。







ストリーミングジョブが正常に開始されました、というメッセージを確認してください。



7.Power BIでのデータの確認と表示


Power BIにサインインすると、データセットに設定したデータセット名が表示されています。




表示されたデータセット名を押すと視覚化のメニューが出ます。



温度と時間を選択し、折れ線グラフを表示させてみます。



上記の画面が確認できれば、今回のチュートリアルは終了です。

8.さいごに


サンプル画面数が非常に多い記事となりましたが、Azureでの作業はデプロイ時間が短いこともあり、作業自体は非常に短時間で終わると思います。

とりあえず、tipsとしては"-"を使わない。これにつきます。

2015-04-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-03-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へ送信するテストプログラムも作成していますので、次回ご紹介します。