![](/media/cache/profiles/7c39a5f991bef4a1e34187677a65871d.jpg.50x50_q85.jpg)
MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.
Diff: main.cpp
- Revision:
- 0:238f0d0c0ba3
- Child:
- 1:1c2544eafc9c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 26 16:15:14 2021 +0000 @@ -0,0 +1,119 @@ +// In this example we create an MQTT client. +// It's publishing messages with topic 'example/hello' and 'Hello World!' payload. +// The MQTT client also subscribes to some topics which are in its interest to receive. +// Ethernet connection is assured by an affordable ENC28J60 Ethernet module. +// +// MQTT broker is like a post office. +// Its task is to distribute messages published by clients to all subscribers (other clients). +// So the 'example/hello' messages published by this client will be sent to the broker. +// Then the broker will send them to all clients which subscribed to such topic (example/hello). +// Also this client will receive all messages with topics it subscribed to (if published such by other clients). +// 'Mosquitto' is a free implementation of MQTT broker for Linux (e.g. Raspberry Pi, Ubuntu etc.) +// +#include "mbed.h" + +#include "EthernetInterface.h" +#include "MQTTNetwork.h" +#include "MQTTmbed.h" +#include "MQTTClient.h" + +#define IP "192.168.1.35" +#define GATEWAY "192.168.1.1" +#define NETMASK "255.255.255.0" +#define BROKER_IP "192.168.1.31" // IP address of your MQTT broker. Change to match your case. +#define MQTT_PORT 1883 // MQTT port +const uint8_t MAC[6] = { 0, 1, 2, 3, 4, 5 }; + +// Global variables +char topic[256]; +EthernetInterface net; +TCPSocket socket; +MQTTNetwork mqttNetwork(&net); +MQTT::Client<MQTTNetwork, Countdown> mqttClient(mqttNetwork); + +// Function prototypes +void onMqttMsgReceived(MQTT::MessageData& md); + +/** + * @brief + * @note + * @param + * @retval + */ +FileHandle* mbed::mbed_override_console(int) +{ + static BufferedSerial myConsole(USBTX, USBRX, 460800); + return &myConsole; +} + +/** + * @brief + * @note + * @param + * @retval + */ +int main(void) +{ + // Bring up the ethernet interface + net.set_network(IP, NETMASK, GATEWAY); // include this to use static IP address + net.get_emac().set_hwaddr(MAC); // set MAC address + printf("MQTT client example\n"); + if (net.connect() != 0) { + printf("Error connecting\n"); + return -1; + } + + // Show network address + SocketAddress addr; + net.get_ip_address(&addr); + printf("IP address: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None"); + net.get_netmask(&addr); + printf("Netmask: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None"); + net.get_gateway(&addr); + printf("Gateway: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None"); + + printf("Connecting to %s:%d\r\n", BROKER_IP, MQTT_PORT); + nsapi_error_t error = mqttNetwork.connect(BROKER_IP, MQTT_PORT); + if (error == NSAPI_ERROR_OK) { + printf("Server connected.\r\n"); + } + else { + printf("Cannot connect server.\r\n"); + return -1; + } + + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.MQTTVersion = 3; + data.clientID.cstring = "MyMqttClient"; + data.username.cstring = NULL; + data.password.cstring = NULL; + + // Connect MQTT client to MQTT broker + printf("Connecting MQTT Broker\r\n"); + if (mqttClient.connect(data) != 0) { + printf("Cannot connect MQTT broker.\r\n"); + return -1; + }; + printf("MQTT Broker connected.\r\n"); + + // Subscribe to topics + mqttClient.subscribe("workroomThermostat/#", MQTT::QOS0, onMqttMsgReceived); + + // Main thread loop + while (1) { + mqttClient.yield(10); + } +} + +/** + * @brief + * @note + * @param + * @retval + */ +void onMqttMsgReceived(MQTT::MessageData& md) +{ + memset(topic, 0, sizeof(topic)); + memcpy(topic, md.topicName.lenstring.data, md.topicName.lenstring.len); + printf("topic: %s\r\n", topic); +}