Help us understand the problem. What is going on with this article?

SORACOM LTE-M Button を使って、「モテモテスイッチ」を開発する。

本稿は、SORACOM Advent Calendar 2019 の12月11日(水)の記事となります。
この記事を真似することで、皆さんもモテモテになります。

概要・作るもの

2019年11月23日(土) SORACOM UG Explorer 2019 のランチタイムLTにて、「モテモテスイッチ」の紹介をさせていただきました。

スライドはこちら
スクリーンショット 2019-12-09 0.06.42.png

SORACOM「#あのボタン(SORACOM LTE-M Button powered by AWS)」を押すと、
膨大な量の通知が来て、モテキを体感できるという、今世紀最大の発明です。
LTE対応のIoTボタンを使用しているため、日本全国、いつでも、どこでも、必要な時に、必要な分だけモテるという、従量課金型のモテシステムとなります。
img_001.jpg

本記事は、この「モテモテスイッチ」の作り方を紹介する記事となります。

LT(ライトニングトーク)では、

  • マッチングアプリ(自作Androidアプリ)
  • 電話(Amazon Connect)
  • LINE(LINE Notify)
  • Slack(Webhook)

の4サービスから、山のように通知が来るデモをお披露目しましたが、
本記事では、ボタンを押してから自作マッチングアプリに通知が来るところまでを記載の範囲といたします。
※この自作マッチングアプリは、マッチング機能は実装されておらず、あくまで通知を受信する機能のみを持たせたものです。
img_002.jpg

【使用する技術】

  • 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から、モジュールをダウンロードします。

https://github.com/cloud8high/moteswitch

リンク先ページ内、Clone or downloadからDownload ZIPを選択し、ローカルに保存してください。
img_201.png

ダウンロードが完了しましたら、一旦このファイルを展開してください。

そして、lambda_function.py ファイルや、bin ディレクトリがある階層で、
全てのファイルを選択して、zipファイルを作成してください。
スクリーンショット 2019-12-08 20.01.54.png

その際、ファイル名は、「MoteButton.zip」にしてください。

  • Macの場合は、全てのファイルを選択して、右クリック→「12項目を圧縮」を選択
  • Windows の場合は、全てのファイルを選択して、右クリック→「送る」→「圧縮(zip 形式) フォルダ」を選択

補足

  • このモジュールは、作業の簡略化と、記事構成の分かりやすさのために、私が事前に作成用意したものです。
  • モジュールの作り方は、本記事下部の 7. 【補足】PythonのコードとZipファイルの作り方 部分を参照ください。
  • ZIPファイルを一旦展開し、再度ZIPファイルを作成するのは、この作業をしないと、後ほどLambdaにアップロードした際に、ファイルの階層がずれてしまう現象に遭遇するためです。(対処法をご存知の方がいたら教えてください。)

2.2 Lambda関数の新規作成

SORACOM LTE-M Button が押された際に、自作マッチングアプリに通知を送るプログラム(Lambda関数)を作成します。

AWSのマネジメントコンソールにログイン後、
「サービスを検索する」の枠に「Lambda」と入力し、Lambdaコンソール画面を開きます。
スクリーンショット 2019-12-08 19.24.10.png

スクリーンショット 2019-12-08 19.29.01.png

関数を作成ボタンを押し、「1から作成」を選択した上で、
以下の通りに設定し、関数の作成ボタンを押します。

項目 設定名
関数名 MoteButton
ランタイム Python3.7
アクセス権限 - 実行ロールの選択または作成 基本的なLambdaアクセス権限で新しいロールを作成

スクリーンショット 2019-12-08 19.31.17.png

2.3 Lambda関数にモジュールのアップロード

関数の編集画面が開きます。
スクリーンショット 2019-12-08 19.34.54.png

画面中央、関数コード項目の、コードエントリタイプにて、「.zip ファイルをアップロード」を選択後、
関数パッケージの下にある、「アップロード」をクリックし、先ほど作成したZIPファイル(MoteButton.zip)を選択します。
スクリーンショット 2019-12-08 20.52.13.png

画面右上の「保存」を選択してください

2.4 Lambda関数の修正

ページがリロードされ、lambda_function.py が選択、編集状態になると思います。

