4.7 Topic Names and Topic Filters 主題名稱和主題過濾器
4.7.1 Topic wildcards 主題通配符
主題級別分隔符用於將結構引入主題名稱。如果存在,它將主題名稱分成多個“主題級別”。
訂閱的主題過濾器可以包含特殊的通配符,允許您一次訂閱多個主題。
通配符可以在主題過濾器中使用,但不能在主題名稱[MQTT-4.7.1-1]中使用。
4.7.1.1 Topic level separator 主題級別分隔符
正斜槓('/'U + 002F)用於分隔主題樹中的每個級別,併爲主題名稱提供分層結構。當訂閱客戶端指定的主題過濾器中遇到兩個通配符中的任何一個時,主題級別分隔符的使用很重要。主題級別分隔符可以出現在主題過濾器或主題名稱中的任何位置。相鄰的主題級別分隔符表示零長度的主題級別。
4.7.1.2 Multi-level wildcard 多級通配符
數字符號('#'U + 0023)是一個通配符,可以匹配主題中的任意數量的級別。多級通配符表示父級和任意數量的子級別。多級通配符必須單獨指定或在主題級別分隔符之後指定。在任何一種情況下,它必須是主題過濾器 [MQTT-4.7.1-2]中指定的最後一個字符。
非規範性評論
例如,如果客戶訂閱“sport / tennis / player1 /#”,它將接收使用這些主題名稱發佈的消息:
·“sport / tennis / player1”
·“sport / tennis / player1 / score / wimbledon”
非規範性評論
·“sport /#”也與單一的“運動”相匹配,因爲#包括父級。
·“#”有效,將接收每個應用程序消息
·“sport / tennis /#”有效
·“sport / tennis#”無效
·“運動/網球/#/排名”無效
4.7.1.3 Single level wildcard 單級通配符
加號('+'U + 002B)是一個通配符,只匹配一個主題級別。
單級通配符可以在主題過濾器中的任何級別使用,包括第一級和最後一級。在使用它的地方必須佔據過濾器的整個級別 [MQTT-4.7.1-3]。它可以在主題過濾器中的多個級別使用,並且可以與多級通配符一起使用。
非規範性評論
For example, “sport/tennis/+” matches “sport/tennis/player1” and “sport/tennis/player2”, but not
“sport/tennis/player1/ranking”. Also, because the single-level wildcard matches only a single level,
“sport/+” does not match “sport” but it does match “sport/”.
非規範性評論
“+” is valid
“+/tennis/#” is valid
“sport+” is not valid
“sport/+/player1” is valid
“/finance” matches “+/+” and “/+”, but not “+”
4.7.2 Topics beginning with $ 以$開頭的主題
服務器必須不匹配主題過濾器,以帶有$字符 [MQTT-4.7.2-1]的主題名稱的通配符(#或+)開頭。服務器應該阻止客戶端使用此類主題名稱與其他客戶端交換消息。服務器實現可以使用以前導$字符開頭的主題名稱用於其他目的。
非規範性評論
·$ SYS /已被廣泛用作包含特定於服務器的信息或控制API的主題的前綴
·應用程序不能將具有前導$字符的主題用於其自身目的
非規範性評論
·訂閱“#”將不會收到發佈到以$開頭的主題的任何消息
·訂閱“+ / monitor / Clients”將不會收到發佈到“$ SYS / monitor / Clients”的任何消息
·訂閱“$ SYS /#”將收到發佈到以“$ SYS /”開頭的主題的消息
·訂閱“$ SYS / monitor / +”將收到發佈到“$ SYS / monitor / Clients”的消息
·對於客戶端接收來自以$ SYS /開頭的主題的消息,以及從不以$開頭的主題接收消息,它必須同時訂閱“#”和“$ SYS /#”
4.7.3 Topic semantic and usage 主題語義和用法
以下規則適用於主題名稱和主題過濾器:
- 所有主題名稱和主題過濾器必須至少有一個字符長 [MQTT-4.7.3-1]
- 主題名稱和主題過濾器區分大小寫
- 主題名稱和主題過濾器可以包含空格字符
- 前導或尾隨'/'創建一個獨特的主題名稱或主題過濾器
- 僅包含'/'字符的主題名稱或主題過濾器有效
- 主題名稱和主題過濾器不得包含空字符(Unicode U + 0000)[ Unicode ] [MQTT-4.7.3-2]
- 主題名稱和主題過濾器是UTF-8編碼的字符串,它們不能編碼爲超過65535字節 [MQTT-4.7.3-3]。見1.5.3節
除了UTF-8編碼字符串的總長度所強加的級別外,主題名稱或主題過濾器中的級別數量沒有限制。
當它執行訂閱匹配時,服務器不得執行主題名稱或主題過濾器的任何規範化,或者對未識別字符的任何修改或替換 [MQTT-4.7.3-4]。主題過濾器中的每個非通配級別必須匹配主題名稱字符中的相應級別才能使匹配成功。
非規範性評論
The UTF-8 encoding rules mean that the comparison of Topic Filter and Topic Name could be
performed either by comparing the encoded UTF-8 bytes, or by comparing decoded Unicode
characters
非規範性評論
“ACCOUNTS” and “Accounts” are two different topic names
“Accounts payable” is a valid topic name
“/finance” is different from “finance”
應用程序消息將發送到每個客戶端訂閱,其主題篩選器與附加到應用程序消息的主題名稱匹配。主題資源可以由管理員在服務器中預定義,也可以由服務器在收到第一個訂閱或具有該主題名稱的應用程序消息時動態創建。服務器還可以使用安全組件有選擇地授權給定客戶端的主題資源上的操作。
4.8 Handling errors 處理錯誤
除非另有說明,否則如果服務器或客戶端遇到協議違規,它必須關閉它收到導致協議違規的控制數據包的網絡連接 [MQTT-4.8.0-1]。
客戶端或服務器實現可能會遇到阻止成功處理MQTT數據包的瞬態錯誤(例如內部緩衝區已滿)。
如果客戶端或服務器在處理入站控制數據包時遇到暫時性錯誤,則必須關閉其收到該控制數據包 [MQTT-4.8.0-2] 的網絡連接。如果服務器檢測到瞬態錯誤,它不應斷開連接或對其與任何其他客戶端的交互產生任何其他影響。