MQTT 主題通配符和過濾器Topic Wildcards & Topic Filters

  • 主題名稱中引入了級別分隔符 /, 用於分割主題級別,如果存在,它將主題名稱劃分爲多個“主題級別”。
  • 訂閱的主題過濾器可以包含特殊的通配符,可以一次訂閱多個主題。
  • 特殊字符的通配符可以用在訂閱過濾器中,但是不能用於主題名稱

1. 主題級別

  • "/" 用於分割主題級別,併爲主題名稱提供層次結構。
  • 當訂閱客戶但指定的主題過濾器中遇到兩個通配符中的任意一個時,分隔符的使用非常重要。
  • 級別分隔符可以出現在主題名稱的任意位置。
  • 兩個相鄰的分隔符// 表示0長度的主題級別

1.1 訂閱通配符"#"

  • "#"匹配的是分隔符之後的任意級別,且包含父級
  • "#"只能是過濾器的最後一個字符
    例如,如果客戶端訂閱“sport/tennis/player1/#”,它將收到使用這些主題名稱發佈的消息:
"sport/tennis/player1”
“sport/tennis/player1/rank”
“sport/tennis/player1/score/wimbledon”

sport/# 可以匹配 sport 主題,因爲# 包括父級
單個的 # 也是有效的,這將收到服務端任何消息
sport/tennis/# 有效
sport/tennis# 無效
sport/tennis/#/ranking 無效

1.2 訂閱通配符 "+"

  • "+" 表示單級別通配符,可以在過濾器中的任何級別使用,包括第一級和最後一級

例如:
"sport/tennis/+"
匹配
"sport/tennis/payler1" 和 "sport/tennis/payler2"
但是不匹配
“sport/tennis/player1/ranking”
由於單級通配符僅匹配單個級別,因此“sport/+”不匹配“sport”,但它匹配“sport/”

另外

  • 單個 "+" 有效,匹配單級主題
  • “+/tennis/#” 有效
  • “sport+” 無效
  • “sport/+/player1” 有效
  • “/finace” 和 “+/+” 以及 “/+” 匹配,但是和 “+”不匹配

2. $開頭的主題

服務器存儲的主題名稱不能以通配符(#或+)開頭。
但是主題名稱可以以$開頭,$開頭的主題已經被廣泛採用,作爲包含服務器特性信息或控制API的前綴

  • 非規範評論
  1. 應用程序不能用$前綴做業務主題
  2. 訂閱“#”將不會收到任何發佈到以 $ 開頭的主題的消息
  3. 訂閱“+/monitor/Clients”將不會收到任何發佈到“$SYS/monitor/Clients”的消息
  4. 訂閱“$SYS/#”將收到發佈到以“$SYS/”開頭的主題的消息
  5. 訂閱“$SYS/monitor/+”將收到發佈到“$SYS/monitor/Clients”的消息
  6. 爲了讓客戶端接收來自以 $SYS/ 開頭的主題和不以 $ 開頭的主題的消息,它必須同時訂閱“#”和“$SYS/#”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章