コード内、
"to" : "<トークン>" と、
'Authorization': "key=<APIキー> に、
1. FirebaseとAndroidアプリの作成で確認した、トークンAPIキーを、記載します。
スクリーンショット 2019-12-08 20.55.19.png

また、画面下、基本設定 の項目内、「タイムアウト」を
デフォルトの3秒から、1分くらいに変更します。
スクリーンショット 2019-12-08 20.56.35.png
画面右上の「保存」を選択し、保存してください

2.5 Lambda関数の動作確認

最初に、関数実行時のパラメータとなる、テストイベントを作成します。

画面右上テストイベントの選択から、「テストイベントの設定」を選択します。
スクリーンショット 2019-12-08 20.57.59.png

開いた画面で以下の通り設定します。
- 「新しいテストイベントの作成」を選択
- イベント名 は 「LambdaTest」など(任意)
- コード編集画面 は、まずは以下の通り。(テストに無関係な項目は除いています)

{
  "deviceEvent": {
    "buttonClicked": {
      "clickType": "SINGLE",
      "reportedTime": "2019-12-07T15:15:43.562Z"
    }
  }
}

スクリーンショット 2019-12-08 20.59.30.png
最後に画面右下の「作成」ボタンを選択してください。

編集画面に戻り、画面右上「テスト」を選択すると、Lambda関数のテスト実行が始まります。
スクリーンショット 2019-12-08 21.01.12.png

実行結果:成功 となればOKです。
スクリーンショット 2019-12-08 21.09.22.png

スマホを見ると、モテ通知が大量に来ていると思います。
Screenshot_20191208-210912.png

2.6 Lambda関数の修正

Pythonコードを好きなように編集して、
通知のメッセージ、数、間隔等を変更することができます。
主に、24 - 26 行目を編集して、以下を調整することができます。

lambda_function.py
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コンソール画面を開きます。
スクリーンショット 2019-12-08 21.09.46.png

開いたコンソール画面にて「デバイスの登録」を選択します。
スクリーンショット 2019-12-08 21.10.41.png

LTE-M Button の電池カバーをあけ、DSNを、コンソール画面の、登録コードまたは登録するデバイスのIDに入力し、「登録」ボタンを押します。
DSC_0704.JPG
スクリーンショット 2019-12-08 21.13.57.png

ボタンからの押下を待機する画面になるため、ボタンを1回押して、LEDが緑になることを確認してください。
(赤になった場合は、データ通信が失敗しているので、再度ボタンを押してください。)
スクリーンショット 2019-12-08 21.15.11.png

通信に成功すると、画面上の表記が、「登録済み」に変化するので、画面右下「完了」を押して、終了します。
スクリーンショット 2019-12-08 21.15.34.png

デバイス一覧に、登録したデバイスが追加されていれば、登録完了です。
スクリーンショット 2019-12-08 21.16.13.png

  • デバイスID
    • DSN名です。一意な番号です。
  • プロジェクト・配置
    • ボタンに紐づく機能(Lambda関数)の状況で、初期状態は双方とも未割当です。

登録したボタンの右にある、...を選択し、「デバイスの有効化」を選択します。

スクリーンショット 2019-12-08 21.16.49.png

「無効」だったところが、「有効」に変わります。
スクリーンショット 2019-12-08 21.17.53.png

4. AWS IoT 1-Click のプロジェクト設定

登録したボタンと、Lambda関数を紐づけていきましょう。

4.1 AWS IoT 1-Click プロジェクト設定

AWS IoT 1-Click コンソールから 管理 > プロジェクト を開いた後 プロジェクトの作成 をクリックします。
スクリーンショット 2019-12-08 21.18.33.png

「プロジェクト情報の指定」画面が開きます。任意ですが、以下のように設定します。

項目名 設定
プロジェクト名(必須) MoteButton
説明(省略可) 押すとモテるボタン

スクリーンショット 2019-12-08 21.20.20.png

4.2 プレイスメントのテンプレート

「プロジェクトのプレイスメントのテンプレートの定義」画面が開きます。
デバイステンプレートの定義を選択します。
スクリーンショット 2019-12-08 21.21.46.png

すべてのボタンタイプを選択します。
スクリーンショット 2019-12-08 21.22.11.png

2. Lambda関数の作成 で作成した、Lambda関数と紐づけます。

