APP下载

物联网设备精简Web服务实现框架设计

2019-03-29李光明黄立昌

物联网技术 2019年2期
关键词:物联网

李光明 黄立昌

摘 要:随着物联网行业的发展,机器设备都要提供Web服务实现网上操作与管理。针对其配置与管理复杂的局限性,目前提供的Web服务大多依赖于第三方软件。通过采用微软.NET框架中Http Listener类实现本地PC端应用软件对远程浏览器HTTP请求报文的监听,从而实现HTTP协议的握手,利用SQL Server数据库实现Web服务端和客户端的实时通信,同时设计一种比较简洁的Web服务实现框架。通过实现步进电机的Web服务对该框架进行测试。实验结果表明,该框架在实现Web服务的同时,系统架构精小,无需配置Web服务软件,系统可移植性较强。

关键词:物联网;Web;Http Listener;工厂模式

中图分类号:TP311.1文献标识码:A文章编号:2095-1302(2019)02-00-04

0 引 言

近些年,随着物联网行业的兴起,机器设备都在朝着智能化方向发展。其中典型的特征就是机器设备具有“连网”功能,能够实现网上远程控制,从而把操作人员从机器设备身边解放出来,减少机器污染对人体的伤害。而机器设备的“连网”功能可通过提供设备的Web服务实现,同时Web技术的发展也为实现Web服务提供了许多方式。一般情况下,实现高性能的Web服务需要借用I2S,Apache等第三方服务软件[1],但是每一个Web服务软件在运行前都需前期配置,实现过程比较复杂,系统庞大,不易于管理。而利用微软.NET框架下的Http Listener类可实现精简的Web服务,同时能够避免借用Web服务软件带来的问题,使系统变得清晰,容易理解,减少一些繁锁的配置。

基于物联网设备实现其“连网”功能只需一些基本Web服务就可满足,且设备的种类较多,借用Http Listener类和工厂模式,本文设计了一套适合于物联网设备的精简Web服务实现框架。

1 Web服务实现框架

Web服务是一组模块化的API,可通过网络对该API进行调用,执行远程系统的请求服务,从而实现机器设备间跨网、平台的相互操作及数据交互。为了实现对物联网设备的跨网和平台实时控制,需要实现其Web服务。

由于物联网设备种类较多,为提高框架的通用性,以适用于不同的物联网设备,本文设计的简易Web服务采用工厂设计模式,将框架分成三层。顶层是逻辑控制模块;中间层是工厂类;底层由控制函数模块、HTTP应答模块和数据访问模块组成。它们相互作用,实现设备的本地控制和Web服务两个功能,软件框架结构如图1所示。

1.1 逻辑控制模块

逻辑控制模块作为软件的逻辑控制中心,通过调用工厂类中函数在逻辑控制模块实例底层各模块中的控制函数类,利用控制函数类调用控制函数实现对设备的逻辑控制。逻辑控制模块同时具有显示作用,在实现具体操作的同时也可将设备的实时状态显示在操作界面。

其中,逻辑控制模块和控制函数模块的主要作用是实现设备的本地控制,而在实现本地控制的基础上借助HTTP应答模块和数据访问模块实现Web服务。

1.2 工厂类

工厂类来源于工厂设计模式,其主要思想是把类的创建封装到工厂类的函数中[2],当需要对象时,无需亲自创建,只需通过调用工厂类中的函数就可得到类。因此工厂设计模式能够把类的创建和使用相分离,减小程序间的耦合度,提高复用性。

为了适用于不同的物联网设备,本文设计的Web实现框架需提高通用性。因此借用工厂类作为中间层封装底层各模块中类的创建,减小逻辑控制模块与其他三个模块的耦合度。例如,当要实现不同设备的Web服务时,只需更新控制函数类,在工厂类中进行新类的创建即可,逻辑控制模块无需修改代码。

1.3 底层模块

底层模块包括控制函数模块、HTTP应答模块和数据访问模块,各模块由接口和类组成。其中,接口中封装的是各模块的功能函数,而模块中的类需要继承接口对各功能函数进行具体实现。通过借用接口把各模块中类的创建封装在工厂类的函数中,供逻辑控制模块调用。

