Freescale FRDM K64F with DeviceHub.net IoT platform demo code
Dependencies: EthernetInterface FXOS8700Q MQTTS MbedJSONValue mbed-rtos mbed wolfSSL
Fork of HelloMQTTS by
Diff: main.cpp
- Revision:
- 17:25584027fae0
- Parent:
- 16:28d062c5522b
- Child:
- 20:0404c7f31c69
--- a/main.cpp Mon Oct 06 11:42:25 2014 +0000 +++ b/main.cpp Sun Jul 26 09:55:46 2015 +0000 @@ -13,121 +13,215 @@ * Contributors: * Ian Craggs - initial API and implementation and/or initial documentation *******************************************************************************/ - - /** - 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 - access to system interfaces for networking and timing. As long as these two - 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. - - */ +/** + 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 + access to system interfaces for networking and timing. As long as these two + 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. -#include "C12832.h" -C12832 lcd(p5, p7, p6, p8, p11); +*/ #include "MQTTEthernet.h" #include "MQTTClient.h" +#include "NTPClient.h" +#include "getline.h" +#include "SDFileSystem.h" +SDFileSystem sdCard(PTE3, PTE1, PTE2, PTE4, "sd"); /* pins for FRDM-K64F */ +const char* certFile = "/sd/mqtts-cert.pem"; + int arrivedcount = 0; - void messageArrived(MQTT::MessageData& md) { MQTT::Message &message = md.message; - lcd.cls(); - lcd.locate(0,3); 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); ++arrivedcount; - lcd.puts((char*)message.payload); + puts((char*)message.payload); +} + +static char * removeNL(char *str) +{ + for(int i=strlen(str)-1; (str[i]=='\n')||(str[i]=='\r'); i--)str[i]='\0' ; + return str ; } +static bool getConnectInfo(char **hn, char **un, char **pwd, char **cID, + char **tc, int *pt, char **ms, char **cert) +{ + static char hostname[100] ; + static char username[20] ; + static char password[20] ; + static char clientID[20] ; + static char topic[50] ; + static char port_s[10] ; + static int port ; + static char msg[100] ; + static char certName[30] ; + static char fullName[sizeof(certName)+10] ; -int main(int argc, char* argv[]) -{ + *hn = hostname ; + *un = username ; + *pwd= password ; + *cID= clientID ; + *tc = topic ; + *ms = msg ; + *cert=fullName ; + + FILE *fp = fopen("/sd/connectInfo.txt", "r"); + if (fp == NULL) { + printf("Cannot open \"connectInfo.txt\"\n") ; + return false ; + } + fgets(hostname, sizeof(hostname), fp) ; + fgets(username , sizeof(username), fp); + fgets(password, sizeof(password), fp) ; + fgets(clientID, sizeof(clientID), fp) ; + fgets(topic, sizeof(topic), fp) ; + getline("Port(1883/8883): ", port_s, sizeof(port_s)) ; + getline("Message: ", msg, sizeof(msg)) ; + removeNL(hostname) ; + removeNL(username) ; + removeNL(password) ; + removeNL(clientID) ; + removeNL(topic) ; + port = atoi(removeNL(port_s)) ; + *pt = port ; + printf("Connecting to %s:%d, %s\n", hostname, port, port>8000? "MQTT-TLS":"MQTT" ); + if(port>8000) { + getline("Cert File name: ", certName, sizeof(certName)) ; + removeNL(certName) ; + if(*certName != '\0') { + sprintf(fullName, "/sd/%s", certName) ; + FILE *fp = fopen(fullName, "r"); + if (fp != NULL) { + NTPClient ntp; /* set Realtime clock for cert verification */ + if(ntp.setTime("ntp.jst.mfeed.ad.jp") != 0) { + printf("NTP Error\n") ; + return false ; + } + printf("Verify Server: %s\n", certName) ; + } else { + printf("ERROR: file not found\n") ; + return false ; + } + } else { + fullName[0] = '\0' ; + printf("No verify Server\n") ; + } + } + return true ; +} + +void mqtt_main(void const *av) +{ MQTTEthernet ipstack = MQTTEthernet(); float version = 0.47; - char* topic = "mbed-sample"; - - lcd.printf("Version is %f\n", version); + printf("Version is %f\n", version); - + printf("Version is %f\n", version); + MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack); - - char* hostname = "m2m.eclipse.org"; - int port = 1883; - lcd.printf("Connecting to %s:%d\n", hostname, port); - int rc = ipstack.connect(hostname, port); + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.MQTTVersion = 3; + + /* get connect info */ + char *hostname ; + char *username ; + char *password ; + char *clientID ; + char *topic ; + int port ; + char *msg ; + char *fullName ; + + if(!getConnectInfo(&hostname, &username, &password, &clientID, &topic, &port, &msg, &fullName)) + return ; + data.username.cstring = username ; + data.password.cstring = password ; + data.clientID.cstring = clientID ; + + int rc = ipstack.connect(hostname, port, port>8000 ? fullName : NULL); if (rc != 0) - lcd.printf("rc from TCP connect is %d\n", rc); - - MQTTPacket_connectData data = MQTTPacket_connectData_initializer; - data.MQTTVersion = 3; - data.clientID.cstring = "mbed-sample"; - data.username.cstring = "testuser"; - data.password.cstring = "testpassword"; + printf("rc from TCP connect is %d\n", rc); + if ((rc = client.connect(data)) != 0) - lcd.printf("rc from MQTT connect is %d\n", rc); - - if ((rc = client.subscribe(topic, MQTT::QOS1, messageArrived)) != 0) - lcd.printf("rc from MQTT subscribe is %d\n", rc); - + printf("rc from MQTT connect is %d\n", rc); + printf("MQTT connected\n") ; + if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0) + printf("rc from MQTT subscribe is %d\n", rc); + printf("Subscribed\n") ; MQTT::Message message; - // QoS 0 - char buf[100]; - sprintf(buf, "Hello World! QoS 0 message from app version %f\n", version); +// QoS 0 + char buf[sizeof(message)+50] ; + sprintf(buf, "\"%s\", QoS 0 message from app version %f\n", msg, version); message.qos = MQTT::QOS0; message.retained = false; message.dup = false; message.payload = (void*)buf; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); + + printf("QoS0: Published to %s\n\t%s\n", topic, message.payload) ; while (arrivedcount < 1) client.yield(100); - - // QoS 1 - sprintf(buf, "Hello World! QoS 1 message from app version %f\n", version); + +// QoS 1 + sprintf(buf, "\"%s\", QoS 1 message from app version %f\n", msg, version); message.qos = MQTT::QOS1; + message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); + printf("QoS1: Published to %s\n\t%s\n", topic, message.payload) ; while (arrivedcount < 2) client.yield(100); - - // QoS 2 - sprintf(buf, "Hello World! QoS 2 message from app version %f\n", version); + +#if 0 /* QoS 2 not tested */ +// QoS 2 + sprintf(buf, "\"%s\", QoS 2 message from app version %f\n", version); message.qos = MQTT::QOS2; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); + printf("QoS2: Published to %s\n\t%s\n", topic, message.payload) ; while (arrivedcount < 3) client.yield(100); - - // n * QoS 2 - for (int i = 1; i <= 10; ++i) - { - sprintf(buf, "Hello World! QoS 2 message number %d from app version %f\n", i, version); + +// n * QoS 2 + for (int i = 1; i <= 10; ++i) { + sprintf(buf, "\"%s\", QoS 2 message number %d from app version %f\n", i, version); message.qos = MQTT::QOS2; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); + printf("QoS2[%d]: Published to %s\n\t%s\n", i, topic, message.payload) ; while (arrivedcount < i + 3) client.yield(100); } - +#endif + + printf("unsubscribing\n") ; if ((rc = client.unsubscribe(topic)) != 0) printf("rc from unsubscribe was %d\n", rc); - + if ((rc = client.disconnect()) != 0) printf("rc from disconnect was %d\n", rc); - + ipstack.disconnect(); - - lcd.cls(); - lcd.locate(0,3); - lcd.printf("Version %.2f: finish %d msgs\n", version, arrivedcount); + printf("Version %.2f: finish %d msgs\n", version, arrivedcount); printf("Finishing with %d messages received\n", arrivedcount); - - return 0; + + return ; } + +main() +{ +#define STACK_SIZE 24000 + Thread t(mqtt_main, NULL, osPriorityNormal, STACK_SIZE); + while (true) { + Thread::wait(1000); + } +}