Example project to publish messages to a MQTT-SN broker using the u-blox SARA-N200 NB-IoT modem

Dependencies:   MQTTSNPacket X-NUCLEO-SARA-N200

Committer:
KeystoneElectronic
Date:
Mon Aug 20 15:29:25 2018 +0000
Revision:
4:df0aab6b9120
Parent:
1:70b751b7a189
Child:
5:749a8fb7f27e
Use mbed_app to configure host, port and topic

Who changed what in which revision?

UserRevisionLine numberNew contents of line
keystone.electronic.solutions@gmail.com 1:70b751b7a189 1 #include <stdio.h>
keystone.electronic.solutions@gmail.com 1:70b751b7a189 2 #include <Serial.h>
KeystoneElectronic 0:c0cf12ee5420 3
keystone.electronic.solutions@gmail.com 1:70b751b7a189 4 #include "mbed.h"
keystone.electronic.solutions@gmail.com 1:70b751b7a189 5 #include "sara_n2.h"
keystone.electronic.solutions@gmail.com 1:70b751b7a189 6 #include "MQTTmbed.h"
keystone.electronic.solutions@gmail.com 1:70b751b7a189 7 #include "MQTTSNUDP.h"
keystone.electronic.solutions@gmail.com 1:70b751b7a189 8 #include "MQTTSNClient.h"
keystone.electronic.solutions@gmail.com 1:70b751b7a189 9
keystone.electronic.solutions@gmail.com 1:70b751b7a189 10 Serial pc(SERIAL_TX, SERIAL_RX, 115200);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 11 DigitalOut myled(LED1);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 12 InterruptIn button(USER_BUTTON);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 13 UARTSerial sara(PA_9, PA_10, 9600);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 14 DigitalOut sara_reset(D7);
KeystoneElectronic 0:c0cf12ee5420 15
keystone.electronic.solutions@gmail.com 1:70b751b7a189 16 //#define INFO_TRACE(_class, _string, ...) printf( "%8s: " _string, _class, ##__VA_ARGS__)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 17 #undef TRACE
keystone.electronic.solutions@gmail.com 1:70b751b7a189 18 #define TRACE(_string, ...) INFO_TRACE( "MQTT", _string, ##__VA_ARGS__ )
keystone.electronic.solutions@gmail.com 1:70b751b7a189 19
keystone.electronic.solutions@gmail.com 1:70b751b7a189 20 float led_flash_rate = 0.5;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 21
keystone.electronic.solutions@gmail.com 1:70b751b7a189 22 void messageArrived(MQTTSN::MessageData& md)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 23 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 24 MQTTSN::Message &message = md.message;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 25 TRACE("Message arrived: qos %d, retained %d, dup %d, packetid %d\n",
keystone.electronic.solutions@gmail.com 1:70b751b7a189 26 message.qos,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 27 message.retained,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 28 message.dup,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 29 message.id);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 30
keystone.electronic.solutions@gmail.com 1:70b751b7a189 31 TRACE("Payload %s\n", message.payload);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 32 char *ptr;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 33 float new_rate = strtof((const char*)message.payload, &ptr);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 34 if(new_rate > 0)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 35 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 36 TRACE("New rate %f\n", new_rate);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 37 led_flash_rate = new_rate;
KeystoneElectronic 0:c0cf12ee5420 38 }
KeystoneElectronic 0:c0cf12ee5420 39 }
KeystoneElectronic 0:c0cf12ee5420 40
keystone.electronic.solutions@gmail.com 1:70b751b7a189 41 enum eMQTTstates
keystone.electronic.solutions@gmail.com 1:70b751b7a189 42 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 43 MQTT_SOCKET_DISCONNECTED,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 44 MQTT_SOCKET_CONNECTED,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 45 MQTT_CLIENT_CONNECTED,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 46 MQTT_CLIENT_PUBLISH,
keystone.electronic.solutions@gmail.com 1:70b751b7a189 47 MQTT_CLIENT_SUBSCRIBED
keystone.electronic.solutions@gmail.com 1:70b751b7a189 48 }mMQTTstate;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 49
keystone.electronic.solutions@gmail.com 1:70b751b7a189 50
keystone.electronic.solutions@gmail.com 1:70b751b7a189 51 SARA_N2 sara_mdm(&sara, &sara_reset);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 52 MQTTSNUDP ipsocket = MQTTSNUDP(&sara_mdm);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 53 MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 54 MQTTSN_topicid topicid;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 55 MQTTSN::QoS grantedQoS;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 56 char topicString[64];
keystone.electronic.solutions@gmail.com 1:70b751b7a189 57 char publishMessage[100];
keystone.electronic.solutions@gmail.com 1:70b751b7a189 58
keystone.electronic.solutions@gmail.com 1:70b751b7a189 59 bool buttonPressed = false;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 60
keystone.electronic.solutions@gmail.com 1:70b751b7a189 61 void mqtt_fsm(MQTTSN::Client<MQTTSNUDP, Countdown> *client)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 62 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 63 static int pub_count = 0;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 64 switch(mMQTTstate)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 65 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 66 case MQTT_SOCKET_DISCONNECTED:
keystone.electronic.solutions@gmail.com 1:70b751b7a189 67 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 68 const char* hostname = MBED_CONF_APP_MQTT_SN_HOST;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 69 int port = MBED_CONF_APP_MQTT_SN_PORT;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 70 TRACE("Connecting to %s:%d\n", hostname, port);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 71 int socket = ipsocket.connect((char*)hostname, port);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 72 if(socket >= 0)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 73 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 74 TRACE("Socket connected - %d\n", socket);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 75 mMQTTstate = MQTT_SOCKET_CONNECTED;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 76 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 77 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 78 break;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 79
keystone.electronic.solutions@gmail.com 1:70b751b7a189 80 case MQTT_SOCKET_CONNECTED:
keystone.electronic.solutions@gmail.com 1:70b751b7a189 81 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 82 data.clientID.cstring = (char*)"NUCLEO_NB-IoT";
keystone.electronic.solutions@gmail.com 1:70b751b7a189 83 data.duration = 100;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 84 int rc = client->connect(data);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 85 TRACE("Connect - %d\n", rc);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 86 if(rc == MQTTSN::SUCCESS)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 87 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 88 printf("Client Connected\n");
keystone.electronic.solutions@gmail.com 1:70b751b7a189 89 mMQTTstate = MQTT_CLIENT_CONNECTED;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 90 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 91 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 92 break;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 93 case MQTT_CLIENT_CONNECTED:
keystone.electronic.solutions@gmail.com 1:70b751b7a189 94 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 95 topicid.type = MQTTSN_TOPIC_TYPE_NORMAL;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 96 topicid.data.long_.name = topicString;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 97 topicid.data.long_.len = strlen(topicString);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 98 int rc = client->subscribe(topicid, MQTTSN::QOS1, grantedQoS, messageArrived);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 99 TRACE("Subscribe - %d\n", rc);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 100 if(rc == MQTTSN::SUCCESS)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 101 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 102 printf("Client Subscribed\n");
keystone.electronic.solutions@gmail.com 1:70b751b7a189 103 mMQTTstate = MQTT_CLIENT_PUBLISH;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 104 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 105 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 106 break;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 107 case MQTT_CLIENT_PUBLISH:
keystone.electronic.solutions@gmail.com 1:70b751b7a189 108 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 109 pub_count = 0;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 110
keystone.electronic.solutions@gmail.com 1:70b751b7a189 111 MQTTSN::Message message;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 112 message.qos = MQTTSN::QOS0;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 113 message.retained = false;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 114 message.dup = false;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 115 message.payload = (void*)publishMessage;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 116 message.payloadlen = strlen(publishMessage)+1;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 117 int rc = client->publish(topicid, message);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 118 if(rc == MQTTSN::SUCCESS)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 119 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 120 TRACE("Publishes %s\n", publishMessage);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 121 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 122
keystone.electronic.solutions@gmail.com 1:70b751b7a189 123 mMQTTstate = MQTT_CLIENT_SUBSCRIBED;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 124 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 125 break;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 126 case MQTT_CLIENT_SUBSCRIBED:
keystone.electronic.solutions@gmail.com 1:70b751b7a189 127 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 128 client->yield(100);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 129
keystone.electronic.solutions@gmail.com 1:70b751b7a189 130 if(buttonPressed)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 131 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 132 buttonPressed = false;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 133 mMQTTstate = MQTT_CLIENT_PUBLISH;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 134 sprintf(publishMessage, "Button pressed");
keystone.electronic.solutions@gmail.com 1:70b751b7a189 135 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 136
keystone.electronic.solutions@gmail.com 1:70b751b7a189 137 if(pub_count++ > 50)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 138 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 139 mMQTTstate = MQTT_CLIENT_PUBLISH;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 140
keystone.electronic.solutions@gmail.com 1:70b751b7a189 141 static int aliveCount = 0;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 142 sprintf(publishMessage, "I am alive %d", aliveCount++);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 143 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 144
keystone.electronic.solutions@gmail.com 1:70b751b7a189 145 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 146 break;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 147 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 148 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 149
keystone.electronic.solutions@gmail.com 1:70b751b7a189 150 void pressedEvent()
keystone.electronic.solutions@gmail.com 1:70b751b7a189 151 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 152 buttonPressed = true;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 153 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 154
keystone.electronic.solutions@gmail.com 1:70b751b7a189 155 int main(void)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 156 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 157 printf("\n\nNUCLEO_X_SARA-N200 HelloMQTT-SN\n");
keystone.electronic.solutions@gmail.com 1:70b751b7a189 158 printf("Version: 0x%08X\n", MBED_CONF_APP_VERSION);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 159 printf("mbed-os: %d.%d.%d\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 160
keystone.electronic.solutions@gmail.com 1:70b751b7a189 161 strcpy(topicString, MBED_CONF_APP_TOPIC);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 162 sprintf(publishMessage, "NUCLEO NB-IoT online");
keystone.electronic.solutions@gmail.com 1:70b751b7a189 163 MQTTSN::Client<MQTTSNUDP, Countdown> client = MQTTSN::Client<MQTTSNUDP, Countdown>(ipsocket);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 164
keystone.electronic.solutions@gmail.com 1:70b751b7a189 165 button.fall(&pressedEvent);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 166
keystone.electronic.solutions@gmail.com 1:70b751b7a189 167 while(1)
keystone.electronic.solutions@gmail.com 1:70b751b7a189 168 {
keystone.electronic.solutions@gmail.com 1:70b751b7a189 169 wait(led_flash_rate);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 170 myled = 1;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 171 wait(led_flash_rate);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 172 myled = 0;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 173
keystone.electronic.solutions@gmail.com 1:70b751b7a189 174 sara_mdm.fsm();
keystone.electronic.solutions@gmail.com 1:70b751b7a189 175 mqtt_fsm(&client);
keystone.electronic.solutions@gmail.com 1:70b751b7a189 176 }
keystone.electronic.solutions@gmail.com 1:70b751b7a189 177
keystone.electronic.solutions@gmail.com 1:70b751b7a189 178
keystone.electronic.solutions@gmail.com 1:70b751b7a189 179 return 0;
keystone.electronic.solutions@gmail.com 1:70b751b7a189 180 }