|智能立体停车库的远程监控系统实现( 三 )


1)创建套接字(socket());
2)将一个IP 地址和一个端口绑定到套接字上(bind());
3) 将套接字设置为监听模式等待连接请求(listen());
4)接受到来的连接请求 , 返回一个新的对应的套接字(accept());
5)利用上一步返回的套接字和客户端通信(send()/recv());
6)关闭套接字(closesocket()) 。
以上每一步骤中括号内部是Linux 操作系统中的C语言库函数的调用 , 目前的后台开发语言都支持Socket通信程序的开发 , 各步骤调用的函数/ 方法名均大同小异 , 选定开发语言后查找API 即可完成此程序 。 业务逻辑层的主要任务是对数据包解析 , 具体操作是在Socket 服务端程序第6 步后增加一个判断 , 每当recv() 函数接收到的数据组成一个完整的数据包后 , 即调用相应的业务逻辑处理函数来对数据进行解析 。 数据访问层的主要任务是将解析后的数据存入数据库等CURD 的任务 , 后台开发语言都有相应成熟的与数据库连接的库 , 如JDBC、ADO 等 , 调用相应的库函数即可与数据库交互 。 软件的程序架构如图5 所示 。
|智能立体停车库的远程监控系统实现
本文插图
图5 实时通信及数据解析程序层次结构
3 关键技术难点及解决方案
两个上层核心程序中的实时通信及数据解析程序通常是远程监控系统的性能瓶颈 。 随着数据流量的增加 , 信息的交互越来越频繁 , 既要保证数据实时传输的可靠性 , 又要保证数据接收和解析足够快 , 以免造成数据堆积甚至程序崩溃 。
3.1 保证实时传输的可靠性
传统的小型PLC 通讯方式为基于RS485 的自由口通信 , 此种通信方式在高速大流量网络中 , 很容易出现数据丢失、顺序混乱等问题 。 鉴于S7-200 Smart 系列PLC 已完全支持开放式TCP 通信 , 利用Micro Step7Smart 编程软件中的库 ,即可调用TCP 的Connect、Send 和Recv 函数 。 因此本系统所有设备间的通信在传输层均可采用基于TCP 面向可靠连接、按字节传输并带有拥塞控制和流量控制的协议 。 应用层也需要制定自定义协议 , 该协议主要完成客户端/ 本地服务器和远程服务器之间的数据传输、命令应答任务 。 通信协议将消息分为请求行、首部和消息体 。 请求行有两部分组成:第一部分是Command , Command 可以是命令 , 也可以是应答 , 该字段长度为4 字节;第二部分是Version , 也就是版本号 , 为版本升级兼容协议 。 使用TotalLen 来表示消息的总长度 , 可在应用中解决数据传输粘包/ 拆包的问题;使用Type来区分不同类型的立体停车库 , 进而使用不同的业务逻辑来解析数据;使用EquiNum 即设备编号来区分不同设备;通过对消息的编号 , 可进一步排除数据混乱、丢失等错误 。
3.2 保证实时传输的可靠性
提高实时通信及数据解析程序的性能主要针对以下两点分别采取措施:
1)实时通信 。 应用层采用socket 编程 , 利用Linux内部的I/O 多路复用机制 , 调用epoll 函数轮询与远程服务器相连接的客户端 , 并采用非阻塞socket , 能大大提高程序的运行效率 。
2)数据的解析和存储 。 若将数据通信接收与数据解析处理串行置于同一线程中 , 当解析处理速率无法跟上通信接收数据包的速率时 , 会造成数据包大量积压最终导致程序崩溃 。 现代计算机发展历程已经由串行计算时代过渡到了并行计算时代 , 服务器中更是采用性能强劲的多核CPU 。 采用多线程技术可以大大提高实时通信及数据解析程序的性能进而解决上述问题[7] 。 每组数据采用单独的线程解析 , 并行计算 。 使用异步调用将原始数据和解析后的数据存于数据库中 。 关系型数据库具有原子性、一致性、隔离性、持久性四个特性 , 不需要考虑多线程同时与数据库交互的问题 。 以上两个措施相辅相成 , 利用操作系统自带的系统调用 , 并采用多线程编程能将计算机的性能最大程度地发挥 , 系统开发者需要结合具体任务将其分解 , 以开发出卓越的多线程程序 。


推荐阅读