TCP组网方案

来源:互联网 发布:詹姆斯历史赛季数据 编辑:程序博客网 时间:2024/05/16 07:51

项目需求中需要通过网络控制1B控制板的开关量,由于Loongson1B板子上串口通讯使用的Modbus通讯协议也支持运行在 TCP/IP 上的Modbus 报文传输协议——Modbus/TCP,所以这个文档讨论的主题主要是针对1B控制板的TCP组网方案。

文档总体来说分为以下几个部分:

A. 方案介绍

B. 方案实现过程

C. 方案总结

1. TCP组网方案

从物理层来看,网络组网一般有三种常见方案:

1. 双网卡互联组网方式

2. 宽带路由器组网方式

3. 无线宽带路由器组网方式

由于1B控制板的硬件规格已经确定,且用户需求中需要通过Wifi无线网络进行通讯,所以我们选择第三种方式:无线宽带路由器组网。而这种组网方式的优点是简约方便,不需要布线;缺点是成本较高,信号强度及覆盖范围对环境要求较高。

连接到无线宽带路由器,1B控制板通过自动或者动态获取到相应的IP地址,那么接下来需要的就是将这些网络开关智能盒通过TCP/IP方式组建一个相对的局域网,而为了能比较方便的管理系统,在应用层上可以使用比较常用的Client/Server结构,即客户机和服务器结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低系统的通讯开销。

但是在我们这个控制板网络里边,并不需要服务器提供较大的数据库,所以不存在C/S结构导致数据不安全的问题,所以此方案还是能提供可靠安全的网络传输的。对于服务器与客户端的任务分配如下:

Server:提供Client成员的登记、注销、检测成员状态、同步网络成员登记表、数据传输等功能;

Client:初始化连接服务器、发送接受数据、处理数据,同步网络成员登记表;

网络数据传输方式如下:

A. 建立连接:

Server端通过建立socket,listen网络中Client端发来的connect请求,当Server与相应的Client成功建立起连接,则Server端获得对应Client端的IP地址,为该对象做好登记,表示该设备已经加到C/S结构对应的网络组里边,同时将登记成员的相关信息反馈回其他成员的Client端。


B. 数据传输:

经过Server端反馈回来的登记成员信息,Client端的UI界面允许对已经登记过的其他Client进行远程控制,控制包括定时控制、多状态控制、多端口控制,具体数据以报文形式传输,遵循Modbus/TCP协议,且发送方式为P2P,如下图所示:


但是按以上模型去传输数据存在总线冲突问题,即当客户端与另一个客户端通讯时,其他客户端若企图与该客户端发起通讯,则出现总线冲突,而且此概率的可能性极大,需要采取某些措施解决总线冲突问题,而且该模型的检测通讯请求以及检测总线冲突的资源开销估计会比较大。

也可以采取以下电梯控制模型:


此模型主要优点是解决总线冲突,由服务端统一分配客户端的连接通道,由服务端等待客户端的呼叫,当收到客户端的连接请求时,加入响应时间队列,当有多个客户端同时发起连接请求时,则检测响应请求优先级,按顺序加入响应事件队列,然后服务端根据该响应事件队列,依序为各个客户端的请求连接建立通讯通道。

该模型的缺点在于效率相对较低,所有客户端之间的数据连接均要向服务器端发起传输请求,然后由服务器统一调配总线,但是由于客户端之间的通讯数据内容为数据量较小的开关控制信息,所以该通讯通道能在成功建立之后很短时间内传输完数据,然后释放连接,所以此问题估计对网络开关智能盒的性能未有太大影响,还待评估。(此数据传输过程任务并不在组网内,本系统的组网以及数据传输是分离开的,组网部分仅提供网络成员登记表)

C. 断开连接:

当Client端由于主动或者被动的与Server端断开连接,则每个Client端之间的传输通道也相应的关闭,而这个关闭行为是通过Server端对每个Client端的监听状态,再反馈回每个在线的Client端的结果。


D. 状态监听:

Server端通过keep-alive即TCP存活检测机制,定时发送心跳包检测每个已经登记在线的Client端的状态,并将检测到相应的状态为Client执行相应的注销行为,同时将网络成员登记表的变更反馈回每个在线的Client端。通过这种机制,就能够实现Server端对Client端的状态监听,但是keep-alive需要一个系统维护的timer,定时的周期需要通过实际测试来确定,以达到最好的效果。

2. TCP组网实现

2.1 Server端的实现

Server端主要提供Client成员的登记、注销、检测成员状态、数据传输等功能。

其中组网阶段主要实现Client成员的登记、注销、检测成员状态,具体实现应用层软件流程如下:


网络开关智能盒的TCP组网的目的在于为客户端之间数据通讯提供一个同步更新的登记表,该网络成员登记表主要由服务器端完成,而登记表的文件名暂定为:netDevList.dat。

主要实现该网络成员登记表的改变的函数接口为:

/*After listenning and accepting,the client and the server connection is established, add to the list */

int addToList(char *client_ip) 

/*Operators to return to receiving,the client and the server connection is breaked, del from the list */

int delFromList(int L)

而这两个函数接口在主函数里边被调用,为登记注销功能所调用:

登记:当select机制检测到文件句柄的改变,代表有Client跟Server建立连接,然后通过accept函数来创建Communication Socket,获取到该Client设备IP地址,再通过调用addToList函数接口将设备IP加入到登记表中,其中包括设备重复检测机制,如果添加成功,则再将改连接的Communication Socket的Socket ID添加到已建立ID缓存队列中。

存活检测:通过设置socket的keep-alive参数,主要检测行为由select机制完成。

注销:同样原理,select机制检测到文件句柄的改变,然后通过逐个检测已建立ID缓存队列中的Communication Socket连接通道是否有效,若无效,则根据无效Socket的ID缓存队列号,调用delFromList函数接口将设备IP从登记表中删除。

无论是登记或者注销之后,当select机制检测到文件句柄的改变,则与已建立ID缓存队列中的Communication Socket同步登记表。

2.1 Client端的实现

Client端主要完成初始化连接服务器、发送接受数据、处理数据,同步网络成员登记表;

而在组网阶段,Client端的任务主要为初始化连接服务器,接收Server端同步的网络成员登记表。具体实现应用层软件流程如下:


客户端的功能比较简单,这里不再详细说明。

3.组网方案总结

以上讨论的TCP组网方案仅仅是一个基本的组网框架,而现在1B网络开关智能盒的网络组网已经完成,由Server端(主机)提供一个网络成员登记表,该登记表的维护工作由Server端完成,Server端通过检测是否响应新建连接以及检测已建立连接的Client的状态来对网络成员进行登记及注销,同步更改网络成员登记表,并将新的登记表同步到远程网络成员。

这种组网是局限于局域网内的,因为网络服务器的本质上也是一台网络开关智能盒,那么绑定在服务器上的IP地址是该局域网的内网地址,而局域网内的其他设备,只要能够Ping通这个服务器的IP,即而能通过内置的Client客户端程序连接上服务器。

这种组网也是一种定义上的组网,即仅是通过生成的网络成员登记表,来限定每个客户端之间的通讯范围及通讯权限,即客户端必须与服务器成功建立连接,才能与该网络的其他设备通讯。同时为网络内其他客户端提供网络内客户端连接状态的反馈。

此组网方案尚未经过严谨测试,仅仅在1B开发板上测试过服务端程序,验证了Server端的登记、注销、状态检测、同步登记表的功能。

原创粉丝点击