摘 要:数据采集是监测类信息化项目的基本功能。实现该功能的方法有多种,而最常用的是借助GPRS技术利用TCP协议进行采集后数据传输的方法。本文建设的基于TCP协议的多线程数据采集系统利用C#编程技术实现,考虑到多终端同时发送数据的实际情况,采集处理用到了多线程技术。
关键词:数据采集;GPRS;TCP;C#;多线程
中图分类号:TP311.52 文献标识码:A 文章编号:2096-4706(2018)07-0022-03
Abstract:Data acquisition is the basic function of monitoring information projects. There are many ways to achieve this function,and the most commonly used method is to use GPRS technology to use TCP protocol to collect data after transmission. The multi thread data acquisition system based on TCP protocol in this paper is realized by C# programming technology. Considering the actual situation of multi terminal data transmission at the same time,multi thread technology is used in the acquisition and processing.
Keywords:data acquisition;GPRS;TCP;C#;multithreading
0 引 言
随着信息化水平的不断发展和提升,信息技术在各行各业的应用逐渐扩展,并为他们带来了实际的效益。尤其近几年来,国家水利、水资源监控项目集中部署,信息技术为该行业的项目建设提供了强有力的技术支撑,并为国家地下水监测、水资源监控能力监测打造了智能化、高效化、网络化、实用性很高的成功案例。
1 关键技术
1.1 GPRS技术
GPRS技术(General Packet Radio Service)是一种移动数据业务,以数据包(Packet)的方式传输。它通过GSM网络中未被使用的TDMA信道,提供中速的数据传递,传输速率可提升至56kb/s甚至达到114kb/s。本项目中的监测终端就是利用GPRS模块与公网(专网)指定的地址建立TCP连接,并将数据传送出去。
1.2 TCP协议
TCP(Transmission Control Protocol)是一种基于字节流的点对点的传输控制协议,TCP用一个校验和函数来检验数据是否存在错误,在发送和接收时都要计算、校验,从而提高了数据传输的可靠性。本文中的TCP客户端为大量的现场监测终端,TCP服务端为中心数据采集系统。
1.3 多线程编程
多线程(Multithreading)编程,是指在软件上实现多个线程并发执行的技术。程序中独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程处理能力的程序,会有效避免短时间内的数据拥堵。本文因业务需要采集终端数据上传时间为同一时刻,为避免数据收发确认延时和处理异常,系统采用了多线程编程技术。
2 系统实现
2.1 系统概述
现场用水户或地下水位监测点,通过安装监测设备(如水位计、流量计等)来获取监测数据,为了将监测数据可以按时发送至指定服务中心,在安装的监测设备上连接带有GPRS数据采集发送功能的采集终端,终端按照设置好的收发规则进行数据收发。图1为数据处理原理图。
2.2 主要设备
系统主要的设备如表1所示。
2.3 数据采集系统
(1)系统环境。开发平台:Microsoft Visual Studio 2010。开发语言:实现语言C#。数据库:Microsoft SQL Server 2008。服务器操作系统:Windows Advanced Server2008。(2)系统架构。数据采集系统采用三层架构设计模式,使系统开发达到高内聚低耦合的目标,为未来可能的系统扩展和系统移植打下了坚实的基础。同时,该架构的应用为系统向产品化、标准化发展提供了技术上的可能,也大大提高了系统的开发效率。(3)GPRS数据采集、发送服务。系统借助.Net 2010开发平台,利用C#编程,实现了数据的采集收发功能,数据采集终端通过GPRS网络与服务中心建立TCP连接,通过固化的上传机制将当前需要上传的数据分包发送至指定中心地址,数据中心采集系统软件在正确解析数据后发送响应包至采集终端,待采集系统发送结束包至终端,终端回应结束包,本次上传结束。数据采集收发机制如图2所示。
2.3.4 多线程编程
为满足接收多终端(一般项目终端数量在千台左右),同时发送的数据的需求,在编程时采用了多线程编程技术。为达到更好的数据处理效果,要求数据中心配置企业级服务器,内存不低于16G。实例代码如下:
Thread threadWatchTcp=1;//负责监听客户端连接请求的线程
Dictionary
Dictionary
TcpListener TcpListener;//监听
///
///监听客户端请求的方法
///
void start_Tcpserver()
{
while (true)//持续监听客户端连接请求
{
try
{
//监听到客户端请求,就返回一个与该客户端通信的套接字
Socket sokConnection=TcpListener.AcceptSocket();
//将与客户端连接的套接字对象添加到集合
dictSocketTcp.Add(sokConnection.RemoteEndPoint.ToString(),sokConnection);
//创建新处理线程
Thread threadTcp=new Thread(RecMsg);
threadTcp.IsBackground=true;
threadTcp.Start(sokConnection);
//将新建的线程添加到线程集合
dictThreadTcp.Add(sokConnection.RemoteEndPoint.ToString(),threadTcp);
}
catch (Exception ex)
{
//异常处理;
}
}
}
///
///接收信息
///
///
void RecMsg(object sokConnectionparn)
{
Socket sokClient=sokConnectionparn as Socket;
while (true)
{
//定义一个缓存区
byte[] arrMsgRec=new byte[1024 * 1024 * 2];
//将接到的数据存入到输入arrMsgRec中
int length=-1;
//接收数据,并返回数据的长度
length = sokClient.Receive(arrMsgRec);
if(length<=0)
{
//从通信套接字集合中删除被中断连接的通信套接字;
dictSocketTcp.Remove(sokClient.RemoteEndPoint.ToString());
//挂起线程
dictThreadTcp[sokClient.RemoteEndPoint.ToString()].Suspend();
//从通信线程集合中删除被中断连接的通信线程对象
dictThreadTcp.Remove(sokClient.RemoteEndPoint.ToString());
break;
}
byte[] recData=new byte[length];
Buffer.BlockCopy(arrMsgRec,0,recData,0,length);
//此处编写数据解析及处理方法
}
}
4 数据采集系统其他主要功能
(1)基础数据管理。系统实现对区域、站点、单位、终端等基础数据的管理,以及系统基本的权限数据管理等。(2)数据解析、存储。系统对接收的数据进行准确的解析,并对解析结果进行校核,校核无误后生成回应指令并保存解析的采集数据。(3)数据缓存处理。对于短时间大数据量接收的系统来说,数据缓存技术的运用是必须。缓存的目的是错时处理非关键数据,保障关键数据处理的通畅。针对本功能该文暂不做详细描述。(4)日志管理。主要记录系统处理日志,内容包括异常日志、可疑日志、临时数据日志等数据处理相关日志内容。(5)报警管理。对于异常或可疑的情况系统通过报警系统及时将信息发送给指定管理人员,发送形式可以是短信、App、邮箱等多种形式。
5 结 论
基于TCP的多线程数据采集处理系统在我单位的项目中应用广泛,目前在天津地下水位监测、天津水资源能力监测、天津基坑计量控制沉降等项目中均有应用。系统严格按照软件开发行业标准规范执行,稳健、可靠,切实为用户提供了方便。
参考文献:
[1] [美]莱特,史蒂文斯.TCP/IP详解(卷2:实现) [M].陆雪莹,等,译.北京:机械工业出版社,2008.
[2] 易飞.GPRS网络信令实例详解 [M].北京:人民邮电出版社,2013.
[3] [英]Jayaram Krishnaswamy. Learning SQL Server 20 08 Reporting Services [M].英国:Packt Publishing,2009.
[4] [美]EugeneAgafonov. C#多线程编程实战 [M].黄博文,黄辉兰,等,译.北京:机械工业出版社,2015.
作者简介:孟祥杰(1980-),男,山东齐河人,工程师,工学学士。从事行业软件系统应用开发及项目管理工作。