4G-LTE通信テストと…教訓(Armadillo-IoT)
Armadillo-IoT G3Lを起動して4G-LTE通信の実力を確認してみましょう。
アットマークテクノ Armadillo-IoT G3L D1モデル開発セット
関連記事
そのまま現場にも量産にも使えるIoTデバイス=Armadillo-IoT試用レポート1
3G通信もお手軽=Armadillo-IoT試用レポート2
USBカメラの映像をボードからサーバへ転送=Armadillo-IoT試用レポート3
Armadillo-IoT G3Lを選択した理由
仮想マシンによる開発環境の利点
内蔵Flashで起動するかSDカードで起動するか
ターゲットとパソコンを接続
このボードの中身(OS)はLinuxです。
Linuxは、コマンドで容易に操作することができます。
例えば、Ubuntuやラズベリーパイの場合、メニューの端末(ターミナル)を選択すると、コマンドを入力する画面が開きます。
他にも、パソコン等からネットワークやシリアル越しにアクセスすることにより、コマンド入力画面を開くことができます。
この、コマンドを入力する画面などを端末と呼びます。
Armadillo-IoTの場合、ボードとパソコンを「開発用USBシリアル変換アダプタ」で接続します。
USBコネクタのついてるパソコンであれば、何でもつなげられるのでお手軽です。
このアダプタを接続すると、パソコンにはシリアルポート(COMポート)として認識されます。
これにより、ボードとパソコンがシリアルで接続されるわけです。
今回、パソコンはWindows 10のノートパソコンを使いました。
Windowsにもコマンド入力画面があります。
「コマンドプロンプト」(DOS)ですね。
これも端末の一種です。
コマンドを入力する画面(ウィンドウ)は、1つのアプリケーションです。
そして、そのアプリケーションから、任意のコンピュータにアクセス(接続)して、コマンドを入力可能な経路を開くのです。
例えば、Windowsのコマンドプロンプトの場合、cmd.exeというアプリケーションを実行して、WindowsのOSにアクセスし、OSにコマンド入力が可能になります。
例えば、Ubuntu(パソコン用のアプリやドライバを多数追加したLinux)の端末の場合、Terminalというアプリを実行し、OSにアクセスし、コマンドが入力可能になります。
さて、この例の場合、アプリケーションが置いてあるパソコン自身のOSにアクセスしているわけですが、別の場所のコンピュータにもアクセスできます。
例えば、パソコンから、インターネット越しにサーバにアクセスすると、サーバへコマンドを入力することができます。
例えば、パソコンから、シリアル越しにボードにアクセスすると、ボードにコマンドを入力することができます。
これらの場合、インターネット越しとか、シリアル越しとかでアクセスするために、ケーブルや接続アプリケーションが使用されます。
今回は、シリアル変換アダプタを使用し、パソコンから、シリアル越しにArmadillo-IoTにアクセスするわけです。
さて、今回使用するアプリケーションは、私がいつも愛用しているTeraTermです。
TeraTermは、シリアル接続もインターネット接続も簡単で、様々な便利機能が使えるのでお勧めです。
TeraTermの接続選択画面で「シリアル」を選択すると、COM番号が選択できます。
USB変換アダプタを接続すると、自動的にCOM番号が割り振られるので、そのCOM番号を選択します。
「USB Serial Port」と書かれているCOM番号があれば、そのCOM番号です。
(インストールされているドライバにより、異なる表示にある場合もあります)
その後、[設定]-[シリアルポート]を選択し、シリアル接続のパラメータを設定します。
設定すべきパラメータについては、Armadillo-IoTの開発セットのDVDやホームページに掲載されているマニュアルに記載されていました。
115200 bps
データ長8ビット
ストップビット1ビット
パリティ無し
フロー制御無し
この状態でボードの電源を投入すると、ボードとLinuxの起動メッセージが滝のように流れてきます。
そして、最後にログインを促すメッセージが出ます。
U-BOOT
このボードのLinuxは、ソフトウェアの中核となるOSです。
そして、そのOSの周囲にはハードウェアに適したドライバや起動プログラム等が付いています。
このボードで採用されている起動プログラムはU-BOOTというプログラムです。
このU-BOOTは、Linuxが起動するために必要な前準備などを行います。
このボードのメモリがどこにどのくらいあって、Linuxその他のプログラムがどこに格納されていてどうやって読み出すのか、予備のプログラムはどこか、等の処理を行い、最後にLinuxの中枢であるKernelを呼び出して、仕事を終えます。
このU-BOOTはハードウェア特有の処理の大半を担うため、Linuxは多くの部分を他のボードと共通化できます。
さて、USB/シリアル変換アダプタには市販のものもありますが、この開発セットに含まれているアダプタには、もう一つ機能が備わっています。
起動モードを選択するスイッチです。
このスイッチは、通常、内側に設定しておくものですが、外側に設定すると起動途中のU-BOOTの最後の処理のところで止まります。
ここでU-BOOTのコマンドが使用できますが、特別なことをしない場合は、boot と入力してkernel(Linux OS)を起動します。
スイッチが内側の場合、途中で止まることなくkernel(Linux OS)が起動します。
このボードをそのまま使用する場合は、おそらくU-BOOTに手を加える必要はないでしょう。
しかし、メモリや部品を追加したり、意図的に機能を削ったりする場合、U-BOOTやその設定に変更を加える必要が出てくる場合があります。
その様な時に、このスイッチを利用します。
ログインのパスワード
ネットワークに接続する前に、必ずやっておかなければならないことがあります。
パスワードの設定です。
デフォルトのパスワードのままでは、易々とウイルスや悪意あるプログラムの侵入を許してしまうからです。
ですから、LANケーブルやWiFi、SIMを接続する前に、ある程度複雑なパスワードを設定しましょう。
パスワードを忘れそうだ、という心配がある場合は、付箋にメモって、ボードに貼っておけばよいと思います。
私は、写真に写らない内側に貼りました。
さて、パスワードについて、一つ注意点があります。
マニュアルに記載されていますが、このボードには、ログイン用のユーザ名があらかじめ2つ登録されています。
この2つ、各々に対して強固なパスワードを設定しておかないと、前述のリスクは回避できません。
ユーザ1のパスワードを強固にしてあっても、ユーザ2のパスワードがデフォルトのままでは、簡単に侵入できてしまうためです。
パスワードは、ログインした後、passwdコマンドで設定変更できます。
面倒ですが、ユーザ1でロングインした後、パスワード変更し、それから一度再起動またはログアウトして、ユーザ2でロングインしなおしてパスワードを変更します。
passwd と入力すると、現在ログインしているユーザ(rootやatmark)の新しいパスワードが入力できます。確認のため、2度入力を求められます。
尚、root以外の場合は、新しいパスワードの前に、現在のパスワードの入力を求められます。
電源OFFコマンドと電源ボタン
他のボードと違い、このボードにはpoweroffコマンドというものが実装されています。
他のLinuxボードでは、電源を落とす前にhaltコマンドやshutdownコマンドですべてのプログラムを安全に停止させてから電源を外す、という手順を踏みますが、このボードの場合は、これらのコマンドの代わりに、poweroffというコマンドを使用します。
このコマンドが実装されていることにより、ボードについているボタンを電源ボタンとして利用することができます。
電源コネクタとシリアルコネクタの間にあるボタンがそのボタンです。
haltコマンド等でプログラムを落とした場合、再起動させるためには、一旦電源を抜いて、再度電源を入れる、という手間がかかりますが、poweroffコマンドでプログラムを落とした場合は、ボタンを押すだけで再起動します。
また、動作中にこのボタンを約10秒押し続けると、poweroffコマンドを入力した時と同じ様に、全てのプログラムが次々と閉じられ、電源を切っても良い状態になります。
これは、開発中のプログラムが止まらなくなったりして、コマンドを打てなくなった時などに便利です。
尚、rebootコマンドは、rootで動作しました。
さて、パスワード変更と、電源OFF手順さえクリアできれば、後は自由です。
早速、LTE通信を試しましょう。
4G-LTE通信設定
電源を落とした後、SIMを挿します。
G3の時と同じ、AEONモバイルのSIMカードを使用しました。
(公式サイトにAEONモバイルは載っていませんでしたが、とりあえず大丈夫でした)
G3の時とはデバイスが異なるので、SIM設定のコマンドも少し設定が異なります。
(con-name指定が追加され、ACM番号が変わった)
ちゃんとマニュアルに従って設定しましょう
nmcli connection add con-name gsm-ttyACM0 type gsm ifname ttyACM0 apn i-aeonmobile.com user user password 0000
このコマンドを入力すると回線への接続が開始され(connecting)、開通(connected)まで約40秒かかるそうです。
1分程度待つか、下記コマンドで connecting が connected になるまで待ちましょう。
nmcli device
その後、nmcli コマンドやpingコマンドでインターネットに接続できたことを確認しました。
nmcli connection
ping www.google.co.jp -c 4
また、ifconfigコマンドで確認すると、usb1というインターフェースが追加されたことが分かります。
安全をみてSDカードを使う
さて、ここから先は色々変更していくので、間違って起動しなくなったりして復旧が面倒になるかもしれません。
そこで、SDカードで起動する方法に切り替えます。
ここまでは、ボード上のFlashデバイスに格納されているOSやファイルを使っていました。
このまま色々と変更を加えて行って、間違って大事なファイルを消したり、設定を戻せなくなったりすると、元に戻すのが大変です。
しかし、SDカードにOS等のファイルを入れて、今後の変更をSDカードに対して行えば、Flashのデータは元のままです。
また、このSDカードを作り直す手間は、Flashの中身を戻す手間に比べれば、遥かに楽です。
このSDカードの作り方はマニュアルに記載されていますが、作成には開発環境(仮想マシン)または、Linux PCが必要です。
開発環境とSDカードについては別記しました。
という訳で、ここから先はSDカード上のOS/ファイルで進めます。
USBカメラを繋いでサーバにアップロード!
今回もUSBカメラを繋いでカメラ撮影画像をサーバにアップロードする時間を測定してみましょう。
まず、fswebcam を installします。
前回はLAN経由でインストールしましたが、今回はLTE回線のみでインストールも行いました。
sudo apt-get install fswebcam
特に遅くもなく、インストールできました。
これだけでも通信速度が向上したことが分かります。
次に、USBカメラを接続し、lsusbとlsで確認。
root@armadillo:~# lsusb
Bus 002 Device 002: ID 1e2d:00a0
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 056e:7016 Elecom Co., Ltd
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@armadillo:~# ls -l /dev/video*
crw-rw---- 1 root video 81, 0 Feb 3 16:22 /dev/video0
今回も /dev/video0 でした。
では、/dev/video0でキャプチャします。
fswebcam -d /dev/video0 -r 1024 --jpeg 95 201.jpg
問題なくキャプチャで来たようです。
続いて、サーバにセキュア接続するためのssh設定を行います。
mkdir .ssh
chmod 700 .ssh
cat > .ssh/id_rsa.pub
(公開キーの中身を貼り付けて、Enter、Ctrl+D)
chmod 600 .ssh/id_rsa.pub
cat > .ssh/id_rsa
(秘密キーの中身を貼り付けて、Enter、Ctrl+D)
chmod 600 .ssh/id_rsa
更に、ローカル(ボード側)のconfigファイルにサーバ名+ユーザ名を追記します。
こうしておくと、長々とサーバ名を書かなくても、簡単なHost名でログインできます。
cp .ssh/config bak-ssh-config
cat >> .ssh/config
(ここで、下記(例)をペーストしてCtrl+D)
Host ebi
HostName team-ebi.sakura.ne.jp
User team-ebi
早速アップロードしてみましょう。
scp 201.jpg ebi:www/wp/test
うん。早いですね。
1つアップロードするだけでは、一瞬で終わってしまうので良く分かりません。
前回と同じスクリプトを使ってみましょう。
キャプチャとダウンロード、アップロードを連続実行するスクリプト
FNUM=201
FEND=`expr $FNUM - 1 + 10`
FDIR=/mnt/ramdisk/
# FDIR=
FNAME=`printf "%03d" $FNUM`
scp ebi:www/wp/test/$FNAME.jpg start.jpg
while [ $FNUM -le $FEND ] ; do
FNAME=`printf "%03d" $FNUM`
echo $FNAME ---------------- step 1
# fswebcam -d /dev/video0 -D 0.1 -r 400 --jpeg 95 $FDIR$FNAME.jpg
fswebcam -d /dev/video0 -r 1024 --jpeg 95 $FDIR$FNAME.jpg
echo $FNAME ---------------- step 2
scp $FDIR$FNAME.jpg ebi:www/wp/test
echo $FNAME ---------------- step 3
FNUM=`expr $FNUM + 1`
done
scp ebi:www/wp/test/$FNAME.jpg end.jpg
保存先がdisk(SD)のままだと遅いので、ramdiskにします。
sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=10m /dev/shm /mnt/ramdisk
上記スクリプトをコピペして cam.sh というファイルにします。
cat > cam.sh
(ここでペーストしてCtrl+D)
で、実行します。
sh cam.sh
…速くなってるのは分かりますが、やはりキャプチャに時間がかかりすぎて、肝心な通信部分の時間が良く分かりません。
通信自体は1秒あるいはそれ以下です。
しかし、
・カメラのオープンに時間がとられる。
・ファイルの保存に時間がとられる。
・ログインに時間がとられる。
つまり、カメラをオープンしたまま、ログインしたまま、ファイルに保存せずにそのまま送出、というプログラムを作れば、かなりパフォーマンスが改善されるということです。
残念ながら今回の方法は、役者不足だったようです。
やはり、適当なプログラムを組み合わせるだけでは、最適なパフォーマンスは出ません。
目的に応じたプログラムがベスト、という教訓ですね。
もちろん、「可能かどうか」を試す方法としては、既存のプログラムを組み合わせるという手段は、何も間違ってません。
前回の様に限られた時間の中でテストする、というケースを乗り越えられたのも、
fswebcam作者の方や色々な手法を考え、公開してくださっている皆さんのおかげです。
さて、今回の記事は皆さんの役に立てるでしょうか?
アットマークテクノ Armadillo-IoT G3L D1モデル開発セット
Armadillo-IoT G3開発セット
(在庫切れ?代理店/オンラインショップの方が早いかもしれませんね)