福建省气象信息中心 杨贤栋 郑志兴 田功平
基于消息监听机制的气象雷达资料推送应用实践
福建省气象信息中心 杨贤栋 郑志兴 田功平
针对省、市、县对气象资料快速共享的需求,该文采用与常规共享不同的方式,综合利用网络通信、数据交换、文件监听、数据库等技术,设计并实现了基于消息监听机制的雷达资料快速推送系统,在业务应用中表明,该系统稳定性好、推送资料时效性高,能够满足业务应用需求。
气象雷达资料 消息监听 数据交换 网络通信
福建省地处中亚热带和南亚热带,地形复杂,气候复杂,气象灾害频发,气象灾害种类繁多,每年受台风、暴雨、干旱、大风、雷暴和冰雹等重大灾害性天气影响很大。仅在福建沿海登陆的热带风暴(台风),一次就可以造成几十亿元、甚至上百亿元的经济损失。在当前全球气候变化背景下,极端气候事件和突发性气象灾害对福建省农业、水资源、交通、能源、粮食和国防的安全保障带来了极大威胁。因此各地市、各县市气象局在气象服务和防灾减灾方面承担着极为重要的作用。为了能够很好地服务广大群众、减少各方面的灾害给人民带来的损失,各地市气象局需要及时、快速地发布准确的预报和预警,要达到这个目的,离不开准确、实时的气象观测资料,更离不开这些资料的快速共享。因此,将全省的雷达观测资料、自动站等实时资料快速共享给地市和县市具有重要意义。
目前,国内气象部门在气象资料共享方面主要依靠映射共享盘、Ftp方式轮回扫描读取、Web共享[1-3]等方式。这些方式在共享的稳定性和时效性方面难以满足目前各地市、各县市气象部门在气象资料快速共享方面的需求。因此,福建省气象部门急需研究相关的资料推送技术,以实现雷达、自动站等实时性要求很高的资料快速共享,从而满足各气象部门在防灾减灾和气象服务中的需求。
为了满足上述气象资料共享的需求,本文采取与常规共享方式不同的途径,综合利用网络通信技术[4]、数据交换技术、文件监听技术、Web技术[5-6]、数据库技术和软件开发等技术,设计并实现了基于消息监听机制的雷达资料快速推送系统,力争雷达资料2min、自动站等其它资料3min内到达地市或县市。
根据资料实时共享的需求,本项目采用基于文件监听的机制进行文件到达和修改的监听,并综合利用网络通信、数据交换、数据库、Web等相关技术实现客户端与服务端的通信,并自动下载定制好的资料至本地服务器进行共享。
1.1 系统架构设计
根据文件快速共享的目标和需求,将整个系统划分为服务端和客户端两大部分。服务端监听信息中心服务器上文件到达的情况,形成相应的消息报文,通过原先建立好的网络信道,将报文传给客户端。客户端根据本地定制的配置需求过滤收到的消息报文。然后,下载自己需要的数据到本地服务器。系统整体架构图如图1所示。
1.2 系统功能设计
1.2.1文件监听功能
文件监听功能主要实现对雷达产品、雷达基数据、自动站资料、预警信号、部分服务产品进行实时监听。当服务器上有文件到达时,服务端软件能够实时监听到文件到达的消息。同时,在服务端界面上显示响应的文件到达的相关信息,包括时间、文件名等。具体界面见图2。
1.2.2一点对多点广播功能
该功能利用网络通信相关技术,实现服务端与配置文件中所有客户端之间的广播通信。服务端封装本地文件到达的消息形成数据报文。接着,利用通信技术将报文广播给每一个客户端。
1.2.3客户端解报功能
客户端将服务端封装广播的报文按照既定的格式和对应的解码规则进行解析,解析后的数据为客户端提供调用数据的相关信息。
1.2.4客户端定制功能
客户端提供相应下载资料的选项,地市局用户可根据自己需要定制需要推送的资料。客户端将收到的消息根据用户的选项进行过滤,符合规则的资料启动下载机制进行下载。具体界面见图3。
1.2.5客户端下载功能
客户端根据定制功能启动相应的下载机制,从服务端通过HTTP协议下载资料并自动保存至设定的目录,并将下载失败的消息记录插入用户本地数据库中。
图4 客户端自动接收界面
1.2.6客户端补调功能
客户端定时扫描本地数据库中由于各种原因导致的下载失败的消息记录,根据下载路径的拼装规则,将相应字段拼装成Web的下载路径,进行数据补调。补调后的数据仍然存放于各种资料对应的目录中。对于补调成功的数据,客户端自动从数据库中删除对应的记录,实现用户的零干涉和数据库中消息记录的自动维护管理。
2.1 服务端
2.1.1软硬件环境
服务器操作系统:Windows Server 2003/2008; Web服务器:IIS6.0;软件开发环境:Microsoft Visual Studio 2008;开发语言:C#。
2.1.2功能要点与技术实现
2.1.2.1 配置文件解析
该模块实现对配置文件的解析功能,将配置文件的内容按照规定的格式解码后,提取相关的本地文件路径信息和对端IP、端口等信息。实现该模块的核心代码如下:
…………
private string dataGet()
{
XmlDocument doc = new XmlDocument();
try
{
doc.Load("config.xml");
}
catch (Exception ex)
{
return "";
}
string JSON = DataGet.XmlToJSON(doc);
JSON = JSON.Replace(@"", @"\");
return JSON;
}
…………
2.1.2.2 文件监听
该模块实现对本地文件的监听,提取相关文件信息,供服务端推送给客户端使用。实现该模块的核心代码如下:
…………
private void fileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
{
…………
string filepath = e.FullPath;
…………
ThreadWithState tws = new ThreadWithState(filepath, rc.IP, syspara.PUTConfig.WatchDIRParent.WatchDirChild.ElementAt
}
…………
2.1.2.3 建立与客户端的通信
该模块实现使用socket()来建立TCP连接,绑定对应的 IP和端口,连接建立后进入与服务端的通信状态。实现该模块的核心代码如下:
…………
//指向远程服务端节点
IPEndPoint ipep = new
IPEndPoint(IPAddress.Parse(remoteip_inner), 2005);
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep);
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
…………
2.1.2.4 报文封装、发送
该模块将监听到的文件到达的相关消息按照约定好的格式封装后,发送给各个客户端。实现该模块的核心代码如下:
…………
string file_createtime = EzoneFile.CreationTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
string file_writetime = EzoneFile.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
string time_str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
//发送[落地信息中心时间和信息中心监听到文件的时间]到客户端
CommonModule.EzoneModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(file_createtime + " | " + file_writetime + " | " + time_str));
string filename_temp = EzoneFile.FullName.Substring(start_index, EzoneFile.FullName.Length - start_index);
string filename2 = localip_inner;
//发送[文件名]到客户端
CommonModule.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(filename_temp));
//发送[文件头]到客户端
CommonModule.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(filename2));
//发送[包的大小]到客户端
CommonModule.EzoneModule.SendVarData(client,System.Text.Encoding.Unicode.GetBytes(EzoneFile.Length.ToString()));
…………
2.2 客户端
2.2.1软硬件环境
服务器操作系统:Windows Server 2003/2008;软件开发环境:Microsoft Visual Studio 2008;数据库:Microsoft access2003;开发语言:C#。
2.2.2功能要点与技术实现
2.2.2.1 客户端与服务端通信功能
该模块实现客户端与服务端建立通信连接,并长时间监听服务端发送的消息,当有消息到达时进行响应处理。实现该模块的核心代码如下:
…………
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("2005"));
//创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定套接字到端口
server.Bind(ipep);
try
{
while (true)
{
InitConfig();
//开始侦听(并堵塞该线程)
server.Listen(100);
//确认连接
Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
…………
2.2.2.2解报功能
该模块主要实现将收到的服务端发送的消息按约定格式进行解报,解报后得到的信息供后面的数据过滤、下载使用。实现该模块的核心代码如下:
…………
//获得[文件落地信息中心时间]
string xxzx_filetime = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("文件名" + SendFileName);
//获得[文件名]
string FileName_download = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)) + SendFileName.Replace("\", "/");
…………
2.2.2.3 数据定制功能
该模块实现数据的定制,用户可根据自己的需要在配置界面选定需要下载的数据选项,客户端根据用户的配置信息过滤掉用户不需要的数据。该模块的具体实现代码如下:
…………
//对文件名进行过滤处理
result_station = station_pattern.Split(stringSeparators, StringSplitOptions.None);
result_product = rad_pattern.Split(stringSeparators, StringSplitOptions.None);
result_other = other_pattern.Split(stringSeparators, StringSplitOptions.None);
for (int i = 0; i < result_station.Length; i++)
if (!result_station[i].Equals(""))
{
if (SendFileName.Contains(result_station[i]))
{
flag_station = true;
}
}
for (int i = 0; i < result_product.Length; i++)
if (!result_product[i].Equals(""))
{
if (SendFileName.Contains("\" + result_product[i]))//目录名+/进行区分
{
flag_rad = true;
}
}
…………
2.2.2.4 客户端下载功能
该模块实现用户定制好的数据在客户端收到消息后自动启动下载功能,并按指定好的目录规则进行存放。该模块的具体实现代码如下:
…………
WebClient client = new WebClient();
string pathURL = url;
int n = url.LastIndexOf("/");
string fileName = pathURL.Substring(n + 1, pathURL.Length - n - 1);
string pathDest = descpath;
bool flag_error = true;
int count = 0;
{
try
{
WebRequest myre = WebRequest.Create(pathURL);
test_str = pathURL;
}
catch (WebException exp)
{
ex_error = exp.ToString();
}
try
{
client.DownloadFile(pathURL, pathDest);
flag_error = false;//下载成功,结束下载。
string info = System.DateTime.Now.ToString() + pathDest + "文件下载成功! ";
}
catch (WebException ex)
{
string info = System.DateTime.Now.ToString() + pathDest + "文件下载失败! ";
ex_error = ex.ToString();
}
…………
2.2.2.5 客户端补调功能
该模块实现定时扫描数据库,将下载失败的记录重新进行下载,下载成功后从数据库中删除该记录。具体实现代码如下:
…………
private void Redown()
{
//数据库里面flag标记为1的需补调,补调成功后将该字段置为0;
try
{
//Flag标志为1需补调,为0已补调过。
string querystring = "select path,url,shijian from message where flag='1'";
DataSet dt = DbSQL.Query(querystring);
/////////开始补调
richTextBox1.AppendText("*************" + System.DateTime.Now.ToString() + "开始补调数据******************** ");
//此处开始下载。。。。。。
…………
ThreadWithState_download t_down = new ThreadWithState_download(dr[1].ToString(), dr[0].ToString(), true);
//开启文件传输子线程
Thread TempThread3 = new Thread(new ThreadStart(t_down.StartDownload));
TempThread3.Start();
TempThread3.Join();
if (!t_down.ex_error.Equals(""))
{
richTextBox1.AppendText(System.DateTime.Now.ToString() + dr[0] + "文件补调失败!!!!! ");
//超过60分钟无法补调的直接删除
if (DateTime.Compare(Convert.ToDateTime(dr[2].ToString()).AddMinutes(60), DateTime.Now) < 0)
{
try
{
//Flag标志为1需补调,为0已补调过。
string updatestring = "update message set flag='0' where path='" + dr[0] + "'";
DbSQL.ExecuteSql(updatestring);
}
…………
else
{
richTextBox1.AppendText(System.DateTime.Now.ToString() + dr[0] + "文件补调成功! ");
//文件补调成功,将flag字段置为0
try
{
//Flag标志为1需补调,为0已补调过。
string updatestring = "update message set flag='0' where path='" + dr[0] + "'";
DbSQL.ExecuteSql(updatestring);
}
…………
本文依据现有业务流程和网络资源,综合运用网络通信技术、数据库技术、数据交换技术、Web技术和软件设计开发等相关技术,设计并实现了基于文件到达消息的监听和广播机制的实时资料推送软件来实现省与地市、县市之间资料的快速共享,解决了传统方式共享资料不稳定的问题,有效缓解了采用遍历目录的方式给服务器带来的压力。软件实现过程中,采用完整的技术解决方案,妥善解决资料传输共享过程中可能出现的问题。另外,采用补调、数据库自动维护等技术,实现用户使用、维护简单方便,实际业务运行证明该系统共享资料快速、稳定。
[1] 邓莉,王国复,孙超, 等.基本气象资料共享系统建设[J]. 应用气象学报, 2004, 15(B12):33-38.
[2] 李新庆,单新兰,岳勇. 宁夏气象数据共享查询系统的设计与实现[J].重庆工商大学学报(自然科学版), 2015,32(3):55-59.
[3]王甫棣,王鹏,何恒宏.基于对等网络技术的气象数据共享服务应用[J]. 气象科技, 2014,42(4):624-628.
[4] 李光明.应用Socket实现网络通信[J]. 煤炭技术, 2012,31(8):88-90.
[5] 杨燕军,马鹏辉,张剑.基于Web服务的气象信息共享方法[J]. 气象水文海洋仪器, 2014,31(1):12-14.
[6] 康晋闽,杨贤栋.多策略快速下载的数据共享平台的设计与实现[J]. 数字技术与应用, 2014(1):139.