SORACOM を使って学ぶ AT コマンド - 3. 実践編

準備編では ATI コマンドを実行してみました。

モデムを使ってダイヤルアップ接続をしてデータ通信を行うことができるようになるには、いくつかの AT コマンドを組み合わせて実行していく必要があります。

とはいっても、どこから手を付けたらいいかわからないので、まずは SORACOM が公開している、SORACOM Air でインターネットに接続するためのスクリプトを読み解いてみましょう。

SORACOM が実施しているハンズオンセミナーの資料が GitHub にて公開されています。 https://github.com/soracom/handson/blob/master/setup/setup.md#3-0

こちらの「接続スクリプトのダウンロード」というところからリンクされているスクリプトを見てみましょう。

途中に

Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","$2"

というような部分が見つかると思います。

これは、wvdial の設定ファイルの内容ですが、ダイヤルアップ接続時にはここに記載されている AT コマンドを一つずつ実行していっているようなイメージとなります。

以下、各コマンドの説明をしていきますが、皆様も是非実際に手を動かしてコマンドを実行してみてください。

ATZ コマンド

では、まず最初の ATZ コマンドは何のためのコマンドでしょうか。 ITU-T Rec. V.250 6.1.1 によると、モデムの設定をデフォルト状態に戻すためのもののようです。

つまり、モデムをいったんまっさらな状態にしているわけですね。 もしモデムを使って接続中(データ通信中)に ATZ コマンドを実行するとその接続は切断されるようです。

ATQ コマンド

つづいては ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 という行を見ていきます。 長いコマンドに見えますが、実はこれは半角スペースごとに別の AT コマンドが続いています。 つまり、ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0

ATQ0
ATV1
ATE1
ATS0=0
AT&C1
AT&D2
AT+FCLASS=0

という複数のコマンドを連続で実行したのと同じことになります。

ちなみに、基本コマンドは空白で区切らずに ATQ0V1E1S0=0&C1&D2 という感じにつなげて実行することもできます。

まずは最初の ATQ0 を見ていきましょう。 これは ITU-T Rec. V.250 6.2.5 によると、モデムが返す結果コード(OK とか ERROR とか)を抑制するかしないかを指定するコマンドです。

ATQ0 は抑制しない(結果コードが表示される)ようにします。 抑制したい場合は ATQ1 を実行します。

もし工場出荷時のデフォルトで結果コードを抑制する設定になっているようなモデムがあったとすると、コマンドの実行が成功しても失敗しても結果コード(OKERROR など)が何も表示されなくなってしまって問題の切り分け等が難しくなってしまうので、ATQ0 で確実に結果コードが表示されるようにしているのだと思います。

ATV コマンド

続いて V1 の部分です。 これは、ITU-T Rec. V.250 によると、モデムからのレスポンスのフォーマットを選択します。

ATV0 および ATV1 が実行可能です。

それぞれの意味は、コマンドの実行例を見てもらったほうが早いと思います。

まず ATV0 を実行してから ATI を実行した場合は、以下のような結果になります。

Manufacturer: huawei
Model: MS2131
Revision: 21.751.19.00.00
IMEI: 86610xxxxxxxxxx
+GCAP: +CGSM,+DS,+ES
0

ATV1 を実行してから ATI を実行すると、以下のようになります。

ATV1
OK
ATI
Manufacturer: huawei
Model: MS2131
Revision: 21.751.19.00.00
IMEI: 866109028769760
+GCAP: +CGSM,+DS,+ES

OK

ATV0 のときと ATV1 のときの違いは以下のような点です。

  • ATV0 のときはコマンドを入力した行に上書きされるような形で結果が表示される。ATV1 のときはコマンドを入力した次の行から結果が表示される
  • ATV0 のときは ATI コマンドの最後の結果コードが数値(0OK と同じ意味)。ATV1 のときは OK と文字列で表示される
  • ATV0 のときは結果の数値の前に空行が入らない。ATV1 のときは結果コードの前に1行空行がある。

通常は ATV1 を設定しておいたほうが(人間にとって)読みやすくて良いでしょう。

ATE コマンド

つづいては E1 です。

これは ITU-T Rec. V.250 6.2.4 によると、モデムに送った AT コマンドの文字列をモデム側からエコーバックするかどうかを決めるコマンドです。

ATE0 ではエコーバックしない、ATE1 ではエコーバックする設定です。

screen で AT コマンドを試してみる際にはエコーバックがないと辛いので ATE1 を設定しておいたほうが良いでしょう。

