![](/media/cache/profiles/7c39a5f991bef4a1e34187677a65871d.jpg.50x50_q85.jpg)
MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.
main.cpp@0:238f0d0c0ba3, 2021-03-26 (annotated)
- Committer:
- hudakz
- Date:
- Fri Mar 26 16:15:14 2021 +0000
- Revision:
- 0:238f0d0c0ba3
- Child:
- 1:1c2544eafc9c
MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 0:238f0d0c0ba3 | 1 | // In this example we create an MQTT client. |
hudakz | 0:238f0d0c0ba3 | 2 | // It's publishing messages with topic 'example/hello' and 'Hello World!' payload. |
hudakz | 0:238f0d0c0ba3 | 3 | // The MQTT client also subscribes to some topics which are in its interest to receive. |
hudakz | 0:238f0d0c0ba3 | 4 | // Ethernet connection is assured by an affordable ENC28J60 Ethernet module. |
hudakz | 0:238f0d0c0ba3 | 5 | // |
hudakz | 0:238f0d0c0ba3 | 6 | // MQTT broker is like a post office. |
hudakz | 0:238f0d0c0ba3 | 7 | // Its task is to distribute messages published by clients to all subscribers (other clients). |
hudakz | 0:238f0d0c0ba3 | 8 | // So the 'example/hello' messages published by this client will be sent to the broker. |
hudakz | 0:238f0d0c0ba3 | 9 | // Then the broker will send them to all clients which subscribed to such topic (example/hello). |
hudakz | 0:238f0d0c0ba3 | 10 | // Also this client will receive all messages with topics it subscribed to (if published such by other clients). |
hudakz | 0:238f0d0c0ba3 | 11 | // 'Mosquitto' is a free implementation of MQTT broker for Linux (e.g. Raspberry Pi, Ubuntu etc.) |
hudakz | 0:238f0d0c0ba3 | 12 | // |
hudakz | 0:238f0d0c0ba3 | 13 | #include "mbed.h" |
hudakz | 0:238f0d0c0ba3 | 14 | |
hudakz | 0:238f0d0c0ba3 | 15 | #include "EthernetInterface.h" |
hudakz | 0:238f0d0c0ba3 | 16 | #include "MQTTNetwork.h" |
hudakz | 0:238f0d0c0ba3 | 17 | #include "MQTTmbed.h" |
hudakz | 0:238f0d0c0ba3 | 18 | #include "MQTTClient.h" |
hudakz | 0:238f0d0c0ba3 | 19 | |
hudakz | 0:238f0d0c0ba3 | 20 | #define IP "192.168.1.35" |
hudakz | 0:238f0d0c0ba3 | 21 | #define GATEWAY "192.168.1.1" |
hudakz | 0:238f0d0c0ba3 | 22 | #define NETMASK "255.255.255.0" |
hudakz | 0:238f0d0c0ba3 | 23 | #define BROKER_IP "192.168.1.31" // IP address of your MQTT broker. Change to match your case. |
hudakz | 0:238f0d0c0ba3 | 24 | #define MQTT_PORT 1883 // MQTT port |
hudakz | 0:238f0d0c0ba3 | 25 | const uint8_t MAC[6] = { 0, 1, 2, 3, 4, 5 }; |
hudakz | 0:238f0d0c0ba3 | 26 | |
hudakz | 0:238f0d0c0ba3 | 27 | // Global variables |
hudakz | 0:238f0d0c0ba3 | 28 | char topic[256]; |
hudakz | 0:238f0d0c0ba3 | 29 | EthernetInterface net; |
hudakz | 0:238f0d0c0ba3 | 30 | TCPSocket socket; |
hudakz | 0:238f0d0c0ba3 | 31 | MQTTNetwork mqttNetwork(&net); |
hudakz | 0:238f0d0c0ba3 | 32 | MQTT::Client<MQTTNetwork, Countdown> mqttClient(mqttNetwork); |
hudakz | 0:238f0d0c0ba3 | 33 | |
hudakz | 0:238f0d0c0ba3 | 34 | // Function prototypes |
hudakz | 0:238f0d0c0ba3 | 35 | void onMqttMsgReceived(MQTT::MessageData& md); |
hudakz | 0:238f0d0c0ba3 | 36 | |
hudakz | 0:238f0d0c0ba3 | 37 | /** |
hudakz | 0:238f0d0c0ba3 | 38 | * @brief |
hudakz | 0:238f0d0c0ba3 | 39 | * @note |
hudakz | 0:238f0d0c0ba3 | 40 | * @param |
hudakz | 0:238f0d0c0ba3 | 41 | * @retval |
hudakz | 0:238f0d0c0ba3 | 42 | */ |
hudakz | 0:238f0d0c0ba3 | 43 | FileHandle* mbed::mbed_override_console(int) |
hudakz | 0:238f0d0c0ba3 | 44 | { |
hudakz | 0:238f0d0c0ba3 | 45 | static BufferedSerial myConsole(USBTX, USBRX, 460800); |
hudakz | 0:238f0d0c0ba3 | 46 | return &myConsole; |
hudakz | 0:238f0d0c0ba3 | 47 | } |
hudakz | 0:238f0d0c0ba3 | 48 | |
hudakz | 0:238f0d0c0ba3 | 49 | /** |
hudakz | 0:238f0d0c0ba3 | 50 | * @brief |
hudakz | 0:238f0d0c0ba3 | 51 | * @note |
hudakz | 0:238f0d0c0ba3 | 52 | * @param |
hudakz | 0:238f0d0c0ba3 | 53 | * @retval |
hudakz | 0:238f0d0c0ba3 | 54 | */ |
hudakz | 0:238f0d0c0ba3 | 55 | int main(void) |
hudakz | 0:238f0d0c0ba3 | 56 | { |
hudakz | 0:238f0d0c0ba3 | 57 | // Bring up the ethernet interface |
hudakz | 0:238f0d0c0ba3 | 58 | net.set_network(IP, NETMASK, GATEWAY); // include this to use static IP address |
hudakz | 0:238f0d0c0ba3 | 59 | net.get_emac().set_hwaddr(MAC); // set MAC address |
hudakz | 0:238f0d0c0ba3 | 60 | printf("MQTT client example\n"); |
hudakz | 0:238f0d0c0ba3 | 61 | if (net.connect() != 0) { |
hudakz | 0:238f0d0c0ba3 | 62 | printf("Error connecting\n"); |
hudakz | 0:238f0d0c0ba3 | 63 | return -1; |
hudakz | 0:238f0d0c0ba3 | 64 | } |
hudakz | 0:238f0d0c0ba3 | 65 | |
hudakz | 0:238f0d0c0ba3 | 66 | // Show network address |
hudakz | 0:238f0d0c0ba3 | 67 | SocketAddress addr; |
hudakz | 0:238f0d0c0ba3 | 68 | net.get_ip_address(&addr); |
hudakz | 0:238f0d0c0ba3 | 69 | printf("IP address: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None"); |
hudakz | 0:238f0d0c0ba3 | 70 | net.get_netmask(&addr); |
hudakz | 0:238f0d0c0ba3 | 71 | printf("Netmask: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None"); |
hudakz | 0:238f0d0c0ba3 | 72 | net.get_gateway(&addr); |
hudakz | 0:238f0d0c0ba3 | 73 | printf("Gateway: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None"); |
hudakz | 0:238f0d0c0ba3 | 74 | |
hudakz | 0:238f0d0c0ba3 | 75 | printf("Connecting to %s:%d\r\n", BROKER_IP, MQTT_PORT); |
hudakz | 0:238f0d0c0ba3 | 76 | nsapi_error_t error = mqttNetwork.connect(BROKER_IP, MQTT_PORT); |
hudakz | 0:238f0d0c0ba3 | 77 | if (error == NSAPI_ERROR_OK) { |
hudakz | 0:238f0d0c0ba3 | 78 | printf("Server connected.\r\n"); |
hudakz | 0:238f0d0c0ba3 | 79 | } |
hudakz | 0:238f0d0c0ba3 | 80 | else { |
hudakz | 0:238f0d0c0ba3 | 81 | printf("Cannot connect server.\r\n"); |
hudakz | 0:238f0d0c0ba3 | 82 | return -1; |
hudakz | 0:238f0d0c0ba3 | 83 | } |
hudakz | 0:238f0d0c0ba3 | 84 | |
hudakz | 0:238f0d0c0ba3 | 85 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
hudakz | 0:238f0d0c0ba3 | 86 | data.MQTTVersion = 3; |
hudakz | 0:238f0d0c0ba3 | 87 | data.clientID.cstring = "MyMqttClient"; |
hudakz | 0:238f0d0c0ba3 | 88 | data.username.cstring = NULL; |
hudakz | 0:238f0d0c0ba3 | 89 | data.password.cstring = NULL; |
hudakz | 0:238f0d0c0ba3 | 90 | |
hudakz | 0:238f0d0c0ba3 | 91 | // Connect MQTT client to MQTT broker |
hudakz | 0:238f0d0c0ba3 | 92 | printf("Connecting MQTT Broker\r\n"); |
hudakz | 0:238f0d0c0ba3 | 93 | if (mqttClient.connect(data) != 0) { |
hudakz | 0:238f0d0c0ba3 | 94 | printf("Cannot connect MQTT broker.\r\n"); |
hudakz | 0:238f0d0c0ba3 | 95 | return -1; |
hudakz | 0:238f0d0c0ba3 | 96 | }; |
hudakz | 0:238f0d0c0ba3 | 97 | printf("MQTT Broker connected.\r\n"); |
hudakz | 0:238f0d0c0ba3 | 98 | |
hudakz | 0:238f0d0c0ba3 | 99 | // Subscribe to topics |
hudakz | 0:238f0d0c0ba3 | 100 | mqttClient.subscribe("workroomThermostat/#", MQTT::QOS0, onMqttMsgReceived); |
hudakz | 0:238f0d0c0ba3 | 101 | |
hudakz | 0:238f0d0c0ba3 | 102 | // Main thread loop |
hudakz | 0:238f0d0c0ba3 | 103 | while (1) { |
hudakz | 0:238f0d0c0ba3 | 104 | mqttClient.yield(10); |
hudakz | 0:238f0d0c0ba3 | 105 | } |
hudakz | 0:238f0d0c0ba3 | 106 | } |
hudakz | 0:238f0d0c0ba3 | 107 | |
hudakz | 0:238f0d0c0ba3 | 108 | /** |
hudakz | 0:238f0d0c0ba3 | 109 | * @brief |
hudakz | 0:238f0d0c0ba3 | 110 | * @note |
hudakz | 0:238f0d0c0ba3 | 111 | * @param |
hudakz | 0:238f0d0c0ba3 | 112 | * @retval |
hudakz | 0:238f0d0c0ba3 | 113 | */ |
hudakz | 0:238f0d0c0ba3 | 114 | void onMqttMsgReceived(MQTT::MessageData& md) |
hudakz | 0:238f0d0c0ba3 | 115 | { |
hudakz | 0:238f0d0c0ba3 | 116 | memset(topic, 0, sizeof(topic)); |
hudakz | 0:238f0d0c0ba3 | 117 | memcpy(topic, md.topicName.lenstring.data, md.topicName.lenstring.len); |
hudakz | 0:238f0d0c0ba3 | 118 | printf("topic: %s\r\n", topic); |
hudakz | 0:238f0d0c0ba3 | 119 | } |