ESP8266 driver using the NodeMCU interface

Dependencies:   BufferedSerial

Dependents:   esp8266_nodeMCU1 esp8266_2_thingspeak1 Solarator_0-0-2 IoTBurglar_and_Fire_AlarmSystem ... more

Fork of ESP8266Interface by ESP8266

This is an alternative implementation of the ESP8266 driver that uses the NodeMCU firmware. The NodeMCU firmware provides a slightly larger feature set than the default firmware through a Lua interpreter.

Note

This library is currently in Alpha. It is not feature complete and has some bugs, proceed with caution. Fixes and patches are welcome!

Interface changes

  • SSID and passphrase moved out of ESP8266Interface constructor and to ESP8266Interface::connect
  • ESP8266Interface constructor provides optional timeout parameter to specify how long to wait for network operations

Note

NodeMCU defaults to a baud rate of 9600 instead of 115200 used by the default firmware.

Firmware

To install the NodeMCU firmware, follow the instructions on the Firmware Update wiki page using the nodemcu_integer_0.9.6-dev_20150406.bin binary at address 0x00000 instead of boot_v1.1.bin and user1.bin.

Since the NodeMCU firmware defaults to a baud rate of 9600, the Serial Passthrough program can be used to get direct access to the Lua interpreter running on the ESP8266.

Status

Working features:

  • TCP Client
  • UDP Client Transmit (Currently only UDP Server can recieve messages)
  • Single Connection at a time
  • Station Mode (Connects to AP)
  • DNS Lookups

To be implemented:

  • TCP Server
  • UDP Server
  • UDP Client recieve
  • Multiple Connections tracked through Lua variables
  • AP Mode (Act as access point)
  • IPV6 support (Existing issue with NodeMCU)

Files at this revision

API Documentation at this revision

Comitter:
michaeljkoster
Date:
Wed Oct 08 19:57:58 2014 +0000
Parent:
11:fc3d86645d23
Child:
13:41098c907200
Commit message:
Debug

Changed in this revision

Socket/UDPSocket.cpp Show annotated file Show diff for this revision Revisions of this file
Wifly/Wifly.cpp Show annotated file Show diff for this revision Revisions of this file
WiflyInterface.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Socket/UDPSocket.cpp	Tue Jun 03 18:43:14 2014 +0000
+++ b/Socket/UDPSocket.cpp	Wed Oct 08 19:57:58 2014 +0000
@@ -21,6 +21,8 @@
 #include <string>
 #include <algorithm>
 
+extern Serial pc;
+
 UDPSocket::UDPSocket()
 {
     endpoint_configured = false;
@@ -40,29 +42,30 @@
     char cmd[17];
     
     // set local port
-    sprintf(cmd, "set i l %d\r", port);
-    if (!wifi->sendCommand(cmd, "AOK"))
-        return -1;
+    sprintf(cmd, "set i l %d\n\r", port);
+    if (!wifi->sendCommand(cmd, "AOK")){
+        pc.printf("bind to port failed\r\n");
+        return -1;}
         
     // save
-    if (!wifi->sendCommand("save\r", "Stor"))
-        return -1;
+    //if (!wifi->sendCommand("save\n\r", "Stor"))
+        //return -1;
     
     // reboot
-    wifi->reboot();
+    //wifi->reboot();
     
     // set udp protocol
-    wifi->setProtocol(UDP);
-    
+    //wifi->setProtocol(UDP);
+    /*
     // connect the network
     if (wifi->isDHCP()) {
-        if (!wifi->sendCommand("join\r", "DHCP=ON", NULL, 10000))
+        if (!wifi->sendCommand("join\n\r", "DHCP=ON", NULL, 10000))
             return -1;
     } else {
-        if (!wifi->sendCommand("join\r", "Associated", NULL, 10000))
+        if (!wifi->sendCommand("join\n\r", "Associated", NULL, 10000))
             return -1;
     }
-        
+    */    
     // exit
     wifi->exit();
     wifi->flush();
@@ -104,7 +107,8 @@
                 break;
             }
         }
-    }
+        pc.printf("UDPsocket::receiveFrom: %d bytes\r\n", nb_available);
+   }
 
     tmr.start();
 
