一、场景
定时将小灯的开关状态上传给公网服务器。公网服务器充当服务端角色,接收ESP8266发送的信息(将小灯或温度传感器信息记录到MySql数据库中),并根据需要生成JSON指令来控制小灯或温度器的开关状态(1表示高电平,0表示低电平)。最后,公网服务器将控制小灯的JSON信息发送给ESP8266,ESP8266接收并解析指令,以此来控制小灯或温度器的引脚输出高低电平,实现对元件的远程控制。
二、esp8266充当的角色
在这个场景中,ESP8266充当客户端角色,因为它是主动连接公网服务器并向其发送信息。公网服务器充当服务端角色,因为它接收来自ESP8266的请求,并返回控制小灯的指令(JSON信息)。
2.1 步骤
ESP8266作为客户端,定时向公网服务器发送小灯的状态信息。你需要在ESP8266上编写程序,设置定时器或延时发送HTTP请求,将小灯开关状态上传给公网服务器。
公网服务器作为服务端,接收ESP8266发送过来的小灯状态信息,并根据需要生成相应的JSON指令,控制小灯的开关状态。
公网服务器将控制小灯的JSON信息发送给ESP8266。ESP8266接收到服务器返回的JSON信息后,解析其中的指令,根据指令控制小灯的引脚输出高低电平,从而实现对小灯的远程控制。
2.2说明
整个过程中,ESP8266起到了客户端的作用,主动向公网服务器发送信息;公网服务器起到了服务端的作用,接收ESP8266发送的信息并返回控制指令。通过这种方式,你可以实现ESP8266与公网服务器之间的双向通信,实现远程控制小灯的功能。
三、客户端方面探究实现
3.1 问题
esp8266要一直发送状态请求吗? 不然公网服务器不能得知esp8266的地址信息?
3.2 思考
ESP8266可以采用一种称为"长连接"或"长轮询"的方式来实现,而不是一直发送状态请求。通过建立一个长时间保持连接的通道,ESP8266可以保持与公网服务器的通信,并随时准备接收服务器发送的指令。
具体实现方式如下:
ESP8266首次连接到公网服务器时,发送自身的地址信息给服务器,以便服务器知道如何回复指令。
ESP8266发送完状态信息后,不断监听服务器是否有指令要发送。这可以通过定时向服务器发送心跳包或保持TCP连接来实现,确保连接不会断开。
当公网服务器需要发送控制指令时,直接通过已建立的连接发送给ESP8266,ESP8266接收并执行相应操作。
通过这种方式,ESP8266可以与公网服务器保持持续的通信,实现双向传输数据的需求,同时避免了频繁发送请求的开销和服务器无法获取ESP8266地址信息的问题。
四、服务端方面探究实现
4.1 问题
服务器要如何发送响应给esp8266,并且长连接一直存在。
4.2 思考
实现服务器向ESP8266发送响应并且保持长连接一直存在,可以采用以下方法:
-
使用WebSocket协议:WebSocket是一种在单个TCP连接上进行全双工通信的协议,适合长连接场景。ESP8266可以与服务器建立WebSocket连接,服务器可以随时向ESP8266发送消息,而不需要ESP8266不断发送请求。
-
保持HTTP长连接:在HTTP/1.1中支持长连接,即在同一个TCP连接上可以进行多次请求和响应。当ESP8266发送完状态信息后,可以保持连接打开,等待服务器的响应。服务器在有指令需要发送时,可以直接在当前连接上发送响应给ESP8266。
-
定时心跳包:为了保持长连接的稳定性,可以定时发送心跳包来防止连接超时断开。ESP8266可以定时发送一个特殊的数据包给服务器,服务器收到后简单回复确认,以维持连接的活跃状态。