,
(天津科畅慧通信息技术有限公司,天津 300399)
射频识别系统包括标签和读写器。读写器一般有1~4个天线端口,天线的工作频率、功率,空口协议所使用的前反向速率、编码方式、调制方式以及读写器的IP地址、ntp同步服务器等都需要在客户端配置。这些配置信息存储在读写器Flash或者EEPROM上,因此配置模块是读写器设计的一个重要模块。
当前读写器和客户端通信通常使用TCP/IP Socket通信,读写器内部配置模块和其他业务模块之间的通信通常采用消息队列、管道等进程间通信实现。这样配置模块和其他模块之间的耦合性很强,并且配置模块要管理来自不同内部模块和客户端的消息,处理起来相对复杂,给模块的设计带来了一定难度。
ZMQ看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息(如线程间、进程间、TCP、广播等),也可以使用套接字构建多对多的连接模式(如扇出、发布-订阅、任务分发、请求-应答等)。ZMQ的快速足以胜任集群应用产品,它的异步I/O机制支持构建多核应用程序,完成异步消息处理任务。ZMQ支持多语言,并能在几乎所有的操作系统上运行。读写器配置模块使用ZMQ作为消息通信的方式,能够很好地解决上面的各种问题,降低开发难度,适用于各种嵌入式开发环境。
图1 请求/应答模式
如图1所示,请求/应答模式特征如下:①服务器使用REP类型套接字而客户端使用REQ类型套接字;②客户端发送请求和接收答复,而服务器则接收请求并发送答复;③客户端可以连接到一个或多个服务器,在这种情况下,请求会在所有的服务器(Reps)之间循环,一个请求被发送到某个服务器,下一个请求则被发送到下个服务器,如此进行下去;④客户端在发送另一个请求之前,必须先接收前一个请求的答复,而服务器在接收另一个请求之前,必须答复前一个请求。
如图2所示,发布/订阅模式特征如下:①发布者使用PUB类型套接字,订阅者则使用SUB类型套接字;②一个发布者可以有一个或者多个订阅者;③一个订阅者可以连接到一个或者多个发布者;④发布者发送消息而订阅者接收消息;⑤订阅者可以使用SubscribeAll方法订阅所有的发布者消息,也可以使用Subscrube方法订阅某个特定的消息,这时要将所感兴趣的发布者消息前缀作为参数,对消息的过滤发生在订阅者端,即发布者将其所有的消息发送给订阅者,而订阅者负责将不需要的消息丢弃;⑥订阅者可以用UnsubscribeAll方法取消所有订阅,也可以使用Unsubscribe方法加上消息前缀来退订某个发布者;⑦发布者将消息发送到已连接的所有订阅者;⑧如果发布者没有和任何订阅者连接,那么消息将会被丢弃;⑨如订阅者连接到多个发布者,那么它会均匀接收所有发布者的消息(公平队列)。
图2 发布/订阅模式
配置模块接收客户端下发的配置消息,并将配置信息保存到读写器的Flash或者EEPROM中,并通知读写器内部模块(比如通信模块、业务模块)配置变更,并将配置信息传递给读写器内部模块,其在接收到配置变更消息后,处理该模块的配置信息,更新配置。此外,读写器内部模块可以主动向配置模块请求该模块配置。
读写器配置模块和客户端之间的消息是配置下发消息和配置获取消息,读写器收到客户端消息后,会返回响应消息,因此可以采用REP/REQ模式。读写器内部模块和配置模块之间的消息包括内部模块向配置模块获取配置消息,以及配置模块收到客户端的配置信息后,将配置信息下发给读写器其他模块的消息。读写器其他模块向配置模块获取配置消息可以采用REP/REQ模式和一问一答的模式;配置模块下发给读写器其他模块的配置变更消息可以采用PUB/SUB模式,其中配置模块作为PUB端,其他模块为SUB端。这样不管读写器内部有多少模块,只要订阅了配置模块的PUB消息,就能收到配置模块下发的配置变更消息,获取自己需要的配置。
在链路模式上,配置模块应该作为服务端,这样无论是客户端还是读写器内部模块都能去链接配置模块的端口号,配置模块只需处理一个套接字上面的消息就能处理所有消息。
在链路协议上,配置模块和客户端之间只能采用TCP协议,这样能保证消息的可靠性;在配置模块和读写器内部其他模块之间,既可以采用进程间(线程间)消息通信,也可以采用TCP消息通信,在这里为了和后台客户端之间保持一致,配置模块应该采用TCP通信协议,这样配置模块只需绑定一个TCP端口就能够处理所有模块(客户端或者阅读器内部模块)发来的消息。
因此,配置模块作为服务端应该采用TCP通信协议与其他模块进行通信,采用ZMQ的REP和PUB模式,保证了最少的监听套接字和发送套接字。
图3 客户端和配置模块消息交互图
如图3所示,读写器配置模块为服务端,以REP模式绑定TCP协议一个端口,客户端则以REQ模式去链接服务器。其中消息A是客户端下发的配置消息或者请求配置消息,配置模块在收到客户端的消息后处理消息,并将配置响应消息或者获取配置响应消息(图中B消息)返回给客户端。
配置模块和读写器内部模块消息交互图如图4所示,其中A和B消息是配置模块和读写器内部模块之间的消息,此时配置模块仍然作为服务端,采用ZMQ中的REP模式,读写器内部模块作为客户端,采用REQ模式。读写器内部模块上电后或者需要查询配置时,可以通过消息A下发配置查询消息,配置模块在收到查询消息后,返回配置查询响应消息(即消息B)给读写器内部模块。
图4 配置模块和读写器内部模块消息交互图
读写器配置模块在收到客户端下发的配置消息后,会将读写器配置信息存储在设备的Flash或者EEPROM中,此时配置模块应该将配置变更消息通知读写器内部模块。该通知消息是一对多消息,采用ZMQ中的PUB/SUB模式能较为简洁地实现该功能。此时配置模块作为服务端,采用PUB模式;读写器内部模块作为客户端,采用SUB模式。配置模块仅需一个套接字就能将变更消息通知读写器其他内部模块,需要配置信息的读写器内部模块只需订阅配置模块的消息就能收到配置变更消息。图4中C消息就是配置模块下发的配置变更消息,内部模块收到C消息后,获取自己模块所需的配置信息。