---
# System prepended metadata

title: 如何導入 QNAP Room Service/SDK

---

# 如何導入 QNAP Room Service/SDK

## 角色及責任

1. QNAP Room Service (後續簡稱 QNAP): 提供建立 WebRTC 視訊所需要的信令 (signaling) 及 NAT 穿透 (NAT traversal) 機制
2. Your Backend Service (後續簡稱 Backend):
    1. 提供撥打電話的 API, 並在此 API 中:
        1. 使用 QNAP 提供的 API 金鑰簽發 JWT 給撥打方 (JWT 格式於後續說明)
        2. 於 API 回應中提供撥打方 JWT
        3. 使用 QNAP 提供的 API 金鑰簽發 JWT 給受話方 (JWT 格式於後續說明)
        4. 以推播方式 (Push Kit, APNs, FCM...) 告知受話方同時並提供 JWT
    2. 提供其它事件 API: 取消通話 (撥打方), 接聽通話 (受話方), 掛斷通話 (受話方)
3. Your Clients (後續簡稱 Caller/Callee):
    1. 導入 Room SDK 以支援視訊/語音通話
    2. 使用 Backend 提供的 API 撥打電話並取得 JWT (並實作 outgoing call 畫面)
    3. 導入推播機制以接收來電通知及 JWT (並實作 incoming call 畫面)
4. Push Service (後續簡稱 Push): 提供推播服務, 依各行動平台而不同, 例如:
    1. Push Kit: 適用於 iOS 發送整合 Call Kit 通話的來電事件
    2. APNs:
        1. 適用於 iOS 發送**不整合** Call Kit 的來電事件 (如受限中國地區法規)
        2. 適用於 iOS 發送取消, 接聽, 掛斷等事件
    3. FCM: 適用於 Android 發送所有通話事件
    4. 小米/腾讯/...推播: 適用於中國地區 Android 發送所有通話事件

## 範例1: 撥打後受話方接聽

```sequence
Caller -> Backend: Make Call
Backend ->> Push: Call Event
Backend --> Caller: JWT
Caller -> Caller: Show Outgoing\nCall Screen
Caller -> QNAP: Join Room with JWT
Push ->> Callee: Call Event
Callee -> Callee: Show Incoming\nCall Screen
Callee -> Backend: Answer Call
Backend ->> Push: Answer Event
Backend --> Callee: OK
Callee -> QNAP: Join Room with JWT
Push ->> Caller: Answer Event
QNAP ->> Callee: Caller Joined
Callee -> Callee: Hide Incoming\nCall Screen
QNAP ->> Caller: Callee Joined
Caller -> Caller: Hide Outgoing\nCall Screen
```

## 範例2: 撥打後撥打方取消

```sequence
Caller -> Backend: Make Call
Backend ->> Push: Call Event
Backend --> Caller: JWT
Caller -> Caller: Show Outgoing\nCall Screen
Caller -> QNAP: Join Room with JWT
Push ->> Callee: Call Event
Callee -> Callee: Show Incoming\nCall Screen
Caller -> Backend: Cancel Call
Backend ->> Push: Cancel Event
Backend --> Caller: OK
Caller -> QNAP: Leave Room
Caller -> Caller: Hide Outgoing\nCall Screen
Push ->> Callee: Cancel Event
Callee -> Callee: Hide Incoming\nCall Screen
```

## 範例3: 撥打後受話方掛斷

```sequence
Caller -> Backend: Make Call
Backend ->> Push: Call Event
Backend --> Caller: JWT
Caller -> Caller: Show Outgoing\nCall Screen
Caller -> QNAP: Join Room with JWT
Push ->> Callee: Call Event
Callee -> Callee: Show Incoming\nCall Screen
Callee -> Backend: Reject Call
Backend ->> Push: Reject Event
Backend --> Callee: OK
Callee -> Callee: Hide Incoming\nCall Screen
Push ->> Caller: Reject Event
Caller -> QNAP: Leave Room
Caller -> Caller: Hide Outgoing\nCall Screen
```

## JWT 格式說明

在正式維運的環境中, 請勿使用 Quickstart 範例程式中使用的 GET /restful/v2/rooms/token API 來產生 JWT, 因為此 API 可能有外流您 API 金鑰的風險, 請務必在 Backend 中自行以 API 金鑰簽發 JWT.

JWT 標準規格, 範例及各種語言函式庫請參考其[官方網站](https://jwt.io/).

以下為存取 QNAP Room Service 的 JWT 標準欄位 (Standard Claims):

- exp: *integer*: 有效期限 (UTC秒)
- sub: *string*: QNAP 提供的 API 金鑰所屬專案 ID, 例如: PJb602298298664dd2b93c058de5bcb18f
- iss: *string*: NAP 提供的 API 金鑰 ID, 例如: SK80b4317d6f21441487c8f7dab75e7082

以下為存取 QNAP Room Service 的 JWT 客制欄位 (Private Claims):

- grant
    - room
        - name: *string*: 信令通道名稱, 建議於正式環境中每次通話配發一 UUID.
        - type: *string*: 請固定使用 "peer-to-peer"
        - turn: *boolean*: 設為 true 則可支援對稱式 NAT 的穿透, 但會有流量費用的發生.
    - identity: *string*: 視訊成員的唯一識別碼, 在同一 room 內不可相同, 建議於正式環境中為各成員配發 UUID.

JWT 欄位範例:

```
{
  "exp": 1585036871,
  "iss": "SK80b4317d6f21441487c8f7dab75e7082",
  "sub": "PJb602298298664dd2b93c058de5bcb18f",
  "grant": {
    "identity": "6266064224649216",
    "room": {
      "name": "267700004",
      "type": "peer-to-peer",
      "turn": true
    }
  }
}
```

QNAP Room Service 支援的簽章演算法:

* HS256
* HS512
