Work in progress MQTT example program on top of mbed OS 5
Fork of HelloMQTT by
Revision 20:49c9daf2b0ff, committed 2017-01-10
- Comitter:
- Jan Jongboom
- Date:
- Tue Jan 10 18:10:17 2017 -0600
- Parent:
- 19:7f7aba7a4a8b
- Commit message:
- Update to mbed OS 5, use NetworkInterface for multiple connectivity methods - not just ethernet
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.mbedignore Tue Jan 10 18:10:17 2017 -0600 @@ -0,0 +1,1 @@ +Linux-example/
--- a/C027.h Thu Jul 30 13:49:18 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 IBM Corp. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial implementation - *******************************************************************************/ - -#if !defined(K64F_H) -#define K64F_H - -C12832 lcd(D11, D13, D12, D7, D10); -PwmOut r(D5); -PwmOut g(D9); -PwmOut b(D8); -DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); -DigitalIn Up(A2); DigitalIn Down(A3); DigitalIn Left(A4); DigitalIn Right(A5); DigitalIn Click(D4); -AnalogIn ain1 (A0); AnalogIn ain2 (A1); - -#define LED2_OFF 0 -#define LED2_ON 1 - -#define DEFAULT_TYPE_NAME "iotsample-mbed-c027" - -#include "lpc_phy.h" -// need a wrapper since K64F and LPC1768 wont have the same name for mii read methods -static uint32_t linkStatus(void) -{ - return (lpc_mii_read_data() & 1); -} - -#endif \ No newline at end of file
--- a/EthernetInterface.lib Thu Jul 30 13:49:18 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://mbed.org/users/mbed_official/code/EthernetInterface/#f69b81aa9eb1
--- a/K64F.h Thu Jul 30 13:49:18 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 IBM Corp. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial implementation - * Sam Grove - added method to check the status of the Ethernet cable - *******************************************************************************/ - -#if !defined(K64F_H) -#define K64F_H - -C12832 lcd(D11, D13, D12, D7, D10); -BusOut led2 (LED_BLUE); -BusOut r (D5); -BusOut g (D9); -BusOut b (D8); -DigitalIn Up(A2); DigitalIn Down(A3); DigitalIn Right(A4); DigitalIn Left(A5); DigitalIn Click(D4); -AnalogIn ain1(A0); AnalogIn ain2(A1); - -#define LED2_OFF 1 -#define LED2_ON 0 - -#define DEFAULT_TYPE_NAME "iotsample-mbed-k64f" - -//#include "lpc_phy.h" -// need a wrapper since K64F and LPC1768 wont have the same name for mii read methods -static uint32_t linkStatus(void) -{ - return (1); -} - -#endif \ No newline at end of file
--- a/LPC1768.h Thu Jul 30 13:49:18 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 IBM Corp. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial implementation - * Sam Grove - added mehtod to check the status of the Ethernet cable - *******************************************************************************/ - -#if !defined(LPC1768_H) -#define LPC1768_H - -C12832 lcd(p5, p7, p6, p8, p11); -DigitalOut led2(LED2); -PwmOut r(p23); -PwmOut g(p24); -PwmOut b(p25); -DigitalIn Down(p12); -DigitalIn Left(p13); -DigitalIn Click(p14); -DigitalIn Up(p15); -DigitalIn Right(p16); -AnalogIn ain1(p19); -AnalogIn ain2(p20); - -#define LED2_OFF 0 -#define LED2_ON 1 - -#define DEFAULT_TYPE_NAME "iotsample-mbed-lpc1768" - -#include "lpc_phy.h" -// need a wrapper since K64F and LPC1768 wont have the same name for mii read methods -static uint32_t linkStatus(void) -{ - return (lpc_mii_read_data() & 1); -} - -#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MQTTNetwork.h Tue Jan 10 18:10:17 2017 -0600 @@ -0,0 +1,38 @@ +#ifndef _MQTTNETWORK_H_ +#define _MQTTNETWORK_H_ + +#include "NetworkInterface.h" + +class MQTTNetwork { +public: + MQTTNetwork(NetworkInterface* aNetwork) : network(aNetwork) { + socket = new TCPSocket(); + } + + ~MQTTNetwork() { + delete socket; + } + + int read(unsigned char* buffer, int len, int timeout) { + return socket->recv(buffer, len); + } + + int write(unsigned char* buffer, int len, int timeout) { + return socket->send(buffer, len); + } + + int connect(const char* hostname, int port) { + socket->open(network); + return socket->connect(hostname, port); + } + + void disconnect() { + + } + +private: + NetworkInterface* network; + TCPSocket* socket; +}; + +#endif // _MQTTNETWORK_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect.lib Tue Jan 10 18:10:17 2017 -0600 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/easy-connect/#cb933fb19cda0a733a64d6b71d271fb6bdaf9e6d
--- a/main.cpp Thu Jul 30 13:49:18 2015 +0000 +++ b/main.cpp Tue Jan 10 18:10:17 2017 -0600 @@ -14,7 +14,7 @@ * Ian Craggs - initial API and implementation and/or initial documentation * Ian Craggs - make sure QoS2 processing works, and add device headers *******************************************************************************/ - + /** This is a sample program to illustrate the use of the MQTT Client library on the mbed platform. The Client class requires two classes which mediate @@ -22,33 +22,31 @@ classes provide the required public programming interfaces, it does not matter what facilities they use underneath. In this program, they use the mbed system libraries. - + */ - + // change this to 0 to output messages to serial instead of LCD #define USE_LCD 1 #if USE_LCD #include "C12832.h" -#if defined(TARGET_UBLOX_C027) -#warning "Compiling for mbed C027" -#include "C027.h" -#elif defined(TARGET_LPC1768) -#warning "Compiling for mbed LPC1768" -#include "LPC1768.h" -#elif defined(TARGET_K64F) -#warning "Compiling for mbed K64F" -#include "K64F.h" -#endif +// the actual pins are defined in mbed_app.json and can be overridden per target +C12832 lcd(LCD_MOSI, LCD_SCK, LCD_MISO, LCD_A0, LCD_NCS); -#define printf lcd.cls();lcd.printf +#define logMessage lcd.cls();lcd.printf + +#else + +#define logMessage printf #endif #define MQTTCLIENT_QOS2 1 -#include "MQTTEthernet.h" +#include "easy-connect.h" +#include "MQTTNetwork.h" +#include "MQTTmbed.h" #include "MQTTClient.h" int arrivedcount = 0; @@ -57,45 +55,51 @@ void messageArrived(MQTT::MessageData& md) { MQTT::Message &message = md.message; - printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message.qos, message.retained, message.dup, message.id); - printf("Payload %.*s\n", message.payloadlen, (char*)message.payload); + logMessage("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id); + logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload); ++arrivedcount; } int main(int argc, char* argv[]) -{ - MQTTEthernet ipstack = MQTTEthernet(); - float version = 0.5; +{ + float version = 0.6; char* topic = "mbed-sample"; - - printf("HelloMQTT: version is %f\n", version); - - MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack); - - char* hostname = "m2m.eclipse.org"; + + logMessage("HelloMQTT: version is %.2f\r\n", version); + + NetworkInterface* network = easy_connect(true); + if (!network) { + return -1; + } + + MQTTNetwork mqttNetwork(network); + + MQTT::Client<MQTTNetwork, Countdown> client = MQTT::Client<MQTTNetwork, Countdown>(mqttNetwork); + + const char* hostname = "m2m.eclipse.org"; int port = 1883; - printf("Connecting to %s:%d\n", hostname, port); - int rc = ipstack.connect(hostname, port); + logMessage("Connecting to %s:%d\r\n", hostname, port); + int rc = mqttNetwork.connect(hostname, port); if (rc != 0) - printf("rc from TCP connect is %d\n", rc); - - MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + logMessage("rc from TCP connect is %d\r\n", rc); + + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; data.MQTTVersion = 3; data.clientID.cstring = "mbed-sample"; data.username.cstring = "testuser"; data.password.cstring = "testpassword"; if ((rc = client.connect(data)) != 0) - printf("rc from MQTT connect is %d\n", rc); - + logMessage("rc from MQTT connect is %d\r\n", rc); + if ((rc = client.subscribe(topic, MQTT::QOS2, messageArrived)) != 0) - printf("rc from MQTT subscribe is %d\n", rc); + logMessage("rc from MQTT subscribe is %d\r\n", rc); MQTT::Message message; // QoS 0 char buf[100]; - sprintf(buf, "Hello World! QoS 0 message from app version %f\n", version); + sprintf(buf, "Hello World! QoS 0 message from app version %f\r\n", version); message.qos = MQTT::QOS0; message.retained = false; message.dup = false; @@ -104,32 +108,32 @@ rc = client.publish(topic, message); while (arrivedcount < 1) client.yield(100); - + // QoS 1 - sprintf(buf, "Hello World! QoS 1 message from app version %f\n", version); + sprintf(buf, "Hello World! QoS 1 message from app version %f\r\n", version); message.qos = MQTT::QOS1; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); while (arrivedcount < 2) client.yield(100); - + // QoS 2 - sprintf(buf, "Hello World! QoS 2 message from app version %f\n", version); + sprintf(buf, "Hello World! QoS 2 message from app version %f\r\n", version); message.qos = MQTT::QOS2; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); while (arrivedcount < 3) client.yield(100); - + if ((rc = client.unsubscribe(topic)) != 0) - printf("rc from unsubscribe was %d\n", rc); - + logMessage("rc from unsubscribe was %d\r\n", rc); + if ((rc = client.disconnect()) != 0) - printf("rc from disconnect was %d\n", rc); - - ipstack.disconnect(); - - printf("Version %.2f: finish %d msgs\n", version, arrivedcount); - + logMessage("rc from disconnect was %d\r\n", rc); + + mqttNetwork.disconnect(); + + logMessage("Version %.2f: finish %d msgs\r\n", version, arrivedcount); + return 0; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Tue Jan 10 18:10:17 2017 -0600 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#2885c1b41e63158cb6faf5f107cd821ae06ef26c
--- a/mbed-rtos.lib Thu Jul 30 13:49:18 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/mbed_official/code/mbed-rtos/#34e80e862021
--- a/mbed.bld Thu Jul 30 13:49:18 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/6213f644d804 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_app.json Tue Jan 10 18:10:17 2017 -0600 @@ -0,0 +1,69 @@ +{ + "config": { + "network-interface":{ + "help": "options are ETHERNET,WIFI_ESP8266,MESH_LOWPAN_ND,MESH_THREAD", + "value": "ETHERNET" + }, + "mesh_radio_type": { + "help": "options are ATMEL, MCR20", + "value": "ATMEL" + }, + "esp8266-tx": { + "help": "Pin used as TX (connects to ESP8266 RX)", + "value": "D1" + }, + "esp8266-rx": { + "help": "Pin used as RX (connects to ESP8266 TX)", + "value": "D0" + }, + "esp8266-ssid": { + "value": "\"SSID\"" + }, + "esp8266-password": { + "value": "\"Password\"" + }, + "esp8266-debug": { + "value": true + }, + "lcd-mosi": { + "value": "D11", + "macro_name": "LCD_MOSI" + }, + "lcd-sck": { + "value": "D13", + "macro_name": "LCD_SCK" + }, + "lcd-miso": { + "value": "D12", + "macro_name": "LCD_MISO" + }, + "lcd-a0": { + "value": "D7", + "macro_name": "LCD_A0" + }, + "lcd-ncs": { + "value": "D10", + "macro_name": "LCD_NCS" + } + }, + "target_overrides": { + "*": { + "target.features_add": ["NANOSTACK", "LOWPAN_ROUTER", "COMMON_PAL"], + "mbed-mesh-api.6lowpan-nd-channel-page": 0, + "mbed-mesh-api.6lowpan-nd-channel": 12, + "mbed-trace.enable": 0 + }, + "HEXIWEAR": { + "esp8266-tx": "PTD3", + "esp8266-rx": "PTD2" + }, + "NUCLEO_F401RE": { + "esp8266-tx": "D8", + "esp8266-rx": "D2" + }, + "NUCLEO_F411RE": { + "esp8266-tx": "D8", + "esp8266-rx": "D2" + } + } +}