簡體   English   中英

當訂閱失敗時,go 客戶端返回 nil

[英]When subscribe failed, the go client return nil

if token := c.Subscribe("go-mqtt/sample", 0, nil); token.Wait() && token.Error() != nil {
    fmt.Println(token.Error()) 
    os.Exit(1)
}

EMQ 服務端返回 reasonCode=128,go 客戶端的 Error 一直是 nil,我們無法得到 EMQ 服務端的 suback。

根據 ALSM 對您最初評論的 paho.mqtt.golang 問題的評論

是的,這是一個有趣的,一個訂閱可以有多個主題,並且子確認在單個響應中為每個主題返回成功/錯誤。 讓客戶端檢測 suback 中的所有響應代碼是否都失敗並在令牌上設置錯誤會很簡單,但不太清楚在成功和失敗混合的情況下該怎么做。 這是一個懸而未決的問題,歡迎任何想法。

庫采用的方法是將已處理的訂閱請求(發送SUBSCRIBE並收到SUBACK )視為成功。 如果您願意,它可以讓您選擇檢查對單個訂閱的響應(但如果 1-many 請求失敗,則不會引發錯誤響應)。 正如 ALSM 所評論的那樣,很可能有更好的方法來解決這個問題(歡迎提出建議)。

您表示這對您不起作用,但沒有在此處提供任何其他信息(根據要求),因此很難知道您遇到了什么困難。 這是一種為您提供總體思路的方法(尚未編譯/測試):

token := c.Subscribe("go-mqtt/sample", 0, nil)
if token.Wait() && token.Error() != nil {
    fmt.Println(token.Error()) 
    os.Exit(1)
} 
if t, ok := token.(*mqtt.SubscribeToken); ok {
    subResult = t.Result() 
    rc := subResult["go-mqtt/sample"]
    fmt.Println("SUBACK response: ", rc) 
} else {
    fmt.Println("unexpected token type") 
    os.Exit(1)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM