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としては"-"を使わない。これにつきます。

2016-03-30

OpenBlocks IoT Familyをユーザー定義スクリプトと組み合わせて遠隔地へのアクセス手段として利用する

OpenBlocks IoT Family には、モバイル回線での接続が可能なモデルがあります。モバイル回線を使って、遠隔地のアクセス手段にOpenBlocks IoT Familyを利用する方法を紹介します。

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

はじめに


OpenBlocks IoT Family (以下OpenBlcoks)には、モバイル回線の通信機能があります。IoTゲートウェイとしては多くの場合常時ネットワーク接続手段の一つとして利用しますが、 OpenBlocksではモバイル回線の ON / OFF を SMS のメッセージによって制御する機能が用意されています。つまり通常時は通信していない状態にしておき、必要な時だけ回線を接続できるのです。また SMS を使ってあらかじめ設定しておいたシェルスクリプトを動かす機能もあります。これらのSMSによる制御機能を活用して、遠隔地のネットワークへアクセス手段としての OpenBlocks を利用します。

なお SMS を使って OpenBlocks を制御するためには、SMS に対応した SIM を使う必要があります。データ通信のみの SIM では SMS を扱うことはできませんのでご注意下さい。

リモートアクセス


次の図を見て下さい。



このような環境で、遠隔地からメンテナンスなどでサーバーにアクセスしたいというのはシステムの運用ではごく普通の要望です。

OpenBlocks の中身は Debian GNU/Linux のサーバーですので、遠隔地からOpenBlocksへログインできれば、目的のサーバーやネットワーク機器へアクセスできます。このために SSH (Secure Shell)のトンネルを活用してみます。

SSHポートフォワーディング


SSHにはTCPの接続を中継する機能が用意されています。これはポートフォワーディングやトンネリングと呼ばれます。このSSHのTCPの中継機能を例をあげて説明しましょう。

ある会社のオフィス内にWebサーバー HostA があり、インターネット上にシステム運用者がアクセスできるサーバー HostB がある場合を例にします。オフィスには NAT を使ったファイアウォールが用意されていて、オフィス内部からインターネットへは比較的自由にアクセスできるような設定になっています。この場合以下の図のように HostA から HostB へ SSH を経由してログインするのは広く行われています。



ここでインターネット側にある HostB から HostA に SSH でログインしたい場合どうしたら良いのでしょうか。

前述の通り HostA → HostB は特別な設定を行わなくても SSH で接続できるのは明らかですが、HostB → HostA の SSH 接続はファイアウォールがあることと、HostA がプライベート IP アドレスを利用しているため簡単にはできません。ここで利用するのが SSHによるポートフォワーディングです。

次の図を見てください。



この例は HostA から接続する際に、SSH のポートフォワーディングの設定で、HostB のIPv4 ループバックアドレスである 127.0.0.1 のポート番号 10022 を、HostA の IPv4 ループバックアドレスである 127.0.0.1 の ポート番号 22 つまり HostA の SSH サービスへ接続しています。

具体的には HostA から HostB へ SSH 接続する場合に次のように SSH コマンドに -R オプションを指定して起動します。(注:今回 SSH接続のオプションは全てコマンドの引数で指定していますが、これらは SSH の config ファイルで指定できます)

HostA$ ssh -R 10022:127.0.0.1:22 HostB
..........
.....
..........
HostB$ 

SSH で HostA から HostB へログインできたら、前述のポートフォワーディングが設定できています。この状態になれば HostB 側で 次のように IPv4 アドレスで 127.0.0.1 ポート番号 10022 に接続する ssh コマンドを実行すると、HostA へログインできます

HostB$ ssh -p 10022 127.0.0.1
..........
.....
..........
HostA$ 

リモートアクセスのための SSH の設定


SSH ポートフォワーディングを理解できたところで、OpenBlocks を設定してみます。前述の例で HostA が OpenBlocks となります。

まずは OpenBlocks で SSH ログイン認証のための鍵を作ります。機械的なログインに利用するため、パスフレーズは空にします。

