工場長のブログ

日々思ったことを書いてます。

セルラーモデムの謎を追う その1 :導入編

みなさん、こういうデバイス使ってIoTしたことありますか?

soracom.jp

これはUSBドングルタイプのセルラーモデムで、例えばラズパイやPC、Macに接続することでそれらのコンピューターにセルラー通信上でのIP通信を実現可能にしてくれます。使ったことある方はわかると思うんですが、このデバイスはpppインターフェイスとしてOSに認識されます。が、実はSORACOMはppp方式での接続を提供していません。このことは下記のドキュメントのPDP Typeが「IP」となっていることからわかります。PDP Typeとはパケット接続の認証方式のことで、IPもしくはPPPという2つの方式があり、SORACOMはIP方式のみを採用しています。他の多くのキャリアも同様です。

参照元: SORACOM Air for セルラーの利用を始める: STEP 3: デバイスを設定する (APN 設定 / ローミング設定) | SORACOM の利用を始める | ソラコムユーザーサイト - SORACOM Users

となると、え?なんでpppインターフェイスが見えるの?となりますよね。疑問に思ったことありませんか?別に気にしなくても使えるんですが。

 

これについてはIIJの方が下記のブログ記事で解説してくださっていますが、実はppp通信しているのはOSとモデムの間だけだということがわかります。しかし、なぜこんな方式になっているのでしょうか?とか気になっちゃいますよね。

www.iij.ad.jp

 

他にも・・・ATコマンドでセルラーモデムを扱ったことあるひとはわかると思うんですが、モデムをラズパイに接続するとシリアルデバイスとして認識され、screenやcuコマンドを使ってASCIIベースの対話型インターフェイスを介してコマンドのやり取りができる状態で立ち上がってきます。ちなみにATコマンドってなに?って人はこちらのブログを読んでみてください。ざっくりいえば「モデムを制御したり情報を取得したりするためのもの」であり、IoTデバイスの入門書やキットでもよく「ATコマンドでセルラー通信をしてみましょう」というコーナーを見かけます。

bearmini.hatenablog.com

でもここで、実際のIP通信の際にはOSはどうやってモデムを扱ってるの?まさかATコマンド?みたいな疑問が湧いてきませんか?

 

これについてはLinux Documenation Projectのガイドによれば以下のような記載があります。ざっくり言えば「モデムはAT-commandモードとして起動し、ATDコマンドが発行されたタイミングからon-line dataモードと呼ばれる土管モードに入る」ということですね。

When the modem is first turned on it's in the command mode (also called terminal mode, idle state or AT-command mode). Anything sent to it from the PC is assumed to be an AT command and not data. Then if a dial command is sent to it (ATD...), it dials and connects to another modem. It's now in the on-line data mode (connected) and sends and receives data (such as Internet pages). In this mode, any AT command one trys to send it will not work but will be transmitted to the other modem instead. Except for the escape command. This is +++ with a minimum time delay both at the start and end. The time delay allows the modem to determine that it is likely a real escape and not just +++ in a file being transmitted.

 

ここまでわかってきたことを総合していくとLinuxMacのようなOSたちは、モデムをon-line dataモードにしたうえでシリアルデバイスとして取り扱い、さらにそのうえにpppインターフェイスを作成し、自身のもつ通信スタックを用いて通信を行っているであろうことが想像できます。このブログでは「LinuxMacセルラーモデムを使ってIP通信が実現されている仕組み」の詳細にDive Deepしていきたいと思います。

 

ちなみにですが、ArduinoにはTinyGSMという著名なセルラー通信ライブラリがあります。

github.com

これを利用するとさまざまな通信モジュールにおいて非常に簡潔なコードでHTTP通信MQTT通信が実現可能です。これも前述のLinuxMacのように様々なモジュールを使って柔軟な通信を実現してくれるという意味ではとても似て見えるのですが(役割としてはとても良く似ている)、実は全く違う仕組みです。このライブラリは通信モジュールが持っている、通信用のATコマンドを利用して通信をする仕組みになっています。例えばQUECTELのモジュールはAT+QISENDというTCPでのデータ送信コマンドや、さらにはAT+QHTTPGET、AT+QHTTPPOSTといった高位の通信を行うためのコマンドも備えておりこれらを活用しています。つまり、TinyGSMの場合はモデム自身が持っている通信スタックを使っており、モデムとMCUはATコマンドでやりとりしている、ということになります。

 

次回以降は実際にいろいろ触ってみながらやっていきたいなと思います。最終的には自作のTCPスタックでモデムを使って通信、みたいなところまで行けたら最高だなと思いますが、さてどこまでいけるだろうか・・・

 

お楽しみに!