LINE株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。 LINEヤフー Tech Blog

Blog


LINE Things 自動通信機能がリリースされました & 使い方紹介

こんにちは、LINE Things の開発を担当している川田です。

待望の、LINE Things でアプリを立ち上げていない間も Bluetooth LE 通信できる、「自動通信機能」がリリースされました。 LINE Things 対応の IoT デバイスが、LINE Bot と密に連携して、自発的にコミュニケーションを行うような機能が実現可能になります。

LINE Things とは、LINE アプリ上で Bluetooth LE に対応した IoT デバイスと連携・操作できることができるプラットフォームです。Developer Trial として、一般の LINE Bot 開発者の方にも機能を開放しています。

LINE Developer Day 2018 での LINE Things リリース当初から、自動通信機能を後日リリースすることはお伝えしていましたが、LINE v9.6.0 からお使いいただける様になりました。 LIFF SDK JavaScript API を通じて LINE Things 対応デバイスと LINE アプリの間で通信する機能はすでにリリース済みで、こちらも利用可能です。(詳しくは、LINE の IoT プラットフォーム LINE Things の Developer Trial を試してみる) もちろん、LINE Things Developer Trial でも自動通信機能は制限なく利用することが可能です。詳しくは、LINE Things のドキュメント を参照してください。

LINE Things リリース後に、何度か機能を紹介するハンズオンや、実際に LINE Things の機能を使ったハッカソンを行いました。

この中でも、自動通信に対するご要望や期待感を多く頂いていたので、今回リリースできたことで、皆さんからどんな反応が帰ってくるか楽しみにしています。

さて、今回のこの記事では、LINE Things 自動通信機能の概要と使い方について簡単に説明したいと思います。

LINE Things 自動通信機能の概要

この動画は、LINE Things に対応した体重計 (開発デバイス用、非売品) での自動通信利用例です。 LINE Things の「自動通信」によって、具体的にどんな事ができるかはこの動画を見ていただけると理解しやすいのではないかと思います。 これまでは、LIFF を立ち上げている間しか LINE Things 対応デバイスと通信する方法はありませんでしたが、自動通信機能を利用すると LINE アプリを表示している状態でなくてもデバイスと接続して通信を行い、Messaging API を経由して通信内容を LINE Bot に送信することができます。

上記は、もっと簡単な例で Puck.js というボタン型デバイスを自動通信により LINE Things と連携させた例になります。 簡単な呼び出しボタンのようなものですが、この小ささの電池で動作するデバイスでも LINE Bot と連携できている様子がわかって頂けると思います。

簡単に自動通信の機能の概要を図に表すと、上記のようなものになります。 自動通信は、以下のようなフローで LINE Bot とデバイスを連携させることができます。

  1. LINE Things 対応デバイスの作成者は、API を通じて通信手順(シナリオ)をプロダクトごとに登録します
  2. LINE アプリは、LINE Things 対応デバイスと一度連携すると、予め登録されたシナリオに従いデバイスと通信を行います
  3. シナリオの実行が行われたら、LINE アプリは Messaging API を経由してデバイスが紐付けられているチャネルに実行結果を Webhook により送信します
  4. シナリオの実行結果を元に、チャネルの LINE Bot はユーザーに自由に返答を返すことができます

つまり、自動通信に対応させると、LINE Bot を通じてデバイスが自発的に何かをメッセージにより通知してくれるような機能が開発可能になります。 例えば、何かのセンサーが異常であるとか、ボタンが押されたとか、定期的に状態を教えてくれるものなど、様々な可能性があります。

LINE Things Starter を自動通信に対応させてみる

実際に、LINE Things Starter を使って Bluetooth LE デバイスを LINE Things と自動通信に対応させてみましょう。

お手元に、ESP32-DevKitC や Adafruit Feather nRF52 Bluefruit LE や Obniz があれば、簡単に LINE Things Starter を導入することができます。 この先は、LINE Bot と LINE Things プロダクトおよび LINE Things Starter のファームウェアが書き込まれたデバイスがある状態を元に説明します。 一度も LINE Things Starter を試したことがない方は以下の記事を参照していただき、セットアップを行った後この先に進んでください。

LINE Things Starter は、ボタンと LED それぞれ1つだけを備えたシンプルなデバイスです。 ここでは、上記の Puck.js の例のように、ボタンを押したら LINE Bot から返事が帰ってくるような物を作りたいと思います。