@@ -135,12 +139,12 @@
         host = ep.get_address();
         if (host[0] != '\0') {
             // set host
-            sprintf(cmd, "set i h %s\r", host);
+            sprintf(cmd, "set i h %s\r\n", host);
             if (!wifi->sendCommand(cmd, "AOK"))
                 return false;
                 
             // set remote port
-            sprintf(cmd, "set i r %d\r", ep.get_port());
+            sprintf(cmd, "set i r %d\r\n", ep.get_port());
             if (!wifi->sendCommand(cmd, "AOK"))
                 return false;
                 
@@ -161,7 +165,7 @@
     string addr;
     int port;
     if (!endpoint_read) {
-        if (!wifi->sendCommand("get ip\r", NULL, recv))
+        if (!wifi->sendCommand("get ip\r\n", NULL, recv))
             return false;
         wifi->exit();
         str = recv;
--- a/Wifly/Wifly.cpp	Tue Jun 03 18:43:14 2014 +0000
+++ b/Wifly/Wifly.cpp	Wed Oct 08 19:57:58 2014 +0000
@@ -40,6 +40,8 @@
 
 #define MAX_TRY_JOIN 3
 
+extern Serial pc;
+
 Wifly * Wifly::inst;
 
 Wifly::Wifly(   PinName tx, PinName rx, PinName _reset, PinName tcp_status, const char * ssid, const char * phrase, Security sec):
@@ -72,65 +74,65 @@
     for (int i= 0; i < MAX_TRY_JOIN; i++) {
 
         // no auto join
-        if (!sendCommand("set w j 0\r", "AOK"))
+        if (!sendCommand("set w j 0\r\n", "AOK"))
             continue;
 
         //no echo
-        if (!sendCommand("set u m 1\r", "AOK"))
+        if (!sendCommand("set u m 1\r\n", "AOK"))
             continue;
 
         // set time
-        if (!sendCommand("set c t 30\r", "AOK"))
+        if (!sendCommand("set c t 30\r\n", "AOK"))
             continue;
 
         // set size
-        if (!sendCommand("set c s 1024\r", "AOK"))
+        if (!sendCommand("set c s 1024\r\n", "AOK"))
             continue;
 
         // red led on when tcp connection active
-        if (!sendCommand("set s i 0x40\r", "AOK"))
+        if (!sendCommand("set s i 0x40\r\n", "AOK"))
             continue;
 
         // no string sent to the tcp client
-        if (!sendCommand("set c r 0\r", "AOK"))
+        if (!sendCommand("set c r 0\r\n", "AOK"))
             continue;
 
         // tcp protocol
-        if (!sendCommand("set i p 2\r", "AOK"))
+        if (!sendCommand("set i p 2\r\n", "AOK"))
             continue;
 
         // tcp retry
-        if (!sendCommand("set i f 0x7\r", "AOK"))
+        if (!sendCommand("set i f 0x7\r\n", "AOK"))
             continue;
             
         // set dns server
-        if (!sendCommand("set d n rn.microchip.com\r", "AOK"))
+        if (!sendCommand("set d n rn.microchip.com\r\n", "AOK"))
             continue;
 
         //dhcp
-        sprintf(cmd, "set i d %d\r", (state.dhcp) ? 1 : 0);
+        sprintf(cmd, "set i d %d\r\n", (state.dhcp) ? 1 : 0);
         if (!sendCommand(cmd, "AOK"))
             continue;
 
         // ssid
-        sprintf(cmd, "set w s %s\r", ssid);
+        sprintf(cmd, "set w s %s\r\n", ssid);
         if (!sendCommand(cmd, "AOK", NULL, 1000))
             continue;
 
         //auth
-        sprintf(cmd, "set w a %d\r", state.sec);
+        sprintf(cmd, "set w a %d\r\n", state.sec);
         if (!sendCommand(cmd, "AOK"))
             continue;
 
         // if no dhcp, set ip, netmask and gateway
         if (!state.dhcp) {
-            DBG("not dhcp\r");
+            DBG("not dhcp\r\n");
 
             sprintf(cmd, "set i a %s\r\n", ip);
             if (!sendCommand(cmd, "AOK"))
                 continue;
 
-            sprintf(cmd, "set i n %s\r", netmask);
+            sprintf(cmd, "set i n %s\r\n", netmask);
             if (!sendCommand(cmd, "AOK"))
                 continue;
 
@@ -142,16 +144,16 @@
         //key step
         if (state.sec != NONE) {
             if (state.sec == WPA)
-                sprintf(cmd, "set w p %s\r", phrase);
+                sprintf(cmd, "set w p %s\r\n", phrase);
             else if (state.sec == WEP_128)
-                sprintf(cmd, "set w k %s\r", phrase);
+                sprintf(cmd, "set w k %s\r\n", phrase);
 
             if (!sendCommand(cmd, "AOK", NULL, 1000))
                 continue;
         }
 
         //join the network
-        sprintf(cmd, "join\r");
+        sprintf(cmd, "join\r\n");
         if (!sendCommand(cmd, "Associated", NULL, 3000))
             continue;
         
@@ -159,11 +161,11 @@
             continue;
 
         if (state.dhcp) {
-            if (!sendCommand("get i\r", "DHCP=ON", NULL, 3000))
+            if (!sendCommand("get i\r\n", "DHCP=ON", NULL, 3000))
                 continue;
         }
 
-        if (!sendCommand("save\r", "Stor"))
+        if (!sendCommand("save\r\n", "Stor"))
             continue;
 
         exit();
@@ -180,21 +182,22 @@
 {
     // use udp auto pairing
     char cmd[20];
-    sprintf(cmd, "set i p %d\r", p);
+    sprintf(cmd, "set i p %d\r\n", p);
     if (!sendCommand(cmd, "AOK"))
         return false;
 
     switch(p) {
         case TCP:
             // set ip flags: tcp retry enabled
-            if (!sendCommand("set i f 0x07\r", "AOK"))
+            if (!sendCommand("set i f 0x07\r\n", "AOK"))
                 return false;
             break;
         case UDP:
             // set ip flags: udp auto pairing enabled
-            if (!sendCommand("set i h 0.0.0.0\r", "AOK"))
+            if (!sendCommand("set i h 0.0.0.0\r\n", "AOK"))
                 return false;
-            if (!sendCommand("set i f 0x40\r", "AOK"))
+            if (!sendCommand("set i f 0x40\r\n", "AOK"))
+//            if (!sendCommand("set i f 0x00\r\n", "AOK")) // TEST turn off autopairing
                 return false;
             break;
     }
@@ -221,7 +224,7 @@
     char cmd[20];
 
     // try to open
-    sprintf(cmd, "open %s %d\r", host, port);
+    sprintf(cmd, "open %s %d\r\n", host, port);
     if (sendCommand(cmd, "OPEN", NULL, 10000)) {
         state.tcp = true;
         state.cmd_mode = false;
@@ -233,7 +236,7 @@
         if (strstr(rcv, "OPEN") == NULL) {
             if (strstr(rcv, "Connected") != NULL) {
                 wait(0.25);
-                if (!sendCommand("close\r", "CLOS"))
+                if (!sendCommand("close\r\n", "CLOS"))
                     return false;
                 wait(0.25);
                 if (!sendCommand(cmd, "OPEN", NULL, 10000))
@@ -274,7 +277,7 @@
     // dns needed
     else {
         nb_digits = 0;
-        sprintf(cmd, "lookup %s\r", host);
+        sprintf(cmd, "lookup %s\r\n", host);
         if (!sendCommand(cmd, NULL, rcv))
             return false;
 
@@ -363,7 +366,7 @@
 bool Wifly::reboot()
 {
     // if already in cmd mode, return
-    if (!sendCommand("reboot\r"))
+    if (!sendCommand("reboot\r\n"))
         return false;
     
     wait(0.3);
@@ -379,7 +382,7 @@
         return true;
 
     wait(0.25);
-    if (!sendCommand("close\r", "CLOS"))
+    if (!sendCommand("close\r\n", "CLOS"))
         return false;
     exit();
 
@@ -400,7 +403,7 @@
     flush();
     if (!state.cmd_mode)
         return true;
-    if (!sendCommand("exit\r", "EXIT"))
+    if (!sendCommand("exit\r\n", "EXIT"))
         return false;
     state.cmd_mode = false;
     flush();
--- a/WiflyInterface.cpp	Tue Jun 03 18:43:14 2014 +0000
+++ b/WiflyInterface.cpp	Wed Oct 08 19:57:58 2014 +0000
@@ -41,7 +41,7 @@
 {
     char * match = 0;
     if (!ip_set) {
-        if (!sendCommand("get ip a\r", NULL, ip_string))
+        if (!sendCommand("get ip a\r\n", NULL, ip_string))
             return NULL;
         exit();
         flush();