Update revision to use TI's mqtt and Freertos.

Dependencies:   mbed client server

Fork of cc3100_Test_mqtt_CM3 by David Fletcher

Committer:
dflet
Date:
Sat Jun 06 13:32:15 2015 +0000
Revision:
0:dbe5e7db3c45
Child:
3:a8c249046181
Revision update to include TI's mtqq and Freertos

Who changed what in which revision?

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