首页 > 后端开发 > C++ > 正文

如何保证ESPased可编程控制器的当前TCP连接

DDD
发布: 2024-10-19 14:07:01
原创
800 人浏览过

在设计简易可编程控制器的软件系统架构时,我主要考虑以下几点:
(1)需要支持TCP服务器以及TCP客户端同时复用,TCP服务器有三种连接情况,浏览器下载内置网页后进行通信,用于第三方软件的通信连接,用于Modbus-TCP协议的连接;
TCP客户端用于连接云服务器上的TCP服务器,实现远程访问。考虑到 ESP8266 的资源情况,按照 TCP 服务器支持 4 个 TCP 客户端连接,同时 1 个 TCP 客户端连接云服务器的规范进行并发设计;
(2)需要控制最多5路TCP/IP数据通信的流量,并为PLC相关任务调度分配足够的时间片,以保证PLC功能的可靠调度和实时响应;
3)主任务为LWIP任务和主任务,LWIP任务的优先级低于主任务,同时保证主任务没有耗时长或阻塞的任务,并且主任务以10ms的tick为周期进行调度,主任务执行完毕后主动进入阻塞状态,释放CPU用于调度其他任务;
结合这些,我设计了附近的软件架构;
当TCP服务器或TCP客户端接收到数据时,LWIP的任务执行数据接收的回调函数;
在回调函数中,程序只是将接收到的数据存入接收缓冲区,但并不对数据进行处理;
有五个接收缓冲区,每个用于五个并发连接;当存入这些缓冲区时,同时处理TCP包解包和粘包情况,HTTP协议数据通过rnrn字符结尾进行解包;
当接收到新数据时,LWIP 任务通过信号量信号量唤醒主任务进行处理。
主任务每次检测这5个缓冲区的状态,如果有接收到的数据,则处理相关数据并生成响应返回给发送方;
为了确保所有 5 个连接都有相同的机会被处理,主任务轮流优先考虑这 5 个缓存的状态。
例如,如果调度程序首先确定连接 0 的缓存,则下一个调度程序确定连接 1 的缓存。
这可以通过简单的代码来实现;

签名短 http_get_recvs(U32 *msg, U32 *addr, U16 *port){
U8 i;
签名短 res = -1;
for(i = 0; i {

    if(tcpclient_curquery_client >= TCPSERVER_CLIENT_NUM){
        tcpclient_curquery_client = 0;
    }
    if(tcpclient_info[tcpclient_curquery_client].used == TRUE){
        if(tcpclient_info[tcpclient_curquery_client].received){
            *msg = (U32)tcpclient_info[tcpclient_curquery_client].recvbuff;
            *addr = tcpclient_info[tcpclient_curquery_client].ipaddr;
            *port = tcpclient_info[tcpclient_curquery_client].port;
            res = (signed short)tcpclient_curquery_client;
            break;
        }
    }
    tcpclient_curquery_client++;
}
return(res);
登录后复制

}

How to ensure oncurrent TCP connection for ESPased programmable controller

How to ensure oncurrent TCP connection for ESPased programmable controller

以上是如何保证ESPased可编程控制器的当前TCP连接的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!