SORACOM Air Harvestにデータを送信するの巻

前回は、SORACOM Air SIMをユーザーコンソールに登録し、Harvestを有効化しました。今回は、ラズパイにUSBドングルを挿入して、各種設定を行い、Harvestにデータを送信してみたいと思います。

ラズパイの設定

ここでは、公式サイトの各種デバイスで SORACOM Air を使用するを参考に進めていきます。

まずは、パッケージのインストールから 3G 接続に利用する ppp の設定までを一括で行うスクリプトというものを用意してくれているようですので、それをダウンロードします。

$ curl -O https://soracom-files.s3.amazonaws.com/setup_air.sh

USBドングルを挿入した状態で上記スクリプトを実行する必要があるので、ラズパイにAK-020を挿入します。

とその前に、setup_air.shが何をしているのか読み解いてみましょう。

setup_air.shを読み解く

1行目から少しずつ区切ってみていきたいと思います。

#!/bin/bash
# setup_air.sh
# populate udev rules and interface for SORACOM Air
setup_config_files()
{
        if ! grep "iface wwan0" /etc/network/interfaces &> /dev/null
        then
                echo "Adding network interface 'wwan0'."
                cat << EOF >> /etc/network/interfaces
allow-hotplug wwan0
iface wwan0 inet wvdial
EOF
        fi

最初に、SORACOM Air用のudevルールとインターフェイスを入力する setup_config_filesという関数が定義されています。

grepコマンドで /etc/network/interfaces ファイル内を “iface wwan0” というキーワードでグレップします。ファイル内にそのキーワードが見つからない場合は、「’wwan0’等ネットワークインターフェイスを追加しています」というメッセージを表示して、/etc/network/interfaces に allow-hotplug wwan0 という行と、iface wwan0 inet wvdial という行を追加しています。

まず、/etc/network/interfaces というファイルがなんなのかというと、これは、ifup、ifdownコマンドの設定ファイルです。

ifup、ifdownコマンドはネットワークインターフェイスカード(以下、NIC)の有効無効を切り替えることができます。

allow-hotplugを設定すると、「ホットプラグ」イベントが検出されたときにインターフェイスを起動します。ホットプラグというのは、電源を入れたまま抜き差しできることです。iface wwan0 inet wvdial は、wvdialで接続するという設定を記述しています。

この2行で、ifup wwan0 というコマンドで接続することができるようになります。

        if [ -f /etc/udev/rules.d/30-soracom.rules ]
        then
                return 0 # nothing to do
        fi
        echo "Adding udev rules for modem detection."
        cat << EOF > /etc/udev/rules.d/30-soracom.rules

次に、/etc/udev/rules.d/30-soracom.rulesファイルが存在するかどうかを確認します。もしない場合は、「モデム検出のためのudevルールを追加しています」というメッセージを表示し、/etc/udev/rules.d/30-soracom.rulesファイルを作成しています。これ以下が、ファイルに書き込まれる内容です。各モデムごとのルールを書いています。今回はAK-020なので、そのルールだけをみてみます。

# AK-020
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="/usr/sbin/usb_modeswitch --std-eject --default-vendor 0x15eb --default-product 0xa403 --target-vendor 0x15eb --target-product 0x7d0e"
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/modprobe usbserial vend・or=0x15eb product=0x7d0e"


KERNEL=="ttyUSB*", ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

udevはデバイスファイルを動的に作成する仕組みです。ここでは、AK-020デバイスが検出された時に動作することを定義しています。

AK-020はゼロインストール機能を持っているので、一旦CD-ROMとして認識されたものをejectして、そのあと、モデムとして認識させる必要があります。

AK-020クイックスタートガイドより

詳しくはここを参照しました。ありがとうございます。

EOF


        udevadm control --reload-rule
}

そして最後に、ルールをリロードして、この関数は終了です。

次は、setup_wvdial()関数です。

setup_wvdial()
{
        cat > /etc/wvdial.conf << EOF
[Dialer Defaults]
Init1 = AT+CFUN=1
Init2 = ATZ
Init3 = AT+CGDCONT=1,"IP","$1"
Dial Attempts = 3
Stupid Mode = 1
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = yes
Baud = 460800
New PPPD = yes
ISDN = 0
APN = $1
Phone = *99***1#
Username = $2
Password = $3
Carrier Check = no
Auto DNS = 1
Check Def Route = 1
EOF
        grep replacedefaultroute /etc/ppp/peers/wvdial &> /dev/null || echo replacedefaultroute >> /etc/ppp/peers/wvdial
}

