TI's MQTT Demo with freertos CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:1e7b5dd9edb4 1 /*
dflet 0:1e7b5dd9edb4 2 * mqtt_client.c - Sample application to connect to a MQTT broker and
dflet 0:1e7b5dd9edb4 3 * exercise functionalities like subscribe, publish etc.
dflet 0:1e7b5dd9edb4 4 *
dflet 0:1e7b5dd9edb4 5 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:1e7b5dd9edb4 6 *
dflet 0:1e7b5dd9edb4 7 *
dflet 0:1e7b5dd9edb4 8 * All rights reserved. Property of Texas Instruments Incorporated.
dflet 0:1e7b5dd9edb4 9 * Restricted rights to use, duplicate or disclose this code are
dflet 0:1e7b5dd9edb4 10 * granted through contract.
dflet 0:1e7b5dd9edb4 11 *
dflet 0:1e7b5dd9edb4 12 * The program may not be used without the written permission of
dflet 0:1e7b5dd9edb4 13 * Texas Instruments Incorporated or against the terms and conditions
dflet 0:1e7b5dd9edb4 14 * stipulated in the agreement under which this program has been supplied,
dflet 0:1e7b5dd9edb4 15 * and under no circumstances can it be used with non-TI connectivity device.
dflet 0:1e7b5dd9edb4 16 *
dflet 0:1e7b5dd9edb4 17 *
dflet 0:1e7b5dd9edb4 18 * Application Name - MQTT Client
dflet 0:1e7b5dd9edb4 19 * Application Overview - This application acts as a MQTT client and connects
dflet 0:1e7b5dd9edb4 20 * to the IBM MQTT broker, simultaneously we can
dflet 0:1e7b5dd9edb4 21 * connect a web client from a web browser. Both
dflet 0:1e7b5dd9edb4 22 * clients can inter-communicate using appropriate
dflet 0:1e7b5dd9edb4 23 * topic names.
dflet 0:1e7b5dd9edb4 24 *
dflet 0:1e7b5dd9edb4 25 * Application Details - http://processors.wiki.ti.com/index.php/CC31xx_MQTT_Client
dflet 0:1e7b5dd9edb4 26 * docs\examples\mqtt_client.pdf
dflet 0:1e7b5dd9edb4 27 *
dflet 0:1e7b5dd9edb4 28 */
dflet 0:1e7b5dd9edb4 29
dflet 0:1e7b5dd9edb4 30 /*
dflet 0:1e7b5dd9edb4 31 *
dflet 0:1e7b5dd9edb4 32 *! \addtogroup mqtt_client
dflet 0:1e7b5dd9edb4 33 *! @{
dflet 0:1e7b5dd9edb4 34 *
dflet 0:1e7b5dd9edb4 35 */
dflet 0:1e7b5dd9edb4 36
dflet 0:1e7b5dd9edb4 37 /* Standard includes */
dflet 0:1e7b5dd9edb4 38 #include "mbed.h"
dflet 0:1e7b5dd9edb4 39
dflet 0:1e7b5dd9edb4 40 #include "simplelink/cc3100_simplelink.h"
dflet 0:1e7b5dd9edb4 41 #include "simplelink/cc3100_sl_common.h"
dflet 0:1e7b5dd9edb4 42 #include "simplelink/G_functions/fPtr_func.h"
dflet 0:1e7b5dd9edb4 43 #include "simplelink/cc3100.h"
dflet 0:1e7b5dd9edb4 44
dflet 0:1e7b5dd9edb4 45 #include "myBoardInit.h"
dflet 0:1e7b5dd9edb4 46
dflet 0:1e7b5dd9edb4 47 /* Free-RTOS includes */
dflet 0:1e7b5dd9edb4 48 #include "FreeRTOS.h"
dflet 0:1e7b5dd9edb4 49 #include "task.h"
dflet 0:1e7b5dd9edb4 50 #include "semphr.h"
dflet 0:1e7b5dd9edb4 51 #include "portmacro.h"
dflet 0:1e7b5dd9edb4 52
dflet 0:1e7b5dd9edb4 53 #include "osi.h"
dflet 0:1e7b5dd9edb4 54
dflet 0:1e7b5dd9edb4 55 #include <stdio.h>
dflet 0:1e7b5dd9edb4 56 #include <stdlib.h>
dflet 0:1e7b5dd9edb4 57
dflet 0:1e7b5dd9edb4 58 #include "mqtt_client.h"
dflet 0:1e7b5dd9edb4 59 #include "sl_mqtt_client.h"
dflet 0:1e7b5dd9edb4 60 #include "mqtt_config.h"
dflet 0:1e7b5dd9edb4 61
dflet 0:1e7b5dd9edb4 62 #include "cli_uart.h"
dflet 0:1e7b5dd9edb4 63
dflet 0:1e7b5dd9edb4 64 using namespace mbed_cc3100;
dflet 0:1e7b5dd9edb4 65 using namespace mbed_mqtt;
dflet 0:1e7b5dd9edb4 66
dflet 0:1e7b5dd9edb4 67 int32_t demo = 0;
dflet 0:1e7b5dd9edb4 68
dflet 0:1e7b5dd9edb4 69 /* Warning Changing pins below you will need the same changes in the following files:
dflet 0:1e7b5dd9edb4 70 *
dflet 0:1e7b5dd9edb4 71 * sl_mqtt_client.cpp
dflet 0:1e7b5dd9edb4 72 * cc31xx_sl_net.cpp
dflet 0:1e7b5dd9edb4 73 * fPtr_func.cpp
dflet 0:1e7b5dd9edb4 74 */
dflet 0:1e7b5dd9edb4 75
dflet 0:1e7b5dd9edb4 76 #if (THIS_BOARD == EA_MBED_LPC4088)
dflet 0:1e7b5dd9edb4 77 //Serial pc(USBTX, USBRX);//EA_lpc4088
dflet 0:1e7b5dd9edb4 78 DigitalOut led1(LED1);
dflet 0:1e7b5dd9edb4 79 DigitalOut led2(LED2);
dflet 0:1e7b5dd9edb4 80 DigitalOut led3(LED3);
dflet 0:1e7b5dd9edb4 81 DigitalOut led4(LED4);
dflet 0:1e7b5dd9edb4 82 cc3100 _cc3100(p14, p15, p9, p10, p8, SPI(p5, p6, p7));//LPC4088 irq, nHib, cs, mosi, miso, sck
dflet 0:1e7b5dd9edb4 83 #elif (THIS_BOARD == Seeed_Arch_Max)
dflet 0:1e7b5dd9edb4 84 /* Off board leds */
dflet 0:1e7b5dd9edb4 85 DigitalOut led1(PB_15);
dflet 0:1e7b5dd9edb4 86 DigitalOut led2(PB_14);
dflet 0:1e7b5dd9edb4 87 cc3100 _cc3100(PB_9, PB_8, PD_12, PD_13, PD_11, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck
dflet 0:1e7b5dd9edb4 88 #elif (THIS_BOARD == LPCXpresso4337)
dflet 0:1e7b5dd9edb4 89 Serial pc(UART0_TX, UART0_RX);
dflet 0:1e7b5dd9edb4 90 cc3100 _cc3100(P2_2, P3_5, P1_2, SPI(P1_4, P1_3, PF_4));//LPCXpresso4337 irq, nHib, cs, mosi, miso, sck
dflet 0:1e7b5dd9edb4 91 #else
dflet 0:1e7b5dd9edb4 92
dflet 0:1e7b5dd9edb4 93 #endif
dflet 0:1e7b5dd9edb4 94
dflet 0:1e7b5dd9edb4 95 #define APPLICATION_VERSION "1.1.0"
dflet 0:1e7b5dd9edb4 96 #define SL_STOP_TIMEOUT 0xFF
dflet 0:1e7b5dd9edb4 97
dflet 0:1e7b5dd9edb4 98 #undef LOOP_FOREVER
dflet 0:1e7b5dd9edb4 99 #define LOOP_FOREVER() \
dflet 0:1e7b5dd9edb4 100 {\
dflet 0:1e7b5dd9edb4 101 while(1) \
dflet 0:1e7b5dd9edb4 102 { \
dflet 0:1e7b5dd9edb4 103 osi_Sleep(10); \
dflet 0:1e7b5dd9edb4 104 } \
dflet 0:1e7b5dd9edb4 105 }
dflet 0:1e7b5dd9edb4 106
dflet 0:1e7b5dd9edb4 107
dflet 0:1e7b5dd9edb4 108 #define PRINT_BUF_LEN 128
dflet 0:1e7b5dd9edb4 109 int8_t print_buf[PRINT_BUF_LEN];
dflet 0:1e7b5dd9edb4 110
dflet 0:1e7b5dd9edb4 111 /* Application specific data types */
dflet 0:1e7b5dd9edb4 112 typedef struct connection_config
dflet 0:1e7b5dd9edb4 113 {
dflet 0:1e7b5dd9edb4 114 SlMqttClientCtxCfg_t broker_config;
dflet 0:1e7b5dd9edb4 115 void *clt_ctx;
dflet 0:1e7b5dd9edb4 116 const char *client_id;
dflet 0:1e7b5dd9edb4 117 uint8_t *usr_name;
dflet 0:1e7b5dd9edb4 118 uint8_t *usr_pwd;
dflet 0:1e7b5dd9edb4 119 bool is_clean;
dflet 0:1e7b5dd9edb4 120 uint32_t keep_alive_time;
dflet 0:1e7b5dd9edb4 121 SlMqttClientCbs_t CallBAcks;
dflet 0:1e7b5dd9edb4 122 int32_t num_topics;
dflet 0:1e7b5dd9edb4 123 char *topic[SUB_TOPIC_COUNT];
dflet 0:1e7b5dd9edb4 124 uint8_t qos[SUB_TOPIC_COUNT];
dflet 0:1e7b5dd9edb4 125 SlMqttWill_t will_params;
dflet 0:1e7b5dd9edb4 126 bool is_connected;
dflet 0:1e7b5dd9edb4 127 } connect_config;
dflet 0:1e7b5dd9edb4 128
dflet 0:1e7b5dd9edb4 129 /*
dflet 0:1e7b5dd9edb4 130 * GLOBAL VARIABLES -- Start
dflet 0:1e7b5dd9edb4 131 */
dflet 0:1e7b5dd9edb4 132 uint32_t g_publishCount = 0;
dflet 0:1e7b5dd9edb4 133 OsiMsgQ_t g_PBQueue; /*Message Queue*/
dflet 0:1e7b5dd9edb4 134
dflet 0:1e7b5dd9edb4 135 /*
dflet 0:1e7b5dd9edb4 136 * GLOBAL VARIABLES -- End
dflet 0:1e7b5dd9edb4 137 */
dflet 0:1e7b5dd9edb4 138
dflet 0:1e7b5dd9edb4 139 /*
dflet 0:1e7b5dd9edb4 140 * STATIC FUNCTION DEFINITIONS -- Start
dflet 0:1e7b5dd9edb4 141 */
dflet 0:1e7b5dd9edb4 142 static void displayBanner(void);
dflet 0:1e7b5dd9edb4 143 static void Mqtt_Recv(void *application_hndl, const char *topstr, int32_t top_len,
dflet 0:1e7b5dd9edb4 144 const void *payload, int32_t pay_len, bool dup,uint8_t qos, bool retain);
dflet 0:1e7b5dd9edb4 145 static void sl_MqttEvt(void *application_hndl,int32_t evt, const void *buf, uint32_t len);
dflet 0:1e7b5dd9edb4 146 static void sl_MqttDisconnect(void *application_hndl);
dflet 0:1e7b5dd9edb4 147 static int32_t Dummy(const char *inBuff, ...);
dflet 0:1e7b5dd9edb4 148 static void MqttClient(void *pvParameters);
dflet 0:1e7b5dd9edb4 149 void buttonHandler_1(void);
dflet 0:1e7b5dd9edb4 150 void buttonHandler_2(void);
dflet 0:1e7b5dd9edb4 151 void toggleLed(int ind);
dflet 0:1e7b5dd9edb4 152 void initLEDs(void);
dflet 0:1e7b5dd9edb4 153 namespace mbed_cc3100 {
dflet 0:1e7b5dd9edb4 154 void stackDump(uint32_t stack[]);
dflet 0:1e7b5dd9edb4 155 }
dflet 0:1e7b5dd9edb4 156 void printErrorMsg(const char *errMsg);
dflet 0:1e7b5dd9edb4 157
dflet 0:1e7b5dd9edb4 158 /*
dflet 0:1e7b5dd9edb4 159 * STATIC FUNCTION DEFINITIONS -- End
dflet 0:1e7b5dd9edb4 160 */
dflet 0:1e7b5dd9edb4 161
dflet 0:1e7b5dd9edb4 162 /*
dflet 0:1e7b5dd9edb4 163 * APPLICATION SPECIFIC DATA -- Start
dflet 0:1e7b5dd9edb4 164 */
dflet 0:1e7b5dd9edb4 165 /* Connection configuration */
dflet 0:1e7b5dd9edb4 166 connect_config usr_connect_config[] =
dflet 0:1e7b5dd9edb4 167 {
dflet 0:1e7b5dd9edb4 168 {
dflet 0:1e7b5dd9edb4 169 {
dflet 0:1e7b5dd9edb4 170 {
dflet 0:1e7b5dd9edb4 171 SL_MQTT_NETCONN_URL,
dflet 0:1e7b5dd9edb4 172 SERVER_ADDRESS,
dflet 0:1e7b5dd9edb4 173 PORT_NUMBER,
dflet 0:1e7b5dd9edb4 174 0,
dflet 0:1e7b5dd9edb4 175 0,
dflet 0:1e7b5dd9edb4 176 0,
dflet 0:1e7b5dd9edb4 177 NULL
dflet 0:1e7b5dd9edb4 178 },
dflet 0:1e7b5dd9edb4 179 SERVER_MODE,
dflet 0:1e7b5dd9edb4 180 true,
dflet 0:1e7b5dd9edb4 181 },
dflet 0:1e7b5dd9edb4 182 NULL,
dflet 0:1e7b5dd9edb4 183 "user007",
dflet 0:1e7b5dd9edb4 184 // CLIENT_ID, /* Must be unique */
dflet 0:1e7b5dd9edb4 185 NULL,
dflet 0:1e7b5dd9edb4 186 NULL,
dflet 0:1e7b5dd9edb4 187 true,
dflet 0:1e7b5dd9edb4 188 KEEP_ALIVE_TIMER,
dflet 0:1e7b5dd9edb4 189 {&Mqtt_Recv, &sl_MqttEvt, &sl_MqttDisconnect},
dflet 0:1e7b5dd9edb4 190 SUB_TOPIC_COUNT,
dflet 0:1e7b5dd9edb4 191 {SUB_TOPIC1, SUB_TOPIC2},
dflet 0:1e7b5dd9edb4 192 {QOS2, QOS2},
dflet 0:1e7b5dd9edb4 193 {WILL_TOPIC, WILL_MSG, WILL_QOS, WILL_RETAIN},
dflet 0:1e7b5dd9edb4 194 false
dflet 0:1e7b5dd9edb4 195 }
dflet 0:1e7b5dd9edb4 196 };
dflet 0:1e7b5dd9edb4 197
dflet 0:1e7b5dd9edb4 198 /* library configuration */
dflet 0:1e7b5dd9edb4 199 SlMqttClientLibCfg_t Mqtt_Client =
dflet 0:1e7b5dd9edb4 200 {
dflet 0:1e7b5dd9edb4 201 LOOPBACK_PORT_NUMBER,
dflet 0:1e7b5dd9edb4 202 TASK_PRIORITY,
dflet 0:1e7b5dd9edb4 203 RCV_TIMEOUT,
dflet 0:1e7b5dd9edb4 204 true,
dflet 0:1e7b5dd9edb4 205 (int32_t(*)(const char *, ...))Dummy
dflet 0:1e7b5dd9edb4 206 };
dflet 0:1e7b5dd9edb4 207
dflet 0:1e7b5dd9edb4 208 void initLEDs(void){
dflet 0:1e7b5dd9edb4 209
dflet 0:1e7b5dd9edb4 210 #if (THIS_BOARD == EA_MBED_LPC4088)
dflet 0:1e7b5dd9edb4 211 led1 = 1;
dflet 0:1e7b5dd9edb4 212 led2 = 1;
dflet 0:1e7b5dd9edb4 213 led3 = 0;
dflet 0:1e7b5dd9edb4 214 led4 = 0;
dflet 0:1e7b5dd9edb4 215 #elif (THIS_BOARD == Seeed_Arch_Max)
dflet 0:1e7b5dd9edb4 216 /* Off board leds */
dflet 0:1e7b5dd9edb4 217 led1 = 0;
dflet 0:1e7b5dd9edb4 218 led2 = 0;
dflet 0:1e7b5dd9edb4 219 #endif
dflet 0:1e7b5dd9edb4 220
dflet 0:1e7b5dd9edb4 221 }
dflet 0:1e7b5dd9edb4 222
dflet 0:1e7b5dd9edb4 223 void toggleLed(int ind){
dflet 0:1e7b5dd9edb4 224
dflet 0:1e7b5dd9edb4 225 if(ind == 1){
dflet 0:1e7b5dd9edb4 226 led1 = !led1;
dflet 0:1e7b5dd9edb4 227 }
dflet 0:1e7b5dd9edb4 228 if(ind == 2){
dflet 0:1e7b5dd9edb4 229 led2 = !led2;
dflet 0:1e7b5dd9edb4 230 }
dflet 0:1e7b5dd9edb4 231
dflet 0:1e7b5dd9edb4 232 }
dflet 0:1e7b5dd9edb4 233
dflet 0:1e7b5dd9edb4 234 /*Publishing topics and messages*/
dflet 0:1e7b5dd9edb4 235 const char *pub_topic_1 = PUB_TOPIC_1;
dflet 0:1e7b5dd9edb4 236 const char *pub_topic_2 = PUB_TOPIC_2;
dflet 0:1e7b5dd9edb4 237 const char *data_1={"Push button s1 is pressed: Data 1"};
dflet 0:1e7b5dd9edb4 238 const char *data_2={"Push button s2 is pressed: Data 2"};
dflet 0:1e7b5dd9edb4 239 void *g_application_hndl = (void*)usr_connect_config;
dflet 0:1e7b5dd9edb4 240 /*
dflet 0:1e7b5dd9edb4 241 * APPLICATION SPECIFIC DATA -- End
dflet 0:1e7b5dd9edb4 242 */
dflet 0:1e7b5dd9edb4 243
dflet 0:1e7b5dd9edb4 244 /*Dummy print message*/
dflet 0:1e7b5dd9edb4 245 static int32_t Dummy(const char *inBuff, ...)
dflet 0:1e7b5dd9edb4 246 {
dflet 0:1e7b5dd9edb4 247 return 0;
dflet 0:1e7b5dd9edb4 248 }
dflet 0:1e7b5dd9edb4 249
dflet 0:1e7b5dd9edb4 250 /*!
dflet 0:1e7b5dd9edb4 251 \brief Defines Mqtt_Pub_Message_Receive event handler.
dflet 0:1e7b5dd9edb4 252 Client App needs to register this event handler with sl_ExtLib_mqtt_Init
dflet 0:1e7b5dd9edb4 253 API. Background receive task invokes this handler whenever MQTT Client
dflet 0:1e7b5dd9edb4 254 receives a Publish Message from the broker.
dflet 0:1e7b5dd9edb4 255
dflet 0:1e7b5dd9edb4 256 \param[out] topstr => pointer to topic of the message
dflet 0:1e7b5dd9edb4 257 \param[out] top_len => topic length
dflet 0:1e7b5dd9edb4 258 \param[out] payload => pointer to payload
dflet 0:1e7b5dd9edb4 259 \param[out] pay_len => payload length
dflet 0:1e7b5dd9edb4 260 \param[out] retain => Tells whether its a Retained message or not
dflet 0:1e7b5dd9edb4 261 \param[out] dup => Tells whether its a duplicate message or not
dflet 0:1e7b5dd9edb4 262 \param[out] qos => Tells the Qos level
dflet 0:1e7b5dd9edb4 263
dflet 0:1e7b5dd9edb4 264 \return none
dflet 0:1e7b5dd9edb4 265 */
dflet 0:1e7b5dd9edb4 266 static void
dflet 0:1e7b5dd9edb4 267 Mqtt_Recv(void *application_hndl, const char *topstr, int32_t top_len, const void *payload,
dflet 0:1e7b5dd9edb4 268 int32_t pay_len, bool dup,uint8_t qos, bool retain)
dflet 0:1e7b5dd9edb4 269 {
dflet 0:1e7b5dd9edb4 270 int8_t *output_str=(int8_t*)malloc(top_len+1);
dflet 0:1e7b5dd9edb4 271 memset(output_str,'\0',top_len+1);
dflet 0:1e7b5dd9edb4 272 strncpy((char*)output_str, topstr, top_len);
dflet 0:1e7b5dd9edb4 273 output_str[top_len]='\0';
dflet 0:1e7b5dd9edb4 274
dflet 0:1e7b5dd9edb4 275 if(strncmp((char*)output_str, SUB_TOPIC1, top_len) == 0)
dflet 0:1e7b5dd9edb4 276 {
dflet 0:1e7b5dd9edb4 277 toggleLed(1);
dflet 0:1e7b5dd9edb4 278 }
dflet 0:1e7b5dd9edb4 279 else if(strncmp((char*)output_str, SUB_TOPIC2, top_len) == 0)
dflet 0:1e7b5dd9edb4 280 {
dflet 0:1e7b5dd9edb4 281 toggleLed(2);
dflet 0:1e7b5dd9edb4 282 }
dflet 0:1e7b5dd9edb4 283
dflet 0:1e7b5dd9edb4 284 Uart_Write((uint8_t*)"\n\r Publish Message Received\r\n");
dflet 0:1e7b5dd9edb4 285
dflet 0:1e7b5dd9edb4 286 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 287 sprintf((char*) print_buf, "\n\r Topic: %s", output_str);
dflet 0:1e7b5dd9edb4 288 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 289 free(output_str);
dflet 0:1e7b5dd9edb4 290
dflet 0:1e7b5dd9edb4 291 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 292 sprintf((char*) print_buf, " [Qos: %d] ", qos);
dflet 0:1e7b5dd9edb4 293 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 294
dflet 0:1e7b5dd9edb4 295 if(retain){
dflet 0:1e7b5dd9edb4 296 Uart_Write((uint8_t*)" [Retained]\r\n");
dflet 0:1e7b5dd9edb4 297 }
dflet 0:1e7b5dd9edb4 298 if(dup){
dflet 0:1e7b5dd9edb4 299 Uart_Write((uint8_t*)" [Duplicate]\r\n");
dflet 0:1e7b5dd9edb4 300 }
dflet 0:1e7b5dd9edb4 301 output_str=(int8_t*)malloc(pay_len+1);
dflet 0:1e7b5dd9edb4 302 memset(output_str,'\0',pay_len+1);
dflet 0:1e7b5dd9edb4 303 strncpy((char*)output_str, (const char*)payload, pay_len);
dflet 0:1e7b5dd9edb4 304 output_str[pay_len]='\0';
dflet 0:1e7b5dd9edb4 305
dflet 0:1e7b5dd9edb4 306 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 307 sprintf((char*) print_buf, " \n\r Data is: %s\n\r", (char*)output_str);
dflet 0:1e7b5dd9edb4 308 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 309
dflet 0:1e7b5dd9edb4 310 free(output_str);
dflet 0:1e7b5dd9edb4 311
dflet 0:1e7b5dd9edb4 312 return;
dflet 0:1e7b5dd9edb4 313 }
dflet 0:1e7b5dd9edb4 314
dflet 0:1e7b5dd9edb4 315 /*!
dflet 0:1e7b5dd9edb4 316 \brief Defines sl_MqttEvt event handler.
dflet 0:1e7b5dd9edb4 317 Client App needs to register this event handler with sl_ExtLib_mqtt_Init
dflet 0:1e7b5dd9edb4 318 API. Background receive task invokes this handler whenever MQTT Client
dflet 0:1e7b5dd9edb4 319 receives an ack(whenever user is in non-blocking mode) or encounters an error.
dflet 0:1e7b5dd9edb4 320
dflet 0:1e7b5dd9edb4 321 \param[out] evt => Event that invokes the handler. Event can be of the
dflet 0:1e7b5dd9edb4 322 following types:
dflet 0:1e7b5dd9edb4 323 MQTT_ACK - Ack Received
dflet 0:1e7b5dd9edb4 324 MQTT_ERROR - unknown error
dflet 0:1e7b5dd9edb4 325
dflet 0:1e7b5dd9edb4 326
dflet 0:1e7b5dd9edb4 327 \param[out] buf => points to buffer
dflet 0:1e7b5dd9edb4 328 \param[out] len => buffer length
dflet 0:1e7b5dd9edb4 329
dflet 0:1e7b5dd9edb4 330 \return none
dflet 0:1e7b5dd9edb4 331 */
dflet 0:1e7b5dd9edb4 332 static void
dflet 0:1e7b5dd9edb4 333 sl_MqttEvt(void *application_hndl,int32_t evt, const void *buf,uint32_t len)
dflet 0:1e7b5dd9edb4 334 {
dflet 0:1e7b5dd9edb4 335 int32_t i;
dflet 0:1e7b5dd9edb4 336
dflet 0:1e7b5dd9edb4 337 switch(evt)
dflet 0:1e7b5dd9edb4 338 {
dflet 0:1e7b5dd9edb4 339 case SL_MQTT_CL_EVT_PUBACK:
dflet 0:1e7b5dd9edb4 340 {
dflet 0:1e7b5dd9edb4 341 Uart_Write((uint8_t*)" PubAck:\n\r");
dflet 0:1e7b5dd9edb4 342 }
dflet 0:1e7b5dd9edb4 343 break;
dflet 0:1e7b5dd9edb4 344
dflet 0:1e7b5dd9edb4 345 case SL_MQTT_CL_EVT_SUBACK:
dflet 0:1e7b5dd9edb4 346 {
dflet 0:1e7b5dd9edb4 347 Uart_Write((uint8_t*)"\n\r Granted QoS Levels\n\r");
dflet 0:1e7b5dd9edb4 348
dflet 0:1e7b5dd9edb4 349 for(i=0;i<len;i++)
dflet 0:1e7b5dd9edb4 350 {
dflet 0:1e7b5dd9edb4 351 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 352 sprintf((char*) print_buf, " QoS %d\n\r",((uint8_t*)buf)[i]);
dflet 0:1e7b5dd9edb4 353 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 354 }
dflet 0:1e7b5dd9edb4 355 }
dflet 0:1e7b5dd9edb4 356 break;
dflet 0:1e7b5dd9edb4 357
dflet 0:1e7b5dd9edb4 358 case SL_MQTT_CL_EVT_UNSUBACK:
dflet 0:1e7b5dd9edb4 359 {
dflet 0:1e7b5dd9edb4 360 Uart_Write((uint8_t*)" UnSub Ack:\n\r");
dflet 0:1e7b5dd9edb4 361 }
dflet 0:1e7b5dd9edb4 362 break;
dflet 0:1e7b5dd9edb4 363
dflet 0:1e7b5dd9edb4 364 default:
dflet 0:1e7b5dd9edb4 365 {
dflet 0:1e7b5dd9edb4 366 Uart_Write((uint8_t*)" [MQTT EVENT] Unexpected event \n\r");
dflet 0:1e7b5dd9edb4 367 }
dflet 0:1e7b5dd9edb4 368 break;
dflet 0:1e7b5dd9edb4 369 }
dflet 0:1e7b5dd9edb4 370 }
dflet 0:1e7b5dd9edb4 371
dflet 0:1e7b5dd9edb4 372 /*!
dflet 0:1e7b5dd9edb4 373
dflet 0:1e7b5dd9edb4 374 \brief callback event in case of MQTT disconnection
dflet 0:1e7b5dd9edb4 375
dflet 0:1e7b5dd9edb4 376 \param application_hndl is the handle for the disconnected connection
dflet 0:1e7b5dd9edb4 377
dflet 0:1e7b5dd9edb4 378 \return none
dflet 0:1e7b5dd9edb4 379
dflet 0:1e7b5dd9edb4 380 */
dflet 0:1e7b5dd9edb4 381 static void
dflet 0:1e7b5dd9edb4 382 sl_MqttDisconnect(void *application_hndl)
dflet 0:1e7b5dd9edb4 383 {
dflet 0:1e7b5dd9edb4 384 connect_config *local_con_conf;
dflet 0:1e7b5dd9edb4 385 osi_messages var = BROKER_DISCONNECTION;
dflet 0:1e7b5dd9edb4 386 local_con_conf = (connect_config*)application_hndl;
dflet 0:1e7b5dd9edb4 387 sl_ExtLib_MqttClientUnsub(local_con_conf->clt_ctx, local_con_conf->topic,
dflet 0:1e7b5dd9edb4 388 SUB_TOPIC_COUNT);
dflet 0:1e7b5dd9edb4 389
dflet 0:1e7b5dd9edb4 390 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 391 sprintf((char*) print_buf, " Disconnect from broker %s\r\n",
dflet 0:1e7b5dd9edb4 392 (local_con_conf->broker_config).server_info.server_addr);
dflet 0:1e7b5dd9edb4 393 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 394
dflet 0:1e7b5dd9edb4 395 local_con_conf->is_connected = false;
dflet 0:1e7b5dd9edb4 396 sl_ExtLib_MqttClientCtxDelete(local_con_conf->clt_ctx);
dflet 0:1e7b5dd9edb4 397
dflet 0:1e7b5dd9edb4 398 /*
dflet 0:1e7b5dd9edb4 399 * Write message indicating publish message
dflet 0:1e7b5dd9edb4 400 */
dflet 0:1e7b5dd9edb4 401 osi_MsgQWrite(&g_PBQueue, &var, OSI_NO_WAIT);
dflet 0:1e7b5dd9edb4 402 }
dflet 0:1e7b5dd9edb4 403
dflet 0:1e7b5dd9edb4 404 /*
dflet 0:1e7b5dd9edb4 405 \brief Application defined hook (or callback) function - assert
dflet 0:1e7b5dd9edb4 406
dflet 0:1e7b5dd9edb4 407 \param[in] pcFile - Pointer to the File Name
dflet 0:1e7b5dd9edb4 408 \param[in] ulLine - Line Number
dflet 0:1e7b5dd9edb4 409
dflet 0:1e7b5dd9edb4 410 \return none
dflet 0:1e7b5dd9edb4 411 */
dflet 0:1e7b5dd9edb4 412 void vAssertCalled(const int8_t *pcFile, uint32_t ulLine)
dflet 0:1e7b5dd9edb4 413 {
dflet 0:1e7b5dd9edb4 414 /* Handle Assert here */
dflet 0:1e7b5dd9edb4 415 while(1)
dflet 0:1e7b5dd9edb4 416 {
dflet 0:1e7b5dd9edb4 417 }
dflet 0:1e7b5dd9edb4 418 }
dflet 0:1e7b5dd9edb4 419
dflet 0:1e7b5dd9edb4 420 /*
dflet 0:1e7b5dd9edb4 421
dflet 0:1e7b5dd9edb4 422 \brief Application defined idle task hook
dflet 0:1e7b5dd9edb4 423
dflet 0:1e7b5dd9edb4 424 \param none
dflet 0:1e7b5dd9edb4 425
dflet 0:1e7b5dd9edb4 426 \return none
dflet 0:1e7b5dd9edb4 427
dflet 0:1e7b5dd9edb4 428 */
dflet 0:1e7b5dd9edb4 429 void vApplicationIdleHook(void)
dflet 0:1e7b5dd9edb4 430 {
dflet 0:1e7b5dd9edb4 431 /* Handle Idle Hook for Profiling, Power Management etc */
dflet 0:1e7b5dd9edb4 432 }
dflet 0:1e7b5dd9edb4 433
dflet 0:1e7b5dd9edb4 434 /*
dflet 0:1e7b5dd9edb4 435
dflet 0:1e7b5dd9edb4 436 \brief Application defined malloc failed hook
dflet 0:1e7b5dd9edb4 437
dflet 0:1e7b5dd9edb4 438 \param none
dflet 0:1e7b5dd9edb4 439
dflet 0:1e7b5dd9edb4 440 \return none
dflet 0:1e7b5dd9edb4 441
dflet 0:1e7b5dd9edb4 442 */
dflet 0:1e7b5dd9edb4 443 void vApplicationMallocFailedHook(void)
dflet 0:1e7b5dd9edb4 444 {
dflet 0:1e7b5dd9edb4 445 /* Handle Memory Allocation Errors */
dflet 0:1e7b5dd9edb4 446 while(1)
dflet 0:1e7b5dd9edb4 447 {
dflet 0:1e7b5dd9edb4 448 }
dflet 0:1e7b5dd9edb4 449 }
dflet 0:1e7b5dd9edb4 450
dflet 0:1e7b5dd9edb4 451 /*
dflet 0:1e7b5dd9edb4 452
dflet 0:1e7b5dd9edb4 453 \brief Application defined stack overflow hook
dflet 0:1e7b5dd9edb4 454
dflet 0:1e7b5dd9edb4 455 \param none
dflet 0:1e7b5dd9edb4 456
dflet 0:1e7b5dd9edb4 457 \return none
dflet 0:1e7b5dd9edb4 458
dflet 0:1e7b5dd9edb4 459 */
dflet 0:1e7b5dd9edb4 460 void vApplicationStackOverflowHook( OsiTaskHandle *pxTask,
dflet 0:1e7b5dd9edb4 461 int8_t *pcTaskName )
dflet 0:1e7b5dd9edb4 462 {
dflet 0:1e7b5dd9edb4 463 /* Handle FreeRTOS Stack Overflow */
dflet 0:1e7b5dd9edb4 464 while(1)
dflet 0:1e7b5dd9edb4 465 {
dflet 0:1e7b5dd9edb4 466 }
dflet 0:1e7b5dd9edb4 467 }
dflet 0:1e7b5dd9edb4 468
dflet 0:1e7b5dd9edb4 469 /*!
dflet 0:1e7b5dd9edb4 470 \brief Publishes the message on a topic.
dflet 0:1e7b5dd9edb4 471
dflet 0:1e7b5dd9edb4 472 \param[in] clt_ctx - Client context
dflet 0:1e7b5dd9edb4 473 \param[in] publish_topic - Topic on which the message will be published
dflet 0:1e7b5dd9edb4 474 \param[in] publish_data - The message that will be published
dflet 0:1e7b5dd9edb4 475
dflet 0:1e7b5dd9edb4 476 \return none
dflet 0:1e7b5dd9edb4 477 */
dflet 0:1e7b5dd9edb4 478 static void
dflet 0:1e7b5dd9edb4 479 publishData(void *clt_ctx, const char *publish_topic, uint8_t *publish_data)
dflet 0:1e7b5dd9edb4 480 {
dflet 0:1e7b5dd9edb4 481 // printf("publishData\n\r");
dflet 0:1e7b5dd9edb4 482 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 483
dflet 0:1e7b5dd9edb4 484 /*
dflet 0:1e7b5dd9edb4 485 * Send the publish message
dflet 0:1e7b5dd9edb4 486 */
dflet 0:1e7b5dd9edb4 487 retVal = sl_ExtLib_MqttClientSend((void*)clt_ctx,
dflet 0:1e7b5dd9edb4 488 publish_topic ,publish_data, strlen((const char*)publish_data), QOS2, RETAIN);
dflet 0:1e7b5dd9edb4 489 if(retVal < 0)
dflet 0:1e7b5dd9edb4 490 {
dflet 0:1e7b5dd9edb4 491 Uart_Write((uint8_t*)"\n\r CC3100 failed to publish the message\n\r");
dflet 0:1e7b5dd9edb4 492 return;
dflet 0:1e7b5dd9edb4 493 }
dflet 0:1e7b5dd9edb4 494
dflet 0:1e7b5dd9edb4 495 Uart_Write((uint8_t*)"\n\r CC3100 Publishes the following message \n\r");
dflet 0:1e7b5dd9edb4 496
dflet 0:1e7b5dd9edb4 497 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 498 sprintf((char*) print_buf, " Topic: %s\n\r", publish_topic);
dflet 0:1e7b5dd9edb4 499 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 500
dflet 0:1e7b5dd9edb4 501 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 502 sprintf((char*) print_buf, " Data: %s\n\r", publish_data);
dflet 0:1e7b5dd9edb4 503 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 504 }
dflet 0:1e7b5dd9edb4 505
dflet 0:1e7b5dd9edb4 506 /*!
dflet 0:1e7b5dd9edb4 507
dflet 0:1e7b5dd9edb4 508 \brief Task implementing MQTT client communication to other web client through
dflet 0:1e7b5dd9edb4 509 a broker
dflet 0:1e7b5dd9edb4 510
dflet 0:1e7b5dd9edb4 511 \param none
dflet 0:1e7b5dd9edb4 512
dflet 0:1e7b5dd9edb4 513 This function
dflet 0:1e7b5dd9edb4 514 1. Initializes network driver and connects to the default AP
dflet 0:1e7b5dd9edb4 515 2. Initializes the mqtt library and set up MQTT connection configurations
dflet 0:1e7b5dd9edb4 516 3. set up the button events and their callbacks(for publishing)
dflet 0:1e7b5dd9edb4 517 4. handles the callback signals
dflet 0:1e7b5dd9edb4 518
dflet 0:1e7b5dd9edb4 519 \return none
dflet 0:1e7b5dd9edb4 520
dflet 0:1e7b5dd9edb4 521 */
dflet 0:1e7b5dd9edb4 522 static void MqttClient(void *pvParameters)
dflet 0:1e7b5dd9edb4 523 {
dflet 0:1e7b5dd9edb4 524 Uart_Write((uint8_t*)"MqttClient\r\n");
dflet 0:1e7b5dd9edb4 525 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 526 int32_t iCount = 0;
dflet 0:1e7b5dd9edb4 527 int32_t iNumBroker = 0;
dflet 0:1e7b5dd9edb4 528 int32_t iConnBroker = 0;
dflet 0:1e7b5dd9edb4 529 osi_messages RecvQue;
dflet 0:1e7b5dd9edb4 530
dflet 0:1e7b5dd9edb4 531 connect_config *local_con_conf = (connect_config *)g_application_hndl;
dflet 0:1e7b5dd9edb4 532
dflet 0:1e7b5dd9edb4 533 /* Configure LED */
dflet 0:1e7b5dd9edb4 534 initLEDs();
dflet 0:1e7b5dd9edb4 535 _cc3100._spi.button1_InterruptEnable();
dflet 0:1e7b5dd9edb4 536 _cc3100._spi.button2_InterruptEnable();
dflet 0:1e7b5dd9edb4 537
dflet 0:1e7b5dd9edb4 538 // registerButtonIrqHandler(buttonHandler, NULL);
dflet 0:1e7b5dd9edb4 539
dflet 0:1e7b5dd9edb4 540 /*
dflet 0:1e7b5dd9edb4 541 * Following function configures the device to default state by cleaning
dflet 0:1e7b5dd9edb4 542 * the persistent settings stored in NVMEM (viz. connection profiles &
dflet 0:1e7b5dd9edb4 543 * policies, power policy etc)
dflet 0:1e7b5dd9edb4 544 *
dflet 0:1e7b5dd9edb4 545 * Applications may choose to skip this step if the developer is sure
dflet 0:1e7b5dd9edb4 546 * that the device is in its default state at start of application
dflet 0:1e7b5dd9edb4 547 *
dflet 0:1e7b5dd9edb4 548 * Note that all profiles and persistent settings that were done on the
dflet 0:1e7b5dd9edb4 549 * device will be lost
dflet 0:1e7b5dd9edb4 550 */
dflet 0:1e7b5dd9edb4 551 retVal = _cc3100.configureSimpleLinkToDefaultState();
dflet 0:1e7b5dd9edb4 552 if(retVal < 0)
dflet 0:1e7b5dd9edb4 553 {
dflet 0:1e7b5dd9edb4 554 if(DEVICE_NOT_IN_STATION_MODE == retVal)
dflet 0:1e7b5dd9edb4 555 Uart_Write((uint8_t*)" Failed to configure the device in its default state \n\r");
dflet 0:1e7b5dd9edb4 556
dflet 0:1e7b5dd9edb4 557 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 558 }
dflet 0:1e7b5dd9edb4 559
dflet 0:1e7b5dd9edb4 560 Uart_Write((uint8_t*)" Device is configured in default state \n\r");
dflet 0:1e7b5dd9edb4 561
dflet 0:1e7b5dd9edb4 562 /*
dflet 0:1e7b5dd9edb4 563 * Assumption is that the device is configured in station mode already
dflet 0:1e7b5dd9edb4 564 * and it is in its default state
dflet 0:1e7b5dd9edb4 565 */
dflet 0:1e7b5dd9edb4 566 retVal = _cc3100.sl_Start(0, 0, 0);
dflet 0:1e7b5dd9edb4 567 if ((retVal < 0) ||
dflet 0:1e7b5dd9edb4 568 (ROLE_STA != retVal) )
dflet 0:1e7b5dd9edb4 569 {
dflet 0:1e7b5dd9edb4 570 Uart_Write((uint8_t*)" Failed to start the device \n\r");
dflet 0:1e7b5dd9edb4 571 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 572 }
dflet 0:1e7b5dd9edb4 573
dflet 0:1e7b5dd9edb4 574 Uart_Write((uint8_t*)" Device started as STATION \n\r");
dflet 0:1e7b5dd9edb4 575
dflet 0:1e7b5dd9edb4 576 /* Connecting to WLAN AP */
dflet 0:1e7b5dd9edb4 577 retVal = _cc3100.establishConnectionWithAP();
dflet 0:1e7b5dd9edb4 578 if(retVal < 0)
dflet 0:1e7b5dd9edb4 579 {
dflet 0:1e7b5dd9edb4 580 Uart_Write((uint8_t*)" Failed to establish connection w/ an AP \n\r");
dflet 0:1e7b5dd9edb4 581 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 582 }
dflet 0:1e7b5dd9edb4 583
dflet 0:1e7b5dd9edb4 584 Uart_Write((uint8_t*)"\r\n Connection established with AP\n\r");
dflet 0:1e7b5dd9edb4 585
dflet 0:1e7b5dd9edb4 586 /* Initialize MQTT client lib */
dflet 0:1e7b5dd9edb4 587 retVal = sl_ExtLib_MqttClientInit(&Mqtt_Client);
dflet 0:1e7b5dd9edb4 588 if(retVal != 0)
dflet 0:1e7b5dd9edb4 589 {
dflet 0:1e7b5dd9edb4 590 /* lib initialization failed */
dflet 0:1e7b5dd9edb4 591 Uart_Write((uint8_t*)"MQTT Client lib initialization failed\n\r");
dflet 0:1e7b5dd9edb4 592 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 593 }
dflet 0:1e7b5dd9edb4 594 // Uart_Write((uint8_t*)"MQTT Client lib initialized\n\r");
dflet 0:1e7b5dd9edb4 595
dflet 0:1e7b5dd9edb4 596 /*
dflet 0:1e7b5dd9edb4 597 * Connection to the broker
dflet 0:1e7b5dd9edb4 598 */
dflet 0:1e7b5dd9edb4 599 iNumBroker = sizeof(usr_connect_config)/sizeof(connect_config);
dflet 0:1e7b5dd9edb4 600 if(iNumBroker > MAX_BROKER_CONN)
dflet 0:1e7b5dd9edb4 601 {
dflet 0:1e7b5dd9edb4 602 Uart_Write((uint8_t*)"Num of brokers are more then max num of brokers\n\r");
dflet 0:1e7b5dd9edb4 603 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 604 }
dflet 0:1e7b5dd9edb4 605
dflet 0:1e7b5dd9edb4 606 while(iCount < iNumBroker)
dflet 0:1e7b5dd9edb4 607 {
dflet 0:1e7b5dd9edb4 608 /*
dflet 0:1e7b5dd9edb4 609 * create client context
dflet 0:1e7b5dd9edb4 610 */
dflet 0:1e7b5dd9edb4 611
dflet 0:1e7b5dd9edb4 612 local_con_conf[iCount].clt_ctx =
dflet 0:1e7b5dd9edb4 613 sl_ExtLib_MqttClientCtxCreate(&local_con_conf[iCount].broker_config,
dflet 0:1e7b5dd9edb4 614 &local_con_conf[iCount].CallBAcks,
dflet 0:1e7b5dd9edb4 615 &(local_con_conf[iCount]));
dflet 0:1e7b5dd9edb4 616
dflet 0:1e7b5dd9edb4 617 /*
dflet 0:1e7b5dd9edb4 618 * Set Client ID
dflet 0:1e7b5dd9edb4 619 */
dflet 0:1e7b5dd9edb4 620 sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
dflet 0:1e7b5dd9edb4 621 SL_MQTT_PARAM_CLIENT_ID,
dflet 0:1e7b5dd9edb4 622 local_con_conf[iCount].client_id,
dflet 0:1e7b5dd9edb4 623 strlen((local_con_conf[iCount].client_id)));
dflet 0:1e7b5dd9edb4 624
dflet 0:1e7b5dd9edb4 625 /*
dflet 0:1e7b5dd9edb4 626 * Set will Params
dflet 0:1e7b5dd9edb4 627 */
dflet 0:1e7b5dd9edb4 628 if(local_con_conf[iCount].will_params.will_topic != NULL)
dflet 0:1e7b5dd9edb4 629 {
dflet 0:1e7b5dd9edb4 630 sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
dflet 0:1e7b5dd9edb4 631 SL_MQTT_PARAM_WILL_PARAM,
dflet 0:1e7b5dd9edb4 632 &(local_con_conf[iCount].will_params),
dflet 0:1e7b5dd9edb4 633 sizeof(SlMqttWill_t));
dflet 0:1e7b5dd9edb4 634 }
dflet 0:1e7b5dd9edb4 635
dflet 0:1e7b5dd9edb4 636 /*
dflet 0:1e7b5dd9edb4 637 * Setting user name and password
dflet 0:1e7b5dd9edb4 638 */
dflet 0:1e7b5dd9edb4 639 if(local_con_conf[iCount].usr_name != NULL)
dflet 0:1e7b5dd9edb4 640 {
dflet 0:1e7b5dd9edb4 641 sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
dflet 0:1e7b5dd9edb4 642 SL_MQTT_PARAM_USER_NAME,
dflet 0:1e7b5dd9edb4 643 local_con_conf[iCount].usr_name,
dflet 0:1e7b5dd9edb4 644 strlen((const char*)local_con_conf[iCount].usr_name));
dflet 0:1e7b5dd9edb4 645
dflet 0:1e7b5dd9edb4 646 if(local_con_conf[iCount].usr_pwd != NULL)
dflet 0:1e7b5dd9edb4 647 {
dflet 0:1e7b5dd9edb4 648 sl_ExtLib_MqttClientSet((void*)local_con_conf[iCount].clt_ctx,
dflet 0:1e7b5dd9edb4 649 SL_MQTT_PARAM_PASS_WORD,
dflet 0:1e7b5dd9edb4 650 local_con_conf[iCount].usr_pwd,
dflet 0:1e7b5dd9edb4 651 strlen((const char*)local_con_conf[iCount].usr_pwd));
dflet 0:1e7b5dd9edb4 652 }
dflet 0:1e7b5dd9edb4 653 }
dflet 0:1e7b5dd9edb4 654
dflet 0:1e7b5dd9edb4 655 /*
dflet 0:1e7b5dd9edb4 656 * Connecting to the broker
dflet 0:1e7b5dd9edb4 657 */
dflet 0:1e7b5dd9edb4 658 if((sl_ExtLib_MqttClientConnect((void*)local_con_conf[iCount].clt_ctx,
dflet 0:1e7b5dd9edb4 659 local_con_conf[iCount].is_clean,
dflet 0:1e7b5dd9edb4 660 local_con_conf[iCount].keep_alive_time) & 0xFF) != 0)
dflet 0:1e7b5dd9edb4 661 {
dflet 0:1e7b5dd9edb4 662 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 663 sprintf((char*) print_buf, "\n\r Broker connect failed for conn no. %d \n\r", (int16_t)iCount+1);
dflet 0:1e7b5dd9edb4 664 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 665
dflet 0:1e7b5dd9edb4 666 /*
dflet 0:1e7b5dd9edb4 667 * Delete the context for this connection
dflet 0:1e7b5dd9edb4 668 */
dflet 0:1e7b5dd9edb4 669 sl_ExtLib_MqttClientCtxDelete(local_con_conf[iCount].clt_ctx);
dflet 0:1e7b5dd9edb4 670
dflet 0:1e7b5dd9edb4 671 break;
dflet 0:1e7b5dd9edb4 672 }
dflet 0:1e7b5dd9edb4 673 else
dflet 0:1e7b5dd9edb4 674 {
dflet 0:1e7b5dd9edb4 675 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 676 sprintf((char*) print_buf, "\n\r Success: conn to Broker no. %d \n\r ", (int16_t)iCount+1);
dflet 0:1e7b5dd9edb4 677 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 678
dflet 0:1e7b5dd9edb4 679 local_con_conf[iCount].is_connected = true;
dflet 0:1e7b5dd9edb4 680 iConnBroker++;
dflet 0:1e7b5dd9edb4 681 }
dflet 0:1e7b5dd9edb4 682
dflet 0:1e7b5dd9edb4 683 /*
dflet 0:1e7b5dd9edb4 684 * Subscribe to topics
dflet 0:1e7b5dd9edb4 685 */
dflet 0:1e7b5dd9edb4 686 if(sl_ExtLib_MqttClientSub((void*)local_con_conf[iCount].clt_ctx,
dflet 0:1e7b5dd9edb4 687 local_con_conf[iCount].topic,
dflet 0:1e7b5dd9edb4 688 local_con_conf[iCount].qos, SUB_TOPIC_COUNT) < 0)
dflet 0:1e7b5dd9edb4 689 {
dflet 0:1e7b5dd9edb4 690 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 691 sprintf((char*) print_buf, "\n\r Subscription Error for conn no. %d \n\r", (int16_t)iCount+1);
dflet 0:1e7b5dd9edb4 692 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 693
dflet 0:1e7b5dd9edb4 694 Uart_Write((uint8_t*)"Disconnecting from the broker\r\n");
dflet 0:1e7b5dd9edb4 695
dflet 0:1e7b5dd9edb4 696 sl_ExtLib_MqttClientDisconnect(local_con_conf[iCount].clt_ctx);
dflet 0:1e7b5dd9edb4 697 local_con_conf[iCount].is_connected = false;
dflet 0:1e7b5dd9edb4 698
dflet 0:1e7b5dd9edb4 699 /*
dflet 0:1e7b5dd9edb4 700 * Delete the context for this connection
dflet 0:1e7b5dd9edb4 701 */
dflet 0:1e7b5dd9edb4 702 sl_ExtLib_MqttClientCtxDelete(local_con_conf[iCount].clt_ctx);
dflet 0:1e7b5dd9edb4 703 iConnBroker--;
dflet 0:1e7b5dd9edb4 704 break;
dflet 0:1e7b5dd9edb4 705 }
dflet 0:1e7b5dd9edb4 706 else
dflet 0:1e7b5dd9edb4 707 {
dflet 0:1e7b5dd9edb4 708 int32_t iSub;
dflet 0:1e7b5dd9edb4 709
dflet 0:1e7b5dd9edb4 710 Uart_Write((uint8_t*)"Client subscribed on following topics:\n\r");
dflet 0:1e7b5dd9edb4 711 for(iSub = 0; iSub < local_con_conf[iCount].num_topics; iSub++)
dflet 0:1e7b5dd9edb4 712 {
dflet 0:1e7b5dd9edb4 713 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 714 sprintf((char*) print_buf, " %s\n\r", local_con_conf[iCount].topic[iSub]);
dflet 0:1e7b5dd9edb4 715 Uart_Write((uint8_t*)print_buf); Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 716 }
dflet 0:1e7b5dd9edb4 717 }
dflet 0:1e7b5dd9edb4 718 iCount++;
dflet 0:1e7b5dd9edb4 719 }
dflet 0:1e7b5dd9edb4 720
dflet 0:1e7b5dd9edb4 721 if(iConnBroker < 1)
dflet 0:1e7b5dd9edb4 722 {
dflet 0:1e7b5dd9edb4 723 /*
dflet 0:1e7b5dd9edb4 724 * No successful connection to broker
dflet 0:1e7b5dd9edb4 725
dflet 0:1e7b5dd9edb4 726 */
dflet 0:1e7b5dd9edb4 727 Uart_Write((uint8_t*)"No successful connections to a broker\r\n");
dflet 0:1e7b5dd9edb4 728 goto end;
dflet 0:1e7b5dd9edb4 729 }
dflet 0:1e7b5dd9edb4 730
dflet 0:1e7b5dd9edb4 731 iCount = 0;
dflet 0:1e7b5dd9edb4 732
dflet 0:1e7b5dd9edb4 733 for(;;)
dflet 0:1e7b5dd9edb4 734 {
dflet 0:1e7b5dd9edb4 735 Uart_Write((uint8_t*)"Waiting for button push event\r\n");
dflet 0:1e7b5dd9edb4 736 osi_MsgQRead( &g_PBQueue, &RecvQue, OSI_WAIT_FOREVER);
dflet 0:1e7b5dd9edb4 737
dflet 0:1e7b5dd9edb4 738 if(PUSH_BUTTON_1_PRESSED == RecvQue)
dflet 0:1e7b5dd9edb4 739 {
dflet 0:1e7b5dd9edb4 740 publishData((void*)local_con_conf[iCount].clt_ctx, pub_topic_1, (uint8_t*)data_1);
dflet 0:1e7b5dd9edb4 741 _cc3100._spi.button1_InterruptEnable();
dflet 0:1e7b5dd9edb4 742 }
dflet 0:1e7b5dd9edb4 743 else if(PUSH_BUTTON_2_PRESSED == RecvQue)
dflet 0:1e7b5dd9edb4 744 {
dflet 0:1e7b5dd9edb4 745 publishData((void*)local_con_conf[iCount].clt_ctx, pub_topic_2, (uint8_t*)data_2);
dflet 0:1e7b5dd9edb4 746 _cc3100._spi.button2_InterruptEnable();
dflet 0:1e7b5dd9edb4 747 }
dflet 0:1e7b5dd9edb4 748 else if(BROKER_DISCONNECTION == RecvQue)
dflet 0:1e7b5dd9edb4 749 {
dflet 0:1e7b5dd9edb4 750 iConnBroker--;
dflet 0:1e7b5dd9edb4 751 if(iConnBroker < 1)
dflet 0:1e7b5dd9edb4 752 {
dflet 0:1e7b5dd9edb4 753 /*
dflet 0:1e7b5dd9edb4 754 * Device not connected to any broker
dflet 0:1e7b5dd9edb4 755 */
dflet 0:1e7b5dd9edb4 756 goto end;
dflet 0:1e7b5dd9edb4 757 }
dflet 0:1e7b5dd9edb4 758 }
dflet 0:1e7b5dd9edb4 759 }
dflet 0:1e7b5dd9edb4 760
dflet 0:1e7b5dd9edb4 761 end:
dflet 0:1e7b5dd9edb4 762 /*
dflet 0:1e7b5dd9edb4 763 * De-initializing the client library
dflet 0:1e7b5dd9edb4 764 */
dflet 0:1e7b5dd9edb4 765 sl_ExtLib_MqttClientExit();
dflet 0:1e7b5dd9edb4 766
dflet 0:1e7b5dd9edb4 767 Uart_Write((uint8_t*)"\n\r Exiting the Application\n\r");
dflet 0:1e7b5dd9edb4 768
dflet 0:1e7b5dd9edb4 769 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 770 }
dflet 0:1e7b5dd9edb4 771
dflet 0:1e7b5dd9edb4 772
dflet 0:1e7b5dd9edb4 773 /*
dflet 0:1e7b5dd9edb4 774 * Application's entry point
dflet 0:1e7b5dd9edb4 775 */
dflet 0:1e7b5dd9edb4 776 int main(int argc, char** argv)
dflet 0:1e7b5dd9edb4 777 {
dflet 0:1e7b5dd9edb4 778 int rv = 0;
dflet 0:1e7b5dd9edb4 779
dflet 0:1e7b5dd9edb4 780 CLI_Configure();
dflet 0:1e7b5dd9edb4 781
dflet 0:1e7b5dd9edb4 782 memset(print_buf, 0x00, PRINT_BUF_LEN);
dflet 0:1e7b5dd9edb4 783 sprintf((char*) print_buf, " \r\nSystemCoreClock = %dMHz\r\n ", SystemCoreClock /1000000);
dflet 0:1e7b5dd9edb4 784 rv = Uart_Write((uint8_t *) print_buf);
dflet 0:1e7b5dd9edb4 785 if(rv < 0){
dflet 0:1e7b5dd9edb4 786 while(1){
dflet 0:1e7b5dd9edb4 787 toggleLed(1);
dflet 0:1e7b5dd9edb4 788 wait(0.1);
dflet 0:1e7b5dd9edb4 789 }
dflet 0:1e7b5dd9edb4 790 }
dflet 0:1e7b5dd9edb4 791
dflet 0:1e7b5dd9edb4 792 int32_t retVal = -1;
dflet 0:1e7b5dd9edb4 793
dflet 0:1e7b5dd9edb4 794 //
dflet 0:1e7b5dd9edb4 795 // Display Application Banner
dflet 0:1e7b5dd9edb4 796 //
dflet 0:1e7b5dd9edb4 797 displayBanner();
dflet 0:1e7b5dd9edb4 798
dflet 0:1e7b5dd9edb4 799 createMutex();
dflet 0:1e7b5dd9edb4 800
dflet 0:1e7b5dd9edb4 801 /*
dflet 0:1e7b5dd9edb4 802 * Start the SimpleLink Host
dflet 0:1e7b5dd9edb4 803 */
dflet 0:1e7b5dd9edb4 804 retVal = VStartSimpleLinkSpawnTask(SPAWN_TASK_PRIORITY);
dflet 0:1e7b5dd9edb4 805 if(retVal < 0)
dflet 0:1e7b5dd9edb4 806 {
dflet 0:1e7b5dd9edb4 807 Uart_Write((uint8_t*)"VStartSimpleLinkSpawnTask Failed\r\n");
dflet 0:1e7b5dd9edb4 808 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 809 }
dflet 0:1e7b5dd9edb4 810 toggleLed(1);
dflet 0:1e7b5dd9edb4 811
dflet 0:1e7b5dd9edb4 812 /*
dflet 0:1e7b5dd9edb4 813 * Start the MQTT Client task
dflet 0:1e7b5dd9edb4 814 */
dflet 0:1e7b5dd9edb4 815 osi_MsgQCreate(&g_PBQueue,"PBQueue",sizeof(osi_messages),MAX_QUEUE_MSG);
dflet 0:1e7b5dd9edb4 816 retVal = osi_TaskCreate(MqttClient,
dflet 0:1e7b5dd9edb4 817 (const int8_t *)"Mqtt Client App",
dflet 0:1e7b5dd9edb4 818 OSI_STACK_SIZE, NULL, MQTT_APP_TASK_PRIORITY, NULL );
dflet 0:1e7b5dd9edb4 819
dflet 0:1e7b5dd9edb4 820 if(retVal < 0)
dflet 0:1e7b5dd9edb4 821 {
dflet 0:1e7b5dd9edb4 822 Uart_Write((uint8_t*)"osi_TaskCreate Failed\r\n");
dflet 0:1e7b5dd9edb4 823 LOOP_FOREVER();
dflet 0:1e7b5dd9edb4 824 }
dflet 0:1e7b5dd9edb4 825
dflet 0:1e7b5dd9edb4 826 /*
dflet 0:1e7b5dd9edb4 827 * Start the task scheduler
dflet 0:1e7b5dd9edb4 828 */
dflet 0:1e7b5dd9edb4 829 Uart_Write((uint8_t*)"Start the task scheduler\r\n");
dflet 0:1e7b5dd9edb4 830
dflet 0:1e7b5dd9edb4 831 osi_start();
dflet 0:1e7b5dd9edb4 832
dflet 0:1e7b5dd9edb4 833 return 0;
dflet 0:1e7b5dd9edb4 834 }
dflet 0:1e7b5dd9edb4 835
dflet 0:1e7b5dd9edb4 836 /*!
dflet 0:1e7b5dd9edb4 837 \brief This function displays the application's banner
dflet 0:1e7b5dd9edb4 838
dflet 0:1e7b5dd9edb4 839 \param None
dflet 0:1e7b5dd9edb4 840
dflet 0:1e7b5dd9edb4 841 \return None
dflet 0:1e7b5dd9edb4 842 */
dflet 0:1e7b5dd9edb4 843 static void displayBanner()
dflet 0:1e7b5dd9edb4 844 {
dflet 0:1e7b5dd9edb4 845 Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 846 Uart_Write((uint8_t*)" *************************************************\r\n");
dflet 0:1e7b5dd9edb4 847 Uart_Write((uint8_t*)" MQTT Client Application - Version\r\n");
dflet 0:1e7b5dd9edb4 848 Uart_Write((uint8_t*)" *************************************************\r\n");
dflet 0:1e7b5dd9edb4 849 Uart_Write((uint8_t*)"\r\n");
dflet 0:1e7b5dd9edb4 850 }
dflet 0:1e7b5dd9edb4 851
dflet 0:1e7b5dd9edb4 852
dflet 0:1e7b5dd9edb4 853
dflet 0:1e7b5dd9edb4 854