シナリオセットの登録

まずは、自動通信を行うために必要なシナリオセットの登録を行います。 自動通信を行うには、その通信手順や通信に関する説明を、予め LINE Things のサーバーに登録して貰う必要があります。 プロダクトごとに1つのシナリオセットを登録できて、シナリオセット内に複数のシナリオを記述できます。 詳しくは、LINE Things のドキュメント「自動通信の準備をする」を参照してください。

LIFF アプリで試したように、Starter デバイスのボタンを押すと GATT Characteristic にボタンの状態を示す値が Notify により送られてきます。 今回は、ボタンを押されたことを GATT Characteristic の Notify により受け取りたいので、以下のようなシナリオセットを記述します。 トリガに BLE_NOTIFICATION を指定して、指定した Notify を受けたときにシナリオの実行を行います。

ここで、serviceUuid と characteristicUuid を指定する必要があります。serviceUuid には、LINE Things プロダクト情報を作成する時に利用した API の返り値に含まれる値を指定します。ボタンの Characteristic UUID は 62FBD229-6EDD-4D1A-B554-5C4E1BB29169 です。 この設定では、一度デバイスと接続したら意図的に接続を切断せずに、指定された Notify を待つような設定になっています。

{
  "autoClose": false,
  "suppressionInterval": 0,
  "scenarios": [
    {
      "trigger": {
        "type": "BLE_NOTIFICATION",
        "serviceUuid": "<YOUR SERVICE UUID>",
        "characteristicUuid": "62FBD229-6EDD-4D1A-B554-5C4E1BB29169"
      },
      "actions": [
      ]
    }
  ]
}

このシナリオセットを、自動通信向けシナリオ管理 API を利用して登録します。ここでは、curl コマンドを利用します。

<YOUR PRODUCT ID> の部分には LINE Things のプロダクトIDを指定します。 こちらも、プロダクト作成の時の API の返り値に含まれている値になります。 忘れてしまった場合には、トライアルプロダクト情報を取得する の API をもとに取得してください。 チャネルのアクセストークンが必要なので、LINE Developers サイトからプロダクト作成時に利用したチャネルのものを取得してください。

$ curl -v -X PUT https://api.line.me/things/v1/products/<YOUR PRODUCT ID>/scenario-set 
-H "Authorization: Bearer {channel access token}" 
-H 'Content-Type:application/json' 
-d '
{
  "autoClose": false,
  "suppressionInterval": 0,
  "scenarios": [
    {
      "trigger": {
        "type": "BLE_NOTIFICATION",
        "serviceUuid": "<YOUR SERVICE UUID>",
        "characteristicUuid": "62FBD229-6EDD-4D1A-B554-5C4E1BB29169"
      },
      "actions": [
      ]
    }
  ]
}'

この状態で、シナリオセットが LINE Things のサーバーに登録され、LINE アプリへ配布されます。 しかし、すでに連携済みのデバイス向けにシナリオセットを更新するには、LINE Things のデバイス連携画面を開く(または、最大24時間で自動更新)必要があります。 ここで、LINE Things のデバイス連携画面を開いて更新しておきましょう。 シナリオセット更新後に、デバイスの電源が入っていれば、すぐに接続状態になります。

Webhook の受け取りと返信

ここまでで、Messaging API へシナリオの実行結果を流すことができるようになりました。 その実行結果を受け取るには、チャネルへの Webhook を受信できるようにする必要があります。 そのためには、LINE Bot の開発と同様に、HTTPS 対応のサーバーを用意して公開する手順が必要です。 そこで、今回は ngrok を使って手軽に手元の環境で Webhook を受けて LINE Bot の開発を行いましょう。

Webhook のイベントの詳細は、LINE Things ドキュメントの LINE Thingsシナリオ実行イベントを受け取る を参照してください。 トリガに BLE_NOTIFICATION を設定した場合、その Notify されたデータは bleNotificationPayload の含まれており、AAAAAA== のような BASE64 エンコードされた形式で送信されてきます。 GATT_READ などのアクションを指定した場合には、その結果が actionResults に含まれます。読み出したデータは同様に BASE64 でエンコードされます。

今回は、LINE Things の Webhook イベントを受けて Bot で返信する Python のサンプルコードを用意しましたので、これを利用しましょう。 Python 3 で実行します。

 

