技术领域
本发明属于通信技术领域,尤其适用于面向服务应用技术通信领域。
背景技术
通过某种通信机制将既有程序从设备获取的数据应用于互联网是一种趋势,实现物联网应用通信的方法很多,但基于Windows平台开发的通信采集程序直接转互联网通信的方法并不多,其中大多数的方法是将MFC(MicrosoftFoundationClasses是微软公司提供的一个类库)采集程序得到的数据先保存在数据库,再由互联网应用网站通过用户向数据库请求数据。本发明中终端设备的数据采集模块基于MFC开发,通过面向服务的通信机制,不通过数据库直接将采集到的数据推送到网页客户端前台,达到实时通信的效果。
发明内容
本发明提出一套基于WCF(WindowsCommunicationFoundation)的物联网通信方法,该方法实现MFC数据采集模块与网站服务器模块(C#或其他语言开发的网站)通信。本方案MFC数据采集模块基于完成端口模型(简称:IOCP),与终端设备建立远程通信来获取数据,并将数据推送给网站服务器模块实时显示,也可以用单机版与终端设备建立本地通信获取数据,然后将数据推送给网站服务器模块实时显示。
本发明由MFC数据采集模块、面向服务应用模块(WCF)和网站服务器模块三大部分组成,MFC数据采集模块和网站服务器模块之间通过面向服务应用模块(WCF)创建的函数建立通信。
1、MFC数据采集模块
MFC数据采集模块包括三个子模块:互联网通信模块、本地通信模块和进程间通信模块。
MFC数据采集模块的三个子模块不能同时运行,如启用其中一个子模块,则另外两个子模块不工作。互联网通信模块应用于与终端设备远程通信,本地通信模块应用于与终端设备串口或CAN通信,进程间通信模块应用于MFC数据采集模块与其他基于Windows平台应用程序通信。
远程(互联网)通信要求MFC数据采集程序安装在一台WINDOWS平台的计算机(简称:PC)内,PC需要具有公网IP地址和通信端口供远程终端连接并接收发送远程终端的数据,本地通信以及进程间通信只需MFC数据采集程序安装在联网(Internet/Intratnet)的PC上。PC与面向服务应用模块以及网站服务器模块协同工作将数据提供给更多用户使用。
为解决TCP/IP通信的虚连接问题以及保证远程通信的有效性和规范性,互联网通信模块采用的应用层协议是JT/T794标准协议,其通信模型采用IOCP模型,IOCP基于Socket编程,适用于控制并发执行的高负载服务器。
本地通信模块主要分串口通信和CAN(ControllerAreaNetWork)通信,串口通信基于windows32位系统,使用两种编程方式,一是使用ActiveX控件,二是调用Windows的API函数。Can通信的应用层协议是CANCailbrationProtocol(简称:CCP)协议,基于CAN转Usb协议转换器提供的驱动程序对CAN通信进行开发,该驱动程序是一种动态链接库。
进程间通信模块主要是将MFC数据采集模块作为一个中转模块,处理其他基于Windows平台的应用程序的数据,并将采集的数据通过面向服务应用模块和网络服务器模块实时反馈给多个用户。MFC数据采集模块作为中转模块,用户只需要关注进程间通信方式和接口,以及面向服务WCF模块的业务模型的设计。
2、面向服务应用模块(WCF)
面向服务应用模块(WCF)主要含通信模块和业务逻辑数据接口。通信模块包含两个WCF程序,这里定义为WCF1和WCF2。WCF1处理解析MFC数据采集模块传递的数据,WCF2用于实现双工通信(双工通信:指在同一时刻信息可以进行双向传输)推送数据到网站服务器模块。业务逻辑数据接口是面向服务应用模块(WCF)中功能函数,其中WCF1包含4个功能函数:普通数据处理函数(GetData)用于接收普通数据,结构体链表数据处理函数(GetDataUsingDataContract)用于接收结构体数据。打开数据库函数(openSql)和关闭数据库函数(CloseSql)。WCF2包含3个功能函数一个接口函数:普通数据处理函数(GetData)用于接收普通的数据,注册监听函数(ResgiterListenter)和反注册监听函数(UnResgisterLister)用于Web客户端向WCF2注册,注册后的Web客户端可以接收WCF2发布的数据。回调接口函数(ITesCallback)用于创建虚函数(Refresh),Web客户端通过实例化Refresh函数实现客户端刷新效果。
WCF1与MFC数据采集模块建立的结构体链表接口一致,其通过gSoap编译工具中WSDL(预处理程序)生成C/C++风格的头文件,再根据头文件自动生成调用远程SOAP服务客户端代码(称为存根:Stub)和提供SOAP服务的框架代码(称为框架:Skeleton),结构体链表存放的数据通过调用WCF1函数传递,这个函数就是MFC数据采集程序与WCF1的接口。通信中采用的绑定协议为basicHttpbinding,basicHttpbinding采用Http/Https协议,主要用于与旧的Web服务协作。其采用的通信模型为InstanceContextMode.Single模式。InstanceContextMode.Single实例行为类似于单件设计模式,所有客户端共享一个服务实例,这个服务实例是一个全局变量,使各模块调用WCF1函数变量成为最新数据。
但basicHttpbinding绑定协议不支持双工通信,为了支持双工通信,本发明又设计了WCF2程序,用于处理需要推送到网站服务器的数据,WCF2作为服务分别与WCF1和网站服务器模块建立通信,WCF1是WCF2的宿主,通过调用WCF2的函数传递实时数据。WCF1和WCF2可以分布式架构,来缓解计算机压力。WCF2主要处理回调机制,接收数据后将数据推送给向它订阅的网站服务器模块。WCF2的回调操作即由WCF2调用网站服务模块的方法。回调操作只有具有双向通信能力的绑定协议才可以使用回调,本方法中使用netTcpbinding绑定协议,通过设定ServiceContract特性中的CallBackContract属性并创建回调契约ITestCallback实例化回调对象再通过它创建一个上下文对象InstanceContext,然后用代理把这个回调引用传回WCF2。
3、网站服务器模块
网站服务器模块包含Web服务器端和Web客户端,采用MVC(Model-View-Control)架构,其中Model和Control主要用于Web服务器端,View主要用于Web客户端。网站服务器模块有两种通信模式:将WCF2信息推送到Web客户端显示和将Web客户端数据回传到MFC数据采集模块。
网站服务器模块让Web客户端和Web服务器端可以实时互相通知消息及调用方法,还负责将数据推送到Web客户端页面中,同时浏览器也有很好的兼容性。
网站服务器模块中安装ASP.NETSignalr类库包并注册了一个HUB(HUB是Signalr类库通信的一种模式),它能与所有Web客户端共享发送到Web服务器上的信息,同时Web服务端可以调用客户端脚本。客户端和服务器端使用JOSN格式(JavaScriptObjectNotation,是一种轻量级的数据交换格式)来交换数据,在服务器端声明的HUB,.Net依赖Proxy生成代理类,Proxy内部则是将JSON转换成对象,客户端可以看到对象。
Web客户端调用网站服务器模块函数与WCF1端通信,网站服务器模块作为WCF1的宿主,可以直接调用WCF1的函数,其通过功能函数形成的指令和优化的数据反馈给WCF1,由WCF1通知应用程序将数据回传到终端设备内。
WCF1不能反向调用MFC采集数据模块处理事务,WCF1向MFC采集数据模块发送数据需采用消息队列(MSMQ)来解决这个问题,WCF1将网站服务器的业务请求转换为指定的消息格式存放在消息队列中,MFC采集程序模块采用线程架构将消息队列信息取走,通过Socket、串口或CAN回写到终端设备中。
本发明的有益效果如下:
1、跨平台性好:WCF是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NETFramework的重要组成部分。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。
2、性能好:基于完成端口模型的MFC应用程序通信。完成端口设计模型只适用于WindowsNT和Windows2000操作系统,其设计的复杂性,在应用程序需要同时管理数百乃至上千个套接字的时候,并希望随着系统内安装的CPU数量的增多,应用程序的性能也可以线性提升。但其接口通信和跨平台性差,通过本方案可以将其与Web客户端连接。
3、模块化好:本方案提供了一整套MFC程序采集的数据到Web
客户端显示的解决方案。整套方案由三大模块组成,每个模块都可以拆解,与其他方案通过通用接口通信。
4、显示效果好:基于Signalr+WCF+JavaScript通信技术及开发思路可以将MFC采集的实时数据及时显示到网页端,弥补网页端数据即时显示交互性差的问题。
5、分布式架构好:本方案的各模块均可以架构在不同的计算机,由面向服务应用模块(WCF)负责通信。
附图说明
图1基于WCF的物联网通信系统
图1表示本解决方案各模块的组成方式及连接示意。终端设备或其他基于WINDOWS平台的应用程序通过一定方式与MFC数据采集模块建立通信,MFC数据采集模块再通过通信接口与面向服务应用模块(WCF)建立通信。最后面向服务应用模块(WCF)程序再根据通用接口函数以及相关回调机制与网站服务模块建立通信。
图2基于WCF编程模型的通信机制
图2表示了各模块的具体通信协议和通信方式。本解决方案中提出了远程终端与MFC数据采集模块基于TCP/IP以及通用协议进行通信。本地终端也可以通过采用CCP协议或自定义协议通信。为实现双工通信,本方案面向服务应用模块(WCF)设计两个WCF程序来分布通信。MFC采集数据模块作为宿主调用WCF1方法传递数据,WCF1又作为WCF2宿主进行通信,WCF2与WCF1和网站服务器基于netTcpbingding协议通信,WCF2利用双工技术(回调机制可以称为订阅发布机制)向网站服务器模块推送数据。最后网站服务器模块接受WCF2数据后采用Signalr类库技术在服务器端建立HUB,由客户端通过建立代理类实现网站服务器端向客户端消息推送功能,用JavaScript技术实现网页客户端刷新无闪烁的良好显示效果。
另外网站服务器模块作为WCF1宿主可以采取调用WCF1的方法向远程终端回写数据。WCF1通过消息队列的方式将指令写在消息队列中,再由MFC数据采集程序通过读取消息队列取走数据后实现标定功能。
具体实施方式
图1基于WCF的物联网通信的系统
1、MFC数据采集模块
MFC数据采集模块负责与终端设备通信。终端设备连接方式有两种:互联网通信、本地通信。还有一种是与其他应用程序通信。各模块之间不共同工作,但可以按应用需求处理不同类型的事务。这里主要具体介绍互联网通信。
MFC数据采集模块搭建在一台互联网的PC上或申请云服务器,提供终端设备的连接信息:固定的域名地址、端口号。终端建立连接后可以向MFC数据采集模块发送消息。MFC数据采集模块可以接受多个终端设备的数据。MFC数据采集模块接收到终端设备数据可以理解为一包包的数组。每个数组需要MFC数据采集模块通过业务逻辑模块去解析它的意思,最后将数据存放在一个结构体链表中再传递给面向服务应用模块(WCF)去处理。
2、MFC数据采集模块与面向服务应用模块(WCF)通信
MFC数据采集模块通过调用面向服务应用模块(WCF)通信模块函数建立通信。面向服务应用模块(WCF)可以与MFC采集数据程序安装在同一台服务器,也可以分布式架构。
面向服务应用模块(WCF)可以接收和转发数据给任意平台的应用程序,这里我们接收MFC数据采集程序的数据,然后对数据进行业务逻辑的分析,再转发给我们网站服务器模块和数据库。业务逻辑模块主要是优化处理MFC采集的数据,如我们有100个终端设备,目前建立通信的设备有20个,每个设备包含它的ID、生产厂家、位置、产生信息等,我们把这些信息存放在MFC数据采集程序一个结构体链表中,通过调用面向服务应用模块(WCF)提供的函数传递数据,由面向服务应用模块(WCF)将需要保存的信息存放在数据库内,实时数据直接推送到Web客户端让用户网页查看。
3、网站服务器模块
Web的客户端页面通过两种方式获得数据,一种是客户端用户主动请求,另一种是由面向服务应用模块(WCF)将数据推送给网站服务端,再由网站服务端推送给Web客户端。
图2基于WCF编程模型的通信机制。
1、终端设备与MFC数据采集模块互联网通信
终端设备主动握手请求数据,MFC数据采集程序被动连接应答终端。通信协议采用的通信方式应符合JT/T794中的相关规定,通信协议采用TCP或UDP,MFC数据采集模块作为服务器端,互联网ECU(ElectronicControlUnit)电子控制单元可以作为终端。协议采用大端模式(big-endian)的网络字节序来传递字和双字。每条消息由标识位、消息头、消息体和校验码组成。终端心跳为周期性发送的数据信息,其发送间隔每次上电复位后默认为60秒,确保远程统计设备在线状态。终端周期性向平台发送终端心跳,平台回复一个平台通用应答。消息ID:0x0002。MFC数据采集模块如发送:7e02211112111111117b3b67e。通过JT/T794协议,可以得知编号为111211111的数据发来一阵心跳。
MFC数据采集模块基于WindowsSoket的IOCP模型,IOCP主要针对数据吞吐量和连接并发量而设计。适用于能控制并发执行的高负载服务器技术,能够异步I/O操作的模型。首先创建一个完成端口(::CreatetoCompletioPort()).然后再创建多个线程,并指定到这个完成端口上去读取数据。再将远程连接套接字句柄关联到这个完成端口。对IOCP模型下的MFC数据采集程序开发设计重点两个方面:(1)内存管理设计方面更新(2)通讯协议及无法粘包流程。
2、MFC数据采集程序与面向服务应用模块(WCF)的通信.
MFC采集数据程序建立结构体链表(List:m_iClient)每个节点包含了一个终端设备的SocketId、位置、设备标识号、位置、报警状态、关键信息等信息。
WCF1作为宿主调用WCF2的GetData函数传递数据.
WCF1作为服务,MFC数据采集模块通过WCF1暴露的服务地址和接口函数(GetAlliClent)作为WCF1的宿主进行通信。
WCF1将采集的数据根据协议解析后通过执行SQL存放在数据库内,实时部分的数据传递给WCF2处理,实时部分数据主要是指哪些模块在线,它们的位置在什么地方等等。采用了InstanceContextMode.Single模式主要保证客户代理实例化唯一,保证客户端获取的数据是最新的部分。WCF1作为WCF2的宿主传递数据,WCF2暴露的服务器地址和接口函数(GetData)。接口函数主要负责向WCF2推送数据。
WCF2设计回调机制,接受数据后会立刻推送给向它订阅的网页客户端。ITesCallback接口类中的Refresh方法用于客户端设计回调方法。
3、网站服务模块推送数据到Web客户端
网站服务端安装ASP.NETSignalr包,Web服务器端注册了一个HUB并定义CallWCFAsyncMetho方法,客户端生成代理后调用callWCFAsyncMethod方法向WCF2注册回调。网站服务器模块通过继承MvcGPRSApp1._1.ServiceReference2.ITestServiceCallback,重写refresh方法再向客户端推送数据(this.clients.All.sendMessage(value))。Web客户端接到数据更新通知后可以采用jquery(Javascript框架)技术刷新主界面,这里我们采用的是最新的DataTable2.9插件,通过"ajax"属性:'/DataModule/DataProvider',实现网页无闪屏感的自然刷新。
4、网站服务模块向WCF1端发送数据
Web客户端与面向服务应用模块(WCF1)端通信,网站服务器作为WCF1的宿主,可以直接调用WCF1的函数。Web客户端调用网站服务模块主要是实现标定职能,如需要终端设备停止发送数据,或对终端设备远程发送具体的数据,Web客户端用户根据JT/T794协议形成的指令和优化的数据反馈给WCF1,由WCF1形成消息队列(MSMQ:MessageQueue)。
5、WCF1向MFC数据采集模块发送数据
WCF1不能反向调用MFC数据采集模块处理事务,这时我们采用消息队列(MSMQ)来解决这个问题。WCF1将网站服务器的业务请求转换为指定的消息格式存放在消息队列中。MFC采集程序模块采用线程设计思路将消息队列信息取走,再通过Socket或串口或Can口回写到终端设备中。