

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 裝置通訊協定
<a name="protocols"></a><a name="iot-message-broker"></a>

AWS IoT Core 支援使用 MQTT 和 MQTT over WebSocket Secure (WSS) 通訊協定來發佈和訂閱訊息的裝置和用戶端，以及使用 HTTPS 通訊協定來發佈訊息的裝置和用戶端。所有通訊協定皆支援 IPv4 和 IPv6。本節說明裝置和用戶端的不同連線選項。

## TLS 通訊協定版本
<a name="connection-protocol-tls"></a>

AWS IoT Core 使用 [TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security) [1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2) 版和 [TLS 1.3 版](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3)來加密所有通訊。您可以在[網域組態中設定 TLS 設定，為您的端點設定其他 TLS](https://docs.aws.amazon.com//iot/latest/developerguide/iot-endpoints-tls-config.html) 政策版本。將裝置連線至 時 AWS IoT Core，用戶端可以傳送[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)，這是[多帳戶註冊](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html#multiple-account-cert)、[可設定端點](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)、[自訂網域](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable-custom.html)和 [VPC 端點](https://docs.aws.amazon.com//iot/latest/developerguide/IoTCore-VPC.html)等功能的必要項目。如需詳細資訊，請參閱 [AWS IoT中的傳輸安全性](transport-security.html)。

[AWS IoT 裝置 SDKs](iot-connect-devices.md#iot-connect-device-sdks) 支援 MQTT 或是經 WSS 的 MQTT，並支援用戶端連線的安全性需求。建議您使用 [AWS IoT 裝置 SDKs](iot-connect-devices.md#iot-connect-device-sdks) 將用戶端連線至 AWS IoT。

## 通訊協定、連接埠映射和身分驗證
<a name="protocol-mapping"></a><a name="protocol-port-mapping"></a>

裝置或用戶端連線至訊息中介裝置的方式，可使用 [身分驗證類型](#connection-protocol-auth-mode)進行設定。根據預設，或未傳送 SNI 延伸時，身分驗證方法是根據裝置使用的應用程式通訊協定、連接埠和應用程式層通訊協定交涉 (ALPN) TLS 延伸。下表列出根據連接埠、連接埠和 ALPN 預期的身分驗證。


**通訊協定、身分驗證和連接埠對應**  

| 通訊協定 | 支援的操作 | 身分驗證 | 站點 | ALPN 通訊協定名稱 | 
| --- | --- | --- | --- | --- | 
| MQTT over WebSocket | 發佈、訂閱 | Signature 第 4 版 | 443 | N/A | 
| MQTT over WebSocket | 發佈、訂閱 | 自訂身分驗證 | 443 | N/A | 
| MQTT | 發佈、訂閱 | X.509 用戶端憑證 | 443† | `x-amzn-mqtt-ca` | 
| MQTT | 發佈、訂閱 | X.509 用戶端憑證 | 8883 | N/A | 
| MQTT | 發佈、訂閱 | 自訂身分驗證 | 443† | `mqtt` | 
| HTTPS | 僅發佈 | Signature 第 4 版 | 443 | N/A | 
| HTTPS | 僅發佈 | X.509 用戶端憑證 | 443† | `x-amzn-http-ca` | 
| HTTPS | 僅發佈 | X.509 用戶端憑證 | 8443 | N/A | 
| HTTPS | 僅發佈 | 自訂身分驗證 | 443 | N/A | 

**應用程式層通訊協定交涉 (ALPN)**  
†使用預設端點組態時，使用 X.509 用戶端憑證身分驗證在連接埠 443 上連線的用戶端，必須實作[應用程式層通訊協定交涉 (ALPN)](https://tools.ietf.org/html/rfc7301) TLS 延伸，並使用用戶端傳送的 [ALPN ProtocolNameList 中列出的 ALPN 通訊協定名稱](https://tools.ietf.org/html/rfc7301#section-3.1)，做為`ClientHello`訊息的一部分。 ProtocolNameList   
在連接埠 443 上，[IoT:Data-ATS](iot-connect-devices.md#iot-connect-device-endpoint-table) 端點支援 ALPN x-amzn-http-ca HTTP，但 [IoT:Jobs](iot-connect-devices.md#iot-connect-device-endpoint-table) 端點不支援。  
ALPN x-amzn-mqtt-ca 在連接埠 8443 HTTPS 和連接埠 443 MQTT 上無法使用[自訂身分驗證](custom-authentication.md)。

用戶端會連線至 AWS 帳戶其裝置端點。如需有關如何尋找帳戶的裝置端點的資訊，請參閱[AWS IoT 裝置資料和服務端點](iot-connect-devices.md#iot-connect-device-endpoints)。

**注意**  
AWS SDKs不需要整個 URL。它們只需要端點主機名稱，例如 [`pubsub.py` GitHub 上適用於 Python 的 AWS IoT Device SDK 範例](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/master/samples/pubsub.py#L100)。如下表所示，傳遞完整 URL 可能會產生錯誤，例如主機名稱無效。


**連線至 AWS IoT Core**  

|  通訊協定  |  端點或 URL  | 
| --- | --- | 
| MQTT | `{{iot-endpoint}}` | 
| 透過 WSS 的 MQTT | `wss://{{iot-endpoint}}/mqtt` | 
| HTTPS | `https://{{iot-endpoint}}/topics` | 

## 選擇裝置通訊的應用程式通訊協定
<a name="protocol-selection"></a>

對於透過裝置端點進行大多數 IoT 裝置通訊，您會想要使用 Secure MQTT 或 MQTT over WebSocket Secure (WSS) 通訊協定；不過，裝置端點也支援 HTTPS。

下表比較 AWS IoT Core 如何使用兩個高階通訊協定 (MQTT 和 HTTPS) 進行裝置通訊。


**AWS IoT 裝置通訊協定 side-by-side (MQTT 和 HTTPS)**  

|  功能  |  [MQTT](mqtt.md)  |  [HTTPS](http.md)  | 
| --- | --- | --- | 
| 發佈/訂閱支援 | 發佈和訂閱 | 僅發佈 | 
| 開發套件支援 | [AWS 裝置 SDKs](iot-connect-devices.md#iot-connect-device-sdks)支援 MQTT 和 WSS 通訊協定 | 不支援軟體開發套件，但您可以使用特定語言的方法來發出 HTTPS 要求 | 
| 服務品質支援 | [MQTT QoS 層級 0 和 1](mqtt.md#mqtt-qos) | QoS 的支援是透過傳遞查詢字串參數 ?qos=qos 來進行，其中值可以是 0 或 1。您可以新增此查詢字串，以發佈內含您所需之 QoS 值的訊息。 | 
| 可接收裝置離線時所遺漏的訊息 | 是 | 否 | 
| `clientId` 欄位支援 | 是 | 否 | 
| 裝置中斷連線偵測 | 是 | 否 | 
| 安全通訊 | 是。請參閱 [通訊協定、連接埠映射和身分驗證](#protocol-mapping) | 是。請參閱 [通訊協定、連接埠映射和身分驗證](#protocol-mapping) | 
| 主題定義 | 應用程式定義 | 應用程式定義 | 
| 訊息資料格式 | 應用程式定義 | 應用程式定義 | 
| 通訊協定負荷 | 較低 | 較高 | 
| 耗電量 | 較低 | 較高 | 

## 選擇裝置通訊的身分驗證類型
<a name="connection-protocol-auth-mode"></a>

您可以使用可設定的端點來設定 IoT 端點的身分驗證類型。或者，使用預設組態，並判斷您的裝置如何使用應用程式通訊協定、連接埠和 ALPN TLS 延伸組合進行身分驗證。您選擇的身分驗證類型決定您的裝置在連線時將如何進行身分驗證 AWS IoT Core。有五種身分驗證類型：

**X.509 憑證**

使用 [X.509 用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)來驗證裝置，以 AWS IoT Core 驗證裝置。此身分驗證類型適用於 Secure MQTT (MQTT over TLS) 和 HTTPS 通訊協定。

**具有自訂授權方的 X.509 憑證**

使用 [X.509 用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)驗證裝置，並使用[自訂授權方](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)執行其他身分驗證動作，這會接收 X.509 用戶端憑證資訊。此身分驗證類型適用於 Secure MQTT (MQTT over TLS) 和 HTTPS 通訊協定。此身分驗證類型只能使用可設定的端點搭配 X.509 自訂身分驗證。沒有 ALPN 選項。

**AWS Signature 第 4 版 (SigV4)**

使用 Cognito 或您的後端服務來驗證裝置，以支援社交和企業聯合。此身分驗證類型適用於 MQTT over WebSocket Secure (WSS) 和 HTTPS 通訊協定。

**自訂授權方**

透過設定 Lambda 函數來驗證裝置，以處理傳送至其中的自訂身分驗證資訊 AWS IoT Core。此身分驗證類型適用於 Secure MQTT (MQTT over TLS)、HTTPS 和 MQTT over WebSocket Secure (WSS) 通訊協定。

**預設**

根據裝置使用的連接埠和/或應用程式層通訊協定交涉 (ALPN) 延伸來驗證裝置。不支援某些額外的身分驗證選項。如需詳細資訊，請參閱[通訊協定、連接埠映射和身分驗證](#protocol-mapping)。

下表顯示所有支援的身分驗證類型和應用程式通訊協定組合。


**支援的身分驗證類型和應用程式通訊協定組合**  

| 身分驗證類型 | 安全 MQTT （透過 TLS 的 MQTT) | 透過 WebSocket Secure (WSS) 的 MQTT | HTTPS | 預設 | 
| --- | --- | --- | --- | --- | 
| X.509 憑證 | ✓ |  | ✓ |  | 
| 具有自訂授權方的 X.509 憑證 | ✓ |  | ✓ |  | 
| AWS Signature 第 4 版 (SigV4) |  | ✓ | ✓ |  | 
| 自訂授權方 | ✓ | ✓ | ✓ |  | 
| 預設 |  |  |  | ✓ | 

## 連線持續時間限制
<a name="connection-duration"></a>

HTTPS 連線的持續時間不保證比接收和回應要求所需時間更長。

MQTT 連線持續時間取決於您使用的身分驗證功能。下表列出每項功能在理想條件下的連線持續時間上限。


**依身分驗證功能分類的 MQTT 連線持續時間**  

|  功能  |  持續時間上限 \*  | 
| --- | --- | 
| X.509 用戶端憑證 | 1–2 週 | 
| 自訂身分驗證 | 1–2 週 | 
| Signature 第 4 版 | 長達 24 小時 | 

\* 不保證

使用 X.509 憑證和自訂身分驗證時，連線持續時間沒有硬性限制，但可以短至幾分鐘。有多種原因可能導致連線中斷。下方清單中包含一些最常見的原因。
+ Wi-Fi 可用性中斷
+ 網際網路服務供應商 (ISP) 連線中斷
+ 服務修補程式
+ 服務部署
+ 服務自動擴展
+ 服務主機無法使用
+ 負載平衡器問題和更新
+ 用戶端錯誤

您的裝置必須實作偵測中斷連線和重新連線的策略。如需中斷連線事件的詳細資訊，以及處理前述事件的指導，請參閱 [生命週期事件](life-cycle-events.md) 中的 [連線/中斷連線事件](life-cycle-events.md#connect-disconnect)。