SORACOMデバイスpingをCLIから試してみた
この記事は
先日発表された、SORACOMの新機能「デバイスping」をcliから試してみたという記事です。
デバイスpingとは
上記の公式ブログにもありますが、SORACOM AirのSIMが挿さっているデバイスに向けてpingを打って疎通確認・死活監視を行う機能です。
pingを返せるデバイスであれば、SORACOM Airで通信中でなくても、通信機器(モデム)に電源が入って通信ができる状態(ステータスがオンライン)でさえあれば使えるようです。
マイコンだとSIMは挿したもののデータが送り込めず、送信プログラムが悪いの?そもそもネットワークつながってるの?PCならpingを打ってみて確認できるのに・・・というようなことは結構あります。そんなときにも便利そうです!
そして、CLIからもOKということであればこれは試すしかないでしょう。
やってみた
早速やってみます。
cliはv0.9.0から対応していますのでGitHubのページからダウンロードしてきます。初めての方はSORACOM CLI利用ガイドを見ながら認証情報の設定などをしてください。
多分sims
コマンドの下にあるんだろうなーと予想してコマンドラインヘルプを確認します。
$ soracom sims --help
Manage SIMs.
Usage:
soracom sims [command]
Available Commands:
......
downlink-ping Send ping requests to a SIM.
ありました!
対象のSIM IDを指定すれば良いのだろうと推測はできますので、soracom sims list
で取得します。私は今回GPSマルチユニットのSIMに向けてやってみました。
soracom sims downlink-ping --sim-id xxxxxxxxxxxxxxxxxxxx
{
"rtt": "rtt min/avg/max/mdev = 416.287/416.287/416.287/0.000 ms",
"stat": "1 packets transmitted, 1 received, 0% packet loss, time 0ms",
"success": true
}
成功しました!
何度か打ってみたのですが、成功したり失敗したりしています。電波状況なのかLTE-Mの特性なのかもしれません。
ちなみにあのボタン(私はひげボタンで確認しました)だと、ボタンを押して通信をしている最中であればpingに反応するようです。
コマンドラインオプションは
指定できるコマンドラインオプションを調べてみましょう。
$ soracom sims downlink-ping -h
Send ICMP ping requests to a SIM.
Usage:
soracom sims downlink-ping [flags]
Flags:
--body string JSON string or @filename for API request body.
-h, --help help for downlink-ping
--number-of-ping-requests int (default 1)
--sim-id string SIM ID of the target SIM.
--timeout-seconds int (default 1)
--sim-id
は必須で、あとはpingの回数を--number-of-ping-requests
で、タイムアウトを--timeout-seconds
で指定できるようです。
先ほどたまに失敗していたのも、タイムアウトを伸ばしてやるとほぼ成功するようになりました。死活監視で使うのであれば、少し長めにするといいかもしれません。
subscribersにもpingがある?
実はこのping機能、sims
コマンドだけでなくsubscribers
コマンドにもあるんです。
$ soracom subscribers --help
Manage subscribers.
Usage:
soracom subscribers [command]
Available Commands:
......
downlink-ping Send ping requests to a subscriber.
こちらも試してみましょう。まずは使い方を確認します。
$ soracom subscribers downlink-ping --help
Send ICMP ping requests to a subscriber.
Usage:
soracom subscribers downlink-ping [flags]
Flags:
--body string JSON string or @filename for API request body.
-h, --help help for downlink-ping
--imsi string IMSI of the target subscriber.
--number-of-ping-requests int (default 1)
--timeout-seconds int (default 1)
オプションはほぼ同じですが、宛先をSIM IDではなくIMSIで指定するようです。
soracom subscribers list
で対象のIMSIを確認して、実行してみます。
$ soracom subscribers downlink-ping --imsi xxxxxxxxxxxxxxxxxxxxx
{
"rtt": "rtt min/avg/max/mdev = 1514.804/1514.804/1514.804/0.000 ms",
"stat": "1 packets transmitted, 1 received, 0% packet loss, time 0ms",
"success": true
}
こちらも成功しました。
ソラコムのテクニカルエヴァンジェリストのmaxに聞いたところ、
- SIMは「物理的なSIM」
- サブスクリプションは「契約・プラン」
- 通常は1対1だけど、SIM1つに対して複数のサブスクライバーとなることがある
と教えてもらいました。確かに現在はサブスクリプションコンテナがあるから、1枚のSIMに複数のサブスクリプションがつくことはあり得ますね。納得です。
そして、SIMが生きてるかとどのサブスクリプションが生きてるかはまた別の概念だから、simis
とsubscribers
の両方にping機能があるということなのでしょう。
まとめ
SORACOMデバイスpingを使うと、SIMの挿さっているデバイスに向けてpingを打てます。cilでも使えますので、皆さん是非ご利用ください!
おまけ
こんな感じにすると普通のpingっぽい表示で面白いかも(エラー時の表示とかガン無視の単なるネタですのでツッコミはご容赦をw)
#!/bin/sh
WAIT=1
COUNT=1
TIMEOUT=1
CMD=""
SEQ=1
while getopts i:c:W:I:S: OPT
do
case $OPT in
i) WAIT=$OPTARG
;;
c) COUNT=$OPTARG
;;
W) TIMEOUT=$OPTARG
;;
I) CMD=subscribers
TARGET="--imsi $OPTARG"
TGT=$OPTARG
;;
S) CMD=sims
TARGET="--sim-id $OPTARG"
TGT=$OPTARG
;;
esac
done
if [ $CMD = "" ]; then
return 1
fi
echo "PING $TGT 56 data bytes"
while [ $COUNT -gt 0 ]; do
RESULT=`soracom $CMD downlink-ping $TARGET --timeout-seconds $TIMEOUT`
RTTRESULT=`echo $RESULT | jq -r .rtt`
RTT=`echo $RTTRESULT |awk -F '/' '{print $5}'`
echo "64 bytes from $TGT: icmp_seq=$SEQ ttl=128 time=$RTT"
COUNT=`expr $COUNT - 1`
SEQ=`expr $SEQ + 1`
if [ $COUNT -gt 0 ]; then
sleep $WAIT
fi
done
echo "--- $TGT ping statistics ---"
echo $RTTRESULT
動かすとこんな感じです
$ soracom-ping -S xxxxxxxxxxxxxxxxxxx -c 3 -W 3
PING xxxxxxxxxxxxxxxxxx 56 data bytes
64 bytes from xxxxxxxxxxxxxxxxxxx: icmp_seq=1 ttl=128 time=911.015
64 bytes from xxxxxxxxxxxxxxxxxxx: icmp_seq=2 ttl=128 time=1121.765
64 bytes from xxxxxxxxxxxxxxxxxxx: icmp_seq=3 ttl=128 time=611.205
--- 8981100005822837432 ping statistics ---
rtt min/avg/max/mdev = 611.205/611.205/611.205/0.000 ms
Discussion