mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-19 14:14:00 +00:00
espat: update MQTT example for greater stability
Signed-off-by: Ron Evans <ron@hybridgroup.com>
This commit is contained in:
@@ -13,6 +13,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"machine"
|
"machine"
|
||||||
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/eclipse/paho.mqtt.golang/packets"
|
"github.com/eclipse/paho.mqtt.golang/packets"
|
||||||
@@ -38,26 +39,28 @@ var (
|
|||||||
conn *espat.TCPSerialConn
|
conn *espat.TCPSerialConn
|
||||||
err error
|
err error
|
||||||
mid uint16
|
mid uint16
|
||||||
|
topic = "tinygo"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
uart.Configure(machine.UARTConfig{TX: tx, RX: rx})
|
|
||||||
|
|
||||||
time.Sleep(3000 * time.Millisecond)
|
time.Sleep(3000 * time.Millisecond)
|
||||||
|
|
||||||
|
uart.Configure(machine.UARTConfig{TX: tx, RX: rx})
|
||||||
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
|
||||||
// Init esp8266/esp32
|
// Init esp8266/esp32
|
||||||
adaptor = espat.New(uart)
|
adaptor = espat.New(uart)
|
||||||
adaptor.Configure()
|
adaptor.Configure()
|
||||||
|
|
||||||
// first check if connected
|
// first check if connected
|
||||||
if adaptor.Connected() {
|
if connectToESP() {
|
||||||
console.Write([]byte("Connected to wifi adaptor.\r\n"))
|
println("Connected to wifi adaptor.")
|
||||||
adaptor.Echo(false)
|
adaptor.Echo(false)
|
||||||
|
|
||||||
connectToAP()
|
connectToAP()
|
||||||
} else {
|
} else {
|
||||||
console.Write([]byte("\r\n"))
|
println("")
|
||||||
console.Write([]byte("Unable to connect to wifi adaptor.\r\n"))
|
println("Unable to connect to wifi adaptor.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +73,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
laddr := &espat.TCPAddr{Port: 1883}
|
laddr := &espat.TCPAddr{Port: 1883}
|
||||||
|
|
||||||
console.Write([]byte("Dialing TCP connection...\r\n"))
|
println("Dialing TCP connection...")
|
||||||
conn, err = adaptor.DialTCP("tcp", laddr, raddr)
|
conn, err = adaptor.DialTCP("tcp", laddr, raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println("tcp connect error")
|
println("tcp connect error")
|
||||||
@@ -80,34 +83,39 @@ func main() {
|
|||||||
err = connectToMQTTServer()
|
err = connectToMQTTServer()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
console.Write([]byte("Publishing MQTT packets...\r\n"))
|
publishToMQTT()
|
||||||
|
|
||||||
publish := packets.NewControlPacket(packets.Publish).(*packets.PublishPacket)
|
|
||||||
publish.Qos = 0
|
|
||||||
publish.TopicName = "tinygo"
|
|
||||||
publish.Payload = []byte("Hello, mqtt\r\n")
|
|
||||||
publish.MessageID = mid
|
|
||||||
mid++
|
|
||||||
|
|
||||||
publish.Write(conn)
|
|
||||||
|
|
||||||
time.Sleep(1000 * time.Millisecond)
|
time.Sleep(1000 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right now this code is never reached. Need a way to trigger it...
|
// Right now this code is never reached. Need a way to trigger it...
|
||||||
console.Write([]byte("Disconnecting TCP...\r\n"))
|
println("Disconnecting TCP...")
|
||||||
conn.Close()
|
conn.Close()
|
||||||
console.Write([]byte("Done.\r\n"))
|
|
||||||
|
println("Done.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// connect to ESP8266/ESP32
|
||||||
|
func connectToESP() bool {
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
println("Connecting to wifi adaptor...")
|
||||||
|
if adaptor.Connected() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// connect to access point
|
// connect to access point
|
||||||
func connectToAP() {
|
func connectToAP() {
|
||||||
console.Write([]byte("Connecting to wifi network...\r\n"))
|
println("Connecting to wifi network...")
|
||||||
|
|
||||||
adaptor.SetWifiMode(espat.WifiModeClient)
|
adaptor.SetWifiMode(espat.WifiModeClient)
|
||||||
adaptor.ConnectToAP(ssid, pass, 10)
|
adaptor.ConnectToAP(ssid, pass, 10)
|
||||||
console.Write([]byte("Connected.\r\n"))
|
|
||||||
console.Write([]byte(adaptor.GetClientIP()))
|
println("Connected.")
|
||||||
console.Write([]byte("\r\n"))
|
println(adaptor.GetClientIP())
|
||||||
}
|
}
|
||||||
|
|
||||||
func connectToMQTTServer() error {
|
func connectToMQTTServer() error {
|
||||||
@@ -116,12 +124,12 @@ func connectToMQTTServer() error {
|
|||||||
connectPkt.Qos = 0
|
connectPkt.Qos = 0
|
||||||
// connectPkt.Username = "tinygo"
|
// connectPkt.Username = "tinygo"
|
||||||
// connectPkt.Password = []byte("1234")
|
// connectPkt.Password = []byte("1234")
|
||||||
connectPkt.ClientIdentifier = "tinygo-client"
|
connectPkt.ClientIdentifier = "tinygo-client-" + randomString(10)
|
||||||
connectPkt.ProtocolVersion = 4
|
connectPkt.ProtocolVersion = 4
|
||||||
connectPkt.ProtocolName = "MQTT"
|
connectPkt.ProtocolName = "MQTT"
|
||||||
connectPkt.Keepalive = 30
|
connectPkt.Keepalive = 30
|
||||||
|
|
||||||
console.Write([]byte("Sending MQTT connect...\r\n"))
|
println("Sending MQTT connect...")
|
||||||
err := connectPkt.Write(conn)
|
err := connectPkt.Write(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println("mqtt connect error")
|
println("mqtt connect error")
|
||||||
@@ -129,7 +137,7 @@ func connectToMQTTServer() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
console.Write([]byte("Waiting for MQTT connect...\r\n"))
|
println("Waiting for MQTT connect...")
|
||||||
// TODO: handle timeout
|
// TODO: handle timeout
|
||||||
for {
|
for {
|
||||||
packet, _ := packets.ReadPacket(conn)
|
packet, _ := packets.ReadPacket(conn)
|
||||||
@@ -137,7 +145,7 @@ func connectToMQTTServer() error {
|
|||||||
if packet != nil {
|
if packet != nil {
|
||||||
_, ok := packet.(*packets.ConnackPacket)
|
_, ok := packet.(*packets.ConnackPacket)
|
||||||
if ok {
|
if ok {
|
||||||
console.Write([]byte("Connected to MQTT server.\r\n"))
|
println("Connected to MQTT server.")
|
||||||
println(packet.String())
|
println(packet.String())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -146,3 +154,30 @@ func connectToMQTTServer() error {
|
|||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func publishToMQTT() error {
|
||||||
|
println("Publishing MQTT message...")
|
||||||
|
|
||||||
|
publish := packets.NewControlPacket(packets.Publish).(*packets.PublishPacket)
|
||||||
|
publish.Qos = 0
|
||||||
|
publish.TopicName = topic
|
||||||
|
publish.Payload = []byte("Hello, mqtt\r\n")
|
||||||
|
publish.MessageID = mid
|
||||||
|
mid++
|
||||||
|
|
||||||
|
return publish.Write(conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns an int >= min, < max
|
||||||
|
func randomInt(min, max int) int {
|
||||||
|
return min + rand.Intn(max-min)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate a random string of A-Z chars with len = l
|
||||||
|
func randomString(len int) string {
|
||||||
|
bytes := make([]byte, len)
|
||||||
|
for i := 0; i < len; i++ {
|
||||||
|
bytes[i] = byte(randomInt(65, 90))
|
||||||
|
}
|
||||||
|
return string(bytes)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user