! This post is also available in the following languages. 英語, 日語

LINE Things 自動通訊功能已上線與使用介紹

大家好,我是負責LINE Things開發的川田。

眾人期盼已久的,即使在未開啟應用程式的期間,也能透過LINE Things進行Bluetooth LE通訊的「自動通訊功能」(Automatic Communication) 上線了。藉由這個功能,LINE Things所支援的IoT裝置和LINE Bot可以緊密地協作,進一步實現了自發性溝通的功能。

所謂LINE Things 指的是可以在LINE應用程式上和有支援Bluetooth LE的IoT裝置進行連動・操作的平台。作為Developer Trial,我們也向一般的LINE Bot開發者們開放了相關功能。

在LINE Developer Day 2018當時公開LINE Things上線以來,便不斷地向外傳達日後將會推出自動通訊功能,因此終於在LINE 9.6.0版本開始就能使用該項功能了。透過LIFF SDK JavaScript API,支援LINE Things的裝置和LINE應用程式之間所進行之通訊功能也已然上線,也可以使用如下 (詳請參閱:Trying out LINE’s IoT Platform through LINE Things Developer Trial )。當然,藉由LINE Things Developer Trial,也可以不受限制地使用自動通訊功能。詳情請參考LINE Things的文件

LINE Things推出後,我們已舉辦過幾次介紹相關功能的Hands-on,以及實際使用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,分別針對各個產品進行登錄通訊步驟(Scenario)。
  2. LINE應用程式只要曾和支援LINE Things裝置連動過後,就會遵照事先登錄的Scenario進行通訊。
  3. 若Scenario完成執行動作,LINE應用程式就會透過Webhook將執行結果傳送給經由Messagine API完成裝置所綁定的Channel上。
  4. 依據Scenario的執行結果,Channel的LINE Bot就可以自由地回覆用戶。

換句話說,只要讓裝置適用自動通訊的話,便能開發像透過LINE Bot自發性地藉由訊息來通知用戶等相關功能。例如,像是感應器發生異常、按鈕被觸按了等等狀態都會定期地告訴我們,存在著各種可能。

嘗試讓LINE Things Starter適用自動通訊

我們就來實際嘗試看看使用LINEThings Starter ,讓Bluetooth LE裝置和LINE Things之間適用自動通訊吧!

若手邊有ESP32-DevKitC 和 Adafruit FeathernRF52 Bluefruit LE 以及 Obniz 的話,就可以簡單地導入LINE Things Starter。接下來,我會假設各位手邊有已有LINE Bot 和LINE Things產品,以及已寫好LINE Things Starter韌體的裝置之狀態下進行說明。若您從未嘗試過LINE Things Starter的話,煩請先參考以下文章,並在設定完成後再執行接下來我要說明的步驟。

LINE Things Starter 是各備有1個按鈕以及LED的簡單裝置。在這邊,我想要實作類似像上述Puck.js的例子,按下按鈕之後會收到來自LINE Bot的回覆。

登錄Scenario Set

首先,為進行自動通訊,必須先進行Scenario Set的登錄。而為了執行自動通訊,需要事先在LINE Things的伺服器上登錄相關通訊步驟以及通訊相關說明。可以針對各個產品登錄1個Scenario Set,Scenario Set當中可以填寫一個以上的Scenario。詳情還請參閱LINE Things文件「Prepare to use automatic communication」。

如同在LIFF應用程式上所嘗試的,按下Starter裝置的按鈕的話,就會將GATT Characteristic上所顯示按鈕狀態的值透過Notify傳送過來。 而這一次,我們想透過GATT Characteristic的Notify接收「按鈕被按了」這個訊息,因此我們的Scenario設定寫法如下:在Trigger部分指定BLE_NOTIFICATION ,接收到當初所指定的Notify之後,便執行Scenario。

在此,需要指定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": [
      ]
    }
  ]
}

使用 Scenario management API for automatic communication 將此一Scenario set登錄上去。在這邊,使用curl 指令。

<YOUR PRODUCT ID> 的部分指定 LINE Things的產品ID。這一部分也是填入包含在建立產品時API的回覆值當中的值。若忘了的情形,煩請依照取得試用產品資訊的 API 來取得。由於需要Channel的Access token,所以請從LINE Developers 網站取得建立產品時所使用Channel的資料。

$ 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": [
      ]
    }
  ]
}'

在這個狀態下,Scenario set被登錄到LINE Things伺服器,並被發放到LINE應用程式上。然而,對於已完成連動的裝置而言,若要進行Scenario set的更新時,就必須打開LINE Things的裝置連動畫面(或是最多24小時進行自動更新)。在這邊,我們就先打開LINE Things 的裝置連動畫面並進行更新吧!Scenario set更新後,若裝置電源是開啟狀態的話,就會立刻變成連線狀態。