ATS0 コマンド

つづいては S0=0 です。

ITU-T Rec. V.250 6.3.8 によりますと、これは電話がかかってきた際に何回の呼び出し音の後に自動応答をするかを決めるコマンドです。

ATS0=0 は自動応答しない設定です。

AT&C コマンド

続いては &C1 です。

ITU-T Rec. V.250 6.2.8 によると、"Circuit 109" の挙動を設定します。

"Circuit 109" とは、接続先からのキャリア信号を受信したこと(≒接続先に接続できたこと)を、DCE(≒モデム)が DTE(≒ユーザープログラム等)に伝えるための信号線の名前です。"Received Line Signal Detector" とか "DCD" と呼ばれたりもします。

AT&C0 では、接続できているかどうかに関わらず Circuit 109 が "ON" 状態になります。 AT&C1 では、接続状態に応じて Circuit 109 の状態が変化します。

通常は &C1 に設定しておきます。

AT&D コマンド

続いては &D2 です。

ITU-T Rec. V.250 6.2.9 によりますと、"Circuit 108/2" が "ON" から "OFF" になったときのモデムの挙動を設定します。

"Circuit 108/2" とは、DTE(≒ユーザープログラム等)がデータ送受信の準備が整っているかどうかを DCE(≒モデム)に伝えるための信号線の名前です。"Data terminal ready" とか "DTR" と呼ばれたりもします。

つまり、"Circuit 108/2" が "ON" から "OFF" になったということは、ユーザープログラムが終了するなどしてデータ送受信できなくなったことを示し、その際にモデムがどのように振る舞えばよいかを設定することになります。

これには設定可能な値が 3 つあります。

AT&D0 の場合は、モデムは "Circuit 108/2" の変化を無視します。(つまりデータ送受信を継続しようとします) AT&D1 の場合は、モデムは通話は継続したままコマンドモードに戻ります。 AT&D2 の場合は、モデムは通話を終了します。未送信のデータが残っている場合の挙動は +ETBM で設定されたパラメータにしたがって処理されます(モデムが対応している場合)

意図せずプログラムが終了してしまった場合などに接続が継続されてしまうと思わぬ課金が発生したりしてしまうかもしれませんので、ここでは &D2 に設定しているのだと思われます。

AT+FCLASS コマンド

続いては +FCLASS=0 です。

これは入門編でもご紹介したように + で始まっているので拡張コマンドになります。 そして +F なので FAX 関連のコマンドということになりそうです。

ITU-T Rec. V.250 の Supplement 1 (ITU-T Rec. V.250 をダウンロードしたのと同じページからダウンロードできます)を見ると、+FCLASSITU-T Rec. T.31 の 8.2.1 などで規定されているようです。

ということで ITU-T Rec. T.31 をダウンロードして確認してみましょう。

これは "サービスクラス" というものを選択するコマンドのようです。

FAX の送受信は行わず、データ通信のみの場合は +FCLASS=0 を指定するようです。

なお、Huawei MS2131i-8 と L-05A は +FCLASS コマンドをサポートしていませんでした。 (実行すると結果コードが ERROR になります。)

+FCLASS コマンドをサポートしているかどうかは +GCAP コマンドを実行するとわかります。

AT+GCAP
+GCAP: +CGSM,+DS,+ES

OK

ここに +FCLASS が含まれていないので、このモデムは +FCLASS コマンドをサポートしていないようです。

AT+CGDCONT コマンド

さて、長かった ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 の解説がやっと終わりました。

次は AT+CGDCONT=1,"IP","$2" です。

$2 の部分は、これはシェルスクリプトの関数に渡されてくる引数で、実際には "soracom.io" という文字列になっています。 ですので、このコマンドは実行されるときには AT+CGDCONT=1,"IP","soracom.io" というコマンドとして実行されます。

これも AT の直後が + なので拡張コマンドです。+C なので携帯電話回線の制御のコマンドということがわかります。

ITU-T Rec. V250 Supplement 1 を見ると、+CGDCONT は GSM07.60 という標準で定められているようです。

GSM 07.60 は一般公開はされていないようですが、3GPP TS 27.060 が GSM 07.60 と同じものなので 3GPP のほうを見ましょう。

27.060 の 12.1 には AT コマンドの概要が書かれていますが、詳細なリファレンスは 3GPP TS 27.007 に記述されている旨が記されています。

ということで今度は 3GPP TS 27.007 を参照しますと 10.1.1 に +CGDCONT の定義がありました。

