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:
Kojto
Date:
Sun Sep 08 18:31:33 2013 +0000
Child:
1:99076f2d9408
Commit message:
initial version of new simple socket

Changed in this revision

KL25Z_irq_proirities.lib Show annotated file Show diff for this revision Revisions of this file
cc3000_HostDriver.lib Show annotated file Show diff for this revision Revisions of this file
doTCPIP.cpp Show annotated file Show diff for this revision Revisions of this file
doTCPIP.h Show annotated file 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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/KL25Z_irq_proirities.lib	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/frankvnk/code/KL25Z_irq_proirities/#d2dd5df65f0e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cc3000_HostDriver.lib	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Kojto/code/cc3000_HostDriver/#b1f1be2cdbc9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doTCPIP.cpp	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,176 @@
+#include "doTCPIP.h"
+#include "cc3000.h"
+#include "main.h"
+
+using namespace mbed_cc3000;
+
+extern cc3000 wigo;
+
+//volatile uint8_t newData;
+// int32_t server_running;
+//uint8_t ForceFixedSSID;
+//int8_t runSmartConfig;            // Flag indicating whether user requested to perform Smart Config
+//volatile uint32_t ulCC3000Connected;
+uint8_t ConnectUsingSmartConfig;
+uint8_t myMAC[8];
+tUserFS userFS;
+
+int8_t requestBuffer[REQ_BUFFER_SIZE];
+//int32_t LAN_Connected = 0;
+
+uint8_t SmartConfigProfilestored = 0xff;
+
+#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};
+#else
+  const uint8_t smartconfigkey = NULL;
+#endif
+
+/** \brief Flag indicating whether to print CC3000 Connection info */
+
+//Device name - used for Smart config in order to stop the Smart phone configuration process
+uint8_t DevServname[] = "CC3000";
+//volatile uint32_t SendmDNSAdvertisment;
+
+
+/* TODO */
+void create_tcp_connection(int32_t port)
+{
+    const char python_msg[] = "Hello Python\n";
+    int32_t stat;
+    int32_t sock;
+    //new TCP socket descriptor
+    int32_t newsock;
+    //destination address
+    sockaddr destAddr;
+    //local address
+    sockaddr LocalAddr;
+    socklen_t addrlen;
+    memset(&LocalAddr, 0, 8);
+    LocalAddr.family = AF_INET;
+    LocalAddr.data[0] = (port >> 8) & 0xff;
+    LocalAddr.data[1] = port & 0xff;
+    memset (&LocalAddr.data[2], 0, 4);
+    sock = wigo._socket.socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    while(sock == -1) sock = wigo._socket.socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);
+    wigo._socket.bind(sock,&LocalAddr,sizeof(sockaddr));
+    wigo._socket.listen(sock, 1);
+    addrlen = sizeof(destAddr);
+    while(1)
+    {
+        newsock = -2;
+        printf("Server waiting for connection to Python\n");
+        LED_D2_ON;
+        while((newsock == -1) || (newsock == -2))
+        {
+            newsock = wigo._socket.accept(sock,&destAddr, &addrlen);
+        }
+        printf("Connected\n");
+        //receive TCP data
+        if(newsock >= 0)
+        {
+            wigo._socket.recv(newsock, requestBuffer,20,0);
+            printf("Input = %s\n", requestBuffer);
+            stat = -2;
+            stat = wigo._socket.send(newsock, python_msg, strlen(python_msg), 0);
+            printf("status= %d\n", stat);
+            LED_D2_OFF;
+        } else printf("bad socket= %d\n", newsock);
+        wigo._socket.closesocket(newsock);
+        printf("Done, press any key to repeat\n");
+        getchar();
+//        printf("\x1B[2J");    //VT100 erase screen
+//        printf("\x1B[H");     //VT100 home
+    }
+}
+
+void start_smart_config() {
+    wigo.start_smart_config(smartconfigkey);
+}
+
+void init_tcp(void)
+{
+    int t;
+    tNetappIpconfigRetArgs ipinfo2;
+
+    check_dhcp();
+    //while(checkWiFiConnected() == false);
+    // If connectivity is good, run the primary functionality
+     // while(1)
+     // {
+     //     if (checkWiFiConnected()) break;
+     //     wait(1);
+     // }
+//     printf("Connected\n");
+    // If we're not blocked by accept or others, obtain the latest status
+    wigo.get_ip_config(&ipinfo2);                  // data is returned in the ipinfo2 structure
+    printf("\n*** Wi-Go board DHCP assigned IP Address = %d.%d.%d.%d\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);
+    LED_D3_ON;
+
+    t = wigo._socket.mdnsAdvertiser(1, DevServname, sizeof(DevServname));
+    printf("mDNS Status= %x\n", t);
+}
+
+void run_tcp_server(void)
+{
+    LED_D3_OFF;
+    LED_D2_OFF;
+    printf("\n\nStarting TCP/IP Server\n");
+    init_tcp();
+    create_tcp_connection(TCPIP_PORT);
+}
+
+bool check_dhcp(void)
+{
+    int32_t t;
+    //static uint8_t obtainIpInfoFlag = FALSE;
+
+    // Wait until for dhcp
+    while (wigo.is_dhcp_configured() == false)
+    {
+         wait_ms(500);
+         printf("waiting\n");
+    }
+
+    // Check if we are in a connected state.  If so, set flags and LED
+    //if (wigo.is_connected() == true)
+    //{
+        //if (obtainIpInfoFlag == FALSE)
+        //{
+        //    obtainIpInfoFlag = TRUE;             // Set flag so we don't constantly turn the LED on
+            //LED_D3_ON;
+            //If Smart Config was performed, we need to send complete notification to the configure (Smart Phone App)
+            // if (ConnectUsingSmartConfig==1)
+            // {
+            //     ConnectUsingSmartConfig = 0;
+            //     SmartConfigProfilestored = SMART_CONFIG_SET;
+            // }
+
+        //}
+        t = wigo._socket.mdnsAdvertiser(1, DevServname, sizeof(DevServname));
+        printf("mDNS Status= %x\n", t);
+        return true;
+    //}
+    //return FALSE;
+}
+
+void do_FTC(void)
+{
+    printf("Running First Time Configuration\n");
+    // server_running = 1;
+    //runSmartConfig = 1;
+    start_smart_config();
+    init_tcp();
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_OFF;
+    userFS.FTC = 1;
+    wigo._nvmem.write( NVMEM_USER_FILE_1_FILEID, sizeof(userFS), 0, (uint8_t *) &userFS);
+    //runSmartConfig = 0;
+    SmartConfigProfilestored = SMART_CONFIG_SET;
+    wigo._wlan.stop();
+    printf("FTC finished\n");
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doTCPIP.h	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,111 @@
+/****************************************************************************
+*
+*  doTCPIP.h - CC3000 TCP/IP
+*  Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*    Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+*    Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the
+*    distribution.
+*
+*    Neither the name of Texas Instruments Incorporated nor the names of
+*    its contributors may be used to endorse or promote products derived
+*    from this software without specific prior written permission.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+
+#ifndef DOTCPIP_H
+#define DOTCPIP_H
+
+#include "cc3000.h"
+
+/** TCP/IP Functions
+*
+*/
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#define SMART_CONFIG_SET 0x55
+#define TCPIP_PORT 15000
+
+#define USE_DHCP      1
+#define USE_STATIC_IP 2
+
+#define NONE 0
+#define WEP  1
+#define WPA  2
+#define WPA2 3
+
+// Modify the following settings as necessary for your Wi-Fi Network setup:
+#define IP_ALLOC_METHOD USE_DHCP        // for DHCP assigned IP address
+//#define IP_ALLOC_METHOD USE_STATIC_IP // for static IP address
+
+// Default SSID Settings
+#define AP_KEY       "87654321"
+#define AP_SECURITY     WPA2            // WPA2 must be enabled for use with iPhone or Android phone hotspot!
+#define SSID           "test"
+//#define AP_SECURITY    NONE          // no security but will connect quicker!
+#define STATIC_IP_OCT1 192
+#define STATIC_IP_OCT2 168
+#define STATIC_IP_OCT3 0
+#define STATIC_IP_OCT4 103
+
+#define STATIC_GW_OCT4 1             // Static Gateway address  = STATIC_IP_OCT1.STATIC_IP_OCT2.STATIC_IP_OCT3.STATIC_GW_OCT4
+
+#define REQ_BUFFER_SIZE 400
+
+// typedef struct {
+//     uint8_t FTC;           // First time config performed
+//     uint8_t PP_version[2]; // Patch Programmer version
+//     uint8_t SERV_PACK[2];  // Service Pack Version
+//     uint8_t DRV_VER[3];    // Driver Version
+//     uint8_t FW_VER[3];     // Firmware Version
+//     uint8_t validCIK;      // CIK[] is valid (Client Interface Key)
+//     uint8_t CIK[40];
+// } userFS_t;
+
+extern mbed_cc3000::tUserFS userFS;
+
+// extern volatile uint32_t ulSmartConfigFinished,ulCC3000DHCP, OkToDoShutDown, ulCC3000DHCP_configured;
+// extern int32_t server_running;
+// extern volatile uint8_t newData;
+// extern uint8_t ForceFixedSSID;
+// extern int8_t runSmartConfig;
+// extern int8_t requestBuffer[];
+ extern uint8_t myMAC[8];
+ extern uint8_t SmartConfigProfilestored;
+
+// extern void StartSmartConfig(void);
+
+bool check_dhcp(void);
+void start_smart_config(void);
+void create_tcp_connection(int32_t port);
+void init_tcp(void);
+void run_tcp_server(void);
+void do_FTC(void);
+
+#endif // DOTCPIP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,194 @@
+#include "mbed.h"
+#include "KL25Z_irq_prio.h"
+#include "cc3000.h"
+#include "doTCPIP.h"
+#include "main.h"
+
+using namespace mbed_cc3000;
+
+// Serial USB port
+Serial pc(USBTX, USBRX);
+// Wi-Go battery charger control
+DigitalOut PWR_EN1(PTB2);
+DigitalOut PWR_EN2(PTB3);
+// Wi-go LED
+DigitalOut ledr (LED_RED);
+DigitalOut ledg (LED_GREEN);
+DigitalOut ledb (LED_BLUE);
+DigitalOut led1 (PTB8);
+DigitalOut led2 (PTB9);
+DigitalOut led3 (PTB10);
+// Wi-go cc3000 
+cc3000 wigo(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5), PORTA_IRQn);
+
+/* TODO REMOVE -> new function with all priorities as well */
+#define WLAN_ISF_PCR        PORTA->PCR[16]
+#define WLAN_ISF_ISFR       PORTA->ISFR
+#define WLAN_ISF_MASK       (1<<16)
+
+void initLEDs(void)
+{
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_OFF;
+    LED_D1_OFF;
+    LED_D2_OFF;
+    LED_D3_OFF;
+}
+
+void print_cc3000_info() {
+    wigo.get_user_file_info((uint8_t *)&userFS, sizeof(userFS));
+    wigo.get_mac_address(myMAC);
+    printf("\n\nWi-Go MAC address %02x:%02x:%02x:%02x:%02x:%02x\n\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
+
+    printf("FTC        %i\n",userFS.FTC);
+    printf("PP_version %i.%i\n",userFS.PP_version[0], userFS.PP_version[1]);
+    printf("SERV_PACK  %i.%i\n",userFS.SERV_PACK[0], userFS.SERV_PACK[1]);
+    printf("DRV_VER    %i.%i.%i\n",userFS.DRV_VER[0], userFS.DRV_VER[1], userFS.DRV_VER[2]);
+    printf("FW_VER     %i.%i.%i\n",userFS.FW_VER[0], userFS.FW_VER[1], userFS.FW_VER[2]);
+}
+
+int32_t set_static_dhcp(void)
+{
+    uint8_t pucIP_Addr[4];
+    uint8_t pucIP_DefaultGWAddr[4];
+    uint8_t pucSubnetMask[4];
+    uint8_t pucDNS[4];
+
+    // Subnet mask is assumed to be 255.255.255.0
+    pucSubnetMask[0] = 0xFF;
+    pucSubnetMask[1] = 0xFF;
+    pucSubnetMask[2] = 0xFF;
+    pucSubnetMask[3] = 0x0;
+
+    // CC3000's IP
+    pucIP_Addr[0] = STATIC_IP_OCT1;
+    pucIP_Addr[1] = STATIC_IP_OCT2;
+    pucIP_Addr[2] = STATIC_IP_OCT3;
+    pucIP_Addr[3] = STATIC_IP_OCT4;
+
+    // Default Gateway/Router IP
+    // 192.168.1.1
+    pucIP_DefaultGWAddr[0] = STATIC_IP_OCT1;
+    pucIP_DefaultGWAddr[1] = STATIC_IP_OCT2;
+    pucIP_DefaultGWAddr[2] = STATIC_IP_OCT3;
+    pucIP_DefaultGWAddr[3] = STATIC_GW_OCT4;
+
+    // We assume the router is also a DNS server
+    pucDNS[0] = STATIC_IP_OCT1;
+    pucDNS[1] = STATIC_IP_OCT2;
+    pucDNS[2] = STATIC_IP_OCT3;
+    pucDNS[3] = STATIC_GW_OCT4;
+
+    wigo._netapp.dhcp((uint32_t *)pucIP_Addr,
+                (uint32_t *)pucSubnetMask,
+                (uint32_t *)pucIP_DefaultGWAddr,
+                (uint32_t *)pucDNS);
+
+    // reset the CC3000 to apply Static Setting
+    wigo._wlan.stop();
+    wait(1);
+    wigo._wlan.start(0);
+
+    // Mask out all non-required events from CC3000
+    wigo._wlan.set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|
+                        HCI_EVNT_WLAN_UNSOL_INIT|
+                        HCI_EVNT_WLAN_ASYNC_PING_REPORT);
+    return(0);
+}
+
+void connect_to_ssid(uint8_t *ssid, uint8_t *key, uint8_t sec_mode) {
+    printf("Connecting to SSID: %s. Timeout is 10s.\n",ssid);
+    if (wigo.connect_to_AP(ssid, key, sec_mode) == true) {
+        printf("Connected\n");
+    } else {
+        printf("Connection timed-out (error).\n");
+  }
+}
+
+void connect_to_ssid(uint8_t *ssid) {
+    wigo.connect_open(ssid);
+}
+
+int main() {
+    // set current to 500mA since we're turning on the Wi-Fi
+    PWR_EN1 = 0;
+    PWR_EN2 = 1;
+
+    pc.baud (115200);
+
+    NVIC_SetAllPriority(3);               // Set ALL interrupt priorities to level 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
+
+    // Clear pending interrupt
+    WLAN_ISF_PCR  |= PORT_PCR_ISF_MASK;
+    WLAN_ISF_ISFR |= WLAN_ISF_MASK;
+
+    GREEN_ON;
+    wigo.start(0);
+    printf("CC3000 Python demo.\n");
+    print_cc3000_info();
+
+    printf("\n<0> Normal run. SmartConfig will\n    start if no valid connection exists.\n");
+    printf("<1> Connect using fixed SSID : %s\n", SSID);
+    printf("<2> SmartConfig.\n");
+
+    signed char c = getchar();
+    switch (c)
+    {
+        case '0':
+            if(!userFS.FTC)
+            {
+                do_FTC();
+                wigo._wlan.stop();
+            }
+            break;
+        case '1':
+            printf("Attempting SSID Connection\n");
+#ifndef CC3000_TINY_DRIVER
+    #ifdef AP_KEY
+            connect_to_ssid((uint8_t *)SSID,(uint8_t *)AP_KEY,AP_SECURITY); /* TODO rewrite to const vraiables - NOT MACROS */
+    #else
+            connect_to_ssid(SSID);
+    #endif
+#else
+            connect_to_ssid(SSID);
+#endif
+            break;
+        case '2':
+            //server_running = 1;
+            //runSmartConfig = 1;
+            start_smart_config();
+            init_tcp();
+            //server_running = 1;
+            RED_OFF;
+            GREEN_OFF;
+            BLUE_OFF;
+            printf("Press the reset button on your board and select 1...\n");
+            while(1)
+            {
+                GREEN_ON;
+                wait_ms(500);
+                GREEN_OFF;
+                wait_ms(500);
+            }
+        default:
+            printf("Wrong selection.\n");
+            printf("Reset the board and try again.\n");
+            break;
+    }
+    //server_running = 0;
+    SmartConfigProfilestored = SMART_CONFIG_SET;
+    RED_OFF;
+    GREEN_OFF;
+    BLUE_OFF;
+
+    //dynamic dhcp is set by default
+#if IP_ALLOC_METHOD == USE_STATIC_IP
+    set_static_dhcp();
+#endif
+
+    run_tcp_server();    // Run TCP/IP Connection to host
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,30 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+extern DigitalOut ledr;
+extern DigitalOut ledg;
+extern DigitalOut ledb;
+extern DigitalOut led1;
+extern DigitalOut led2;
+extern DigitalOut led3;
+
+#define RED_OFF        ledr = 1;
+#define RED_ON         ledr = 0;
+#define RED_TOGGLE     ledr = !ledr;
+#define GREEN_OFF      ledg = 1;
+#define GREEN_ON       ledg = 0;
+#define GREEN_TOGGLE   ledg = !ledg;
+#define BLUE_OFF       ledb = 1;
+#define BLUE_ON        ledb = 0;
+#define BLUE_TOGGLE    ledb = !ledb;
+#define LED_D1_OFF     led1 = 1;
+#define LED_D1_ON      led1 = 0;
+#define LED_D1_TOGGLE  led1 = !led1;
+#define LED_D2_OFF     led2 = 1;
+#define LED_D2_ON      led2 = 0;
+#define LED_D2_TOGGLE  led2 = !led2;
+#define LED_D3_OFF     led3 = 1;
+#define LED_D3_ON      led3 = 0;
+#define LED_D3_TOGGLE  led3 = !led3;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Sep 08 18:31:33 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9c8f0e3462fb
\ No newline at end of file