【ESP8266学习记录-3】基于TCP链接的远程控制LED通断简易教程-MicroPython 基础
本文主要讲什么?
- 简述什么是TCP?
- 为什么采用Gateway-Worker来创建服务端?
- 具体实现步骤以及代码是什么?
1,什么是TCP? 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 一个TCP连接的“一生”大概可以分为“连接”,“传输”,“断开”。 在建立连接的过程中会进行三次握手,第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。连接建立后,客户端和服务器就可以开始进行数据传输了。 看起来很复杂,我们可以使用一个很简单的例子来解释它:你暗恋一个女孩,她叫“小芳”,第一次你写信给小芳,你很害羞没有写名字。小芳收到信之后不确定是不是你写的,但是是你写的可能性比较大,所以就给你回了一封信询问情书是不是你写的。你很激动,所以又回信说是你写的信。到这里你和小芳就正式开始交往了。你第一次写信是第一次握手,小芳回信是第二次握手,你回信是第三次握手。 接下来我们了解一下TCP建立连接之后的数据传输过程。①这是一个全双工的数据传输过程,相当于可以在同一时间双向传输,保证了传输的效率。②TCP有超时重传机制,在某一时刻发送端发送报文至接收端,但是接收端却没有返回确认信息。这时候发送端就会认为数据没有传到,或者损坏,发送端会重新发送数据。③TCP支持长连接,在建立一个链接之后,这个链接可以保持很久,在本例中可以确保设备在线,不会出现因受控端不在线而控制端无法控制的情况。 最后是TCP连接的终止,在此处就不详细叙述。感兴趣的小伙伴可以移步以下网址了解更多:
2,为什么采用Gateway-Worker来创建服务端? 我们在此处引用其官网的叙述;
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等 GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。 GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。
简单来讲有以下几点好处:
- 快速建立TCP服务
- 基于php(因为服务器上已经部署了PHP且后续应用创建都需要在这个环境下进行)
- GatewayWorker官方已经将复杂的传输过程简单化
3,具体实现步骤以及代码 据GatewayWorker官方介绍,在业务开发只需要关注 Applications/项目/Events.php一个文件即可。我们首先在其官网下载一个demo程序(网址:http://www.workerman.net/download/GatewayWorker.zip ),demo程序中文件目录如下; 建议新开一个screen运行,否则退出SSH的时候程序就会中断,如果不会screen请移步:https://blog.csdn.net/lwm1986/article/details/1725617 GatewayWorker官方介绍只用关注 Applications/项目/Events.php一个文件,因此在此文件内写入如下代码:
将修改的demo文件上传到服务器,并且在后台运行此demo。
具体步骤以及代码为:
- 进入DEMO目录
- 运行 php start.php start
这样服务端就完成了。 因为本人使用的受控端为ESP8266,准确的讲是NodeMcu,并且采用MicroPython进行开发。因此具体代码如下:
from machine import Pin impot socket a=Pin(15,Pin.OUT)”””15 为我接的受控io,LED正极接15,负极接GND””” s=socket.socket() s.connect((‘TEST IP’,DK))”””TEST IP为前面建立的服务器IP地址,后面为开放的端口,此程序默认为8282端口,阿里,腾讯等云主机请将此端口加入安全组””” print(‘connection is successful’) while True: data=s.recv(500).decode(‘utf8’) if(data == ‘1’): a.value(1) print(‘LED is on’) if(data == ‘0’): a.value(0) print(‘LED is off’)
将此代码传输到开发板中,并且运行即可。 注意:在本示例中,具体实现流程如 虽然业务流程为单向的,但是TCP的连接是双向的,也就是说控制端(PC,或者手机等)要和服务器建立连接,同时服务器也要和受控端建立连接。Gatewayworker有一个特性:每一次连接的建立过程中$client_id 是不断改变的,因此在不同的连接过程中建议将$client_id与UID进行绑定操作。 本文代码请见:https://github.com/Pidbid/TCP-MIcroPython-GatewayWorker