これは "PDP コンテキスト" と呼ばれるものを設定するコマンドです。"PDP" は Packet Data Protocol の略で、要はデータ通信のことです。PDP をするために必要な情報を設定します。

ここでは 1, "IP", "soracom.io" という3つのパラメータを設定しています。 最初の 1 は、コンテキストの ID で、1からいくつかの数が使えます。PDP コンテキストを保存しておくスロットの番号のようなものです。あとでこの設定を参照するためにこの 1 という値を使います。

"IP"PDP タイプというもので、 SORACOM の場合は今のところ "IP" を固定で指定しておけば良いです。

"soracom.io" は APN 名です。

ここまで実行したら、設定が完了しました。

ATD コマンド

設定が完了したらダイヤルアップします。 ダイヤルアップするには ATD コマンドを使用します。

ITU-T Rec. V.250 の 6.3.1 に ATD コマンドの基本的な定義があり、3GPP TS 27.007 の 6.2 には D コマンドが携帯電話回線で使われるときの追加仕様や変更点について少し書かれています。

SORACOM SIM でダイヤルアップするには ATD*99***1# というコマンドを実行します。

これは *99***1# という番号にダイヤルしているのですが、この番号の末尾の # の一つ前にある 1 は、先ほどの +CGDCONT で指定したコンテキスト ID の 1 です。+CGDCONT で異なるコンテキスト ID で複数の設定を保存している場合、ここのダイヤル先番号を変えてどのコンテキストを使うかを選択します。

ATD*99***1# を実行すると CONNECT 21600000 のような応答が返ってくると思います。(モデムの機種によっては数字が表示されたりされなかったりするかもしれません)

この状態で、ダイヤルアップ接続をしてソラコムの認証サーバーとの通信が始まっています。

本当であればここでプロトコルに則ってユーザー名・パスワード(いずれも "sora")を送信したり、IP アドレス情報や DNS サーバー情報を受信したりしてセッション開始となるのですが、screen コマンドで手作業で AT コマンドを実行している今の状態ではそれらのプロトコルを処理することがさすがにできません。

Linux では wvdial コマンドがそのあたりをやってくれて、ppp0 インターフェースを作成してくれたりしてデータ通信ができるようになります。

自作のプログラム等であれば、これまで見てきたような AT コマンドを使って接続したあとにここで認証処理を実施すればデータ通信が行えるようになるはずです。

なお、この状態では screen の画面上で何かキーを打ったりしても反応が無くなります。抜け出すには screen ごと終了する必要があります。

機種依存コマンド

機種によっては、標準で定められていない独自拡張コマンドを使うことで、AT コマンドだけでデータ通信を行うことができるようになるものもあります。

たとえば SORACOM の販売している Quectel 社製の 3G 通信モジュール UC20-G や EC21-J には AT+Q で始まる独自コマンドを使うことによって AT コマンドのみでデータ通信ができるようになっています。 (以前の記事でちらっと解説しています)

そのような機種依存のコマンドについては、メーカーが AT コマンドのリファレンスを提供していると思いますのでそれを参照するのが良いでしょう。

AT+C系の興味深いコマンド

ここからはデータ通信ではないのですが、AT コマンドを使って面白いことができるということをご紹介していきたいと思います。

以下の情報は、機種によってはサポートしていなかったりしますが、使えると有益な情報が得られたりして非常に便利です。

AT+CGREG

これは PS (Packet Switched) ドメイン、すなわちデータ通信用ネットワークへの登録状況を取得するコマンドです。

SIM がモデムに入っている状態で AT+CGREG を実行すると、デフォルトのままだとおそらく以下のような結果が得られるのではないかと思います。

AT+CGREG?
+CGREG: 0,1

OK

という感じの結果が返ってきます。 これの何が面白いのかと思われるかもしれませんが、以下のようにモードを変更してから再度実行すると今度は何やら面白そうな値が取得できます。

AT+CGREG=2
OK
AT+CGREG?
+CGREG: 2,1,"00B0","04AF4173"

OK

このレスポンスを解説しましょう。

まず、AT+CGREG=2 では、この後の AT+CREG? コマンドのモードを変更しています。モードを 2 にすると、AT+CREG? コマンドは GPRS ネットワークへの登録状況の他に、位置情報(基地局の ID やエリアの ID)を返すようになります。

上記で得られたのは "00B0" がエリアコード lac: location area code"04AF4173"基地局 ID(cid: cell id) です。