1.3.1 控制函数模块

作为设备控制的直接程序,控制函数模块包含对设备进行操作的各种函数。通常情况下,对设备的控制主要通过设备的初始化、起停控制、状态读取和参数设置等操作实现,因此控制函数类主要是对以上四个功能的函数进行实现。

1.3.2 HTTP應答模块

HTTP协议作为实现Web服务的基础,建立在TCP/IP协议基础上,对HTTP协议报文的监听一般需借用第三方Web服务软件,虽然Web服务软件可实现高性能Web服务,但是配置繁琐。而物联网设备通常只需一些简单的Web服务,同时.NET中的Http Listener类是对TCP/IP协议的封装,因此使用Http Listener类可以较容易地在HTTP应答模块中创建响应HTTP请求的简单HTTP协议侦听器。在监听到网页请求后向客户端返回HTML文件,通过浏览器对HTML文件的渲染得到控制界面就能实现设备的Web服务。因此该模块的类中只需借用Http Listener类实现HTTP请求报文监听和HTML文件响应两个功能函数。

1.3.3 数据访问模块

由于HTTP是一个短连接的通信方式,每次连接只持续较短的一段时间,如果要用HTTP协议实现Web服务端和客户端的实时通信,则需要采用轮询方式[3]。但实现轮询方式时,无论数据是否发生变化,都要间隔一段时间向服务端发送一个请求,对服务器造成了较大压力。虽然Web Socket可以简单方便地实现实时通信,但需借助Web服务器。而本文实现的Web服务框架需精简系统,因此借用数据库作为中间桥梁实现服务端和客户端的数据交互。

数据访问模块的功能是将设备状态信息写进数据库供远程客户端读取,同时从数据库中读取远程客户端对设备的操作信息以及HTML文件中的Java Script代码,实现服务端和客户端的数据实时交互。此外,还可实现设备历史数据查询和大数据分析。要实现以上功能只需在数据访问模块中封装数据库的增、删、改、查函数即可。

2 步进电机Web服务实现

由于步进电机应用广泛,且和其他设备一样实现“连网”和远程跨网控制只需简单的Web服务就可满足需求,因此本文以实现步进电机的Web服务为例,说明如何利用Http Listener类采用C#编程实现Web服务。

2.1 步进电机Web服务系统结构

本文设计的软件框架只用于开发步进电机控制软件,是Web服务的服务端。要实现步进电机的Web服务和跨网控制,还需要步进电机、客户端和SQL Server数据库。由以上四部分组成步进电机Web服务系统,如图2所示。

步进电机作为被控制和管理的设备,是Web服务的落脚点。

电机控制软件作为Web服务端,是整个结构的核心部分。控制软件采用C#作为开发语言,框架软件包括逻辑控制、控制函数、HTTP应答、数据访问和工厂类五个模块。

Web客户端即浏览器,需向服务端发送网页请求报文,在收到响应报文中的HTML文件后,对HTML文件进行渲染得到步进电机远程控制界面,从而实现步进电机的Web服务。

SQL Server数据库作为Web服务端和客户端实时通信的中间桥梁,在本地PC机中通过C#代码操作数据库,而远程浏览则利用接收到的HTML文件中的Java Script程序对SQL Server数据库进行操作,实现Web服务端和客户端的实时数据通信。

2.2 步进电机控制软件实现

本文设计的框架中,工厂类作为中间层主要是隔离模块,而其他四个模块则是步进电机控制软件的实现基础。

2.2.1 逻辑控制模块

逻辑控制模块的主要功能是调用控制函数模块中的函数,实现步进电机的逻辑控制和状态显示,实现过程可分为以下三步:

(1)步进电机初始化

