建立和讀取 IoT 中樞 訊息

為了支援跨通訊協定的無縫互操作性,IoT 中樞 定義所有裝置面向通訊協定中可用的一組通用傳訊功能。 這些可用於 裝置到雲端訊息路由雲端到裝置訊息

注意

本文所述的一些功能,例如雲端到裝置傳訊、裝置對應項和裝置管理,僅適用於標準層 IoT 中樞。 如需基本和標準/免費 IoT 中樞 層的詳細資訊,請參閱為您的解決方案選擇正確的 IoT 中樞 層。

IoT 中樞使用串流傳訊模式實作裝置到雲端的傳訊。 IoT 中樞的裝置到雲端訊息更像事件中樞事件服務匯流排 訊息中,有大量事件通過服務,可供多個讀取器讀取。

IoT 中樞訊息包含:

  • 預先決定的系統屬性集,如下所示。

  • 應用程式屬性集。 應用程式可以定義並存取的字串屬性字典,而不需要還原序列化訊息本文。 IoT 中樞永遠不會修改這些屬性。

  • 訊息本文,其可以是任何類型的資料。

每個裝置通訊協定會以不同的方式實作設定屬性。 如需詳細資訊,請參閱相關的 MQTTAMQP 開發人員指南。

屬性名稱和值只能包含 ASCII 英數位元,以及 {'!', '#', '$', '%, '&', ''', '*', '+', '-', '.', '^', '_', '`', '|', '~'} 當您使用 HTTPS 通訊協定傳送裝置到雲端訊息或傳送雲端到裝置訊息時。

使用 IoT 中樞進行的裝置到雲端的傳訊具有下列特性:

  • 裝置到雲端訊息在IoT中樞的預設 訊息/事件 端點中保留最多七天。

  • 裝置到雲端的訊息最多可以有 256 KB,而且可以分組為批次以將傳送最佳化。 批次最多可以有 256 KB。

  • IoT 中樞不允許任意分割。 裝置到雲端的訊息會根據其來源 deviceId 進行分割。

  • 如控制對 IoT 中樞 的存取中所述,IoT 中樞 啟用個別裝置驗證和訪問控制。

  • 您可以使用進入應用程式屬性的資訊為訊息加上戳記。 如需詳細資訊,請參閱 訊息擴充

如需如何使用不同通訊協定來編碼和解碼所傳送訊息的詳細資訊,請參閱 Azure IoT SDK (部分機器翻譯)。

注意

每個 IoT 中樞 通訊協定都會提供訊息內容類型屬性,當將數據路由傳送至自定義端點時會受到尊重。 若要在目的地正確處理您的資料(例如,將 JSON 視為可剖析字串,而不是 Base64 編碼的二進位數據),您必須為訊息提供適當的內容類型和字元集。

若要在 IoT 中樞 路由查詢中使用訊息本文,您必須為訊息提供有效的 JSON 物件,並將訊息的內容類型屬性設定為 application/json;charset=utf-8

有效的可路由訊息本文看起來可能如下所示:

{
    "timestamp": "2022-02-08T20:10:46Z",
    "tag_name": "spindle_speed",
    "tag_value": 100
}

D2C IoT 中樞 訊息的系統屬性