項目 設定名
デバイステンプレート名 任意(Button)
アクション 「Lambda 関数の選択」を選択
AWS リージョン アジアパシフィック(東京)
Lambda 関数 2. Lambda関数の作成 で作成したLambda関数(MoteButton)

スクリーンショット 2019-12-08 21.23.15.png

入力後、画面下の「プロジェクトの作成」を選択します。
スクリーンショット 2019-12-08 21.24.47.png

4.3 プレイスメント設定

「プロジェクトとテンプレートが正常に作成されました」画面が開きます。
プレイスメントの作成を選択します。
スクリーンショット 2019-12-08 21.25.41.png

ここで、登録済みボタンのDSNコードを紐づけを行います。

項目 設定
デバイスのプレイスメント名 (今回は)Button
デバイスの選択 登録したボタンを選択
プレイスメントの属性 (特に編集なし)

最後に、「プレイスメントの作成」を選択します。
スクリーンショット 2019-12-08 21.28.53.png

以上で、AWS IoT 1-Click のプロジェクト設定は完了です。
スクリーンショット 2019-12-08 21.30.54.png

5. 完成

これにて、モテシステムが一通り完成です。

SORACOM ボタンを押してみましょう。LTE通信が完了すると、スマホに大量のモテ通知が来ます。
Screenshot_20191208-213636.png

今年のクリスマスはモテモテですね! おめでとうございます!!

6. 【補足】 お片付け

SORACOM LTE-M Button を他のプロジェクトに用いたい時は、AWS IoT 1-Clickとの紐付けを解除する必要があります。

6.1 プレイスメントの削除

AWS IoT 1-Click コンソールから 管理 > プロジェクト を開いた後、今回作成したプロジェクトを選択します。
スクリーンショット 2019-12-08 21.43.19.png

画面左、プレイスメントを選択後、解除したいデバイスの右にある...を選択、「プレイスメントの削除」を選択します。
スクリーンショット 2019-12-08 21.46.28.png

確認画面が表示されるので、「削除」を選択します。

6.2 デバイスの削除

AWS IoT 1-Click コンソールから 管理 > デバイス を開いた後、登録したボタンの右にある、...を選択し、「デバイスの登録解除」を選択します。
スクリーンショット 2019-12-08 21.56.49.png

確認画面が表示されますので、「登録解除」を選択します。
スクリーンショット 2019-12-08 21.57.44.png

一覧からデバイスが消えていれば、解除完了です。
お疲れさまでした。

7. 【補足】PythonのコードとZipファイルの作り方

2.1 関数モジュールのダウンロード でダウンロードいただいたモジュールの作り方を記載します。

7.1 大前提

AWS Lambda にて、サードパーティのライブラリを用いたPython関数を実行したい場合は、

  1. ローカルにてライブラリをインストールした作業用ディレクトリを作り
  2. 作業用ディレクトリをZipで圧縮し、
  3. そのZipファイルをLambdaにアップロードする

という手順を踏みます。

これについては、下記記事などが詳しいため、
本稿では、モテシステムを作る上で重要な部分のみを中心に記載するにとどめます。
【AWS】Lambdaでpipしたいと思ったときにすべきこと - Qiita

7.2 始める前に

以下2つを前提に話を進めます。

7.3 Pythonコードの作り方

Postmanからコードの簡易生成

PostmanからPythonのコードを簡単に生成できます。
Postmanの画面右上「Code」を選択。
スクリーンショット 2019-11-25 18.34.38.png

「言語選択」のところで、「Python」→「Requests」を選択すると、コードが生成されます。
スクリーンショット 2019-11-25 18.37.11.png

画面右上「Copy to Clipboard」を選択しコピー。 修正するためにテキストエディタに貼り付けます。
スクリーンショット 2019-11-25 18.41.54.png

コードの修正

文字コードの都合上、このままではエラーが発生するため、
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から生成したコードのうち、不要な要素を減らし、インデントを修正したものとなります。

lambda_function.py
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 を以下のように修正します。

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 の記事から着想を得ています。

アイデアの種を、そして様々な機会をくださった皆様に、この場をお借りして、改めてお礼申し上げます。
ありがとうございました。

hayate_h
SIer勤務の3年目・24歳
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away