前書き
ATコマンドについて、日本語で書かれた記事がほとんどありません。
最近Soracomの方がATコマンドについて書かれていましたが、非常に勉強になります。
これから始めてみる方はとても参考になるのではないでしょうか。
やりたいこと
ATコマンドを使い、携帯に日本語(UCS2)でSMSを送信します。
以下、間違いなどがあれば指摘してもらえると助かります。
環境
RaspberryPiを使います。
- RasbperryPi3
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.1 (stretch)
Release: 9.1
Codename: stretch
- 3gドングル
- AK-020 : https://soracom.jp/products/ak-020/
- Soracom Air Sim : https://soracom.jp/products/
- 携帯
- HUAWEI P9 lite
- Android 7.0
SMSを送る
まずは普通に(GSM 7 bit≒Asciiで)SMSを送ってみます(参考)。
Linuxの場合、ドングルを刺すと/dev/ttyUSB0~3
が作られます。
このうち、ATコマンドを発行してみると、ttyUSB0
とttyUSB1
がmodemとして動作していることがわかります。
どちらを使ってもよいのですが、今回はttyUSB1
を使用します。
例によってscreen
をインストールし、以下のコマンドを実行していきます。
以下、>>
は端末上で入力するコマンド、<<
はmodemからの応答を表します。
$ screen /dev/ttyUSB1 115200
>> AT+CFUN=1
<< OK
>> AT+CMGF=1
<< OK
>> AT+CMGS="電話番号"
> test(Ctrl-z)
<< +CMGS: ***
<<
<< OK
各コマンドはそれぞれ以下のような意味を持ちます。
- AT+CFUN=1
modemの機能制限に関する設定です。
1は機能制限をとっぱらいます。 - AT+CMGF=1
SMSを送信モードを設定します。
text modeで送信します。 - AT+CMGS="電話番号"
電話番号に対してSMSを送信します。
test(Ctrl-z)
はtestと入力した後にCtrl-zを入力します。
日本語(UCS2)でSMSを送る
USC2(USC2 ⊂ UTF-16)でSMSを送ります。
$ screen /dev/ttyUSB1 115200
>> AT+CFUN=1
<< OK
>> AT+CMGF=1
<< OK
>> AT+CSMP=1,167,0,8
<< OK
>> AT+CSCS="UCS2"
<< OK
>> AT+CMGS="電話番号"
> 3042(Ctrl-z)
<< +CMGS: ***
<<
<< OK
- AT+CSMP=1,167,0,8
SMSの送信や保存についての設定です。
UCS2で送信する場合、4番目の要素が重要で、8とする必要があります。
8ではなく24(Flash message)にすると地震速報とか緊急速報的なメッセージの出方をします(参考)。 - AT+CSCS="UCS2"
エンコードを設定します。
モジュールによってはUCS2に対応していない場合があります。
対応しているかどうかは、AT+CSCS=?
で確認ができます。
AK-020の場合は以下のような感じです。
AT+CSCS=?
+CSCS: ("IRA", "GSM", "HEX", "PCCP437", "8859-1", "UCS2", "UCS2_0X81")
このエンコードの設定は受信するSMSにも影響するので、一つのmodemでSMSを送受信する場合は気を付けましょう。
GSM 7 bitに設定したい場合は8859-1を設定します。
また、携帯によって表示が異なりますが、UCS2で使える絵文字も送ることができます。
参考
- http://www.smssolutions.net/
- http://www.developershome.com/
- https://ja.wikipedia.org/wiki/Unicode%E3%81%AEEmoji%E3%81%AE%E4%B8%80%E8%A6%A7
雑談
SMSを送受信するだけなら、直接ATコマンドを実行しなくても、gammuという良いツールがあります。
GPLですがPythonなどにライブラリも公開されていますし、1行のコマンドでSMSの送受信を行うこともできます。
ただ、色々試したのですがどうしてもUCS2でSMSを送信することができませんでした・・・。
コードから使いたく、自前で超簡単なものを作りましたので、よかったらどーぞ。