四、esp8266+手机端+路由器(路由可上网)组成物联网与广域网建立tcp通信的工作模式设定方法
前言:esp8266模块和手机同时接入在一个路由下,通过路由器建立二者之间的tcp通信,模块设置为客户端,手机设置为服务器端,路由器为网关,同时由于路由器能上网,所以8266模块可以通过路由器与广域网上的服务器进行远程长连接的tcp通信。
实例:
实现功能概述:,8266工作在station模式下,接入到能上网的实验室路由上,手机也连的是实验室同一个路由,然后把8266连接到查询天气的知心天气网站的(api接口: ip: 地址:116.62.81.138 端口:80)服务器上,模块同时还连接到手机端的tcp server上(开放的端口与天气网站的服务器端口不同),进而实现通过手机能控制8266和外网通信,触发执行http协议的GET请求动作,向知心天气网站请求天气信息。
(一)前期准备:
Wifi模块:esp8266
手机:安装有有人网络助手的手机一部(便于设置tcp服务器用)
路由器:实验室路由器 热点名称:TP-LINK_5D3BDE 密码:saibei216216
8266模块功能设置方式: AT命令
(二)设置步骤
(1)8266初始化功能配置,设置STA模式+连接路由
1)设置8266模块工作在STA模式:
发送指令:
AT+RST //重启
AT+CWMODE=1 //或AT+CWMODE=3 1-Station模式 3-AP兼Station模式
AT+RST //重启
2)查看当前无线路由器列表
发送指令:AT+CWLAP
3)加入当前无线网络
发送指令:AT+CWJAP="TP-LINK_5D3BDE","saibei216216"
//搜索并连接路由器,第一个引号内容为路由器名,第二个引号内容为密码
(2)设置8266位客户端建立tcp通信,进行Client方法收发
1)设置8266模块:开启多连接模式(因为模块要连接多个服务器,所以选择多连接模式,如果模块只与一个服务器通信时选择单连接模式即可)
发送指令:AT+CIPMUX=1
//设置指令 1-多路连接模式 0-单路连接模式
2)建立tcp连接
知心天气网站服务器:
发送指令:AT+CIPSTART=1,"TCP","116.62.81.138",80
//8266模块连接心知天气网站服务器 ip地址:116.62.81.138
//第一个1为多连接模式下的设备id号,
//进行tcp通信时要先指定要通信的设备id
手机端服务器:
准备:先打开手机上的有人网络助手,新建TCP server——端口号8081,
记住手机产生的本地IP,下面模块作为tcp client进行连接手机tcp server要用。
发送指令:AT+CIPSTART=2,"TCP"," 192.168.1.112",8081
//8266模块连接手机端服务器 ip地址:192.168.1.112
//第一个2为多连接模式下的设备id号,
//进行tcp通信时要先指定要通信的设备id
(建立tcp通信时,下图命令不要在再发送给模块,否则前面建立的tcp连接将会失效,这里只为验证说明用)
手机端服务器:
发送指令:AT+CIPSEND=2,100 //选择需要用于传输连接的id号
//这里选的“2”为手机端服务器
// length:100 表示要发送数据的长度为100,最大长度为2048
知心天气网站服务器:
发送指令:AT+CIPSEND=1,1024 //选择需要用于传输连接的id号
//这里选的“1”为知心天气网站服务器
// length:1024 表示要发送数据的长度为1024,最大长度为2048
请求天气信息:
方法:http协议的GET方法
发送内容:
GET https://api.seniverse.com/v3/weather/now.json?key=S4bQnu5_rNi_kbNJZ&location=hangzhou&language=en&unit=c
返回信息:
正常情况下应该返回的信息:
{"results":[{"location":{"id":"WTMKQ069CCJ7","name":"Hangzhou","country":"CN","path":"Hangzhou,Hangzhou,Zhejiang,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"Light rain","code":"13","temperature":"22","feels_like":"21","pressure":"1005","humidity":"97","visibility":"1.8","wind_direction":"N","wind_direction_degree":"20","wind_speed":"3.96","wind_scale":"1","clouds":"95","dew_point":""},"last_update":"2019-04-21T20:50:00+08:00"}]}
实际情况:提交GET请求后,知心天气网站的服务器关闭了,如下图,并且8266模块死机了。我上网查找了不少资料,了解到很少有人用AT固件下的多路连接这种方式去实现多路连接下的GET功能,原因大多数解释为:esp8266在多路连接模式下不能进入透传模式,而实现类似功能的解决方案都是基于SDK实现的,所以这种实现方案失败了,如有大佬晓得什么原因及解决方案,欢迎留言评论。
另一种建立手机+wifi+路由器实现与外网进行通信的方案:上述设置不变,就是把上面esp8266的多路连接改成设置esp8266模块为单路连接,然后设置esp8266模块为透传方式工作,就可以正常返回天气信息了,不过这种方案在实现手机端与8266模块进行通信,即用手机端去触发8266向天气网站服务器提交GET请求时要借助单片机来实现,先让手机与8266模块建立tcp通信,再让手机给wifi发送消息去触发单片机的内部编程,即通过单片机的串口向esp8266模块发送AT指令,使8266模块与天气网站服务器建立tcp通信,通信建立后触发单片机提交GET请求,向天气网站服务器索要天气信息,请求部分指令如下:
AT+CIPMUX=0 //设置单链接
AT+CIPSTART="TCP","116.62.81.138",80 //连接知心天气网站服务器
AT+CIPMODE=1 //设置透传模式
AT+CIPSEND //进入透传
信息提取出来是这样子的:
{"results":[{"location":{"id":"WTMKQ069CCJ7","name":"Hangzhou","country":"CN","path":"Hangzhou,Hangzhou,Zhejiang,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"Cloudy","code":"4","temperature":"21","feels_like":"21","pressure":"1005","humidity":"97","visibility":"1.7","wind_direction":"NW","wind_direction_degree":"334","wind_speed":"7.56","wind_scale":"2","clouds":"50","dew_point":""},"last_update":"2019-04-21T21:25:00+08:00"}]}
一般物联网的远程控制的通信方案:
1、要实现远程控制就必须得租用一个服务器,可以租用云服务器,比如阿里云的ECS
2、手机与服务器建立tcp长连接
3、esp8266与服务器建立tcp长连接
4、手机发送数据到云服务器,使用json数据的网络通信,云服务器接收到手机发的数据后,继续把手机发送过来数据转发给esp8266
5、esp8266发送数据到云服务器,云服务器接收到esp8266发过来的数据后,继续把数据推送给手机app
6、如上所述方式,实现手机+esp8266的双向通信的远程控制。
以小米智能台灯为例: