Armadilloフォーラム

Wi-SUNアドオンモジュール経由でのデータ送受信方法

keisyu

2015年12月10日 9時19分

コスタルシステムズに小原と申します。Unixに不慣れなもので、基本的な質問をお許し下さい。

アルマジロIoT + Wi-SUNアドオンモジュール <=> Wi-SUN USBドングルでの文字列データの送受信を行いたいと考えております。
アルマジロ側から、tip コマンドでWi-SUNモジュールに接続した状態で、Wi-SUNモジュールのコマンドを打ち込めば、USBドングル側で、送信した文字列を確認することができました。
次のステップとして、アルマジロ側に、予め用意した文字列を送信するシェルスクリプトを準備することで、データの送信を行いたいのですが、シェルからWi-SUN経由でデータを送信するには、シェルをどの様に記述すれば良いでしょうか。
また、同様に、受信したUDPデータを受け取り、変数として格納する様なシェルの記述方法を教えて頂けますでしょうか。
よろしくお願いたします。

ちなみに、Wi-SUNモジュールでUDPデータ送信するコマンドは、SKSENDTOで、
コマンド例は以下の通りです。
SKSENDTO 1 FE80:0000:0000:0000:021D:1290:1234:5678 0E1A 0 0005 01234
SKSENDTO + + + + + +

また、Wi-SUNアドオンモジュールは、アルマジロIoTのCON2に挿してあります。

コメント

at_yuma.arakawa

2015年12月10日 10時26分

> シェルからWi-SUN経由でデータを送信するには、シェルをどの様に記述すれば良いでしょうか。

expectのスクリプトですが、データ送信については過去にスクリプトを作成したので、
参考までに紹介します。

以下のスクリプトで"<<送信したい文字列を記述して下さい>>"に記述した文字列を
繰り返し送信します。
なお、送信の都度、Wi-SUNモジュール側の応答を待つようにしています。

set timeout -1
spawn tip -l /dev/ttymxc2 -s 115200
expect "Connected."
send "\n"
while {1} {
    send "SKSENDTO 1 FE80:0000:0000:0000:021D:1290:1234:5678 0E1A 0 0005 01234"
    send "<<送信したい文字列を記述して下さい>>"
    expect "OK"
}
interact

以下のように実行して下さい
(上記のスクリプトをsender.expectというファイル名で保存した場合)

[armadillo]# expect -f sender.expect

なお、expectスクリプトはヒアドキュメントを使用してシェルスクリプトに組み込むことが可能です。
以下の記事が参考になるかと思います。

http://kuni255.blogspot.jp/2012/07/expect.html

at_yuma.arakawa

2015年12月10日 11時16分

先ほどの回答で、
> 以下のスクリプトで"<<送信したい文字列を記述して下さい>>"に記述した文字列を
> 繰り返し送信します。
と書きましたが、元のスクリプトが固定長データのみに対応したものであり、
先ほど回答したスクリプトでは"<<送信したい文字列を記述して下さい>>"は送信されません。すみません。

投稿文のコマンド例で示されている、"01234"の5バイトのデータを送信する場合は以下で十分です。
(CON2にアドオンモジュールを接続しているとのことなので、併せて、ttymxc0へ変更しました。)

set timeout -1
spawn tip -l /dev/ttymxc0 -s 115200
expect "Connected."
send "\n"
send "SKSENDTO 1 FE80:0000:0000:0000:021D:1290:1234:5678 0E1A 0 0005 01234"
expect "OK"
interact

keisyu

2015年12月11日 9時49分

ご回答、ありがとうございました。
ご連絡頂いた方法で確かにUDP送信できるのですが、tipコマンド等の様に一旦Wi-SUNモジュールにシリアル接続する方法以外には、Wi-SUNモジュールとの間でデータの送受信をすることは出来ないでしょうか。
また、教えて頂いたスクリプトの場合、終了後にtip接続されたままの状態となってしまうのですが、tip接続が終了して終わる様にすることはできるでしょうか。基本的な質問で申し訳ありませんが、よろしくお願い致します。

> 先ほどの回答で、
> > 以下のスクリプトで"<<送信したい文字列を記述して下さい>>"に記述した文字列を
> > 繰り返し送信します。
> と書きましたが、元のスクリプトが固定長データのみに対応したものであり、
> 先ほど回答したスクリプトでは"<<送信したい文字列を記述して下さい>>"は送信されません。すみません。
>
> 投稿文のコマンド例で示されている、"01234"の5バイトのデータを送信する場合は以下で十分です。
> (CON2にアドオンモジュールを接続しているとのことなので、併せて、ttymxc0へ変更しました。)
>

> set timeout -1
> spawn tip -l /dev/ttymxc0 -s 115200
> expect "Connected."
> send "\n"
> send "SKSENDTO 1 FE80:0000:0000:0000:021D:1290:1234:5678 0E1A 0 0005 01234"
> expect "OK"
> interact
> 

>

at_yashi

2015年12月17日 11時28分

> tipコマンド等の様に一旦Wi-SUNモジュールにシリアル接続する方法以外には、Wi-SUNモジュールとの間でデータの送受信をすることは出来ないでしょうか。

今回のスクリプトは、tclという言語を使った、expect というものを使っています。
expect は直接シリアルポートを開けるので、tipは不要です。

それとも、なにか違う質問でしたか?たとえば、Cでも同じことをかけます。
ただ、利用している Wi-SUNのモジュールは、シリアル通信用であり、
ethernet のように socket インターフェイスをもっているわけではありません。
シリアルも NULL Modemのように単純ではなく、コマンドベースなので、
pppを通すにも、拡張が必要です。