rela1470のブログ

rela1470がブログです。

受信したSMSをSlackに送る、イケてるはいてくましーんを作ったぞ

わたしがつくりました

はい。
題名で全てです。
受信したSMSをSlackに送る、イケてるはいてくましーんを作りました。
わはは。

その名もCorp-IT-SMSちゃんです。

ということでcorp-engr 情シスSlackのアドベントカレンダーの記事になります。

adventar.org

気づいたら12月、4記事目やで。頑張った。うむ。もうそろそろゴールしてよいですか。

さて

前置きはこのくらいにして、受信したSMSをSlackに送る、イケてるはいてくましーんをゴールデンウィークの自由研究でけっこう頑張って作ったので、GitHubで公開します〜。

https://github.com/rela1470/wio-sms-to-slackgithub.com

ここから下は真面目注意なんですけども、この自由研究は所属する会社の部署研究開発費用でご支援頂きました。ここでお礼申し上げます。

rela1470.hatenablog.jp

なんでつくった

避けられない会社の共用アカウント等、Corp-ITの部署にはSMSの受信手段が求められます。
2023年にCorp-IT部署が正社員2名体制になり、今まで自分の自宅に置いてあったSMS受信専用ケータイをどうにかしたかったからです。
他社に対する綿密なリサーチ*1の結果、このコロナ禍においては、当番制などで持ち回りで預かっている会社さんが多いようです。

当時もうだうだしてました

盗難や紛失の可能性もありますし、あまりケータイを持ち歩きたくなかったので、できれば社内のサーバールームに置きたい。
でもそうするとリモートワークできない。そしてあわよくば部署内で共有して便利に使いたい。その思いでこのプロダクトは生まれました。

言い訳(免責事項とも言います)

想定しているSMSの利用例としては、二要素認証のコード受信などです。
そのため、SMS本文のデータ送受信には一定のセキュアな環境が要求されますが、もちろんSlackに送信するという仕組み上、リスクは避けられません。
今回構築した仕組みとしては、SORACOM Funkという通信キャリアのプラットホーム上から、直接AWS LambdaのFunctionを呼び出す仕組みを利用しています。
これで実質的にLambdaのデータ受信までは閉塞網で情報制御が実現できていると思います。
もちろんAWSからSlackへの通信はインターネット上で行っており、HTTPS通信ではありますが、やはり一定のリスクは残ると考えてください。
また、Slackからの情報漏洩の可能性ももちろんあります。
自分は携帯電話の紛失や盗難と同じ程度、もしくはそれ以下のリスクだと判断していますが、もし模倣する際は、再度ご自身の責任でリスクアセスメントを実施頂きますよう、お願いいたします。

blog.soracom.com

せめてLambdaまでは閉塞網にする https://blog.soracom.com/ja-jp/2022/12/22/how-to-choose-data-transfer-service/

はい

はい。真面目パートおわります。

機種選定

さっき書いた通り、SMS受信のためだけにケータイ持ってます!って話を飲み会で聞いたんですが、"そのためだけ"にAndroidやらiPhoneやらの物理ケータイなんて"持ちたくなさすぎた"んですよね。
最悪の最悪物理ケータイを使うにしても、画面を見ないで運用したい。わたしの作業机にSMS専用機を置くスペースなんて存在しないのだ。
で、なんかAndroidだったらSMSを転送する怪しいアプリとか、まあググったら出てくるんですけど、もちろんそんなの怪しすぎて使いたくないじゃないですか。

そこできました。ないなら作れってのが親の教え*2
SMS専用のIoT機種を探して自作することにしました。

ちなみにRaspberry Pi + LTEドングルのソリューションで実現された方もいて、
全く同時期に開発なされた方がいらっしゃるのでご紹介しておきます。
自分はLinuxの面倒すらみたくなかったので選択肢に入りませんでした。
(この方のプロダクトを知らなかったとも言います)

zenn.dev

ちまちま調べていたら、ようやくでてきました。

soracom.jp

その名もWio LTE JP Version。 Arduino互換でLTEが触れる開発機です。やったぜ。

これにたどり着くの、実は結構苦労しました...
キーワードがむずくて。犯罪の匂いがする機械しか出てこんのよ...

犯罪の匂いがプンプンするぜ...

3G回線対応の機種は何個かあるんですが、あと2〜3年で停波なんでね。

soracom.jp

4G以上対応がなかなか見つからなかったです。今だともう少し選択肢があるのかな〜。

実装するぞ

さてさて〜マニュアルを見ると良いメソッドがあるじゃないすか。

seeedjp.github.io

ReceiveSMSだって。受信しそう

ReceiveSMSというもうお誂え向きなメソッドがあり、これを使うとなんか動きそうだったのでせいやって買ったんですが...

まーそうよね。マニュアル通り日本語対応が出来ていません。文字化けするだけで数字はワンチャン見れるかなーとか思ったんですが。駄目でしたね。

SMSを受信するスケッチ例(日本語不可)
github.com

まあね、サンプルプログラムそのままで動くなんてつまらないですからね。*3
ないなら作れってのが親の教え*4*5

ということでライブラリの内部実装を覗いてみると... github.com

あーなるほどね、ATコマンド使ってるだけでしたね。

ははーんATコマンドね
ATコマンド使うだけなら簡単ですね。小学生の時良く使いましたもんね*6

なんかATコマンドが良くまとまってるページが見つからないんで適当なPDF貼るんですが...

https://www.lineeye.co.jp/pdf/EB-SL01GL_j1.pdfwww.lineeye.co.jp

AT+CMGR=0*7を送って帰ってきた値に+CMGR:的な文言が入ってたら受信できてます。やったね。

+CMGR: "REC UNREAD","09012345678",,"23/05/07,01:46:37+36"
306630593068
O

こんなかんじ。

ATコマンドを愛情込めて直打ちしました

読めた

はい、ここまで来たらね、もう読めましたね。
もちろん306630593068てすとです。

よめますね

ああ、すみません。UCS-2読めませんでしたか?
あ、でもUTF-16なら読めますよね?

ash.jp

はい、読めますね。

...

冗談は抜きにしても、まあ、人が読めなくてもプログラムなら読めますよね...!

UCS-2とは

UCS-2聞いたことないよって方多いと思うんですが、まあ...
だいたいUTF-16だと思っちゃえばよいです。だいたい問題ないんで、そうしちゃいましょう。

ああ、いいんです社内でしか使わないんで。なんとなく動くのが大事です。

真面目な内容的には以下のサイトとかを読んでもろて。
良くまとまってるのでよろしくお願いいたします。
gihyo.jp qiita.com

変換するか〜

自分はPHPが好きなのでサクッとやります。
4文字ずつに分けてUCS-2(UTF-16)変換したらいい感じ。

さくっとやっちゃいましょう

たまにバグるけど、まあ元のテキスト貼っとけばなんとかなります。

サーバーはLambdaで

変換した値をそのままSlackに送っても良いんですが、HTTPS通信したり、そもそも正当性を考えるのが面倒くさいので、そこらへんはSORACOMさんやAWSさんにお任せしようと思います。

今回はPHP使ったんでいつものbrefさんを経由してのserverless frameworkでLambda functionを爆誕させます。

bref.sh

https通信するのは組み込みだと面倒くさいのでSORACOM Funkで変換してもらいます。閉塞網で送れるので更に良い感じ。

soracom.jp

今回はWioのライブラリでHTTP通信POSTができるメソッドがあったので、それを使いました。

Wio.HttpPost("http://funk.soracom.io", jsonString.c_str(), &status)

IoT機械上ではただのHTTPだけど、SORACOMの閉塞網の中でそれなりに保護されていて、セキュアないい感じでLambda Functionが呼べる、ってのがSORACOM Funkです。いつもありがとうございます。

ARNと認証情報をSORACOMのコンソールで登録して、SIMカードと紐づけたらいい感じになります

SORACOMさんは今回の用途だと基本料の495円とかで収まるので素敵。請求書で何ヶ月かまとめて支払いもできるので更に素敵。
一応今回の用途は営業さんにお電話でお話しているので、問題はないとは思っておりますが、やり過ぎには注意してくださいね。

できたー!

ごにょごにょした結果がこちら。

UCS-2をいい感じに解読したらOKです。

これで携帯をサーバールームに置いたまま、いい感じにSMS受信運用ができるようになりました。やったぜ。
あ、本運用もしするなら、ブログの上の方に書いた免責事項を再度読んでいただいて...
あくまで自分の場合なんでね... そこらへん何卒... よろしくお願いいたします...

ではでは。

*1:飲み会とも言います

*2:諸説あります

*3:かなしい

*4:諸説あります

*5:このネタもうしつこいかなあ

*6:諸説あります

*7:0ってのは先頭のメールボックスってことです