[应用方案] ESP8266进阶篇

[复制链接]
 楼主| 萧洛毫 发表于 2019-4-30 22:45 | 显示全部楼层 |阅读模式
说一下如何通过内网和外网来控制我的ESP8266的数据模块
1、内网控制:(要求手机直接连接在ESP8266的WIFI上面,使用“TCP连接”这款软件来控制ESP8266的数据,模块的设置按照之前上面的主机端的设置模式即可
    这种情况下需要设置ESP8266模块为AP模式,也就是AT+CWMODE=2(AP Mode as a TCP Server),这个时候手机作为Client端,通过无线连接到AP端。如下图所示:
    772331-20170225133328788-1830326566.jpg     772331-20170225133557257-199330913.jpg

 楼主| 萧洛毫 发表于 2019-4-30 22:56 | 显示全部楼层
2、经过家庭WIFI无线路由器节点来让外网访问ESP8266模块,需要知道的是ESP8266的IP地址和MAC地址及其端口。
或者直接下载云盘文档链接:http://pan.baidu.com/s/1c2lAePE 密码:8zgm
上面的这篇文档,没有涉及到DMZ服务的配置,现在的路由器需要设置好DMZ服务器之后才能将本地的ESP8266模块的数据发送出去!
还可以参考这篇博客园的博客:http://www.cnblogs.com/yangfengwu/p/5295632.html
一、ESP8266的设置:AT+RST  -->   AT+CWMODE=3   -->   AT+CWLAP   -->    AT+CWJAP="ssid of Router","PassWords of Router"   -->     AT+CIFSR  -->    AT+CIPMUX=1   -->AT+CIPSERVER=1,333
                              复位ESP    配置为AP/Station兼容模式       列出所有AP              找到当前的无线wifi路由器,输入账户密码,加入AP       列出ESP8266的IP和MAC地址  设置为多连模式        设置服务端口
二、TP link路由器设置:
首先登陆家里的路由器界面,管理员密码
772331-20170225204531741-2056917533.jpg 772331-20170225204543570-1981980067.jpg 772331-20170225204920304-1228943085.jpg
在应用管理中获得ESP8266的密码和MAC地址,同时绑定IP和MAC地址,保证每次启动的时候IP不用动态分配,保持IP不变!
在应用管理中设置启用DMZ主机服务,将ESP8266模块暴露在公网中,在DMZ主机IP地址填写之前路由器分配的IP地址即可!
在路由设置中获得路由器的外网IP地址:121.xx.xxx.xx
通过EasyTCP软件来链接我的ESP8266模块:(如下图所示)
772331-20170225205759335-1823641858.jpg        772331-20170225205904132-1170525654.jpg
     手机TCP端数据发送                                                                                       ESP8266客户端数据监控
不设置路由器来实现ESP8266的控制(采用内网透传的方式实现此功能)Time:2017 02 26
本来想使用免费的内网透传软件Xtunnel软件来做实验的,我用 Sockettool软件死活是连接不上我的Xtunnel公网,没办法就注册了花生壳,交了钱拿个域名(6元)和1G的流量(10元)
注册好花生壳的域名和流量之后,我们开始建立内网透传的IP和端口:
772331-20170226234311663-719074847.jpg 772331-20170226234916101-1219361886.jpg

 楼主| 萧洛毫 发表于 2019-4-30 22:57 | 显示全部楼层
下面我们开始设置ESP8266,这个设置和上面的一样,只不过我们不需要设置路由器的DMZ功能将内网主机ESP8266的IP地址和端口映射到广域网上啦~
AT
AT+RST
AT+CWLAP
AT+CWJAP="xxxx","xxxx"
AT+CIFSR
AT+CIPMUX=1
AT+CIPSERVER=1,333
772331-20170226235148132-2095916389.jpg
设置完之后就能传输数据啦!!非常方便

 楼主| 萧洛毫 发表于 2019-4-30 22:58 | 显示全部楼层
基于单片机控制的ESP8266模块的实验如下:
主机端:(步骤如下)
AT固件按照之前提供的AT固件包和烧录位置来烧录即可,在失忆之前先使用串口来直接调试ESP8266是否已经烧录完成!
单片机型号是STM32C8T6,串口使用的是UART2,代码如下:
main.c文件内容
  1. #include "stm32f10x.h"
  2. #include "app.h"
  3. #include "LED.h"
  4. #include "delay.h"
  5. #include "oled.h"

  6. #define T 1000
  7. unsigned char Return[200]={' '};
  8. unsigned char Clear[200]={' '};
  9. unsigned char Count=0;

  10. void delayms(void)
  11. {
  12.     int i=0,j=0;
  13.     for(i=0;i<1000;i++)
  14.     {
  15.         for(j=0;j<1000;j++) ;
  16.     }
  17. }
  18. int main(void)
  19. {
  20.     unsigned char Str[]="ESP8266 & STM32C8T6!";
  21.     unsigned char i=0;
  22.     char Len = 0;
  23.    
  24.     //Server ESP8266
  25.     char Server_Step1[]="AT\r\n";
  26.     char Server_Step2[]="AT+RST\r\n";
  27.     char Server_Step3[]="AT+CWMODE=2\r\n";
  28.     char Server_Step4[]="AT+CWSAP="UESTC-MM","1234abcd",1,3\r\n";
  29.     char Server_Step5[]="AT+CIFSR\r\n";
  30.     char Server_Step6[]="AT+CIPMODE=0\r\n";
  31.     char Server_Step7[]="AT+CIPMUX=1\r\n";
  32.     char Server_Step8[]="AT+CIPSERVER=1,333\r\n";
  33.     unsigned char Info1[]={"SSID:UESTC-MM"};
  34.     unsigned char Info2[]={"PSWD:1234abcd"};
  35.    
  36.     All_Init();
  37.     LED_init();
  38.     init_OLED();
  39.     USART2_Puts(Str);
  40.     OLED_P6x8Str(1,1,Str);

  41.    
  42.     OLED_P6x8Str(1,2,Info1);
  43.     OLED_P6x8Str(1,3,Info2);
  44.     //Command 1
  45.     USART2_Puts(Server_Step1); delayms(); delay_ms(T); delay_ms(T);
  46.     Return[Count] = '\0'; OLED_Fill(0);
  47.     OLED_P6x8Str(1,1,Return);  Count = 0;
  48.     for(i=0;i<200;i++)
  49.     {
  50.         Return[i] = ' ';
  51.     }
  52.     //Command 2
  53.     USART2_Puts(Server_Step2); delayms(); delay_ms(T); delay_ms(T);
  54.     Return[Count] = '\0'; OLED_Fill(0);
  55.     OLED_P6x8Str(1,1,Return);  Count = 0;
  56.     for(i=0;i<200;i++)
  57.     {
  58.         Return[i] = ' ';
  59.     }
  60.     //Command 3
  61.     USART2_Puts(Server_Step3); delayms(); delay_ms(T); delay_ms(T);
  62.     Return[Count] = '\0'; OLED_Fill(0);
  63.     OLED_P6x8Str(1,1,Return);  Count = 0;
  64.     for(i=0;i<200;i++)
  65.     {
  66.         Return[i] = ' ';
  67.     }
  68.     //Command 4
  69.     USART2_Puts(Server_Step4); delayms(); delay_ms(T); delay_ms(T);
  70.     Return[Count] = '\0'; //OLED_Fill(0);
  71.     OLED_P6x8Str(1,1,Return);  Count = 0;
  72.     for(i=0;i<200;i++)
  73.     {
  74.         Return[i] = ' ';
  75.     }
  76.     //Command 5
  77.     USART2_Puts(Server_Step5); delayms(); delay_ms(T); delay_ms(T);
  78.     Return[Count] = '\0'; OLED_Fill(0);
  79.     OLED_P6x8Str(1,1,Return);  Count = 0;
  80.     for(i=0;i<200;i++)
  81.     {
  82.         Return[i] = ' ';
  83.     }
  84.     //Command 6
  85.     USART2_Puts(Server_Step6); delayms(); delay_ms(T); delay_ms(T);
  86.     Return[Count] = '\0'; OLED_Fill(0);
  87.     OLED_P6x8Str(1,1,Return);  Count = 0;
  88.     for(i=0;i<200;i++)
  89.     {
  90.         Return[i] = ' ';
  91.     }
  92.     //Command 7
  93.     USART2_Puts(Server_Step7); delayms(); delay_ms(T); delay_ms(T);
  94.     Return[Count] = '\0'; OLED_Fill(0);
  95.     OLED_P6x8Str(1,1,Return);  Count = 0;
  96.     for(i=0;i<200;i++)
  97.     {
  98.         Return[i] = ' ';
  99.     }
  100.     //Command 8
  101.     USART2_Puts(Server_Step8); delayms(); delay_ms(T); delay_ms(T);
  102.     Return[Count] = '\0'; OLED_Fill(0);
  103.     OLED_P6x8Str(1,1,Return);  Count = 0;
  104.     for(i=0;i<200;i++)
  105.     {
  106.         Return[i] = ' ';
  107.     }
  108.   while(1)
  109.   {
  110.         OLED_P6x8Str(1,1,Return);
  111.         delay_ms(100);
  112.         switch(Return[11]){
  113.             case '0': break;
  114.             case '1': OLED_Fill(0); break;
  115.             case '2': LED_H(); break;
  116.             case '3': LED_L(); break;
  117.             default:break;
  118.         }
  119.         Count = 0 ;
  120.   }
  121. }


 楼主| 萧洛毫 发表于 2019-4-30 22:59 | 显示全部楼层
直接使用USB-TLL串口模块来操作,AT指令和主机端的设置一样
使用EasyTCP软件来连接ESP8266的设备,IP地址通过查看OLED显示的信息为192.168.4.1,端口设置为333,所以连接的结果如下
772331-20170515003326629-1132444844.jpg     772331-20170515003416238-1857112775.jpg     772331-20170515003550691-1118783114.jpg
772331-20170515003941035-1253313019.jpg 772331-20170515005440316-625254178.jpg
程序中通过发送2来开启STM32上的LED,相反通过发送3来关闭STM32上的LED!



 楼主| 萧洛毫 发表于 2019-4-30 23:00 | 显示全部楼层
注(很重要,一定要注意):

    在收到来自手机的消息时,ESP8266-01芯片将会把得到的数据通过连接到单片机的串口发送到单片机STM32中,这样就会触发单片机的数据接收中断:

void USART2_IRQHandler(void)在中断中数据获取的方式是每次中断都只读取一个byte的数据,所以ESP8266得到的数据如下:+IPD,0,1,:2 这就是收到了一个2数据,2所在的位置是11,因此将数据保存在DATA[200],那么我们需要的数据就是DATA[11],但是为了保证中断接受程序能够完整的接收完整个这一段字符串:"+IPD,0,1,:2",需要等待一定的时间才能完成数据的发送,所以while中需要长时间停在delay_ms的进程中,等待中断读取完整个数据,然后在让Count清零。

delay_ms(100);
 楼主| 萧洛毫 发表于 2019-4-30 23:00 | 显示全部楼层
NodeMCU简单使用(2017-04-26):
今天买了块小板子本来是用来买个完整的,所有GPIO都接粗来的ESP8266的板子来玩的,结果没啥资料,看某宝下面的资料就给了个链接,点进去一看全英文...(NodeMCU官网),呀呀呀还不错啊Lua语言开发ESP8266,这玩意贼溜,于是就网上找了找这方面的资料,不得不说的是这ESP8266小芯片不愧称为 麻雀虽小五脏俱全啊~参照这网站入门NodeMCU真棒~   http://benlo.com/esp8266/esp8266QuickStart.html
NodeMCU固件程序源代码:https://github.com/nodemcu/nodemcu-firmware
下面是在CSDN的博主发布的**,感觉入门很好~(链接如下:http://blog.csdn.net/dingzz/article/details/46876503
  1. wifi.setmode(wifi.STATION)  
  2. wifi.sta.config("YOUR_NETWORK_NAME","YOUR_NETWORK_PASSWORD")  
  3. print(wifi.sta.getip())  
  4. led1 = 0  
  5. led2 = 4  
  6. gpio.mode(led1, gpio.OUTPUT)  
  7. gpio.mode(led2, gpio.OUTPUT)  
  8. srv=net.createServer(net.TCP)  
  9. srv:listen(80,function(conn)  
  10.     conn:on("receive", function(client,request)  
  11.         local buf = "";  
  12.         local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");  
  13.         if(method == nil)then  
  14.             _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");  
  15.         end  
  16.         local _GET = {}  
  17.         if (vars ~= nil)then  
  18.             for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do  
  19.                 _GET[k] = v  
  20.             end  
  21.         end  
  22.         buf = buf.."<h1> ESP8266 Web Server</h1>";  
  23.         buf = buf.."<p>GPIO16 <a href="?pin=ON1"><button>OFF</button></a> <a href="?pin=OFF1"><button>ON</button></a></p>";  
  24.         buf = buf.."<p>GPIO2 <a href="?pin=ON2"><button>OFF</button></a> <a href="?pin=OFF2"><button>ON</button></a></p>";  
  25.         local _on,_off = "",""  
  26.         if(_GET.pin == "ON1")then  
  27.               gpio.write(led1, gpio.HIGH);  
  28.         elseif(_GET.pin == "OFF1")then  
  29.               gpio.write(led1, gpio.LOW);  
  30.         elseif(_GET.pin == "ON2")then  
  31.               gpio.write(led2, gpio.HIGH);  
  32.         elseif(_GET.pin == "OFF2")then  
  33.               gpio.write(led2, gpio.LOW);  
  34.         end  
  35.         client:send(buf);  
  36.         client:close();  
  37.         collectgarbage();  
  38.     end)  
  39. end)


 楼主| 萧洛毫 发表于 2019-4-30 23:01 | 显示全部楼层
我们将以上代码的第二行的YOUR_NETWORK_NAME与YOUR_NETWORK_PASSWORD分别替换成我们自己的无线热点的名称和密码,然后通过LuaLoader程序调试工具的Upload FIle...按钮来上传到NodeMcu板子,最后按dofile执行刚才上传的程序。
代码稍有改动,可能我和CSDN版主的芯片的外围电路不同吧,主要改了HTML部分的按键部分,还有就是按键的接口(0--->GPIO16  &  4--->GPIO2),下面是我的购买链接:https://detail.tmall.com/item.htm?id=44766400092&spm=a1z09.2.0.0.WdMqyB&_u=q1gpmsvhc513
看看实物图吧~(想想再使用之前介绍的花生壳域名来做个内网透传就阔以使用外网来访问控制这个超小型的Web Server啦!!)
772331-20170426233051694-1877073044.jpg     772331-20170426234111850-2062285832.jpg

wuwei1029 发表于 2019-8-7 18:08 | 显示全部楼层
很厉害!学习一下
玛尼玛尼哄 发表于 2019-9-25 00:08 | 显示全部楼层
可以作为单片机的无线传输接口。
yiyigirl2014 发表于 2019-9-27 00:17 | 显示全部楼层
geil,入门必备。
zlmin 发表于 2019-10-3 19:31 来自手机 | 显示全部楼层
感谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

254

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部