====== SMS を使う (MA-E350/F・MA-E350/N) ======
u-blox 製モジュールを搭載した MA-E350 と v2.1.6β2 以降のファームウェアで、SMS の送受信((SMS 契約ありの SIM が必要です))が可能となります。\\
[[http://smstools3.kekekasvi.com/index.php|{{:mae3xx_tips:use_sms:sms_00.png|SMS Server Tools 3}}]]
[[http://smstools3.kekekasvi.com/index.php|SMS Server Tools 3]] を使用しています。
\\
===== 設定 =====
daemon の起動はデフォルトでは無効としてあります。有効にするため、/etc/default/smstools を編集します。
user1@plum:~$ sudo nano -w /etc/default/smstools
# smsd default file
ENABLE=no
# enable wakeup by SMS
WAKEUP=no
# Defines under which user smsd is running. This may need to be changed
# if using devices other then /dev/ttyS0
USER="smsd"
GROUP="dialout"
# Specifies pathes.
PIDFILE="/var/run/smstools/smsd.pid"
INFOFILE="/var/run/smstools/smsd.working"
"ENABLE=no" を "ENABLE=yes" に変更します。\\
SMS 着信による Suspend 状態からの Wakeup を有効にする((MA-E350/N で利用可、MA-E350/F では機能しません。))場合、"WAKEUP=no" を "WAKEUP=yes" に変更します。
\\
===== daemon の起動 =====
設定ファイルを更新したら、daemon を起動します((設定ファイル更新後の次回以降は自動で起動します))。
user1@plum:~$ sudo service smstools start
Starting SMS Daemon: smsd.
user1@plum:~$
\\
起動しているか確認をしておきます。
user1@plum:~$ ps ax|grep sms
1574 ? Ss 0:00 /usr/sbin/smsd -p/var/run/smstools/smsd.pid -i/var/run/smstools/smsd.working -usmsd -gdialout
1575 ? S 0:00 /usr/sbin/smsd -p/var/run/smstools/smsd.pid -i/var/run/smstools/smsd.working -usmsd -gdialout
1581 pts/1 S+ 0:00 grep --color=auto sms
user1@plum:~$
\\
===== SMS の送受信 =====
==== SMS の送信 ====
SMS の送信は、
* 送信先電話番号((マニュアルでは、"international format without the leading +" となっていますが、"8180xxxxxxxx" とすると送信できません。))
* メッセージ
を設定したメッセージファイルを、SMS Server Tools 3 の送信ディレクトリ (/var/spool/sms/outgoing/) にコピーすることで実行されます。\\
もっとも簡単なメッセージファイルは、下記の書式となります。
To: 080xxxxxxxx
Hello! from MA-E3xx.
※ より細かいオプションは、[[http://smstools3.kekekasvi.com/index.php?p=fileformat|SMS Server Tools 3 - SMS file format]] を参照してください。
メッセージファイルを作成したら、実際に送信してみます。
user1@plum:~$ sudo cp msg.txt /var/spool/sms/outgoing/
user1@plum:~$
\\
ログファイル (/var/log/smstools/smsd.log) には次のように記録され、送信が成功しました。
2014-07-30 13:56:19,5, smsd: Moved file /var/spool/sms/outgoing/msg.txt to /var/spool/sms/checked
2014-07-30 13:56:23,5, GSM1: sent, Message: Hello! from MA-E3xx.=>Hello! from MA-E3xx., l=20.
2014-07-30 13:56:26,5, GSM1: SMS sent, Message_id: 43, To: 080xxxxxxxx, sending time 5 sec.
\\
送信されたファイルは、送信時の情報が付加され、送信済みディレクトリ (/var/spool/sms/sent/) へ移動されます。
user1@plum:~$ sudo cat /var/spool/sms/sent/msg.txt
To: 080xxxxxxxx
Modem: GSM1
Sent: 14-07-30 13:56:26
IMSI: 44xxxxxxxxxxxxx
Hello! from MA-E3xx.
user1@plum:~$
\\
==== SMS の受信 ====
SMS の受信には、2つの動作があります。
* 受信したメッセージが、受信ディレクトリ (/var/spool/sms/incoming/) へ保存される
* メッセージ受信後、指定したハンドラ (スクリプト/実行ファイル) を実行する
SMS の受信をきっかけとして、何らかの動作をさせたい場合、ハンドラを設定するのが良いと思います。\\
まずは、単純にファイルとして保存される動作を確認してみます。
\\
=== 受信内容の保存 ===
SMS を受信すると、ログファイルには下のような記録がされます。
2014-07-30 14:17:08,5, GSM1: SMS received, From: 080xxxxxxxx
\\
受信ディレクトリには、ファイルが作成されています。
user1@plum:~$ ls -l /var/spool/sms/incoming/
total 4
-rw-r--r-- 1 smsd smsd 232 Jul 30 14:17 GSM1.cEnCZH
user1@plum:~$
user1@plum:~$ cat /var/spool/sms/incoming/GSM1.cEnCZH
From: 080xxxxxxxx
From_TOA: 80 unknown, unknown
From_SMSC: 8190xxxxxxxx
Sent: 14-07-30 14:17:03
Received: 14-07-30 14:17:08
Subject: GSM1
Modem: GSM1
IMSI: 44xxxxxxxxxxxxx
Report: no
Alphabet: ISO
Length: 23
Test Reply from iPhone.user1@plum:~$
※ 最後に改行コードがないので、プロンプト (user1@plum:~$) が続いてしまっています。メッセージは "Test Reply from iPhone." までです。
\\
=== メッセージ受信ハンドラの設定 ===
設定ファイル (/etc/smsd.conf) の "eventhandler" に設定します。
〜〜〜 略 〜〜〜
[GSM1]
device = /dev/ttyLISA1
incoming = yes
#pin =
baudrate = 19200
#incoming_utf8 = yes
decode_unicode_text = yes
#eventhandler= <--- ここ
verify_pdu = no
sms_mode = 1
\\
詳細な説明は、[[http://smstools3.kekekasvi.com/index.php?p=eventhandler|SMS Server Tools 3 - Event handler, Alarm handler]] にあります。\\
指定したスクリプト/プログラムを、イベントにより 2 〜 3 個の引数付きで起動します。
* イベント (SENT, RECEIVED, FAILED, REPORT or CALL)
* SMS ファイル名
* 送信済みメッセージの message id (イベントが "SENT" の場合のみ)
\\
=== メッセージハンドラの例 ===
使い方としては、つぎのような用例が考えられると思います。
* SMS を受信したら PPP の発信を行う (IP 着信ができないMVNO SIM での、閉域網エミュレーション)。
* ネットワークのトラフィックを監視し、ターゲットとなるアドレスへの SYN を検知したら、SMS を送信、相手側のデバイスとトンネルを張る。
\\
===== 日本語メッセージの処理 =====
v2.6.9rc2 から、[[https://github.com/faucamp/python-gsmmodem|python-gsmmodem]] パッケージを追加しました。\\
それを用いて、PDUから日本語メッセージをデコードすることができます。
まず、/etc/smsd.conf の下記項目を設定し、smstoolsを再起動しておきます。
store_received_pdu = 3
SMSを受信したときに作成されるファイルを、下記スクリプトで処理します。
受信したファイル
From: 080xxxxxxxx
From_TOA: 80 unknown, unknown
From_SMSC: 8190xxxxxxxxx
Sent: 16-05-25 11:39:42
Received: 16-05-25 11:40:14
Subject: GSM1
Modem: GSM1
IMSI: 4401xxxxxxxxxxx
Report: no
Alphabet: ISO
Length: 15
PDU: .....
�,�k{�Thogehoge
\\
スクリプト
#! /usr/bin/env python3
import sys
import gsmmodem
def main(filename):
f = open(filename, encoding='latin1')
for line in f.readlines():
if line.startswith("PDU:"):
pdu = line.strip().split(" ")[1]
info = gsmmodem.pdu.decodeSmsPdu(pdu)
print(info['text'])
break
if __name__ == "__main__":
filename = sys.argv[1]
main(filename)
\\
実行例
root@plum:~# python3 decodeSMS.py GSM1.3Eqc6l
日本語にほんごhogehoge
\\