四、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        //重启

手机连接esp8266发送数据 esp8266怎么与手机建立连接_手机连接esp8266发送数据

 

2)查看当前无线路由器列表

发送指令:AT+CWLAP

手机连接esp8266发送数据 esp8266怎么与手机建立连接_esp8266_02

 

3)加入当前无线网络

发送指令:AT+CWJAP="TP-LINK_5D3BDE","saibei216216"

 //搜索并连接路由器,第一个引号内容为路由器名,第二个引号内容为密码

手机连接esp8266发送数据 esp8266怎么与手机建立连接_手机连接esp8266发送数据_03

 

 

(2)设置8266位客户端建立tcp通信,进行Client方法收发

    

1)设置8266模块:开启多连接模式(因为模块要连接多个服务器,所以选择多连接模式,如果模块只与一个服务器通信时选择单连接模式即可)

发送指令:AT+CIPMUX=1

//设置指令   1-多路连接模式   0-单路连接模式

手机连接esp8266发送数据 esp8266怎么与手机建立连接_esp8266_04

 

2)建立tcp连接

 

知心天气网站服务器:

发送指令:AT+CIPSTART=1,"TCP","116.62.81.138",80  

//8266模块连接心知天气网站服务器  ip地址:116.62.81.138

//第一个1为多连接模式下的设备id号,

//进行tcp通信时要先指定要通信的设备id

 

手机连接esp8266发送数据 esp8266怎么与手机建立连接_手机连接esp8266发送数据_05

 

手机端服务器:

准备:先打开手机上的有人网络助手,新建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

手机连接esp8266发送数据 esp8266怎么与手机建立连接_tcp通信_06

 

手机连接esp8266发送数据 esp8266怎么与手机建立连接_远程控制_07

 

(建立tcp通信时,下图命令不要在再发送给模块,否则前面建立的tcp连接将会失效,这里只为验证说明用)

手机连接esp8266发送数据 esp8266怎么与手机建立连接_tcp通信_08

 

手机端服务器:

 

发送指令:AT+CIPSEND=2,100  //选择需要用于传输连接的id号

//这里选的“2”为手机端服务器 

// length:100  表示要发送数据的长度为100,最大长度为2048

手机连接esp8266发送数据 esp8266怎么与手机建立连接_手机连接esp8266发送数据_09

 

 

手机连接esp8266发送数据 esp8266怎么与手机建立连接_远程控制_10

 

 

知心天气网站服务器:

发送指令:AT+CIPSEND=1,1024  //选择需要用于传输连接的id号

//这里选的“1”为知心天气网站服务器 

// length:1024  表示要发送数据的长度为1024,最大长度为2048

手机连接esp8266发送数据 esp8266怎么与手机建立连接_手机连接esp8266发送数据_11

 

 

请求天气信息:

方法: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实现的,所以这种实现方案失败了,如有大佬晓得什么原因及解决方案,欢迎留言评论。

 

手机连接esp8266发送数据 esp8266怎么与手机建立连接_esp8266_12

 

另一种建立手机+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  //进入透传

手机连接esp8266发送数据 esp8266怎么与手机建立连接_服务器_13

 

信息提取出来是这样子的:

{"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的双向通信的远程控制。  

以小米智能台灯为例:

  1. 有一台自己的服务器:小米云服务器
  2. 终端设备:小米台灯  自身带有wifi,作为tcp客户端可以连接小米云服务器
  3. 手机APP  该APP作为tcp 客户端能够连接小米云服务器
  4. 通信过程概述:小米智能台灯和app同时接入小米云服务器,用户在app上选择要执行的功能,如开灯,则当用户触发按键时,app会向小米云服务器发送该消息,小米云服务器会对这条消息进行转发(或者在服务器中做解析处理),解析知道了用户想要执行开灯动作,则有小米云服务器向小米智能台灯发送开灯指令,电亮台灯,即app和小米智能台灯之间的通信,由小米云服务器来中转完成,app、小米智能台灯与小米云服务器之间均为tcp长连接通信。