【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连接的终止,在此处就不详细叙述。感兴趣的小伙伴可以移步以下网址了解更多:

  1. https://baike.baidu.com/item/TCP
  2. https://www.cnblogs.com/dreamroute/p/6247726.html

2,为什么采用Gateway-Worker来创建服务端?

我们在此处引用其官网的叙述;

GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等

GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。

GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。

简单来讲有以下几点好处:

  1. 快速建立TCP服务
  2. 基于php(因为服务器上已经部署了PHP且后续应用创建都需要在这个环境下进行)
  3. 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一个文件,因此在此文件内写入如下代码:

<?php

use \GatewayWorker\Lib\Gateway;

class Events

{

//客户端连接后出发的回掉函数

public static function onConnect($client_id)

{

Gateway::sendToClient($client_id, "Hello $client_id\r\n");

//向当前连接的$client_id 发送Message

}

//连接之后收到信息的处理函数

public static function onMessage($client_id, $message)

{

if($message == 'on')

{

Gateway::sendToClient($client_id, "1");//控制端发出开启LED的指令后向当前连接的$client_id 发送‘1’

}

if($message == 'off')

{

Gateway::sendToClient($client_id, "0");//控制端发出关闭LED的指令后向当前连接的$client_id 发送‘0’

}

}

}

?>

将修改的demo文件上传到服务器,并且在后台运行此demo。

具体步骤以及代码为:

  1. 进入DEMO目录
  2. 运行 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 

00:00/00:00

 

歪克士

每一个人都是一座孤岛,你,我,和他们……

相关推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫,分享到朋友圈

【ESP8266学习记录-3】基于TCP链接的远程控制LED通断简易教程-MicroPython 基础
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close