まず最初に、/etc/wvdial.confに設定を書き込んでいます。設定では、引数で渡したSORACOMの接続情報が設定に追加されます。$1がAPN、$2がUsername、$3がPasswordです。

各種設定値の説明は、ここを参照してください。

そして、/etc/ppp/peers/wvdialにreplacedefaultrouteを設定しています。これで、この関数は終わりです。

次に initialize_modem()関数です。

initialize_modem()
{
        for x in 1c9e:6801 1c9e:98ff 15eb:7d0e 15eb:a403 12d1:14fe 11f6:1034 11f6:1035
        do
                if (lsusb | grep $x > /dev/null)
                then
                        echo Found un-initilized modem. Trying to initialize it ...
                        eval $(echo $x | tr : \  | awk '{print "udevadm trigger -c add --attr-match=idVendor="$1" --attr-match=idProduct="$2}')
                        return 0
                fi
        done
        return 1
}

ここでは、lsusbコマンドでUSBデバイス情報を取得し、それを1c9e:6801 1c9e:98ff 15eb:7d0e 15eb:a403 12d1:14fe 11f6:1034 11f6:1035それぞれでgrepして、もし存在したら、「初期化されていないモデムを発見しました。初期化を試みています」というメッセージを出力し、grepで取得した製造元IDと製品IDを$1、$2に設定し、udevadmコマンドを生成して、evalでそれを実行しています。例えば、1c9e:6801がマッチした場合は、

udevadm trigger -c add --attr-match=idVendor=1c9e --attr-match=idProduct=6801

というコマンドが生成され実行されます。

次は、configure_apn()関数です。

configure_apn()
{
        usb-devices | grep HUAWEI_MOBILE > /dev/null || return 0
        echo found HUAWEI LTE USB dongle. Configuring APN ...
        if [ ! -x /usr/bin/expect -o ! -x /usr/bin/cu ]
        then
                echo Installling required packages.
                apt-get install -y --no-install-recommends cu expect || exit 1
        fi
        if [ -e /dev/ttyUSB0 ]
        then
                chmod 666 /dev/ttyUSB0
                sleep 1
                expect <<EOS || return 1

まず最初に、usb-devicesコマンドで表示したUSBデバイス情報から、「HUAWE_MOBILE」という文字列をグレップしています。見つかったら、「ファーウェイのUSBドングルが見つかりました。APNを設定しています」というメッセージを表示します。見つからない場合は、関数終了です。

/usr/binにexpect、cuという実行可能ファイルがない場合、apt-getでそれらをインストールしています。

次に、/dev/ttyUSB0が存在するかをチェックし、存在していたら、chmodでファイルの属性を666に変更し、expectで対話形式に値を設定しています。対話部分は省略します。

EOS
                echo re-plug modem or reboot OS
                return 0
        else
                echo could not find /dev/ttyUSB0. try OS reboot.
                return 1
        fi
}

それが終わったら「モデムを再接続するかOSを再起動してください」というメッセージを表示し0を返却します。ttyUSB0が見つからない場合は、「OSを再起動してください」等メッセージを表示し、1を返却します。

ここからが、実際の処理です。

echo --- 1. Check required packages


if [ $UID != 0 ]
then
        echo please execute as root or use sudo command.
        exit 1
elif [ ! -x /usr/bin/wvdial ]
then
        echo 'wvdial is not installed! installing wvdial...'
        echo
        apt-get update && apt-get install -y --no-install-recommends wvdial || exit 1
        echo
        echo "# please ignore message above, as /etc/wvdial.conf will be created soon."
        echo
fi


echo ok.
echo

必須のパッケージをチェックします。

最初に、rootで実行されているかをチェックし、されていなければ警告を表示して処理を終了します。

次に、/usr/bin/wvdialという実行可能ファイルが存在するかをチェックし、なければapt-getでインストールします。

「インストールの際に出力された上記のメッセージは無視してください。/etc/wvdial.confはすぐに作られますので。」というメッセージを表示します。

echo --- 2. Patching /lib/systemd/system/ifup@.service
sed -ie 's/^After=sys-subsystem-net-devices-%i.device$/# After=sys-subsystem-net-devices-%i.device/' /lib/systemd/system/ifup@.service || exit 1
echo ok.
echo

/lib/system/systemd/system/ifup@.serviceにパッチを当てています。After=sys-subsystem-net-devices-%i.deviceという行の頭に#を付与しています。コメントアウトしています。

echo --- 3. Generate config files


[ "$1" = "" ] && apn=soracom.io || apn=$1
[ "$2" = "" ] && user=sora || user=$2
[ "$3" = "" ] && pass=sora || pass=$3


setup_config_files
setup_wvdial $apn $user $pass


echo ok.
echo

各種設定ファイルを生成します。

apn、user、passそれぞれに値を設定しています。そして、setup_config_files関数と、setup_wvdial関数を呼び出しています。

echo --- 4. Initialize Modem
initialize_modem
configure_apn $apn || configure_apn $apn || configure_apn $apn
if [ $? = 0 ]
then
        echo ok.
else
        echo NG! please retry.
        exit 1
fi

モデムを初期化します。

まずは、initialize_modem関数を呼び出します。次にconfigure_apn関数を呼び出します。この関数の実行に失敗したら2回リトライしています。

cat <<EOF
Now you are all set.


Tips:
 - When you plug your usb-modem, it will automatically connect.
 - If you want to disconnect manually or connect again, you can use 'sudo ifdown wwan0' / 'sudo ifup wwan0' commands.
 - Or you can just execute 'sudo wvdial'.
EOF

最後に、チップスを出力しています。

  • USBモデムを挿したら、自動的に接続されますよ。
  • 手動で切断したり再接続したい場合は、”sudo ifdown wwan0″や”sudo ifup wwan0″コマンドを使ってください。
  • または、”sudo wvdial”を実行するだけでもいいですよ。

途中少し説明を端折ってしまったところもありますが、中身としてはこんな感じです。必須パッケージをインストールしてくれたり、設定ファイルを自動で作ってくれたり、自動接続設定してくれたりと、至れり尽くせりなシェルですね。さすがSORACOMさん!

セットアップのシェルを実行

中身がわかったので、安心してシェルを実行します。シェルの実行前は、USBドングルを接続しておいてください。シェルの読み解きでわかったと思いますが、USBデバイスをグレップして処理したりということをしていますので。

改めまして、シェルを実行します。

$ sudo bash setup_air.sh

なんやかんやと出力されて、最後に、先ほど読み解いたシェルのチップスが出力されました。

Found un-initilized modem. Trying to initialize it ...
ok.
Now you are all set.


Tips:
 - When you plug your usb-modem, it will automatically connect.
 - If you want to disconnect manually or connect again, you can use 'sudo ifdown wwan0' / 'sudo ifup wwan0' commands.
 - Or you can just execute 'sudo wvdial'.

大成功です。モデムも緑の点滅を始めました。通信中のようです。何を通信しているのでしょうか・・。

ifdown が実行できるか試してみましょう。

$ sudo ifdown wwan0

実行すると、緑の点滅が遅くなりました。アイドル状態になりました。

$ sudo ifup wwan0

で、もう一度接続しておきましょう。

SORACOM Harvestにデータを送信

ラズパイの設定が終わったので、SORACOM Harvestにデータを送信してみます。

$ curl -v -X POST \
 -H 'content-type:application/json' \
 -d '{"temperature":20}' \
 http://harvest.soracom.io

すると、以下のように出力されました。

* Connected to harvest.soracom.io (100.127.111.111) port 80 (#0)
> POST / HTTP/1.1
> Host: harvest.soracom.io
> User-Agent: curl/7.64.0
> Accept: */*
> content-type:application/json
> Content-Length: 18
> 
* upload completely sent off: 18 out of 18 bytes
< HTTP/1.1 201 Created
< Date: Wed, 27 May 2020 10:53:56 GMT
< Content-Length: 0
< Connection: close
< 
* Closing connection 0

なんかうまくいっているっぽい。ということでSORACOMのユーザーコンソールで確認してみましょう。

操作からデータを確認するを選択すると、以下のように表示されました。(ひとつじゃわかりにくかったので、temperature:25でもう一度送信しました。)

おおおおお!送信されている。そしてグラフが確認できる。棒グラフに変えてみます。

グラフが棒になってる!すごい!

おわりに

ということで、無事セットアップが完了しました。

かなり簡単にセットアップでき、データが送信でき、そしてデータが確認できました。想像していたよりかなり簡単でした。

本格的にスマート農業するときもSORACOMで決まりのような気がしてきました。いや、決めました!

次は、実際の測定データをHarvestに送信したいと思います。

コメント

タイトルとURLをコピーしました