root@obsiot:~# ssh-keygen -t ecdsa -N "" -C "Remote Access for BX1"
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
13:4d:49:02:63:b6:e5:ac:2b:77:c3:46:bb:d1:63:42 Remote Access for BX1
The key's randomart image is:
+--[ECDSA  256]---+
|      =.o.o.     |
|     o * +.      |
|      . + .      |
|       . .       |
|      . E        |
|       = +       |
|    . o O +      |
|     o o * .     |
|        .        |
+-----------------+
root@obsiot:~#
root@obsiot:~# ls -l .ssh/id_ecdsa*
-rw------- 1 root root 227 Mar 29 11:43 .ssh/id_ecdsa
-rw-r--r-- 1 root root 183 Mar 29 11:43 .ssh/id_ecdsa.pub
root@obsiot:~#

この鍵を HostB との間でログインに使うため、authorized_keys を設定します。

root@obsiot:~# cat .ssh/id_ecdsa.pub  >> .ssh/authorized_keys

またこの鍵のペアを HostB の SSH でログインするユーザー(ここでは tunuser )の ~/.ssh ディレクトリに設定します。

tunuser@HostB$ ls -l .ssh
total 8
-rw-------  1 tunuser wheel  227 Mar 29 11:43 id_ecdsa
-rw-r--r--  1 tunuser wheel  183 Mar 29 11:43 id_ecdsa.pub
tunuser@HostB$ cp .ssh/id_ecdsa.pub .ssh/authorized_keys
tunuser@HostB$ ls -l .ssh
total 12
-rw-r--r--  1 tunuser wheel  183 Mar 29 12:22 authorized_keys
-rw-------  1 tunuser wheel  227 Mar 29 11:43 id_ecdsa
-rw-r--r--  1 tunuser wheel  183 Mar 29 11:43 id_ecdsa.pub
tunuser@HostB$ 

以上が設定できたら OpenBlocks から HostB にログインできるかどうかを確認しみます。この時一緒にポートフォワーディングも指定しています。(注:OpenBlocks をインターネットへ接続した状態で実験しています)

root@obsiot:~# ssh -R 10022:127.0.0.1:22 tunuser@HostB
The authenticity of host 'HostB (XXX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is d5:5e:df:18:bb:69:8e:e7:91:11:f5:d5:ff:3d:90:c4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'HostB,XXX.XXX.XXX.XXX' (ECDSA) to the list of known hosts.
..........

.....
..........
tunuser@HostB$ 

この通りログインを確認できました。ポートフォワーディングも指定してあるので、HostB 側から OpenBlocks へログインしてみます。(注:OpenBlocks のデフォルトではSSH 接続が閉じているため設定で解放する必要があります)

tunuser@HostB$ ssh -p 10022 root@127.0.0.1
The authenticity of host '[127.0.0.1]:10022 ([127.0.0.1]:10022)' can't be established.
ECDSA key fingerprint is 08:03:4c:2f:35:7b:15:d2:99:b8:42:f5:66:8c:3a:68.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:10022' (ECDSA) to the list of known hosts.
Linux obsiot.example.org 3.10.17-poky-edison #1 SMP PREEMPT Fri Mar 11 12:01:23 JST 2016 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Mar 29 11:07:29 2016
root@obsiot:~#

この通りポートフォワーディングを使って、インターネットにあるサーバー HostB から OpenBlocks へのログインが確認できました。

OpenBlocks の SMS コントロールコマンド(抜粋)


今回のリモートアクセスで利用するSMSコントロールコマンドを以下に挙げます。


コマンド
コマンドの内容
CON
モバイル回線を接続する
COFF
モバイル回線を切断する
SSHON
SSHを解放する
SSHOFF
SSHを閉鎖する
USCR1F
ユーザー定義のシェルスクリプトの1番をフォアグラウンドで実行する

OpenBlocks に設定した SIM の電話番号へ SMS を使ってこれらのコマンドを送ると、コマンドに応じて OpenBlocks が動作します。また SMS のコントロールコマンドは複数を"+"で接続して 1通の SMS で送ることで、連続した動作を指定できます。

例えば、モバイル回線を接続してユーザー定義シェルスクリプトの1番を実行し、モバイル回線を切断するには次のようなコマンドを送ります。

      CON+USCR1F+COFF