工作之前,一般需对机器设备进行基本参数设置,在对步进电机进行实时控制前需对电机和PC机的USB通信进行初始化。初始化的主要过程:在程序操作界面起停控件“Click”事件函数中,依次调用控制函数模块中的OpenDevi-ce( )函数和SetTimeout( )函数,打开USB串口,设置USB通信超时时间;在USB串口打开后调用WriteData( )函数,对电机的衰减模式电压和电机驱动电流进行设置,从而完成对电机的初始化。

(2)步进电机转速和行进距离控制

目前,对步进电机的控制主要是对步进电机转速和行进距离的控制,再利用圆弧和直线的插补算法可合成工程上所需的行进路线。

完成初始化后,根据步进电机提供的USB通信数据表将控制软件界面中的转速和行进距离输入控件中的数据写入到字节数组中对应的字节中,通过调用WriteData( )函数将控制命令字节数组写入驱动器中实现对步进电机的控制。

(3)步进电机运行状态读取

在实现对电机进行控制的同时也需显示电机的工作状态,为操作人员提供操作参考数据。通过调用ReadData( )函数从USB串口中读取电机状态字节数组,然后根据电机提供的USB通信数据表对所读取的状态字节数组进行解析,再将解析结果显示在软件界面相对应的显示控制中。

2.2.2 控制函数模块

在步进电机控制过程中,转速和行进距离是比较常用的两个参数,而且这两个参数有取值范围限制。因此在电机控制类中定义电机转速Servo_Speed和电机行进距离Servo_Distance属性,对电机转速字段servo_speed和行进距离字段servo_distance进行保护和取赋值限定。电机转速和行进距离不仅要进行写入也要读取,因此属性定义时要有get和set访问器。

控制函数类作为控制函数模块的主体,其实现的函数主要有以下几个:

OpenDevice( ):打开电机驱动器;

CloseDevice( ):关闭电机驱动器;

SetTimeout( ):设置USB数据读写超时时间;

WriteData( ):写入控制命令数据块;

ReadData( ):读取控制命令数据块。

以上控制函数通过引用步进电机驱动器提供的DLL动态链接库中所对应的外部函数,在电机控制类中对所引用的函数进行外部函数声明实现。

2.2.3 HTTP应答模块

HTTP應答模块的功能是对HTTP请求作出反应,其实现过程是先对HTTP请求进行监听,然后向客户端响应HTML文件。

(1)远程浏览器HTTP请求报文监听

对HTTP请求报文的监听主要通过创建HTTP协议侦听器完成,侦听器创建的部分源代码如下:

HttpListener listener = new HttpListener();

listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;