from flask import Flask, request, from flask import Flask, request, abort
import json
import base64

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, ThingsEvent, ScenarioResult,
)

app = Flask(__name__)

ACCESS_TOKEN = ""
CHANNEL_SECRET = ""
line_bot_api = LineBotApi(ACCESS_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)

@app.route("/")
def healthcheck():
    return 'OK'

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

@handler.add(ThingsEvent)
def handle_things_event(event):
    if event.things.type != "scenarioResult":
        return
    if event.things.result.result_code != "success":
        app.logger.warn("Error result: %s", event)
        return

    button_state = int.from_bytes(base64.b64decode(event.things.result.ble_notification_payload), 'little')
    if button_state > 0:
        line_bot_api.reply_message(event.reply_token, TextSendMessage(text="Button is pressed!"))

if __name__ == "__main__":
    app.run(debug=True)

以下の部分に、LINE Developers サイトから取得したチャネルのアクセストークンと Channel Secret を設定してください。

ACCESS_TOKEN = "<YOUR_ACCESS_TOKEN>"
CHANNEL_SECRET = "<YOUR_CHANNEL_SECRET>"

Flask と LINE Bot SDK を利用しているので、利用する前には以下のコマンドを実行してください。

$ pip3 install flask line-bot-sdk

ローカルホストで以下のように、Bot の Webhook を受けるためのサーバーを起動します。Flask のデフォルトで、5000番ポートから接続できます。

$ python3 app.py

ngrok の詳しい説明はここでは省きますが、以下の通りにローカルのサーバーを ngrok にプロキシします。

$ ngrok http 5000

ここまでできたら、ngrok の表示の "Forwarding" に URL が以下のように表示されるので、この URL を各自コピーして LINE Developers サイトの Webhook URL に設定します。 /callback のパスを指定するのと、Webhook 送信を "利用する" に設定するのを忘れないでください。

(例)
Forwarding                    http://c2761e26.ngrok.io -> http://localhost:5000
Forwarding                    https://c2761e26.ngrok.io -> http://localhost:5000

Webhook URL を設定後、接続確認を行い正しく動作していることが確認できたら、LINE Things Starter デバイスのボタンを押してみましょう。 正しく Webhook が届いていれば、「ボタンが押されたよ」というメッセージが届くはずです。 場合によっては、ボタンのチャタリングによって、複数回メッセージを受け取る場合もあるかもしれませんが、正常です。

Android の場合は、デバイスとの接続が確率されている場合に以下のような通知が表示されます。(iOS では表示されません)

まとめ

LINE Things 自動通信機能を使うと、簡単に Messaging API を経由した IoT デバイスと LINE Bot の連携を行うことができました。 これまでも、Wi-Fi や LTE を IoT デバイスに直接組み込むことで同様のユーザー体験を提供できていましたが、電池で動く持ち運び型のデバイスや Wi-Fi が届かないような屋外での使用を、省電力で安価な Bluetooth LE を利用して専用のアプリのインストールなしで実現できる点が、LINE Things の利点だと思います。

実際に自動通信を利用する際には、いくつか利用上の注意点もあります。詳細は、自動通信を利用する際の注意点についてを参照してください。

今後も、LNE Things では自動通信機能を中心に、実際に LINE Things の機能を体験するハンズオンや、ハッカソンの開催も計画しています。 今後のハンズオンやハッカソンでは、LINE Things 専用開発ボード LINE Things development board を制作したので、これを利用して Web の知識だけで IoT できるような仕組みも考えています。 まだ、詳しい日時や場所は決定していませんが、これまでの LINE Things に参加した方も含めて、自動通信を体験したい方は参加を検討して頂けると幸いです。

LINE Things では、Developer Trial の制限を超えて実際に製品へ利用したい方のご提案もお待ちしております。

  • 独自の GATT Service UUID を使ってデバイス検索・PSDI の取得をを行いたい
  • 友だち追加しなくても、連携可能デバイスに表示したい
  • デバイス連携数の上限を超えたい

商用利用の際には、上記ような制限を緩和することも可能です。 LINE Things の利用を検討したい、製品化するアイデアをお持ちの方、興味のある方は、LINE Things Partnership Form からお問い合わせください。

これからも、LINE の IoT プラットフォーム LINE Things をよろしくお願いします。