--- tags: 'Acer' --- 電動捲軸通訊協定 ======== [TOC] ### 資料流架構圖 ![](https://i.imgur.com/UIPz9rG.gif) ### MQTT Flow #### 向中央伺服器註冊 中央伺服器的功能為流量配度中心,會依照使用者的座標位置以及 QR Code 的內文,分配對應的資料伺服器給裝置端或是手機端,此目的為二: 1. 資料流分流 2. 當有資料伺服器癱瘓時,可以做動態分配救援 #### 資料伺服器 考量未來使用者廣及全球,無論是基於伺服器的負載考量或是距離產生的延遲考量,分散式的架構才能方便藉由 AWS 廣布的伺服器來完成全球服務佈建。 裝置端或使用者手機端,在向中央伺服器取得該裝置的資料伺服器後,即會轉向透過資料伺服器來溝通。 #### 註冊流程 1. 裝置端或手機端對中央伺服器發送註冊指令: TOPIC: /eScreen/host/register Payload: ``` { "id": IDAM_id or mobile_id, "GPS": [23.xxx,121.xxx], // 如為 IDAM 端可以為空陣列 [] } ``` 2. 伺服器端回覆指令: TOPIC: /eScreen/uuid/registerAck 此 uuid 為 IDAM_id or mobile_id ``` { dataServer: 'xxx.xxx.xxx.xxx', dataServerPort: xxxx , } ``` 3. 此命令為裝置端每次啟動以及網路斷線後,必須重新執行的流程, 如遇到無法與中央伺服器連線的狀況,則一直重複嘗試連線. #### 資料傳輸 ##### 取得使用者資訊 Command: TOPIC: /eScreen/host/userSignIn Payload: ``` { "id": mobile_id } ``` Ack: TOPIC: /eScreen/uuid/userSignInAck Payload: ``` { "id": mobile_id, "IDAM": [ { "id" : "idamId_e6c78aca68717", "windows" : [ { "id" : "windowId_b6badf1edba48", "status" : "close" } ], } ] ``` ##### 更新使用者訊息 Command: TOPIC: /eScreen/host/updateUserInfo Payload: ``` { "id": mobile_id, "IDAM": [ { "id" : "idamId_e6c78aca68717", "windows" : [ { "id" : "windowId_b6badf1edba48", "status" : "close" } ], } ] } ``` Ack: TOPIC: /eScreen/uuid/updateUserInfoAck Payload: ``` { "status": 'OK' } ``` ##### 取得裝置狀態 Command: TOPIC: /eScreen/host/deviceSignIn Payload: ``` { "id": IDAM_id } ``` Ack: TOPIC: /eScreen/uuid/deviceSignInAck Payload: ``` { "id" : "idamId_e6c78aca68717", "windows" : [ { "id" : "windowId_b6badf1edba48", "status" : "off" } ], } ``` ##### 更新裝置狀態 Command: TOPIC: /eScreen/host/updateDeviceInfo Payload: ``` { "id" : "idamId_e6c78aca68717", "windows" : [ { "id" : "windowId_b6badf1edba48", "status" : "on" } ], } ``` Ack: TOPIC: /eScreen/uuid/updateDeviceInfoAck Payload: ``` { "status": 'OK' } ``` #### 裝置端與伺服器端的帳號以及 payload 加密 裝置端使用 MQTT 但需帳號密碼,所有內文需經加密才能傳輸 #### 手機端與伺服器端的通訊加密 手機與伺服器端全程使用 wss ( MQTT over websockets with TLS )通訊. #### 手機端與裝置端與捲軸 uuid 規則 * 手機端: Android 內建之 uuid * 裝置端: 'IDAM_' + 16 位元的亂數 hex string * 捲軸端: 'windows_'+ 16 位元的亂數 hex string