[Issue #8] - adding MQTT reconnect if the connection drops
This commit is contained in:
@@ -36,8 +36,8 @@ func (m *SimpleMQTT) Connect(clientID, username, password string) error {
|
|||||||
flags |= 0x40
|
flags |= 0x40
|
||||||
}
|
}
|
||||||
|
|
||||||
// Variable header: MQTT (proto name), Level 4 (MQTT 3.1.1), flags, KeepAlive 60s
|
// Variable header: MQTT (proto name), Level 4 (MQTT 3.1.1), flags, KeepAlive 0s (disabled)
|
||||||
varHeader := []byte{0x00, 0x04, 'M', 'Q', 'T', 'T', 0x04, flags, 0x00, 0x3C}
|
varHeader := []byte{0x00, 0x04, 'M', 'Q', 'T', 'T', 0x04, flags, 0x00, 0x00}
|
||||||
|
|
||||||
payload := encodeString(clientID)
|
payload := encodeString(clientID)
|
||||||
if username != "" {
|
if username != "" {
|
||||||
@@ -145,7 +145,7 @@ func registerHADiscovery(mqtt *SimpleMQTT, sensor ClimateSensor) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
// Panic Handler & Entry Point
|
// Panic Handler & Helper Functions
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
func panicErr(msg string, err error) {
|
func panicErr(msg string, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -156,6 +156,22 @@ func panicErr(msg string, err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func connectMQTT(netStack *NetworkStack, port uint16) (*SimpleMQTT, error) {
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
conn, err := netStack.DialTCP(ctx, MQTTHost, port)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mqtt := NewSimpleMQTT(conn)
|
||||||
|
if err := mqtt.Connect(ClientID, MQTTUser, MQTTPass); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return mqtt, nil
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
@@ -205,17 +221,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
portNum, _ := strconv.Atoi(MQTTPort)
|
portNum, _ := strconv.Atoi(MQTTPort)
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
conn, err := netStack.DialTCP(ctx, MQTTHost, uint16(portNum))
|
|
||||||
if err != nil {
|
|
||||||
panicErr("TCP dial", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
mqtt := NewSimpleMQTT(conn)
|
|
||||||
println("Connecting MQTT session...")
|
println("Connecting MQTT session...")
|
||||||
if err := mqtt.Connect(ClientID, MQTTUser, MQTTPass); err != nil {
|
mqtt, err := connectMQTT(netStack, uint16(portNum))
|
||||||
|
if err != nil {
|
||||||
panicErr("MQTT connect", err)
|
panicErr("MQTT connect", err)
|
||||||
}
|
}
|
||||||
println("MQTT connected.")
|
println("MQTT connected.")
|
||||||
@@ -237,7 +246,16 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := mqtt.Publish(StateTopic, []byte(stateJSON), false); err != nil {
|
if err := mqtt.Publish(StateTopic, []byte(stateJSON), false); err != nil {
|
||||||
println("MQTT publish error:", err.Error())
|
println("MQTT publish error:", err.Error(), "- attempting reconnect...")
|
||||||
|
newMqtt, recErr := connectMQTT(netStack, uint16(portNum))
|
||||||
|
if recErr != nil {
|
||||||
|
println("MQTT reconnect failed:", recErr.Error())
|
||||||
|
} else {
|
||||||
|
println("MQTT reconnected successfully.")
|
||||||
|
mqtt = newMqtt
|
||||||
|
_ = registerHADiscovery(mqtt, sensor)
|
||||||
|
_ = mqtt.Publish(StateTopic, []byte(stateJSON), false)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
println(fmt.Sprintf("[%s] Published: %s", NodeName, stateJSON))
|
println(fmt.Sprintf("[%s] Published: %s", NodeName, stateJSON))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user