listener.Prefixes.Add(“http://192.168.0.21:9216/”);

listener.Start();

HttpListenerContext context = await listener.GetContextAsync();

HttpListenerRequest request = context.Request;

本文利用Prefixes属性将侦听器绑定到9216端口上,也可根据需要绑定到其他未被占用的端口,而Authentication Schemes属性的功能是设置是否允许匿名和无身份验证的客户端访问。在执行Start( )函数后,开始监听浏览器的HTTP请求。在接收到HTTP请求时GetContextAsync( )函数会返回一个HttpListenerContext类,利用该类实现HTML文件响应。为了实现对客户端网页请求的实时监听,该段程序需要分配子线程循环执行。

(2)HTML文件响应

返回HttpListenerContext类后,该类的Response属性返回一个HttpListerResponse类。通过HttpListerResponse类可响应远程浏览器的请求,给远程浏览器响应HTML文件,从而实现对浏览器的Web服务。具体源代码如下:

HttpListenerResponse response = context.Response;

response.ContentType = “text/html;charset=utf-8”;

response.ContentLength64 = bytes.Length;

System.IO.Stream output = response.OutputStream;

output.Write(bytes, 0, bytes.Length);

output.Close();

为了实现对浏览器的实时响应,该段代码需要和监听代码在同一子线程,并且在监听代码后循环执行。代码中使用ContentType属性设置响应文件的格式,如果不设置,浏览器会将文件以.txt格式显示在窗口上。而Write(bytes,0, bytes.Length)函数的功能则是向浏览器传递响应文件,其中参数bytes为一个字节类型的数组,该数组存放了HTML文件的二进制数据。

2.2.4 数据访问模块

数据库太小不利于系统扩展,太大不利于管理,因此选用中型数据库SQL Server作为中间桥梁实现服务端和浏览器的数据交互。SQL Server表中不仅存储步进电机的状态信息,如实时转速、周期行进距离与串口通信状态等,同时还存储来自客户端的操作信息,如转速给定、行进距离给定、正反转与起停等。

在服务端,电机控制软件的C#代码将电机的实时状态写进数据库,同时从数据库中读取浏览器对电机的操作数据,根据操作数据调用控制函数模块中相应的控制函数,实现电机的远程操作。

在客户端实现对数据库的操作需借助Java Script代码,因此要在HTML文件中嵌入对数据库进行操作的Java Script函数,将在浏览器中对步进电机的操作数据写进数据库中,同时将数据库中存放的电机状态信息读出,并显示在浏览器网页上。

3 Web服务测试

将步进电机驱动器USB数据线接入本地PC机,运行控制软件,对电机参数进行设置,启动按钮,即可实现对电机的控制。控制软件界面如图3所示。

软件运行后,在同一局域网内的浏览器中输入IP地址及其端口号192.168.0.21:9216,浏览器将收到的HTML文件渲染到浏览器窗口,即步进电机远程控制界面。远程控制界面如图4所示。

若要实现外网Web服务,只需向网络运营商申请外网IP地址,或者借用花生壳软件将本机IP映射到外网即可实现。

4 结 语

从对步进电机Web服务的测试过程可以看出,本文设计的Web服务实现方案可以很好地应用,在实现既定功能的同时系统也能稳定运行。该方案不仅规避了借用Web服务软件带来的复杂配置过程,同时精简了系统,提高了软件的可移植性。

本文只用了两个步进电机进行测试,在物联网行业中类似步进电机只需向外提供简单Web服务的设备还大量存在。而本文设计的Web实现框架采用工厂模式,各模块间的耦合度低,且具有很强的可扩展性,因此只要在框架中添加不同设备的模块即可实现其他物联网设备的Web服务,从而对分布式物联网设备进行集中管理。

参 考 文 献

[1]秦元培.使用C#开发HTTP服务器系列之Hello World [EB/OL]. http: //blog.csdn.net/qinyuanpei/article/details/51757148,2016.

[2]葛萌,欧阳宏基.工厂设计模式的研究与应用[J].计算技术与自动化,2017,36(2):136-140.

[3]祝瑞,车敏.基于HTTP协议的服务器程序分析[J].现代电子技术,2012,35(4):117-119,122.

[4] EGBENIMI B E, SANDEEP B.Simplifying the abstract factory and factory design patterns[J]. ARPN journal of science and technology,2014,4(12):789-794.

[5]高扬.基于.NET平台的三层架构软件框架的设计与实现[J].计算机技术与发展,2011,21(2):77-80,85.

[6]李光明,孙英爽,党小娟.基于安卓的远程监控系统的设计与实现[J].计算机工程与设计,2016,37(2):556-561.

[7]杜超,林开伟,陈曼雯.物联网智能示波器研究与设计[J].物联网技术,2017,7(11):36-39,41.

[8]刘立伟,司冬雨,白洁.基于LabVIEW Web服务的物联网发电设备远程监测系统应用[J].自动化技术与应用,2014,33(10):82-84.

[9] SERNA F, CATAL?N C, BLESA A, et al. “Predictive maintenance surveyor” design pattern for machine tools control software applications[C]// Emerging Technologies & Factory Automation. IEEE, 2011:1-7.

[10]蔡昭權.基于C#的无I2S的Web Services服务[J].计算机工程与设计,2007(9):2230-2232.

[11]刘伟,胡志刚,阎朝坤.C#设计模式[M].北京:清华大学出版社,2013.

猜你喜欢

物联网
基于无线组网的智慧公交站点信息系统研究与实践
基于LABVIEW的温室管理系统的研究与设计
论智能油田的发展趋势及必要性
中国或成“物联网”领军者