fix(mqtt): improve topic parsing logic and dynamic clientid logging

This commit is contained in:
sky121113 2026-04-21 14:06:39 +08:00
parent c3b623e5e0
commit 43a160e2d4
2 changed files with 20 additions and 5 deletions

View File

@ -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 {

View File

@ -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()