OpenBlocks の設定


SMS 制御でリモートアクセスを行うための OpenBlocks の設定の要点をまとめてみます。

  1. 通常時はモバイル回線は接続せず、回線の ON / OFF は SMS で制御する。
  2. モバイル回線が ON になったら SSH で HostB へ接続してポートフォワーディングを有効にするシェルスクリプトを用意する

まず上記 1 を設定します。これは WEB の設定メニューの「ネットワーク」メニューの「基本」タブの下部にある「サービスネットワーク (モバイル回線)」で設定します。



各項目の設定ポイントは次の通りです。
  • [使用設定]は「使用する」を選んでモバイル回線が利用できるようにします。
  • [APN]、[ユーザー名]、[パスワード]、[認証方式]の項目は利用する SIM に合わせて設定します。
  • [自動接続]は OpenBlocks の起動時にモバイル回線を接続するかどうかを設定するもので、通常時はモバイル回線は OFF にしておくので「自動接続しない」を選びます。
  • [SMSコントーロール]は「有効」を選択し、SMS の制御に使う電話番号を登録します。 OpenBlocks ではセキュリティ面から SMS の制御は、登録した電話番号からのみ受け付けるようになっています。

SSHポートフォワーディングを起動するシェルスクリプト


SSHポートフォワーディングを起動するシェルスクリプトは、[拡張]メニューの[スクリプト編集]のタブで、「ユーザー定義スクリプト1」を選んでから内容を入力します。



シェルスクリプトの内容は次の通りです。

#!/bin/sh

ssh -T -R 10022:127.0.0.1:22 tunuser@HostB sleep 600

この ssh コマンドはシェルスクリプトの中で起動するため、ユーザーのインタラクティブなコマンド操作を受け付ける必要はありません。そこで -T オプションを指定して、HostBでの pty を要求しないように設定しています。

ssh コマンドで HostB に対して「sleep 600」を設定します。これは SSH が 600秒間(つまり10分間)接続し、その後 sleep の終了とともに SSH の接続が終了します。何もしないと 10 分間で接続が切れる設定となります。「え?それじゃ 10分間しか SSH 接続が利用できないの?」という心配の必要はありません。SSH のポートフォワーディングでは、ポートフォワーディングの利用中は SSH 接続が切れることはありません。つまりこのスクリプトが起動してから10分以内にポートフォワーディングの接続を使って、HostB から OpenBlocks へログインすれば、そのポートフォワーディング経由のログインセッションが続いている限りSSH 接続も維持されます。

以上の設定が完了したら、OpenBlocksを一旦再起動します。

リモートアクセスを使ってみる


以上の設定が終わったので、実際に試してみましょう。OpenBlocks の SIM の電話番号に対して次の SMS のメッセージを送ります。

     CON+SSHON+USCR1F+SSHOFF+COFF

意味は、(1)モバイル回線を接続、(2)SSH接続を許可、(3)ユーザー定義シェルスクリプト1を実行、(4)シェルスクリプトの終了後SSH接続を不許可にし、(5)モバイル回線を切断、ということになります。

SMS の送信後 40秒ぐらいで OpenBlocks が HostB に SSH 接続を行います。その状態で HostB から以下のコマンドを実行すれば、OpenBlocks へログインできます。

tunuser@HostB$ ssh -p 10022 root@127.0.0.1

実際に試してみると SSH の接続までに 40秒近くかかるため、SSH 接続が成立したタイミングがはっきりしないという難点があることがわかりました。そこで例えばシェルスクリプトを次のように修正すると、tunuser アカウントのホームディレクトリに 「SSHOK」というファイルがあるか無いかで SSH 接続が成立しているかどうか判断できわかりやすくなります。

#!/bin/sh

ssh -T -R 10022:127.0.0.1:22 tunuser@HostB 'touch SSHOK ; sleep 600 ; rm SSHOK'

この他にもシェルスクリプトを工夫することで、HostB が停止している場合は別の HostC へ接続するなど様々なバリエーションが考えられます。

終わりに


SSH ポートフォワーディングは、ここで紹介したものとは逆向きつまり SSH の接続元から接続先へのポートフォワーディングもできます。ちなみに紹介例の向きのポートフォワーディングをリモートフォワード、逆向きをローカルフォワードと言います。本例での HostB から OpenBlocks へ SSH でログインする場合にもポートフォワーディングを併用できるので、サーバーのリモートデスクトップ接続を外部へ中継することなども可能です。

一昔前でしたらリモートアクセスには電話回線を通じてアナログモデムが使われているのが普通で、サーバーやネットワークのメンテナンスを行う人は必ずモデムを所有していました。しかし今ではモデムを所有している人は少なくなりつつあるどころか、モデムそのものの存在すら知らない人が増えているのも事実です。OpenBlocks のこのような使用例はモデムの代替の一つの解になるのではと思います。

2016-03-04

OpenBlocks IoT EX1 で microSDXC メモリーカードを利用する

OpenBlocks IoT EX1 には microSD メモリーカードスロットが用意されています。このスロットを使って実際に microSDXC メモリーカードを読み書きする方法について説明します。

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

はじめに


OpenBlocks IoT EX1 (以下EX1)には、筐体内部に microSD メモリーカードスロットがあり microSDXC メモリーカード(以下 microSDXC)を利用できますが、実は、市販されている microSDXC をそのまま利用するためには、EX1側で少し設定作業が必要になります。

ここでは microSDHC メモリーカード(以下 microSDHC)と比べながら、microSDXC を EX1 で読み書きする方法について説明しましょう。

本文が長くなったので最後にまとめを用意してあります。ざっくりと概要を知りたい方は最後のまとめをお読みください。

microSDXC と miroSDHC


今回用意したメモリーカードは次の2枚で、左側の黒いカードが microSDHC 16GB、右側の上部が赤いカードが microSDXC 64GB です。


microSDHC の利用


まず microSDHC を EX1 にマウントしてみましょう。

EX1 で microSD メモリーカードを利用するために EX1 本体の蓋を開ける必要がありますが、蓋を固定してあるネジを外す際は次のようなグリッップの太いしっかりした0番のプラスドライバーを利用してください。


よくある細い精密ドライバーでは力が十分にかからず、ネジを開けられないことがあります。


この写真は microSDHC を EX1 に差し込んでいる途中の状態です。このままカチっと音がするまで奥に差し込みます。完全に差し込むと次のようになります。


ここに刺した microSDHC のデバイス名は、/dev/mmcblk1 となります。

次の例はまだ microSDHC カードを刺していない状態で、デバイスが存在しません。

# ls -l /dev/mmcblk1*
ls: cannot access /dev/mmcblk1*: No such file or directory

microSDHC を刺すと、次の通りデバイスが現れます。

# ls -l /dev/mmcblk1*
brw-rw---T 1 root floppy 179, 128 Feb 24 14:12 /dev/mmcblk1
brw-rw---T 1 root floppy 179, 129 Feb 24 14:12 /dev/mmcblk1p1

ここで /dev/mmcblk1 が microSDHC カード全体を表し、/dev/mmcblk1p1 が microSDHC の最初のパーティションを表していて、実際の記憶領域はこのパーティションとなります。

では実際に /dev/mmcblk1p1 をマウントしてみましょう。

# mount /dev/mmcblk1p1 /mnt     ← microSDHC パーティションのマウント
# mount | fgrep /mnt            ← マウントできたかどうかの確認その1
/dev/mmcblk1p1 on /mnt type vfat (rw,relatime,fmask=0022, dmask=0022,codepage=437,iocharset=iso8859-1, shortname=mixed,errors=remount-ro)
# df -h /mnt/.                  ← moountできたかどうかの確認その2
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk1p1   15G  2.2M   15G   1% /mnt

この通りマウントできています。あとは /mnt ディレクトリの配下で microSDHC のデータを読み書きできます。

ファイルのコピー等必要な作業が終わったら microSDHC を本体から抜きますが、抜く前には必ず unmount します。

# umount /mnt

これで安全に microSDHC カードを安全に本体から抜くことができます。

microSDXC の利用


今度は microSDXC で同様の作業を行ってみましょう。

まず本体に microSDXC カードを挿入します。



写真は差し込み途中のものですが、奥までしっかり差し込んで下さい。正しく差し込めば次のように microSDXC のデバイスが現れます。microSDXC でもデバイス名は microSDHC と同じ名前です。

# ls -l /dev/mmcblk1*
brw-rw---T 1 root floppy 179, 128 Feb 24 14:42 /dev/mmcblk1
brw-rw---T 1 root floppy 179, 129 Feb 24 14:42 /dev/mmcblk1p1
#

ではマウントしてみましょう

# mount /dev/mmcblk1p1 /mnt
mount: unknown filesystem type 'exfat'
#

exfatは知らないファイルシステムだというエラーメッセージが表示されました。df コマンドや、mount コマンドの結果を見ても次のように microSDXC のマウントはできていません。

# mount | fgrep /mnt
# df /mnt/.
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/root         198337 156166     31931  84% /
#

マウントに失敗した理由は、市販の microSDXC は exFAT 形式でフォーマットされていて、OpenBlocks IoT Familyの標準の状態では exFAT 形式のドライバを持っていないからです。

これに対して microSDHC は FAT32 形式でフォーマットしてあり、元々カーネルがドライバを持っています。

exFAT 形式のディスクを読み書きするためのドライバとツール類は、Debianのパッケージで用意されています。次のように exFAT 用のパッケージを探してみましょう。

# apt-get update             ← パッケージインデックスの更新
Hit http://ftp.plathome.co.jp ./ Release.gpg
---------- 中略 ---------- 中略 ----------
Hit http://cdn.debian.or.jp wheezy-updates/main Translation-en
Reading package lists... Done
#
# apt-cache search exfat     ← exFAT関係のパッケージの検索
exfat-utils - utilities to create, check, label and dump exFAT filesystem
exfat-fuse - read and write exFAT driver for FUSE

#

exfat-utils と exfat-fuse が見つかりました。ここでは exfat-utils をインストールします。exfat-fuse 並びに他に必要なパッケージが一緒にインストールされます。

# apt-get install exfat-utils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  exfat-fuse fuse libfuse2
The following NEW packages will be installed:
  exfat-fuse exfat-utils fuse libfuse2
0 upgraded, 4 newly installed, 0 to remove and 23 not upgraded.
Need to get 348 kB of archives.
After this operation, 720 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
---------- 中略 ---------- 中略 ----------
Done.
udev active, skipping device node creation.
Setting up exfat-fuse (0.9.7-2) ...
Setting up exfat-utils (0.9.7-2) ...
#

これで環境が整ったので microSDXC をマウントしてみます。

# mount /dev/mmcblk1p1 /mnt
FUSE exfat 0.9.7
# mount | fgrep /mnt
/dev/mmcblk1p1 on /mnt type fuseblk (rw,nosuid,nodev,relatime, user_id=0,group_id=0,allow_other,blksize=4096)
# df -h /mnt/.
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk1p1   60G   26M   60G   1% /mnt
#

マウントできたので、簡単に読み書きしてみます。

# cd /mnt
# ls
# touch test
# ls
test
# ls -l test
-rwxr-xr-x 1 root root 0 Feb 24 15:39 test
#

microSDXC を抜く時もアンマウントを忘れないようにしてください。

# umount /mnt

microSDXC を EXT4 形式で使う


microSDXC は exFAT 形式のまま使うには exFAT 形式サポート用のドライバとユーティリティが必要ですが、カード側をカーネルがサポートしているファイル形式に変換してから使う方法もあります。ここでは Linux で標準的な EXT4 形式でフォーマットしてみましょう。

# fdisk /dev/mmcblk1     ← fdisk コマンドでパーテションテーブルを変更する

Command (m for help): p  ← 現在の状態を確認する

Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes
255 heads, 63 sectors/track, 7764 cylinders, total 124735488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1           32768   124735487    62351360    7  HPFS/NTFS/exFAT

Command (m for help): t    ← パーテションタイプを変更
Selected partition 1
Hex code (type L to list codes): 83  ← Linux の "83" を指定する
Changed system type of partition 1 to 83 (Linux)

Command (m for help): p   ← 変更結果を確認する

Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes
255 heads, 63 sectors/track, 7764 cylinders, total 124735488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1           32768   124735487    62351360   83  Linux

