fix(mqtt): improve topic parsing logic and dynamic clientid logging
This commit is contained in:
parent
c3b623e5e0
commit
43a160e2d4
@ -29,11 +29,26 @@ func (h *MqttHandler) HandleMessage(client mqtt.Client, msg mqtt.Message) {
|
||||
// 檢查是否為系統主題 ($SYS)
|
||||
if strings.HasPrefix(topic, "$SYS/") {
|
||||
parts := strings.Split(topic, "/")
|
||||
if len(parts) >= 6 {
|
||||
serialNo = parts[4]
|
||||
event := parts[5]
|
||||
|
||||
// 尋找事件類型 (connected 或 disconnected)
|
||||
var event string
|
||||
for _, p := range parts {
|
||||
if p == "connected" || p == "disconnected" {
|
||||
event = p
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 解析系統 JSON Payload
|
||||
// 尋找 Client ID (通常位於 "clients" 的下一層)
|
||||
for i, p := range parts {
|
||||
if p == "clients" && i+1 < len(parts) {
|
||||
serialNo = parts[i+1]
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if event != "" && serialNo != "" {
|
||||
// 解析系統 JSON Payload (補強:有些版本會把 ClientID 放在 Payload 裡)
|
||||
var sysData map[string]interface{}
|
||||
if err := json.Unmarshal(payload, &sysData); err == nil {
|
||||
if cid, ok := sysData["clientid"].(string); ok {
|
||||
|
||||
@ -54,7 +54,7 @@ func main() {
|
||||
opts.SetMaxReconnectInterval(10 * time.Second)
|
||||
|
||||
opts.SetOnConnectHandler(func(c mqtt.Client) {
|
||||
log.Printf("Connected to MQTT Broker as Gateway [star-cloud-gateway] at %s", cfg.MQTTAddr)
|
||||
log.Printf("Connected to MQTT Broker as Gateway [%s] at %s", cfg.MQTTClientID, cfg.MQTTAddr)
|
||||
// 訂閱所有機台的上行 Topic
|
||||
token := c.Subscribe("machine/+/+", 1, mqttHandler.HandleMessage)
|
||||
token.Wait()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user