本稿は、SORACOM Advent Calendar 2019 の12月11日(水)の記事となります。
この記事を真似することで、皆さんもモテモテになります。
概要・作るもの
2019年11月23日(土) SORACOM UG Explorer 2019 のランチタイムLTにて、「モテモテスイッチ」の紹介をさせていただきました。
スライドはこちら
SORACOM「#あのボタン(SORACOM LTE-M Button powered by AWS)」を押すと、
膨大な量の通知が来て、モテキを体感できるという、今世紀最大の発明です。
LTE対応のIoTボタンを使用しているため、日本全国、いつでも、どこでも、必要な時に、必要な分だけモテるという、従量課金型のモテシステムとなります。
本記事は、この「モテモテスイッチ」の作り方を紹介する記事となります。
LT(ライトニングトーク)では、
- マッチングアプリ(自作Androidアプリ)
- 電話(Amazon Connect)
- LINE(LINE Notify)
- Slack(Webhook)
の4サービスから、山のように通知が来るデモをお披露目しましたが、
本記事では、ボタンを押してから自作マッチングアプリに通知が来るところまでを記載の範囲といたします。
※この自作マッチングアプリは、マッチング機能は実装されておらず、あくまで通知を受信する機能のみを持たせたものです。
【使用する技術】
- SORACOM LTE-M Button powered by AWS
- AWS IoT 1-Click
- AWS Lambda
- Firebase Cloud Messaging (FCM)
- Android Studio (Java:Androidアプリ開発)
躓いた箇所の自分用メモとして、また、他の方の参考にもなれば幸いです。
【必要なもの】
- AWSアカウント
- 各自作成しておいてください。
1. FirebaseとAndroidアプリの作成
まず最初に、以前投稿した下記記事の通りに、
自作のマッチングアプリを、Android StudioとFirebaseを用いて開発してください。
ここで作成するアプリに対して、通知を送るシステムを構築していきます、
「マッチングが成立しました!」通知を見てニタニタしたい。(FirebaseでAndroidアプリに通知を送るまで) - Qiita
リンク先、5-2. Postmanを使う方法まで進み、通知が届くことが確認できればOKです。
また、トークン と APIキー(サーバーキー)は控えておいてください。
(この第1項が一番作業量が多いです)
2. Lambda関数の作成
1. FirebaseとAndroidアプリの作成 で作成したAndroidアプリに、通知を送る AWS Lambda 関数を作成します。
2.1 関数モジュールのダウンロード
下記リンクのGitHubから、モジュールをダウンロードします。
リンク先ページ内、Clone or download
からDownload ZIP
を選択し、ローカルに保存してください。
ダウンロードが完了しましたら、一旦このファイルを展開してください。
そして、lambda_function.py ファイルや、bin ディレクトリがある階層で、
全てのファイルを選択して、zipファイルを作成してください。
その際、ファイル名は、「MoteButton.zip」にしてください。
- Macの場合は、全てのファイルを選択して、右クリック→「12項目を圧縮」を選択
- Windows の場合は、全てのファイルを選択して、右クリック→「送る」→「圧縮(zip 形式) フォルダ」を選択
補足
- このモジュールは、作業の簡略化と、記事構成の分かりやすさのために、私が事前に作成用意したものです。
- モジュールの作り方は、本記事下部の 7. 【補足】PythonのコードとZipファイルの作り方 部分を参照ください。
- ZIPファイルを一旦展開し、再度ZIPファイルを作成するのは、この作業をしないと、後ほどLambdaにアップロードした際に、ファイルの階層がずれてしまう現象に遭遇するためです。(対処法をご存知の方がいたら教えてください。)
2.2 Lambda関数の新規作成
SORACOM LTE-M Button が押された際に、自作マッチングアプリに通知を送るプログラム(Lambda関数)を作成します。
AWSのマネジメントコンソールにログイン後、
「サービスを検索する」の枠に「Lambda」と入力し、Lambdaコンソール画面を開きます。
関数を作成ボタンを押し、「1から作成」を選択した上で、
以下の通りに設定し、関数の作成ボタンを押します。
項目 | 設定名 |
---|---|
関数名 | MoteButton |
ランタイム | Python3.7 |
アクセス権限 - 実行ロールの選択または作成 | 基本的なLambdaアクセス権限で新しいロールを作成 |
2.3 Lambda関数にモジュールのアップロード
画面中央、関数コード
項目の、コードエントリタイプ
にて、「.zip ファイルをアップロード」を選択後、
関数パッケージ
の下にある、「アップロード」をクリックし、先ほど作成したZIPファイル(MoteButton.zip)を選択します。
画面右上の「保存」を選択してください
2.4 Lambda関数の修正
ページがリロードされ、lambda_function.py が選択、編集状態になると思います。
コード内、
"to" : "<トークン>"
と、
'Authorization': "key=<APIキー>
に、
1. FirebaseとAndroidアプリの作成で確認した、トークンとAPIキーを、記載します。
また、画面下、基本設定
の項目内、「タイムアウト」を
デフォルトの3秒から、1分くらいに変更します。
画面右上の「保存」を選択し、保存してください
2.5 Lambda関数の動作確認
最初に、関数実行時のパラメータとなる、テストイベントを作成します。
画面右上テストイベントの選択
から、「テストイベントの設定」を選択します。
開いた画面で以下の通り設定します。
- 「新しいテストイベントの作成」を選択
-
イベント名
は 「LambdaTest」など(任意) -
コード編集画面
は、まずは以下の通り。(テストに無関係な項目は除いています)
{
"deviceEvent": {
"buttonClicked": {
"clickType": "SINGLE",
"reportedTime": "2019-12-07T15:15:43.562Z"
}
}
}
編集画面に戻り、画面右上「テスト」を選択すると、Lambda関数のテスト実行が始まります。
2.6 Lambda関数の修正
Pythonコードを好きなように編集して、
通知のメッセージ、数、間隔等を変更することができます。
主に、24 - 26 行目を編集して、以下を調整することができます。
def lambda_handler(event, context):
for i in range(100): ## 100回繰り返す
notify_to_match() ## notify_to_match関数を
time.sleep(0.1) ## 0.1秒間隔ごとに実施
3. SORACOM LTE-M Button の AWS IoT 1-Click への登録
AWSのマネジメントコンソールにログイン後、「サービスを検索する」の枠に「iot 1-click」と入力し、AWS IoT 1-Clickコンソール画面を開きます。
LTE-M Button の電池カバーをあけ、DSNを、コンソール画面の、登録コードまたは登録するデバイスのID
に入力し、「登録」ボタンを押します。
ボタンからの押下を待機する画面になるため、ボタンを1回押して、LEDが緑になることを確認してください。
(赤になった場合は、データ通信が失敗しているので、再度ボタンを押してください。)
通信に成功すると、画面上の表記が、「登録済み」に変化するので、画面右下「完了」を押して、終了します。
デバイス一覧に、登録したデバイスが追加されていれば、登録完了です。
- デバイスID
- DSN名です。一意な番号です。
- プロジェクト・配置
- ボタンに紐づく機能(Lambda関数)の状況で、初期状態は双方とも未割当です。
登録したボタンの右にある、...
を選択し、「デバイスの有効化」を選択します。
4. AWS IoT 1-Click のプロジェクト設定
登録したボタンと、Lambda関数を紐づけていきましょう。
4.1 AWS IoT 1-Click プロジェクト設定
AWS IoT 1-Click コンソールから 管理
> プロジェクト
を開いた後 プロジェクトの作成
をクリックします。
「プロジェクト情報の指定」画面が開きます。任意ですが、以下のように設定します。
項目名 | 設定 |
---|---|
プロジェクト名(必須) | MoteButton |
説明(省略可) | 押すとモテるボタン |
4.2 プレイスメントのテンプレート
「プロジェクトのプレイスメントのテンプレートの定義」画面が開きます。
デバイステンプレートの定義
を選択します。
2. Lambda関数の作成 で作成した、Lambda関数と紐づけます。
項目 | 設定名 |
---|---|
デバイステンプレート名 | 任意(Button) |
アクション | 「Lambda 関数の選択」を選択 |
AWS リージョン | アジアパシフィック(東京) |
Lambda 関数 | 2. Lambda関数の作成 で作成したLambda関数(MoteButton) |
4.3 プレイスメント設定
「プロジェクトとテンプレートが正常に作成されました」画面が開きます。
プレイスメントの作成
を選択します。
ここで、登録済みボタンのDSNコードを紐づけを行います。
項目 | 設定 |
---|---|
デバイスのプレイスメント名 | (今回は)Button |
デバイスの選択 | 登録したボタンを選択 |
プレイスメントの属性 | (特に編集なし) |
以上で、AWS IoT 1-Click のプロジェクト設定は完了です。
5. 完成
これにて、モテシステムが一通り完成です。
SORACOM ボタンを押してみましょう。LTE通信が完了すると、スマホに大量のモテ通知が来ます。
今年のクリスマスはモテモテですね! おめでとうございます!!
6. 【補足】 お片付け
SORACOM LTE-M Button を他のプロジェクトに用いたい時は、AWS IoT 1-Clickとの紐付けを解除する必要があります。
6.1 プレイスメントの削除
AWS IoT 1-Click コンソールから 管理
> プロジェクト
を開いた後、今回作成したプロジェクトを選択します。
画面左、プレイスメント
を選択後、解除したいデバイスの右にある...
を選択、「プレイスメントの削除」を選択します。
確認画面が表示されるので、「削除」を選択します。
6.2 デバイスの削除
AWS IoT 1-Click コンソールから 管理
> デバイス
を開いた後、登録したボタンの右にある、...
を選択し、「デバイスの登録解除」を選択します。
一覧からデバイスが消えていれば、解除完了です。
お疲れさまでした。
7. 【補足】PythonのコードとZipファイルの作り方
2.1 関数モジュールのダウンロード でダウンロードいただいたモジュールの作り方を記載します。
7.1 大前提
AWS Lambda にて、サードパーティのライブラリを用いたPython関数を実行したい場合は、
- ローカルにてライブラリをインストールした作業用ディレクトリを作り
- 作業用ディレクトリをZipで圧縮し、
- そのZipファイルをLambdaにアップロードする
という手順を踏みます。
これについては、下記記事などが詳しいため、
本稿では、モテシステムを作る上で重要な部分のみを中心に記載するにとどめます。
【AWS】Lambdaでpipしたいと思ったときにすべきこと - Qiita
7.2 始める前に
以下2つを前提に話を進めます。
- 「マッチングが成立しました!」通知を見てニタニタしたい。(FirebaseでAndroidアプリに通知を送るまで) - Qiita の記事の、5-2. Postmanを使う方法まで進み、通知が届くことまで確認できている。
- 手元のパソコンにPythonがインストールされている
7.3 Pythonコードの作り方
Postmanからコードの簡易生成
PostmanからPythonのコードを簡単に生成できます。
Postmanの画面右上「Code」を選択。
「言語選択」のところで、「Python」→「Requests」を選択すると、コードが生成されます。
画面右上「Copy to Clipboard」を選択しコピー。 修正するためにテキストエディタに貼り付けます。
コードの修正
文字コードの都合上、このままではエラーが発生するため、
payload = "{...}"
の後ろに.encode("utf-8")
を追加して
payload = "{...}".encode("utf-8")
のように修正する必要があります。
7.4 Pythonコードのローカルでの実行方法
Lambdaにアップロードする前提で、上記のPythonコードを実行できる環境の作り方を記載します。
作業用ディレクトリの作成
作業用ディレクトリを適当なところに作ります
$ mkdir workdir
$ cd workdir
リクエストライブラリのインストール
pipでrequestsライブラリをインストールします
$ pip install requests -t .
※ 最後の-t .
オプションはカレントディレクトリ(workdir)にインストールすることの指定です。
関数の作成
ファイル名は lambda_function.py
などで、以下のように関数を作成します。
※ファイル名は必ずしもlambda_function.pyである必要はありませんが、後ほどLambda関数にするため、最初からlambda)_function.pyにしています。
※コード内の、<トークン>
と<APIキー>
は、ご自身の値に置き換えてください。
Postmanから生成したコードのうち、不要な要素を減らし、インデントを修正したものとなります。
import requests
url = "https://fcm.googleapis.com/fcm/send"
payload = "{\
\"notification\" : { \
\"title\": \"マッチングが成立しました\",\
\"body\": \"メッセージを送りましょう!\",\
\"sound\":\"default\",\
\"icon\":\"@android:drawable/sym_action_chat\",\
\"color\":\"#FF8000\"\
} , \
\"to\" : \"<トークン>\",\
\"priority\":\"high\"\
}".encode("utf-8")
headers = {
'Authorization': "key=<APIキー>",
'Content-Type': "application/json",
}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
関数の実行
関数を実行します。
$ python lambda_function.py
{"multicast_id":888888888888888888,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1574683767273355%c0b3904ac0b3904a"}]}
上記の手順でスマホに通知が来ます。
7.5 lambda関数の作成
2.1 関数モジュールのダウンロード にて紹介したGitHubのパッケージと同じ関数の作り方を紹介します。
Lambda関数を修正
前述の lambda_function.py
を以下のように修正します。
import requests
import time
def notify_to_match():
url = "https://fcm.googleapis.com/fcm/send"
payload = '{ \
"notification" : { \
"title": "マッチングが成立しました!", \
"body": "メッセージを送りましょう", \
"sound":"default", \
"icon":"@android:drawable/sym_action_chat",\
"color":"#FF8000" \
} , \
"to" : "<トークン>", \
"priority":"high" \
}'.encode("utf-8")
headers = {
'Authorization': "key=<APIキー>",
'Content-Type': "application/json",
}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
def lambda_handler(event, context):
for i in range(100):
notify_to_match()
time.sleep(0.1)
作業ディレクトリをZipで圧縮
作業ディレクトリをZipで圧縮します
$ zip -r lambda.zip *
これ以降は、2.2 Lambda関数の新規作成と同じです。
8. 謝辞
この「モテモテスイッチ」は、当初、社内のライトニングトーク大会で紹介をさせていただいたものです。
とても技術に明るい先輩方が登壇される中、入社2年目の低レベルな内容ではありましたが、
発表の後、様々な方から「面白かったよ」と声をかけていただきました。
そこできっかけをいただき、社外のライトニングトークでの登壇や、UG会のお手伝い、本記事の執筆など、願ってもないくらいの貴重な経験をたくさんさせていただきました。
スキルもなく、大したアウトプットを出すこともできませんでしたが、それでも温かく受け入れ、ご指導くださった皆様に、本当に感謝しております。
お世話になった方は、本当にたくさんいらっしゃいます。
その中でも、特にライトニングトークにてお世話になりました、以下3団体の関係皆様には、この場をお借りして特別な感謝をお伝えできればなと思います。
- 9月の社内LT大会 運営の皆様、観覧者の皆様
- 10月15日(水)の IoTLT@SCSK 運営の皆様、観覧者の皆様
- 11月23日(土)の SORACOM UG Explorer 2019 運営の皆様、観覧者の皆様
また、「モテモテスイッチ」のアイデアは、同じ会社の大先輩でもある、Kizawaさんの
SORACOM Buttonで会議脱出ボタンをつくる – kizawa.info の記事から着想を得ています。
アイデアの種を、そして様々な機会をくださった皆様に、この場をお借りして、改めてお礼申し上げます。
ありがとうございました。