---
# System prepended metadata

title: 電動捲軸通訊協定
tags: [Acer]

---

---
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


