🧙

SORACOMデバイスpingをCLIから試してみた

2021/06/10に公開

この記事は

先日発表された、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が生きてるかとどのサブスクリプションが生きてるかはまた別の概念だから、simissubscribersの両方に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
GitHubで編集を提案

Discussion