Command (m for help): w   ← 変更を書き込んで fdisk を終了
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# fdisk -l /dev/mmcblk1   ← 改めて変更結果を確認

Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes
255 heads, 63 sectors/track, 7764 cylinders, total 124735488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk1p1           32768   124735487    62351360   83  Linux
#
# mkfs -t ext4 /dev/mmcblk1p1 ← ext4ファイルシステムの作成
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3899392 inodes, 15587840 blocks
779392 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
476 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

# mount /dev/mmcblk1p1 /mnt ← マウントする
# mount | fgrep /mnt
/dev/mmcblk1p1 on /mnt type ext4 (rw,relatime,data=ordered)
# df /mnt/.
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/mmcblk1p1 61241372 53064 58054356   1% /mnt

まとめ


OpenBlocks IoT EX1 で microSDXC を利用する方法をまとめます。
  • 市販の microSDXC は exFAT 形式でフォーマットされている
  • exFAT 形式はそのままでは Linux のカーネルがサポートしていないため、次のいずれかの対応が必要となる
    • exFAT 形式のドライバとユーティリティーをインストールして利用する
    • microSDXC のフォーマットを EXT4 などのLinux のファイルシステムに変換してから利用する
microSD メモリーカードはシステム運用に十分な信頼性を確保できない為、ファイル交換やログ保存用等の限定用途で利用するのが安全です。

また OpenBlocks IoT BX1, BX3 などでも、USB 二股ケーブルとUSBのメモリカードリーダライタを使って microSDXC を読み書きする場合には、同様の手続きが必要になります。

2016-02-26

OpenBlocks IoT Family で一時的な Wi-Fi クライアント接続を行う

Web ユーザーインターフェースの設定を変更せず、一時的に Wi-Fi クラアントとして OpenBlocks IoT Family を既設の Wi-Fi ネットワークへ接続する方法を紹介します。

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

はじめに


OpenBlocks IoT Family(以下OpenBlocks)の初期設定では、Wi-Fi インターフェースはアクセスポイントとして動作するようになっています。常時 3G や LTE のモバイル回線を利用する場合にこの設定は便利ですが、メンテナンス等の目的で一時的に Wi-Fi クライアントとして既設の Wi-Fi ネットワーク環境に接続したいことがあります。

もちろん Web ユーザーインターフェース経由で設定を変更しても良いのですが、設定を戻すのを忘れて別のネットワーク環境に移った場合、Web ユーザーインターフェースへアクセスできず、設定の初期化が必要になるなど後々少々面倒くさいことになります。

そこで Web ユーザーインターフェースの設定を変更せずに、一時的に OpenBlocks を Wi-Fi クライアントとして既設ネットワークへ接続する方法を紹介します。

Wi-Fi のアクセスポイントモードとクライアントモード


はじめに Wi-Fi のアクセスポイントになっている OpenBlocks がどういう状態であるかを整理してみましょう。ネットワークインターフェース(以下I/F)としては次のような状態になっています。
  • Wi-Fi I/F はアクセスポイントモードに設定
  • Wi-Fi I/F で DHCP のサービスが稼働
したがって次の三つを行えば、アクセスポイントモードからクライアントモードへ切り替えて、既設の Wi-Fi ネットワークに接続できます。
  1. DHCP サービスを停止
  2. Wi-Fi I/F をアクセスポイントモードからクライアントモードへ変更
  3. Wi-Fi クライアントとして必要な設定の投入
これらを順に説明します。

DHCP サービスの停止


DHCP サービスを停止するにはサービスを実施しているプロセスの dhcpd を停止するだけです。dhcpd については単純にkillで問題ありません。

# killall dhcpd

Wi-Fi I/F をアクセスポイントモードからクライアントモードへ変更


Wi-Fi I/F をアクセスポイントをクライアントのモードへ切り替えるのは、少し複雑です。というのも Wi-Fi I/F のドライバーがカーネルモジュールになっていて、モジュールのロード時にモード設定を行っているからです。また Wi-Fi アクセスポイントをサービスする hostapd というプロセスも動いています。手順としては次のようになります。
  1. hostapd の停止
  2. Wi-Fi I/F の停止
  3. ドライバーのモードの切り替え
  4. Wi-Fi I/F の起動
