Simple HTTP GET and POST with ESP8266.

Dependencies:   ESP8266Interface HTTPClient-SSL WebSocketClient mbed-rtos mbed

Fork of ESP8266_HTTP_HelloWorld by ESP8266

Files at this revision

API Documentation at this revision

Comitter:
michaeljkoster
Date:
Wed Dec 24 19:02:13 2014 +0000
Child:
1:f61c1001ee60
Commit message:
Initial commit

Changed in this revision

ESP8266Interface.lib Show annotated file Show diff for this revision Revisions of this file
PololuLedStrip.lib Show annotated file Show diff for this revision Revisions of this file
dbg.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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
nsdl_lib.lib Show annotated file Show diff for this revision Revisions of this file
nsdl_support.cpp Show annotated file Show diff for this revision Revisions of this file
nsdl_support.h Show annotated file Show diff for this revision Revisions of this file
resources/light.cpp Show annotated file Show diff for this revision Revisions of this file
resources/light.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ESP8266Interface.lib	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/components/code/WiflyInterface/#03585a13ff3b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PololuLedStrip.lib	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/DavidEGrayson/code/PololuLedStrip/#aa89fb2a5769
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbg.h	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,17 @@
+#ifndef DEBUG_H
+#define DEBUG_H
+
+#include "nsdl_support.h"
+#include "mbed.h"
+
+//Debug is disabled by default
+#define DEBUG 1
+
+#if (DEBUG)
+extern Serial pc;
+#define NSDL_DEBUG(x, ...) pc.printf("[NSDL_DEBUG: %s:%d]" x "\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
+#else
+#define NSDL_DEBUG(x, ...)
+#endif
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,149 @@
+#include "mbed.h"
+#include "ESP8266Interface.h"
+#include "nsdl_support.h"
+#include "dbg.h"
+#include "UDPSocket.h"
+#include "Endpoint.h"
+
+// Include resources
+#include "light.h"
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+// ****************************************************************************
+// Configuration section
+
+
+// Ethernet configuration
+/* Define this to enable DHCP, otherwise manual address configuration is used */
+#define DHCP
+  
+/* Manual IP configurations, if DHCP not defined */
+#define IP      "10.0.0.199"
+#define MASK    "255.255.255.0"
+#define GW      "10.0.0.1"
+
+
+// NSP configuration
+/* Change this IP address to that of your NanoService Platform installation */
+//static const char* NSP_ADDRESS = "191.239.5.150"; // barista2.cloudapp.net
+static const char* NSP_ADDRESS = "108.201.184.41"; // smartobjectservice.com
+//static const char* NSP_ADDRESS = "192.168.1.200"; // local mDS server
+static const int NSP_PORT = 5683;
+char endpoint_name[24] = "mbedDEMO-";
+uint8_t ep_type[] = {"DEMO"};
+uint8_t lifetime_ptr[] = {"60"};
+
+// ****************************************************************************
+// Ethernet initialization
+
+
+ESP8266Interface wifi(PA_15,PB_7,PA_14,"demo","ARMDEMO1");
+
+
+static void ethernet_init()
+{
+    pc.printf("init\r\n");
+    wifi.init(); // initialize the interface, reset the module
+    
+    pc.printf("join\r\n");
+    wifi.join(); // join AP and get DHCP settings
+}
+
+// ****************************************************************************
+// NSP initialization
+
+UDPSocket server;
+Endpoint nsp;
+bool UDP_blocking = false;
+unsigned int UDP_timeout = 100;
+
+uint8_t macbytes[6] = {0};
+char MAC[20] = "776655443322";
+
+static void nsp_init()
+{
+    //pc.printf("socket init\r\n");
+    server.init();
+    //pc.printf("socket bind\r\n");
+    server.bind(0);
+    pc.printf("set blocking option\r\n");
+    server.set_blocking(UDP_blocking, UDP_timeout);
+    
+    pc.printf("set ep address\r\n");
+    nsp.set_address(NSP_ADDRESS, NSP_PORT);
+        
+    strncat(endpoint_name, MAC, 12);
+    
+    NSDL_DEBUG("name: %s", endpoint_name);
+    NSDL_DEBUG("NSP=%s - port %d\n", NSP_ADDRESS, NSP_PORT);
+
+}
+
+// ****************************************************************************
+// Resource creation
+
+static int create_resources()
+{
+    sn_nsdl_resource_info_s *resource_ptr = NULL;
+    sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
+    
+    NSDL_DEBUG("Creating resources");
+
+    /* Create resources */
+    resource_ptr = (sn_nsdl_resource_info_s*)nsdl_alloc(sizeof(sn_nsdl_resource_info_s));
+    if(!resource_ptr)
+        return 0;
+    memset(resource_ptr, 0, sizeof(sn_nsdl_resource_info_s));
+
+    resource_ptr->resource_parameters_ptr = (sn_nsdl_resource_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s));
+    if(!resource_ptr->resource_parameters_ptr)
+    {
+        nsdl_free(resource_ptr);
+        return 0;
+    }
+    memset(resource_ptr->resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s));
+
+    // Static resources
+    nsdl_create_static_resource(resource_ptr, sizeof("3/0/0")-1, (uint8_t*) "3/0/0", 0, 0,  (uint8_t*) "mbedDEMO", sizeof("mbedDEMO")-1);
+    nsdl_create_static_resource(resource_ptr, sizeof("3/0/1")-1, (uint8_t*) "3/0/1", 0, 0,  (uint8_t*) "DEMO", sizeof("DEMO")-1);
+
+    // Dynamic resources
+    create_light_resource(resource_ptr);
+
+        /* Register with NSP */
+    endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
+    if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
+        pc.printf("NSP registering failed\r\n");
+    else
+        pc.printf("NSP registering OK\r\n");
+    nsdl_clean_register_endpoint(&endpoint_ptr);
+
+    nsdl_free(resource_ptr->resource_parameters_ptr);
+    nsdl_free(resource_ptr);
+    return 1;
+}
+
+// ****************************************************************************
+// Program entry point
+
+int main()
+{
+    pc.printf("SystemCoreClock=: %d\r\n", SystemCoreClock / 1000000) ;
+    NSDL_DEBUG("Hello mDS Demo Endpoint Application\n");
+    
+    // Initialize Ethernet interface first
+    ethernet_init();
+    
+    // Initialize NSP node
+    nsp_init();
+    
+    // Initialize NSDL stack
+    nsdl_init();
+    
+    // Create NSDL resources
+    create_resources();
+    
+    // Run the NSDL event loop (never returns)
+    nsdl_event_loop();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nsdl_lib.lib	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Sensinode/code/nsdl_lib/#388450b1e776
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nsdl_support.cpp	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,210 @@
+// NSDL library support functions
+
+#include "mbed.h"
+#include "nsdl_support.h"
+#include "mbed.h"
+#include "UDPSocket.h"
+#include "Endpoint.h"
+
+/*    __heapvalid((__heapprt)fprintf,stdout, 1);\*/
+#define MEM_VALID(x) \
+    int s##x=0;\
+    int *h##x = new int [1];\
+    std::printf("[stack]0x%08x\t[heap]0x%08x\t[memory avail]%d bytes \tLine: %d %s\r\n", &s##x, h##x, &s##x-h##x, __LINE__, __FILE__);\
+    if (h##x > &s##x)\
+    printf("collision\n");\
+    else\
+    delete [] h##x;\
+    __nop()
+
+extern Serial pc;
+extern Endpoint nsp;
+extern UDPSocket server;
+extern char endpoint_name[24];
+extern uint8_t ep_type[];
+extern uint8_t lifetime_ptr[];
+char null_ep_name[] = "";
+uint8_t null_ep_type[] = "";
+uint8_t null_lifetime_ptr[] = "60";
+bool nsdl_reg_update_needed = false;
+
+/* The number of seconds between NSP registration messages */
+#define RD_UPDATE_PERIOD  30
+
+void *nsdl_alloc(uint16_t size)
+{
+    void *buf = malloc(size);
+//    printf("alloc\r\n");
+//    MEM_VALID(0);
+    return buf;
+}
+
+void nsdl_free(void* ptr_to_free)
+{
+    free(ptr_to_free);
+//    printf("de-alloc\r\n");
+//    MEM_VALID(0);
+}
+
+/*
+ * Create a static resoure
+ * Only get is allowed
+ */
+void nsdl_create_static_resource(sn_nsdl_resource_info_s *resource_structure, uint16_t pt_len, uint8_t *pt, uint16_t rpp_len, uint8_t *rpp_ptr, uint8_t *rsc, uint16_t rsc_len)
+{
+    resource_structure->access = SN_GRS_GET_ALLOWED;
+    resource_structure->mode = SN_GRS_STATIC;
+    resource_structure->pathlen = pt_len;
+    resource_structure->path = pt;
+    resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;
+    resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;
+    resource_structure->resource = rsc;
+    resource_structure->resourcelen = rsc_len;
+    sn_nsdl_create_resource(resource_structure);
+}
+
+void nsdl_create_dynamic_resource(sn_nsdl_resource_info_s *resource_structure, uint16_t pt_len, uint8_t *pt, uint16_t rpp_len, uint8_t *rpp_ptr, uint8_t is_observable, sn_grs_dyn_res_callback_t callback_ptr, int access_right)
+{
+    resource_structure->access = (sn_grs_resource_acl_e)access_right;
+    resource_structure->resource = 0;
+    resource_structure->resourcelen = 0;
+    resource_structure->sn_grs_dyn_res_callback = callback_ptr;
+    resource_structure->mode = SN_GRS_DYNAMIC;
+    resource_structure->pathlen = pt_len;
+    resource_structure->path = pt;
+    resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;
+    resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;
+    resource_structure->resource_parameters_ptr->observable = is_observable;
+    sn_nsdl_create_resource(resource_structure);
+}
+
+sn_nsdl_ep_parameters_s* nsdl_init_register_endpoint(sn_nsdl_ep_parameters_s *endpoint_structure, uint8_t* name, uint8_t* typename_ptr, uint8_t *lifetime_ptr)
+{
+    if (NULL == endpoint_structure)
+    {   
+        endpoint_structure = (sn_nsdl_ep_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_ep_parameters_s));
+    }
+    if (endpoint_structure)
+    {
+        memset(endpoint_structure, 0, sizeof(sn_nsdl_ep_parameters_s));
+        endpoint_structure->endpoint_name_ptr = name;
+        endpoint_structure->endpoint_name_len = strlen((char*)name);
+        endpoint_structure->type_ptr = typename_ptr;
+        endpoint_structure->type_len =  strlen((char*)typename_ptr);
+        endpoint_structure->lifetime_ptr = lifetime_ptr;
+        endpoint_structure->lifetime_len =  strlen((char*)lifetime_ptr); 
+    }
+    return endpoint_structure;
+}
+
+void nsdl_clean_register_endpoint(sn_nsdl_ep_parameters_s **endpoint_structure)
+{
+    if (*endpoint_structure)
+    {
+        nsdl_free(*endpoint_structure);
+        *endpoint_structure = NULL;
+    }
+}
+
+static uint8_t tx_cb(sn_nsdl_capab_e protocol, uint8_t *data_ptr, uint16_t data_len, sn_nsdl_addr_s *address_ptr)
+{
+    pc.printf("TX callback!\n\rSending %d bytes\r\n", data_len);
+
+    if(server.sendTo(nsp, (char*)data_ptr, data_len) != data_len)
+        pc.printf("sending failed\n\r");
+
+    return 1;
+}
+
+static uint8_t rx_cb(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
+{
+    pc.printf("RX callback!\r\n");
+    pc.printf("msg_code: %d \r\n", coap_packet_ptr->msg_code);
+    pc.printf("Payload length: %d bytes\r\n", coap_packet_ptr->payload_len);
+    int i;
+    pc.printf("Payload:'");
+    for (i=0; i < coap_packet_ptr->payload_len; i++)
+        pc.printf("%c", *(coap_packet_ptr->payload_ptr + i));
+    pc.printf("' \r\n");
+    if (coap_packet_ptr->options_list_ptr && coap_packet_ptr->options_list_ptr->location_path_ptr)
+    {
+        pc.printf("Location: /");
+        int i;
+        for (i=0; i < coap_packet_ptr->options_list_ptr->location_path_len; i++) pc.printf("%c", (char)(coap_packet_ptr->options_list_ptr->location_path_ptr[i]));
+        pc.printf(" \r\n");
+    }
+    //sn_coap_packet_debug(coap_packet_ptr);
+    return 0;
+}
+
+void nsdl_init()
+{
+    uint8_t nsp_addr[4];
+    sn_nsdl_mem_s memory_cbs;
+
+    /* Initialize libNsdl */
+    memory_cbs.sn_nsdl_alloc = &nsdl_alloc;
+    memory_cbs.sn_nsdl_free = &nsdl_free;
+    if(sn_nsdl_init(&tx_cb, &rx_cb, &memory_cbs) == -1)
+        pc.printf("libNsdl init failed\r\n");
+    else
+        pc.printf("libNsdl init done\r\n");
+
+    /* Set nsp address for library */
+    set_NSP_address(nsp_addr, 5683, SN_NSDL_ADDRESS_TYPE_IPV4);
+}   
+
+void nsdl_reg_update()
+    {
+    sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
+    endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)null_ep_name, null_ep_type, null_lifetime_ptr);
+    if(sn_nsdl_update_registration(endpoint_ptr) != 0)
+        pc.printf("NSP registration update failed\r\n");
+    else
+        pc.printf("NSP registration update OK\r\n");
+    nsdl_clean_register_endpoint(&endpoint_ptr);
+    }
+    
+void nsdl_reg_update_timeout()
+    {
+    nsdl_reg_update_needed = true;
+    }
+
+Ticker regUpdateTicker;
+
+void nsdl_event_loop()
+{
+    regUpdateTicker.attach(&nsdl_reg_update_timeout, RD_UPDATE_PERIOD);
+
+    sn_nsdl_addr_s received_packet_address;
+    uint8_t received_address[4];
+    char buffer[1024];
+    Endpoint from;
+
+    memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
+    received_packet_address.addr_ptr = received_address;
+
+    uint16_t count = 0;
+    while(1)
+    {
+        int n = server.receiveFrom(from, buffer, sizeof(buffer));
+        if (n < 0)
+        {
+            pc.printf("Socket error: %d\n\r", n);
+        }
+        else if (n > 0)
+        {   
+            count = 0;
+            pc.printf("Received %d bytes\r\n", n);
+            sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
+        }
+        if (nsdl_reg_update_needed)
+        {
+            nsdl_reg_update_needed = false;
+            nsdl_reg_update();
+        }
+        //pc.printf("nsdl loop: %d\r\n", count++);
+    }
+}
+
+            
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nsdl_support.h	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,24 @@
+// Support functions for the NSDL library
+
+#ifndef NSDL_SUPPORT_H
+#define NSDL_SUPPORT_H
+
+#include "mbed.h"
+#include <stdint.h>
+#include "sn_nsdl.h"
+#include "sn_coap_header.h"
+#include "sn_coap_protocol.h"
+#include "sn_nsdl_lib.h"
+
+typedef uint8_t (*sn_grs_dyn_res_callback_t)(sn_coap_hdr_s *, sn_nsdl_addr_s *, sn_proto_info_s *);
+
+extern "C" void *nsdl_alloc(uint16_t size);
+extern "C" void nsdl_free(void* ptr_to_free);
+void nsdl_create_static_resource(sn_nsdl_resource_info_s *resource_structure, uint16_t pt_len, uint8_t *pt, uint16_t rpp_len, uint8_t *rpp_ptr, uint8_t *rsc, uint16_t rsc_len);
+void nsdl_create_dynamic_resource(sn_nsdl_resource_info_s *resource_structure, uint16_t pt_len, uint8_t *pt, uint16_t rpp_len, uint8_t *rpp_ptr, uint8_t is_observable, sn_grs_dyn_res_callback_t callback_ptr, int access_right);
+sn_nsdl_ep_parameters_s* nsdl_init_register_endpoint(sn_nsdl_ep_parameters_s *endpoint_structure, uint8_t* name, uint8_t* ypename_ptr, uint8_t *lifetime_ptr);
+void nsdl_clean_register_endpoint(sn_nsdl_ep_parameters_s **endpoint_structure);
+void nsdl_init();
+void nsdl_event_loop();
+
+#endif // NSDL_SUPPORT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resources/light.cpp	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,102 @@
+// Light resource implementation
+
+#include "mbed.h"
+#include "nsdl_support.h"
+#include "light.h"
+
+#include "PololuLedStrip.h"
+PololuLedStrip ledStrip(D2);
+//#define LED_COUNT 60
+#define LED_COUNT 120
+rgb_color colors[LED_COUNT];
+
+#define LIGHT_RES_ID    "11100/0/5900"
+
+extern Serial pc;
+char led_color[] = {"00000000"};
+
+void set_led_color(char *color_string)
+{
+static uint8_t red, green, blue, index ;
+int color_int ;
+
+    sscanf(color_string, "%X", &color_int);
+    
+    index = color_int & 255;
+    blue = color_int >> 8 & 255;
+    green = color_int >> 16 & 255;
+    red = color_int >> 24 & 255;
+        
+    if(index > 0 and index <= LED_COUNT)
+    {
+        colors[index-1] = (rgb_color) {red,green,blue} ;
+        ledStrip.write(colors, LED_COUNT);
+    }
+    else if(index == 0)
+    {
+        for(int i = 0; i < LED_COUNT; i++)
+        {
+            colors[i] = (rgb_color) {red,green,blue} ;
+            ledStrip.write(colors, LED_COUNT);
+            wait_ms(10);
+        }
+    }
+    else if(index == 255)
+    {    
+        for( int i = LED_COUNT-1; i > 0; i-- )
+        {
+            colors[i] = colors [i-1];
+        }
+    colors[0] = (rgb_color) {red,green,blue} ;
+    ledStrip.write(colors, LED_COUNT);
+    }
+}
+
+/* Only GET and PUT method allowed */
+static uint8_t light_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
+{
+    sn_coap_hdr_s *coap_res_ptr = 0;
+
+    //pc.printf("LED Strip callback\r\n");
+
+    if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET)
+    {
+        coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
+
+        coap_res_ptr->payload_len = strlen(led_color);
+        coap_res_ptr->payload_ptr = (uint8_t*)led_color;
+        sn_nsdl_send_coap_message(address, coap_res_ptr);
+    }
+    else if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT)
+    {
+        //pc.printf("PUT: %d bytes\r\n", received_coap_ptr->payload_len);
+        if(received_coap_ptr->payload_len == 8)
+        {
+            memcpy(led_color, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len);
+
+            led_color[received_coap_ptr->payload_len] = '\0';
+            pc.printf("PUT: %s\r\n",led_color);
+
+            //call LED strup update function here
+            set_led_color(led_color);
+
+            coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
+            sn_nsdl_send_coap_message(address, coap_res_ptr);
+        }
+    }
+
+    sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
+    return 0;
+}
+
+int create_light_resource(sn_nsdl_resource_info_s *resource_ptr)
+{
+    nsdl_create_dynamic_resource(resource_ptr, sizeof(LIGHT_RES_ID)-1, (uint8_t*)LIGHT_RES_ID, 0, 0, 0, &light_resource_cb, (SN_GRS_GET_ALLOWED | SN_GRS_PUT_ALLOWED));
+
+    set_led_color("10000000");
+    set_led_color("00100000");
+    set_led_color("00001000");
+    set_led_color("00000000");
+    
+    return 0;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resources/light.h	Wed Dec 24 19:02:13 2014 +0000
@@ -0,0 +1,10 @@
+// Light resource implementation
+
+#ifndef LIGHT_H
+#define LIGHT_H
+
+#include "nsdl_support.h"
+
+int create_light_resource(sn_nsdl_resource_info_s *resource_ptr);
+
+#endif