Webhook的接收與回覆

到目前為止,我們已經成功讓Scenario的執行結果發佈給Messaging API。而為了接收該執行結果,必須將環境設定成可以接收到傳訊至Channel的Webhook。為了做到這件事,就如同LINE Bot的開發一樣,需要準備有支援HTTPS的伺服器並進行公開的手續。因此,這一次我們使用ngrok ,輕鬆地在手邊環境上接收Webhook並進行LINE Bot的開發吧!

關於Webhook事件的詳細資訊,請參閱LINE Things技術文件的 Receiving LINE Things scenario execution events 。 在Trigger部分以設定好 BLE_NOTIFICATION 的情形,被Notify的資訊會在 bleNotificationPayload 裡,會類似 AAAAAA== 一般,以BASE64解碼之後的形式傳送過來。若已經指定 GATT_READ 等動作的情形,該結果就會在 actionResults 當中。讀出的資料一樣會透過BASE64完成解碼。

這一次,我們準備了接收LINE Things的Webhook事件並透過Bot回覆的Python sample code,所以就用這個來進行吧!我們在Python3來執行。

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的Access token,以及Channel Secret。

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

由於我們使用Flask和LINE Bot SDK,因此在使用之前請執行下列指令:

$ pip3 install flask line-bot-sdk

如下,為了接收Bot的Webook,在locoalhost啟動伺服器。Flask的預設規格中,可從5000號埠開始連接。

$ python3 app.py

在此省略ngrok的詳細說明,但透過以下方式,將本地的伺服器指定代理至ngrok。

$ ngrok http 5000

若完成以上步驟,ngrok所顯示“Forwarding”的URL會顯示如下,因此各自將此URL複製後,設定成 LINE Developers網站上的Webhook URL。請別忘了指定/callback的路徑,以及將Webook傳訊部分設定為“允許”。

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

設定Webhook URL之後,進行連線確認且確認到正常運作時,就按下LINE Things Starter裝置的按鈕吧! 若Webhook順利發送的話,就應該會收到寫著:「按鈕被按了喔」的訊息。依照狀況不同,也隨著按鈕的振顫(Chattering)現象,或許會有數次收到訊息的情形發生,但也實屬正常。

圖片內文字由上至下:

  • 自動通訊測試感謝您將本帳號將為好友,若不想接收提醒,可以點選本畫面上方的「V」圖示中的「關閉提醒」鍵喔。
  • 按鈕被按了喔!

若使用Android的情形,確定和裝置已連接的狀態下會顯示通知如下:(iOS上不會顯示)

(圖片內文字:自動通訊執行中)

總結

綜上述,我們得知使用LINE Things 自動通訊功能,便可以簡單地透過Messaging API的IoT裝置和LINE Bot進行連動。以往,我們雖然也透過直接將Wi-Fi以及LTE置入IoT裝置的形式,成功提供了相同的用戶體驗。但我認為像是使用電池的攜帶型裝置,以及WiFi訊號無法觸及的室外進行使用的情境下,可以透過省電又低廉的Bluetooth LE,並且不需安裝專用的APP就可以實現,恰恰正是LINE Things的優點。

實際上使用自動通訊時,亦有幾點需要注意。詳細內容煩請參考Important notes related to using automatic communication

今後,LINE Things也計劃以自動通訊功能為中心,舉辦一些實際可以體驗LINE Things功能的Hands-on以及黑客松活動。而針對今後的Hands-on和黑客松當中,我們也建立了LINE Things專用開發板 LINE Things development board 。也思考著利用這個渠道,建立僅憑Web的知識便可以進行開發IoT的架構。 雖然尚未決定實際的時間和地點,但包含以往參加過LINE Things的各位在內,歡迎想要體驗自動通訊的各位來一同參與。

若您是想超越LINE Things當中Developer Trail的限制,並想將其實際運用到產品上的同好,我們非常期待看到您的提案想法。

  • 想要使用獨自的GATT Service UUID,進行裝置搜尋・取得PSDI
  • 不加為好友,仍可以顯示出可連接之裝置。
  • 想提昇裝置連接數量的上限

使用於商業用途時,也可能放寬上述限制。對於考慮使用LINE Things、或對於產品化有想法、有興趣的各位,請透過LINE Things Partnership Form 來與我們洽詢。

今後,還懇請大家對於LINE的IoT平台「LINE Things」給予指教,謝謝!