屬性 說明 使用者可設定? 路由查詢的
關鍵詞
message-id 使用者可針對用於要求-回復模式之訊息設定的識別碼。 格式:ASCII 7 位英數位元 + {'-', ':', '.', '+', '%', '_', '#', '*', '?', '!', '(', ')', ',', '=', '@', ';', '$', '''}的區分大小寫字串(長度最多 128 個字元)。 Yes messageId
iothub-enqueuedtime IoT 中樞 收到裝置到雲端訊息的日期和時間。 No enqueuedTime
user-id 用來指定訊息來源的識別碼。 當訊息由 IoT 中樞 產生時,它會設定為 {iot hub name} Yes userId
iothub-connection-device-id IoT 中樞在裝置到雲端的訊息上設定的識別碼。 它包含傳送訊息之裝置的 deviceId No connectionDeviceId
iothub-connection-module-id IoT 中樞在裝置到雲端的訊息上設定的識別碼。 它包含傳送訊息之裝置的 moduleId No connectionModuleId
iothub-connection-auth-generation-id IoT 中樞在裝置到雲端的訊息上設定的識別碼。 它包含 傳送訊息之裝置的 connectionDeviceGenerationId (根據 裝置身分識別屬性)。 No connectionDeviceGenerationId
iothub-connection-auth-method IoT 中樞在裝置到雲端的訊息上設定的驗證方法。 此屬性包含用來驗證傳送訊息之裝置的驗證方法相關資訊。 No connectionAuthMethod
iothub-app-iothub-creation-time-utc 允許裝置在以批次方式傳送資料時傳送事件建立時間。 Yes creation-time-utc
iothub-creation-time-utc 允許裝置在一次傳送一則訊息時傳送事件建立時間。 Yes creation-time-utc
dt-dataschema 此值是由裝置到雲端訊息上的 IoT 中樞所設定。 其包含裝置連線中設定的裝置型號識別碼。 No $dt-dataschema
dt-subject 傳送裝置到雲端訊息的元件名稱。 Yes $dt-subject

D2C IoT 中樞 訊息的應用程式屬性

應用程式屬性的常見用法是使用 iothub-creation-time-utc 屬性從裝置傳送時間戳,以在裝置傳送訊息時記錄。 此時間戳的格式必須是UTC,且沒有時區資訊。 例如, 2021-04-21T11:30:16Z 有效, 2021-04-21T11:30:16-07:00 無效:

{
  "applicationId":"5782ed70-b703-4f13-bda3-1f5f0f5c678e",
  "messageSource":"telemetry",
  "deviceId":"sample-device-01",
  "schema":"default@v1",
  "templateId":"urn:modelDefinition:mkuyqxzgea:e14m1ukpn",
  "enqueuedTime":"2021-01-29T16:45:39.143Z",
  "telemetry":{
    "temperature":8.341033560421833
  },
  "messageProperties":{
    "iothub-creation-time-utc":"2021-01-29T16:45:39.021Z"
  },
  "enrichments":{}
}

C2D IoT 中樞 訊息的系統屬性

屬性 說明 使用者可設定?
message-id 使用者可針對用於要求-回復模式之訊息設定的識別碼。 格式:ASCII 7 位英數位元 + {'-', ':', '.', '+', '%', '_', '#', '*', '?', '!', '(', ')', ',', '=', '@', ';', '$', '''}的區分大小寫字串(長度最多 128 個字元)。 Yes
sequence-number IoT 中樞指派給每個雲端到裝置的訊息的數字 (每個 device-queue 都是唯一的)。 No
打給 雲端到裝置訊息中指定的目的地。 No
absolute-expiry-time 訊息到期的日期和時間。 Yes
correlation-id 回應訊息中的字串屬性,通常包含要求的 MessageId,其模式為要求-回復。 Yes
user-id 用來指定訊息來源的識別碼。 當訊息由 IoT 中樞 產生時,它會設定為 {iot hub name} Yes
iothub-ack 意見反應訊息產生器。 此屬性用於雲端到裝置的訊息,以要求 IoT 中樞產生意見反應訊息 (由於裝置取用訊息的結果)。 可能的值:none (預設值):不產生任何意見反應訊息、positive:如果訊息已完成,則接收意見反應訊息、negative:如果訊息已過期 (或達到傳遞計數上限),則接收意見反應訊息,而不會由裝置完成,或 full:positive 與 negative。 Yes

系統屬性名稱

系統屬性名稱會根據要路由傳送訊息的端點而有所不同。 如需這些名稱的詳細資訊,請參閱下表。

系統屬性名稱 事件中樞 Azure 儲存體 服務匯流排 Event Grid
訊息 ID message-id messageId MessageId message-id
使用者識別碼 user-id userId UserId user-id
連線 ion 裝置識別碼 iothub-connection-device-id connectionDeviceId iothub-connection-device-id iothub-connection-device-id
連線 ion 模組識別碼 iothub-connection-module-id connectionModuleId iothub-connection-module-id iothub-connection-module-id
連線 ion 驗證產生識別碼 iothub-connection-auth-generation-id connectionDeviceGenerationId iothub-connection-auth-generation-id iothub-connection-auth-generation-id
Connection auth method iothub-connection-auth-method connectionAuthMethod iothub-connection-auth-method iothub-connection-auth-method
contentType Content-Type contentType ContentType iothub-content-type
contentEncoding content-encoding contentEncoding ContentEncoding iothub-content-encoding
iothub-enqueuedtime iothub-enqueuedtime enqueuedTime N/A iothub-enqueuedtime
CorrelationId correlation-id correlationId CorrelationId correlation-id
dt-dataschema dt-dataschema dt-dataschema dt-dataschema dt-dataschema
dt-subject dt-subject dt-subject dt-subject dt-subject

訊息大小

IoT 中樞以與通訊協定無關的方式測量訊息大小,只考慮實際承載。 以位元組為單位的大小會以下列值的總和計算:

  • 本文大小 (以位元組為單位)。
  • 訊息系統屬性之所有值的大小 (以位元組為單位)。
  • 所有使用者屬性名稱與值的大小 (以位元組為單位)。

屬性名稱與值限制為 ASCII 字元,因此字串的長度等於位元組大小。

反詐騙屬性

為避免裝置到雲端的訊息中的裝置詐騙,IoT 中樞會為具有下列屬性的所有訊息加上戳記:

  • iothub-connection-device-id
  • iothub-connection-auth-generation-id
  • iothub-connection-auth-method

前兩個包含 原始裝置的 deviceIdgenerationId ,根據 裝置身分識別屬性

iothub-connection-auth-method 屬性包含 JSON 已序列化物件,其具有下列屬性:

{
  "scope": "{ hub | device | module }",
  "type": "{ symkey | sas | x509 }",
  "issuer": "iothub"
}

下一步