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

Files at this revision

API Documentation at this revision

Comitter:
kaz260
Date:
Tue Jan 20 04:44:00 2015 +0000
Parent:
15:af967b9898f8
Child:
17:78857c543ba1
Commit message:
Ver 0.1

Changed in this revision

ADT7410.lib Show annotated file Show diff for this revision Revisions of this file
MQTT.lib Show annotated file Show diff for this revision Revisions of this file
MbedJSONValue.lib Show annotated file Show diff for this revision Revisions of this file
cc3000_hostdriver_mbedsocket.lib Show annotated file Show diff for this revision Revisions of this file
init.cpp Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ADT7410.lib	Tue Jan 20 04:44:00 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/kenjiArai/code/ADT7410/#231bddd40e29
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MQTT.lib	Tue Jan 20 04:44:00 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/jwende/code/MQTT/#8765a16d7ca5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MbedJSONValue.lib	Tue Jan 20 04:44:00 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/samux/code/MbedJSONValue/#10a99cdf7846
--- a/cc3000_hostdriver_mbedsocket.lib	Tue Jun 03 08:31:20 2014 +0000
+++ b/cc3000_hostdriver_mbedsocket.lib	Tue Jan 20 04:44:00 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/Kojto/code/cc3000_hostdriver_mbedsocket/#50ab13d8f2dc
+http://mbed.org/users/Kojto/code/cc3000_hostdriver_mbedsocket/#472828e3b40a
--- a/init.cpp	Tue Jun 03 08:31:20 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "main.h"
-#include "mbed.h"
-
-#if (MY_BOARD == WIGO)
-
-#include "NVIC_set_all_priorities.h"
-
-/**
- *  \brief Wi-Go initialization
- *  \param none
- *  \return none
- */
-void init() {
-    DigitalOut PWR_EN1(PTB2);
-    DigitalOut PWR_EN2(PTB3);
-
-    // Wi-Go set current to 500mA since we're turning on the Wi-Fi
-    PWR_EN1 = 0;
-    PWR_EN2 = 1;
-
-    NVIC_set_all_irq_priorities(3);
-    NVIC_SetPriority(SPI0_IRQn, 0x0);     // Wi-Fi SPI interrupt must be higher priority than SysTick
-    NVIC_SetPriority(PORTA_IRQn, 0x1);
-    NVIC_SetPriority(SysTick_IRQn, 0x2);  // SysTick set to lower priority than Wi-Fi SPI bus interrupt
-    PORTA->PCR[16] |=PORT_PCR_ISF_MASK;
-    PORTA->ISFR |= (1 << 16);
-}
-
-#elif (MY_BOARD == WIFI_DIPCORTEX)
-
-/**
- *  \brief Wifi DipCortex initialization
- *  \param none
- *  \return none
- */
-void init() {
-    NVIC_SetPriority(SSP1_IRQn, 0x0);
-    NVIC_SetPriority(PIN_INT0_IRQn, 0x1);
-
-    // SysTick set to lower priority than Wi-Fi SPI bus interrupt
-    NVIC_SetPriority(SysTick_IRQn, 0x2);
-}
-
-#else
-
-/**
- *  \brief Place here init routine for your board
- *  \param none
- *  \return none
- */
-void init() {
-
-}
-
-#endif
--- a/main.cpp	Tue Jun 03 08:31:20 2014 +0000
+++ b/main.cpp	Tue Jan 20 04:44:00 2015 +0000
@@ -1,23 +1,19 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+/* MQTT Smart Sensor
+ * Author: Kazuhiro Matsuda
+ * Ver: 0.1 2015-01-15
+ * Ver: 0.2 2015-01-18
+ * Ver: 1.0 2015-01-20
  */
+ 
+//#define DEBUG
+ 
 #include "mbed.h"
 #include "cc3000.h"
+#include "TCPSocketConnection.h"
+#include "PubSubClient.h"
+#include "MbedJSONValue.h"
 #include "main.h"
-#include "TCPSocketConnection.h"
-#include "TCPSocketServer.h"
+#include "ADT7410.h" 
 
 #define STRINGIFY(x) #x
 #define TO_STRING(x) STRINGIFY(x)
