MQTT with CC3000 Wi-Fi interface

Dependencies:   ADT7410 MQTToveCC3000 MbedJSONValue NVIC_set_all_priorities cc3000_hostdriver_mbedsocket2 mbed

Fork of cc3000_simple_socket_demo by Martin Kojtal

Committer:
kaz260
Date:
Tue Jan 20 07:28:46 2015 +0000
Revision:
17:78857c543ba1
Parent:
16:45572def5fb2
MQTT over CC3000

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kaz260 16:45572def5fb2 1 /* MQTT Smart Sensor
kaz260 16:45572def5fb2 2 * Author: Kazuhiro Matsuda
kaz260 16:45572def5fb2 3 * Ver: 0.1 2015-01-15
kaz260 16:45572def5fb2 4 * Ver: 0.2 2015-01-18
kaz260 16:45572def5fb2 5 * Ver: 1.0 2015-01-20
Kojto 6:6eaae34586b8 6 */
kaz260 16:45572def5fb2 7
kaz260 16:45572def5fb2 8 //#define DEBUG
kaz260 16:45572def5fb2 9
Kojto 6:6eaae34586b8 10 #include "mbed.h"
Kojto 6:6eaae34586b8 11 #include "cc3000.h"
kaz260 16:45572def5fb2 12 #include "TCPSocketConnection.h"
kaz260 16:45572def5fb2 13 #include "PubSubClient.h"
kaz260 16:45572def5fb2 14 #include "MbedJSONValue.h"
Kojto 6:6eaae34586b8 15 #include "main.h"
kaz260 16:45572def5fb2 16 #include "ADT7410.h"
Kojto 6:6eaae34586b8 17
Kojto 8:be68e827aa53 18 #define STRINGIFY(x) #x
Kojto 8:be68e827aa53 19 #define TO_STRING(x) STRINGIFY(x)
Kojto 8:be68e827aa53 20
Kojto 6:6eaae34586b8 21 using namespace mbed_cc3000;
Kojto 6:6eaae34586b8 22
Kojto 6:6eaae34586b8 23 tUserFS user_info;
Kojto 6:6eaae34586b8 24
kaz260 16:45572def5fb2 25 // CC3000 fix up
kaz260 16:45572def5fb2 26 cc3000 wifi(p9, p10, p8, SPI(p5, p6, p7));
kaz260 16:45572def5fb2 27
kaz260 16:45572def5fb2 28 // serial console for debug
Kojto 6:6eaae34586b8 29 Serial pc(USBTX, USBRX);
Kojto 6:6eaae34586b8 30
kaz260 16:45572def5fb2 31 // ADT7410 fix up
kaz260 16:45572def5fb2 32 ADT7410 tempsens(p28, p27, 0x90);
Kojto 6:6eaae34586b8 33
Kojto 6:6eaae34586b8 34 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
Kojto 6:6eaae34586b8 35 const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
Kojto 6:6eaae34586b8 36 #else
Kojto 6:6eaae34586b8 37 const uint8_t smartconfigkey = 0;
Kojto 6:6eaae34586b8 38 #endif
Kojto 6:6eaae34586b8 39
kaz260 16:45572def5fb2 40 DigitalOut led1(LED1); // connected to AP
kaz260 16:45572def5fb2 41 DigitalOut led2(LED2); // connected to MQTT broker
kaz260 16:45572def5fb2 42 DigitalOut led3(LED3); // publish a message
kaz260 16:45572def5fb2 43 DigitalOut led4(LED4); // subscribe a message
kaz260 16:45572def5fb2 44
kaz260 16:45572def5fb2 45 //MQTT broker information
kaz260 16:45572def5fb2 46 char* serverIpAddr = "10.10.0.1";
kaz260 16:45572def5fb2 47 int port = 1883;
kaz260 16:45572def5fb2 48
kaz260 16:45572def5fb2 49 //MQTT client information
kaz260 16:45572def5fb2 50 char clientID[] = "temp1";
kaz260 16:45572def5fb2 51 char pub_topic[] = "home/office/environment/temp1";
kaz260 16:45572def5fb2 52 char sub_topic[] = "home/office/environment/temp1";
kaz260 16:45572def5fb2 53
kaz260 16:45572def5fb2 54 //Sensor information
kaz260 16:45572def5fb2 55 uint16_t idx_low = 40, idx_high = 80;
kaz260 16:45572def5fb2 56 #define DURATION 10
kaz260 16:45572def5fb2 57
kaz260 16:45572def5fb2 58 //create MQTT Client instanse
kaz260 16:45572def5fb2 59 void callback(char* topic, char* payload, unsigned int len); //callback function prototype
kaz260 16:45572def5fb2 60 PubSubClient mqtt(serverIpAddr, port, callback);
kaz260 16:45572def5fb2 61
kaz260 16:45572def5fb2 62 void callback(char* topic, char* payload, unsigned int len)
kaz260 16:45572def5fb2 63 {
kaz260 16:45572def5fb2 64 MbedJSONValue json_msg, res, idx;
kaz260 16:45572def5fb2 65 std::string res_msg;
kaz260 16:45572def5fb2 66
kaz260 16:45572def5fb2 67 // parse json object
kaz260 16:45572def5fb2 68 parse(json_msg, payload);
kaz260 16:45572def5fb2 69
kaz260 16:45572def5fb2 70 if(json_msg.hasMember("cmd")) {
kaz260 16:45572def5fb2 71 led4 = 1;
kaz260 16:45572def5fb2 72 // set new threshold
kaz260 16:45572def5fb2 73 idx_low = json_msg["setidx_low"].get<int>();
kaz260 16:45572def5fb2 74 // create response
kaz260 16:45572def5fb2 75 idx["setidx_low"] = idx_low;
kaz260 16:45572def5fb2 76 res["res"] = idx;
kaz260 16:45572def5fb2 77
kaz260 16:45572def5fb2 78 // serialize JSON in oder to send via network
kaz260 16:45572def5fb2 79 res_msg = res.serialize();
kaz260 16:45572def5fb2 80 #ifdef DEBUG
kaz260 16:45572def5fb2 81 printf("send response %s\r\n", res_msg);
kaz260 16:45572def5fb2 82 #endif
kaz260 16:45572def5fb2 83 // send MQTT message
kaz260 16:45572def5fb2 84 mqtt.publish(topic, (char*)res_msg.c_str(), strlen(res_msg.c_str()));
kaz260 16:45572def5fb2 85 led4 = 0;
kaz260 16:45572def5fb2 86 }
kaz260 16:45572def5fb2 87 }
kaz260 16:45572def5fb2 88
Kojto 6:6eaae34586b8 89 /**
Kojto 6:6eaae34586b8 90 * \brief Print cc3000 information
Kojto 6:6eaae34586b8 91 * \param none
Kojto 6:6eaae34586b8 92 * \return none
Kojto 6:6eaae34586b8 93 */
Kojto 6:6eaae34586b8 94 void print_cc3000_info() {
Kojto 6:6eaae34586b8 95 uint8_t myMAC[8];
Kojto 6:6eaae34586b8 96
Kojto 6:6eaae34586b8 97 wifi.get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
Kojto 6:6eaae34586b8 98 wifi.get_mac_address(myMAC);
kaz260 16:45572def5fb2 99 #ifdef DEBUG
kaz260 16:45572def5fb2 100 printf("MAC address + cc3000 info \r\n");
Kojto 6:6eaae34586b8 101 printf(" MAC address %02x:%02x:%02x:%02x:%02x:%02x \r\n \r\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
Kojto 6:6eaae34586b8 102 printf(" FTC %i \r\n",user_info.FTC);
Kojto 6:6eaae34586b8 103 printf(" PP_version %i.%i \r\n",user_info.PP_version[0], user_info.PP_version[1]);
Kojto 6:6eaae34586b8 104 printf(" SERV_PACK %i.%i \r\n",user_info.SERV_PACK[0], user_info.SERV_PACK[1]);
Kojto 6:6eaae34586b8 105 printf(" DRV_VER %i.%i.%i \r\n",user_info.DRV_VER[0], user_info.DRV_VER[1], user_info.DRV_VER[2]);
Kojto 6:6eaae34586b8 106 printf(" FW_VER %i.%i.%i \r\n",user_info.FW_VER[0], user_info.FW_VER[1], user_info.FW_VER[2]);
kaz260 16:45572def5fb2 107 #endif
Kojto 6:6eaae34586b8 108 }
Kojto 6:6eaae34586b8 109
Kojto 6:6eaae34586b8 110 /**
Kojto 6:6eaae34586b8 111 * \brief Connect to SSID with a timeout
Kojto 6:6eaae34586b8 112 * \param ssid Name of SSID
Kojto 6:6eaae34586b8 113 * \param key Password
Kojto 6:6eaae34586b8 114 * \param sec_mode Security mode
Kojto 6:6eaae34586b8 115 * \return none
Kojto 6:6eaae34586b8 116 */
Kojto 6:6eaae34586b8 117 void connect_to_ssid(char *ssid, char *key, unsigned char sec_mode) {
kaz260 16:45572def5fb2 118 #ifdef DEBUG
Kojto 7:afaa17c11965 119 printf("Connecting to SSID: %s. Timeout is 10s. \r\n",ssid);
kaz260 16:45572def5fb2 120 #endif
Kojto 6:6eaae34586b8 121 if (wifi.connect_to_AP((uint8_t *)ssid, (uint8_t *)key, sec_mode) == true) {
kaz260 16:45572def5fb2 122 #ifdef DEBUG
Kojto 7:afaa17c11965 123 printf(" Connected. \r\n");
kaz260 16:45572def5fb2 124 #endif
Kojto 6:6eaae34586b8 125 } else {
kaz260 16:45572def5fb2 126 #ifdef DEBUG
Kojto 7:afaa17c11965 127 printf(" Connection timed-out (error). Please restart. \r\n");
kaz260 16:45572def5fb2 128 #endif
Kojto 6:6eaae34586b8 129 while(1);
Kojto 6:6eaae34586b8 130 }
Kojto 6:6eaae34586b8 131 }
Kojto 6:6eaae34586b8 132
Kojto 6:6eaae34586b8 133 /**
Kojto 6:6eaae34586b8 134 * \brief Connect to SSID without security
Kojto 6:6eaae34586b8 135 * \param ssid Name of SSID
Kojto 6:6eaae34586b8 136 * \return none
Kojto 6:6eaae34586b8 137 */
Kojto 6:6eaae34586b8 138 void connect_to_ssid(char *ssid) {
Kojto 6:6eaae34586b8 139 wifi.connect_open((uint8_t *)ssid);
Kojto 6:6eaae34586b8 140 }
Kojto 6:6eaae34586b8 141
Kojto 6:6eaae34586b8 142 /**
Kojto 6:6eaae34586b8 143 * \brief First time configuration
Kojto 6:6eaae34586b8 144 * \param none
Kojto 6:6eaae34586b8 145 * \return none
Kojto 6:6eaae34586b8 146 */
Kojto 6:6eaae34586b8 147 void do_FTC(void) {
Kojto 6:6eaae34586b8 148 printf("Running First Time Configuration \r\n");
Kojto 6:6eaae34586b8 149 wifi.start_smart_config(smartconfigkey);
Kojto 6:6eaae34586b8 150 while (wifi.is_dhcp_configured() == false) {
Kojto 6:6eaae34586b8 151 wait_ms(500);
Kojto 6:6eaae34586b8 152 printf("Waiting for dhcp to be set. \r\n");
Kojto 6:6eaae34586b8 153 }
Kojto 6:6eaae34586b8 154 user_info.FTC = 1;
Kojto 6:6eaae34586b8 155 wifi.set_user_file_info((uint8_t *)&user_info, sizeof(user_info));
Kojto 6:6eaae34586b8 156 wifi._wlan.stop();
Kojto 7:afaa17c11965 157 printf("FTC finished. \r\n");
Kojto 6:6eaae34586b8 158 }
Kojto 6:6eaae34586b8 159
Kojto 8:be68e827aa53 160 /**
Kojto 7:afaa17c11965 161 * \brief Start smart config
Kojto 7:afaa17c11965 162 * \param none
Kojto 6:6eaae34586b8 163 * \return none
Kojto 6:6eaae34586b8 164 */
Kojto 6:6eaae34586b8 165 void start_smart_config() {
Kojto 6:6eaae34586b8 166 wifi.start_smart_config(smartconfigkey);
Kojto 6:6eaae34586b8 167 }
Kojto 6:6eaae34586b8 168
kaz260 16:45572def5fb2 169 void measure(){
kaz260 16:45572def5fb2 170 float tmp;
kaz260 16:45572def5fb2 171 MbedJSONValue sts, body;
kaz260 16:45572def5fb2 172 std::string msg;
kaz260 16:45572def5fb2 173
kaz260 16:45572def5fb2 174 // measure temperature and humidity
kaz260 16:45572def5fb2 175 tmp = tempsens.read_temp();
kaz260 16:45572def5fb2 176
kaz260 16:45572def5fb2 177 // create JSON message
kaz260 16:45572def5fb2 178 body["temp"] = tmp;
kaz260 16:45572def5fb2 179 body["unit"] = "degree C";
kaz260 16:45572def5fb2 180 sts["sts"] = body;
Kojto 8:be68e827aa53 181
kaz260 16:45572def5fb2 182 // serialize JSON in oder to send via network
kaz260 16:45572def5fb2 183 msg = sts.serialize();
kaz260 16:45572def5fb2 184 led3 = 1;
kaz260 16:45572def5fb2 185 mqtt.publish(pub_topic, (char*)msg.c_str(), strlen(msg.c_str()));
kaz260 16:45572def5fb2 186 led3 = 0;
kaz260 16:45572def5fb2 187 }
Kojto 6:6eaae34586b8 188
kaz260 16:45572def5fb2 189 int main() {
kaz260 16:45572def5fb2 190 printf("----- Start MQTT client\r\n");
kaz260 16:45572def5fb2 191 pc.baud(9600);
Kojto 8:be68e827aa53 192
kaz260 16:45572def5fb2 193 MbedJSONValue sts, body;
kaz260 16:45572def5fb2 194 std::string msg;
kaz260 16:45572def5fb2 195 uint16_t cnt = 0;
frankvnk 11:991f6c2444e9 196
kaz260 16:45572def5fb2 197 // start CC3000 Wi-Fi interface
kaz260 16:45572def5fb2 198 wifi.start(0);
kaz260 16:45572def5fb2 199
kaz260 16:45572def5fb2 200 #ifdef DEBUG
kaz260 16:45572def5fb2 201 print_cc3000_info();
kaz260 16:45572def5fb2 202 printf("User's AP setup: SSID: %s, Password: %s, Security: %s \r\n", TO_STRING(SSID), TO_STRING(AP_KEY), TO_STRING(AP_SECURITY));
kaz260 16:45572def5fb2 203 printf("Attempting SSID Connection. \r\n");
kaz260 16:45572def5fb2 204 #endif
kaz260 16:45572def5fb2 205
kaz260 16:45572def5fb2 206 // set connection policy to manual mode
kaz260 16:45572def5fb2 207 wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
kaz260 16:45572def5fb2 208
kaz260 16:45572def5fb2 209 // connect to AP
kaz260 16:45572def5fb2 210 connect_to_ssid(SSID, AP_KEY, AP_SECURITY);
kaz260 16:45572def5fb2 211
kaz260 16:45572def5fb2 212 while (wifi.is_dhcp_configured() == false) {
kaz260 16:45572def5fb2 213 wait_ms(500);
kaz260 16:45572def5fb2 214 #ifdef DEBUG
kaz260 16:45572def5fb2 215 printf("Waiting for dhcp to be set. \r\n");
kaz260 16:45572def5fb2 216 #endif
Kojto 6:6eaae34586b8 217 }
Kojto 6:6eaae34586b8 218
kaz260 16:45572def5fb2 219 #ifdef DEBUG
Kojto 6:6eaae34586b8 220 tNetappIpconfigRetArgs ipinfo2;
Kojto 6:6eaae34586b8 221 wifi.get_ip_config(&ipinfo2); // data is returned in the ipinfo2 structure
Kojto 6:6eaae34586b8 222 printf("DHCP assigned IP Address = %d.%d.%d.%d \r\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);
kaz260 16:45572def5fb2 223 #endif
kaz260 16:45572def5fb2 224 led1 = 1;
Kojto 6:6eaae34586b8 225
kaz260 16:45572def5fb2 226 if(!mqtt.connect(clientID)){
kaz260 16:45572def5fb2 227 printf("\r\nConnect to server failed ..\r\n");
kaz260 16:45572def5fb2 228 return -1;
kaz260 16:45572def5fb2 229 }
kaz260 16:45572def5fb2 230 led2 = 1;
kaz260 16:45572def5fb2 231
kaz260 16:45572def5fb2 232 // define TOPIC to read
kaz260 16:45572def5fb2 233 mqtt.subscribe(sub_topic);
kaz260 16:45572def5fb2 234
kaz260 16:45572def5fb2 235 while(1){
kaz260 16:45572def5fb2 236 mqtt.loop();
kaz260 16:45572def5fb2 237 if(cnt > 20){
kaz260 16:45572def5fb2 238 measure();
kaz260 16:45572def5fb2 239 cnt = 0;
Kojto 6:6eaae34586b8 240 }
kaz260 16:45572def5fb2 241 cnt++;
kaz260 16:45572def5fb2 242 wait(0.5);
Kojto 6:6eaae34586b8 243 }
kaz260 16:45572def5fb2 244 }