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:
Thu Sep 03 14:02:37 2015 +0000
Revision:
3:a8c249046181
Parent:
0:dbe5e7db3c45
SPI Mode change 1 to 0

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