具体的には次の各コマンドを実行します。

# killall hostapd
# ifdown wlan0
# modprobe -r bcm4334x
# modprobe bcm4334x op_mode=1
# ifup wlan0

Wi-Fi クライアントとして必要な設定


以上まで完了したら、後は一般的な Linux を Wi-Fi に接続する場合と同じ手順となります。Wi-Fi クライアントとして必要な設定を行うには、次の2つの手順を踏むことになります。
  1. 既設 Wi-Fi 環境への接続
  2. DHCP クライアントとして設定
既設 Wi-Fi 環境へ接続するためには、SSID(ESSID)とパスフレーズを用意してwpa_supplicant を設定します。wpa_supplicant の設定の詳細は省略しますが、以下の例では /var/run/wpa.conf ファイルで Wi-Fi 接続の設定を行っています。最後に dhclient プログラムを起動すれば完了です。

# cat /var/run/wpa.conf
ctrl_interface=/var/run/wpa_supplicant
network={
        ssid="WIFISSID"
        scan_ssid=1
        key_mgmt=WPA-PSK
        psk="PASSWORD"
}
# wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid ¥
        -i wlan0 -D nl80211,wext -c /var/run/wpa.conf
# dhclient -v -pf /run/dhclient.wlan0.pid ¥
        -lf /var/run/dhclient.wlan0.leases wlan0

以上で Wi-Fi クライアントへの切り替えは完了です。この作業では何ら設定を保存していないため次に OpenBlocks を再起動した場合は本来の設定が有効になり、Wi-Fi I/F はアクスセスポイントとして動作します。

Wi-Fi クライアント設定のシェルスクリプト


上記に紹介した作業を毎回手作業で実施するには手順が多すぎますので、これらを実施するシェルスクリプトを最後に紹介します。

#!/bin/sh
#
# OpenBlocks IoT familyでWebのユーザーインターフェースの設定を変更せず
# 一時的にWi-Fiをクライアント設定に変更するシェルスクリプト
#
# このスクリプト中でsleep 1を多用しているのは、立て続けにコマンドを起
# するとうまく動かないものがあるため、待ち時間を確保している

export PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 次の2行はWi-Fi環境に合わせて設定する
SSID=WIFISSID # Wi-Fi接続先のSSID
WKEY=PASSWORD # Wi-Fi接続先のパスフレーズ

IF=wlan0 # 無線I/F名 OpenBlocksの場合wlan0
WPACONF=/var/run/wpa.conf # wpa_supplicantの設定ファイル名

# Wi-Fi I/Fのモード切り替え
killall dhcpd hostapd ; sleep 1
ifdown wlan0 ; sleep 1
modprobe -r bcm4334x ; sleep 1
modprobe bcm4334x op_mode=1 ; sleep 1
ifup wlan0 ; sleep 1

# /etc/network/interfaces の記載によって
# ifupで付加される余計なIPアドレスの削除
ip addr del 192.168.254.254/24 dev ${IF}

# wpa_supplicantの設定ファイル(ここでは/var/run/wpa.conf)の生成
#  一般的なWPAの事前共有鍵の設定を前提にしているため、
#  Wi-Fi環境の設定に応じて修正する
cat <<-EOT >$WPACONF
ctrl_interface=/var/run/wpa_supplicant
network={
   ssid="$SSID"
   scan_ssid=1
   key_mgmt=WPA-PSK
   psk="$WKEY"
}
EOT

# wpa_supplicantの起動
wpa_supplicant -s -B -P /var/run/wpa_supplicant.${IF}.pid \
-i ${IF} -D nl80211,wext -c $WPACONF
sleep 1

# dhcpクライアントサービスの起動
dhclient -v -pf /run/dhclient.${IF}.pid  \
-lf /var/run/dhclient.${IF}.leases ${IF}

# Wi-Fi経由でのssh 接続を許可する場合、
# 以下のコメントアウトを外してiptablesの行を有効にする
# iptables -A INPUT -p tcp --dport ssh -j ACCEPT