@@ -26,19 +22,14 @@
 
 tUserFS user_info;
 
-/* cc3000 module declaration specific for user's board. Check also init() */
-#if (MY_BOARD == WIGO)
-cc3000 wifi(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5));
+// CC3000 fix up
+cc3000 wifi(p9, p10, p8, SPI(p5, p6, p7));
+
+// serial console for debug
 Serial pc(USBTX, USBRX);
-#elif (MY_BOARD == WIFI_DIPCORTEX)
-cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37));
-Serial pc(UART_TX, UART_RX);
-#elif (MY_BOARD == MBED_BOARD_EXAMPLE)
-cc3000 wifi(p9, p10, p8, SPI(p5, p6, p7));
-Serial pc(USBTX, USBRX);
-#else
 
-#endif
+// ADT7410 fix up
+ADT7410 tempsens(p28, p27, 0x90);
 
 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
   const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
@@ -46,6 +37,55 @@
   const uint8_t smartconfigkey = 0;
 #endif
 
+DigitalOut led1(LED1);  // connected to AP
+DigitalOut led2(LED2);  // connected to MQTT broker 
+DigitalOut led3(LED3);  // publish a message
+DigitalOut led4(LED4);  // subscribe a message
+
+//MQTT broker information
+char* serverIpAddr = "10.10.0.1";  
+int port = 1883; 
+
+//MQTT client information
+char clientID[] = "temp1";
+char pub_topic[] = "home/office/environment/temp1";
+char sub_topic[] = "home/office/environment/temp1";
+
+//Sensor information
+uint16_t idx_low = 40, idx_high = 80;
+#define DURATION 10
+
+//create MQTT Client instanse
+void callback(char* topic, char* payload, unsigned int len); //callback function prototype
+PubSubClient mqtt(serverIpAddr, port, callback);
+
+void callback(char* topic, char* payload, unsigned int len)
+{
+    MbedJSONValue json_msg, res, idx;
+    std::string res_msg;
+    
+    // parse json object
+    parse(json_msg, payload);
+
+    if(json_msg.hasMember("cmd")) {
+        led4 = 1;
+        // set new threshold
+        idx_low = json_msg["setidx_low"].get<int>();
+        // create response
+        idx["setidx_low"] = idx_low;
+        res["res"] = idx;
+
+        // serialize JSON in oder to send via network
+        res_msg = res.serialize();
+#ifdef DEBUG
+        printf("send response %s\r\n", res_msg);
+#endif
+        // send MQTT message
+        mqtt.publish(topic, (char*)res_msg.c_str(), strlen(res_msg.c_str()));
+        led4 = 0;
+    }
+}
+
 /**
  *  \brief Print cc3000 information
  *  \param none
@@ -54,16 +94,17 @@
 void print_cc3000_info() {
     uint8_t myMAC[8];
 
-    printf("MAC address + cc3000 info \r\n");
     wifi.get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
     wifi.get_mac_address(myMAC);
+#ifdef DEBUG
+    printf("MAC address + cc3000 info \r\n");
     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]);
-
     printf(" FTC        %i \r\n",user_info.FTC);
     printf(" PP_version %i.%i \r\n",user_info.PP_version[0], user_info.PP_version[1]);
     printf(" SERV_PACK  %i.%i \r\n",user_info.SERV_PACK[0], user_info.SERV_PACK[1]);
     printf(" DRV_VER    %i.%i.%i \r\n",user_info.DRV_VER[0], user_info.DRV_VER[1], user_info.DRV_VER[2]);
     printf(" FW_VER     %i.%i.%i \r\n",user_info.FW_VER[0], user_info.FW_VER[1], user_info.FW_VER[2]);
+#endif
 }
 
 /**
@@ -74,11 +115,17 @@
  *  \return none
  */
 void connect_to_ssid(char *ssid, char *key, unsigned char sec_mode) {
+#ifdef DEBUG
     printf("Connecting to SSID: %s. Timeout is 10s. \r\n",ssid);
+#endif
     if (wifi.connect_to_AP((uint8_t *)ssid, (uint8_t *)key, sec_mode) == true) {
+#ifdef DEBUG
         printf(" Connected. \r\n");
+#endif
     } else {
+#ifdef DEBUG
         printf(" Connection timed-out (error). Please restart. \r\n");
+#endif
         while(1);
   }
 }