この情報を、地図上の座標に変換してくれるサービスがあります。 GoogleFirefox なども API を提供しているようですが、ここでは OpenCellID.org というサイトを使ってみましょう。

www.opencellid.org

サインアップは簡単です。名前、メールアドレスを入力し、用途を選択して Submit したら、Token というパスワードのようなものが送られてきますのでそれを使ってサイトにログインします。

ログインしたら、以下のように MCC = 440, MNC = 10, LAC, CID を入力します。 MCC = 440 は日本を表す Mobile Country Code です。 MNC = 10 は日本の中で NTT ドコモを表す Mobile Network Code です。 SORACOM の SIM は NTT ドコモの電波を掴むのでこれらの値を設定します。 LAC と CID は先ほどの AT+CGREG? コマンドで得られた16進数の値を10進数に変換したものです。 (10進数への変換は、MacLinux の場合は printf %d "0x04AF4173" というように printf コマンドを使うと簡単でしょう)

f:id:bearmini:20171203092019p:plain

このときはソラコムの二子玉川オフィスで基地局情報を取得しましたが、オフィスの近くの場所が示されていることがわかると思います。

GPS を搭載していないデバイスでも、基地局の位置情報を使うことで、「だいたいどのあたりにいるか」という感じの大まかな位置情報が利用可能となります。

なお、デバイスや携帯電話会社によってはこの情報を取得できない場合もあるようです。

それから、SORACOM のグローバル SIM を使ってローミングしている場合にも、接続先の国やオペレーター(電話会社)によって取得できたりできなかったりすることもあるようですので、あくまでも「利用できたらラッキー」という位の気持ちで使っていただくと良いでしょう。

AT+CGREG によく似たコマンドで AT+CREGC の後ろに G が入っていない)というのもありますが、こちらは CS (Circuit Switched) ドメイン、いわゆる音声通話や SMS 送受信用のネットワークへの登録状況を取得します。 SIM の種類がデータ通信専用のものだと PS ドメインにしか接続しないので、SORACOM の SIM の場合はとりあえず C の後ろに G が入っている方の、 AT+CGREG を実行しておくと良いでしょう。SMS つきの SIM を使っている場合、 AT+CREG コマンドでも登録状況が取得できるはずです。 逆に他社の SIM でデータ通信をサポートしていない(音声通話のみの)SIM を入れると AT+CREG のみ結果が得られるはずです。

ちなみに、拡張コマンドの多くは AT+XXXX? で現在の値の取得、AT+XXXX=Y で値の設定、AT+XXXX=? で設定可能な値のリストの取得、というような書式になっているものが多いようです。

AT+CSQ コマンド

こちらは、電波の強度(Signal Quality)を取得するコマンドです。 実行してみると、以下のような結果が得られるはずです。

AT+CSQ
+CSQ: 17,99

OK

1799 の2つの数が見えます。

1つめの数は RSSI (Received Signal Strength Indicator) です。 RSSI の値の範囲は 0 〜 31 です。 RSSI の値が 0 の場合は -113 dBm かそれ以下、RSSI の値が 31 の場合は -51 dBm かそれ以上、RSSI の値が 1 から 30 の間の場合は、その値を n とすると、-113 + (n * 2) [dBm] となります。今回の場合 17 なので、-79 dBm という事になります。

2つめの数は BER (Bit Error Rate) です。 BER の値が 0〜7 のときは 3GPP TS 45.008 の 8.2.4 にある表にしたがって導出されるエラーレートであることがわかります。 BER の値が 99 の場合は、ビットエラーが起きたかどうか不明な場合か検出できなかった場合です。

おわりに

入門編準備編、そしてこの実践編と3記事に渡って AT コマンドをいろいろ見てきましたが、いかがでしたでしょうか。 少しでも AT コマンドへの理解が深まったとしたら幸いです。 ここまでの 3 つの記事の内容を理解していれば、大抵の AT コマンドは、ITU-T3GPP、そしてデバイス製造元の発行しているドキュメントを参照しつつ、理解したり使いこなしたりできるようになっているはずです。

今絶賛流行中の Wio LTE も、Quectel 社の EC21-J というモジュールを搭載していてそのモジュールに対して AT コマンドを実行したりできますので、ぜひ試してみてください。

本当は SMS の送受信とかも AT コマンドでできるのでそこまでご紹介したかったのですが、(そろそろ力尽きて来たので)それはまたの機会にとっておきたいと思います。

ちなみに SMS 関連の AT コマンドは 3GPP TS 27.005 に定義されていますので、興味のある読者はぜひ参照してみてください。