Raspberry PiとSoracom AirでSMSの送受信

投稿者:

Raspberry PiとSoracom Airを利用してSMSを送る方法について紹介しています。

あとがきに書いた通り、SMSは普通に(インターネットを使わずに)送っています。

まず、これを作ってみた理由ですが、実をいうと今年のお盆に実家に居た時に、東京にある事務所のインターネット接続ができなくなるという問題が起きまして、その事務所にRaspberry Piを置いておき、定期的なインターネット通信の確認や、問題発生時にルーターの再起動をやらせよう、という考えが浮かびました。その通知や命令は手元の携帯でできるようにしたかったので、SMSを使ってみることにしたというわけです。

このRaspberry Piは、ネットが繋がらなくなるとSMSで「止まってるかもよ」と教えてくれて、「再起動して」とお願いするとしてくれます。あと「生きてる?」と聞くと「はい。生きてます。」と答えてくれるようにしました。この記事ではそのベースとなるSMS送受信の部分だけを紹介しています。

必要なもの/費用

※ 上記SORACOMスターターキットにはSIMカードが入っているのですが、そちらはデータ通信専用なので、この記事では利用していません。

Soracom Air SIMは、利用開始時の手数料は954円、維持に1日15円(SMS機能付きの場合)、SMS送信1回につき3円です。初期費用が安いのでこうした実験に向いていると思います。

あとSORACOMスターターキットには1,000円のクーポンが付いてきます。ただしデータ通信料に対するクーポンなので、この記事の内容では対象になりませんが、他にもSoracomのサービスをいろいろ試して見るには良いのではないでしょうか。

価格は2016年8月時点のものです。

SIMカードのアクティベーション

SIMカードのアクティベーションは、Soracomのサイトの「今すぐ始めよう」から見ていけば難しさは無いと思います。簡単に言うと、Soracomのアカウントを作り、購入したSIMカードをウェブブラウザ上で登録すると使えるようになります。

Raspberry Piの設定

次にAK-020の説明書の「セットアップ(Linux)」のところに記載されているように、CD-ROMとして認識されているAK-020をejectコマンドで取り出して、modprobeコマンドでドライバのロードをします。

まずejectのインストール

sudo apt-get install eject

ejectとmodprobeはRaspberry Piでは下記のコマンドでできると思います。

eject /dev/sr0
sudo modprobe usbserial vendor=0x15eb product=0x7d0e

このコマンドは起動時に自動的に実行したいので、/etc/rc.localのexit 0の前に以下のプログラムを追加します。

i=0
while [ $i -lt 15 ]; do
  if [ -e /dev/sr0 ]; then
    break
  else
    sleep 1
  fi
  i=$((i+1))
done

eject /dev/sr0
sudo modprobe usbserial vendor=0x15eb product=0x7d0e

ちなみにこのシェルスクリプトではejectコマンドを実行する前に/dev/sr0が認識されるのを最大15秒間待つようにしてあります。

この待ちは必要な端末と不要な端末がありました。Raspberry Pi 3 Model B と Raspbian Jessie Lite:不要、Raspberry Pi 2 Model B と Noobs:必要、Raspberry Pi 1 Model A+ と Raspbian Jessie:不要

ともかく、ここまでやったらAK-020を刺したまま、Raspberry Piを再起動します。
再起動されるとejectとmodprobeが済んだ状態になっているはずです。

SMSの送信/受信

そこから先は、ATコマンドを/dev/ttyUSB0に送ることでSMSを送信/受信ができます。

pythonのSMSの送受信のサンプルコード
https://gist.github.com/suzukiken/60b1a340788647852b5b125b4f5d191d

これの実行にはpythonのpyserialモジュールが必要となるのですが、もし使っているOSがRaspbian Jessie Liteの場合、デフォルトではそのモジュールは入っていないのでインストールする必要があります。以下のようにやればインストールできます。

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo pip install pyserial

さてサンプルコードを実行してみよう。
enter image description here

携帯に「Hello world!」というメッセージがSMSで届きます。
enter image description here

メッセージ(ここでは「Hi!」と「Hello」)を送り返してから、サンプルを実行するとその2つのメッセージが受け取れていることが確認できます。

あとがき

SMSの送り方としては、TwilioのようなウェブAPIを使う方法があり、そちらの方がSIMカードの価格や維持費が少し安価になるものと思いますが、ネットワークの死活監視はイーサネットで行い、TwilioのAPIはSoracom Airを使う、といったようにネットワークを切り替えて通信させる設定が煩わしいのではないかと思ったのでそうしていません。

ですのでこの記事の設定だけではSoracom Airでインターネット通信はできないことにご注意ください。この記事ではSMSはATコマンドで送受信しています。

本当は手間を惜しまず、Soracom Airでデータ通信できるようにしておいて、Soracom GateでRaspberry PiにSSHできるようにしておくというのがいいのかもしれません。