大家好,我是負責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和裝置進行連動。
- 支援LINE Things裝置的製作者經由API,分別針對各個產品進行登錄通訊步驟(Scenario)。
- LINE應用程式只要曾和支援LINE Things裝置連動過後,就會遵照事先登錄的Scenario進行通訊。
- 若Scenario完成執行動作,LINE應用程式就會透過Webhook將執行結果傳送給經由Messagine API完成裝置所綁定的Channel上。
- 依據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」給予指教,謝謝!