@@ -119,113 +166,79 @@
     wifi.start_smart_config(smartconfigkey);
 }
 
-/**
- *  \brief Simple socket demo
- *  \param none
- *  \return int
- */
-int main() {
-    init(); /* board dependent init */
-    pc.baud(115200);
-
-    wifi.start(0);
-    printf("cc3000 simple socket demo. \r\n");
-    print_cc3000_info();
-
-    printf("User's AP setup: SSID: %s, Password: %s, Security: %s \r\n", TO_STRING(SSID), TO_STRING(AP_KEY), TO_STRING(AP_SECURITY));
+void measure(){
+    float tmp;
+    MbedJSONValue sts, body;
+    std::string msg;
+    
+    // measure temperature and humidity
+    tmp = tempsens.read_temp();
+              
+    // create JSON message
+    body["temp"] = tmp;
+    body["unit"] = "degree C";
+    sts["sts"] = body;
 
-    printf("\n<0> Normal run. SmartConfig will \r\n    start if no valid connection exists. \r\n");
-    printf("<1> Connect using fixed SSID without AP_KEY: %s \r\n", SSID);
-    printf("<2> Connect using fixed SSID with AP_KEY: %s \r\n", SSID);
-    printf("<8> Erase all stored profiles.\r\n");
-    printf("<9> SmartConfig. \r\n");
+    // serialize JSON in oder to send via network
+    msg = sts.serialize();
+    led3 = 1;
+    mqtt.publish(pub_topic, (char*)msg.c_str(), strlen(msg.c_str()));
+    led3 = 0;
+}
 
-    signed char c = getchar();
-    switch (c)
-    {
-        case '0':
-            if (!user_info.FTC) {
-                do_FTC();
-                wifi._wlan.stop();
-            } else {
-                wifi._wlan.ioctl_set_connection_policy(0, 1, 1);
-            }
-            break;
-        case '1':
-            printf("Attempting SSID Connection. \r\n");
+int main() {
+    printf("----- Start MQTT client\r\n");
+    pc.baud(9600);
 
-            wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
-            connect_to_ssid(SSID);
-            break;
-        case '2':
-            printf("Attempting SSID Connection. \r\n");
-
-            wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
-#ifndef CC3000_TINY_DRIVER
-            connect_to_ssid(SSID, AP_KEY, AP_SECURITY);
-#else
-            connect_to_ssid(SSID);
-#endif
-            break;
-        case '8':
-            printf("Erasing all wireless profiles. \r\n");
-            wifi.delete_profiles();
-            wifi.stop();
-            printf("Done - press the reset button on your board... \r\n");
-            while(1);
+    MbedJSONValue sts, body;
+    std::string msg;
+    uint16_t cnt = 0;
 
-        case '9':
-            printf("Starting Smart Config configuration. \r\n");
-            if (!user_info.FTC) {
-                printf("First Time Configuration was not run. \r\nSwitching to First Time Configuration. \r\n");
-                do_FTC();
-                wifi._wlan.stop();
-            } else {
-                start_smart_config();
-            }
-            while (wifi.is_dhcp_configured() == false)
-            {
-                wait_ms(500);
-                printf("Waiting for dhcp to be set. \r\n");
-            }
-            printf("Press the reset button on your board and select 0... \r\n");
-            while(1);
-        default:
-            printf("Wrong selection. \r\n");
-            printf("Reset the board and try again. \r\n");
-            break;
+    // start CC3000 Wi-Fi interface
+    wifi.start(0);
+    
+#ifdef DEBUG
+    print_cc3000_info();
+    printf("User's AP setup: SSID: %s, Password: %s, Security: %s \r\n", TO_STRING(SSID), TO_STRING(AP_KEY), TO_STRING(AP_SECURITY));
+    printf("Attempting SSID Connection. \r\n");
+#endif
+
+    // set connection policy to manual mode
+    wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
+
+    // connect to AP
+    connect_to_ssid(SSID, AP_KEY, AP_SECURITY);
+
+    while (wifi.is_dhcp_configured() == false) {
+         wait_ms(500);
+#ifdef DEBUG
+         printf("Waiting for dhcp to be set. \r\n");
+#endif
     }
 
-    printf("DHCP request \r\n");
-    while (wifi.is_dhcp_configured() == false) {
-         wait_ms(500);
-         printf("  Waiting for dhcp to be set. \r\n");
-    }
-
+#ifdef DEBUG
     tNetappIpconfigRetArgs ipinfo2;
     wifi.get_ip_config(&ipinfo2); // data is returned in the ipinfo2 structure
     printf("DHCP assigned IP Address = %d.%d.%d.%d \r\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);
-
-    char python_msg[] = "Hello Python\n";
-    TCPSocketServer server;
-    TCPSocketConnection client;
-
-    server.bind(15000);
-    server.listen();
+#endif
+    led1 = 1;
 
-    while (1) {
-        int32_t status = server.accept(client);
-        if (status >= 0) {
-            client.set_blocking(false, 1500); // Timeout after (1.5)s
-            printf("Connection from: %s \r\n", client.get_address());
-            char buffer[256];
-            int stat = client.receive(buffer, sizeof(buffer));
-            if (stat >=0) {
-                printf("Received: %s \r\n",buffer);
-                printf("Sending the message to the server. \r\n");
-                client.send_all(python_msg, sizeof(python_msg));
-                client.close();
-            }
+    if(!mqtt.connect(clientID)){
+        printf("\r\nConnect to server failed ..\r\n");
+        return -1;
+    }
+    led2 = 1;
+        
+    // define TOPIC to read
+    mqtt.subscribe(sub_topic);
+        
+    while(1){
+        mqtt.loop();
+        if(cnt > 20){
+          measure();
+          cnt = 0;
         }
+        cnt++;
+        wait(0.5);
     }
-}
+}
\ No newline at end of file
--- a/main.h	Tue Jun 03 08:31:20 2014 +0000
+++ b/main.h	Tue Jan 20 04:44:00 2015 +0000
@@ -21,7 +21,7 @@
 #define MBED_BOARD_EXAMPLE 3
 #define UNDEFINED          4
 
-#define MY_BOARD WIGO
+#define MY_BOARD MBED_BOARD_EXAMPLE
 
 // use this defines in AP_SECURITY
 #define NONE 0
@@ -33,9 +33,9 @@
 #define USE_SMART_CONFIG 0
 
  // Default SSID Settings
-#define AP_KEY       "test"
+#define AP_KEY       "Testbed-0"
 #define AP_SECURITY  WPA2            // WPA2 must be enabled for use with iPhone or Android phone hotspot!
-#define SSID         "test"
+#define SSID         "Testbed-0"
 
 #define USE_DHCP      1
 #define USE_STATIC_IP 2
@@ -44,13 +44,15 @@
 #define IP_ALLOC_METHOD USE_DHCP        // for DHCP assigned IP address
 //#define IP_ALLOC_METHOD USE_STATIC_IP // for static IP address
  
-#define STATIC_IP_OCT1 192
-#define STATIC_IP_OCT2 168
+#define STATIC_IP_OCT1 10
+#define STATIC_IP_OCT2 10
 #define STATIC_IP_OCT3 0
-#define STATIC_IP_OCT4 103
+#define STATIC_IP_OCT4 100
  
-#define STATIC_GW_OCT4 1             // Static Gateway address  = STATIC_IP_OCT1.STATIC_IP_OCT2.STATIC_IP_OCT3.STATIC_GW_OCT4
- 
+#define STATIC_GW_OCT1 10
+#define STATIC_GW_OCT2 10
+#define STATIC_GW_OCT3 0
+#define STATIC_GW_OCT4 254
 
 void init();