计算机应用
Computer Applications
1999年 第19卷　第8期 Vol.19　No.8 1999



远程公网电话报警信息的实时处理技术
丰国炳　
　　摘　要　本文探讨了远程公网报警信息的获取路径及显示平台的构筑方式，提出了大幅图的设计方法及片图地名信息的压缩处理方法，并对显示方式作了深入的探讨。
　　关键词　主线程，辅助线程，压缩处理
1　显示平台的构成
　　构造连接城市市话公网的特种服务信息网络平台比较复杂，我们仅论述与信息显示有关的设备。首先由电信部门提供2兆口光纤进入光复用设备（光端机），为排队交换机提供数字中继，由排队交换机维护计算机获取的电话号码，通过网络系统送显示平台，显示平台的程序的主线程负责不间断远程查号，辅助线程不间断对报警电话号码进行信息和地图定位，并生成出动命令文件，出动命令文件通过显示平台电脑（PC机）多串口发往辖区中队，多串口中的COM1通过专线Modem连接不同的中队，其中远程查号的路径是DDN专线，而出动命令下达的路径为普通专线。排队交换机维护台计算机与显示平台电脑通信采用Windows 95自带的网络通信程序，在对话框中指出各自的IP地址即可，网关采用3COM的3C509网卡。显示平台电脑主机可以连接普通的21寸电脑显示屏，也可接大屏幕投影仪，或者接大屏幕背投电视。每个值班员席电脑也能由通信服务器多串口连接不同的中队。见图1：


图1
2　大幅图的设计及地名信息的压缩
　　桌面地理信息系统普遍选用的开发工具为MAPINFO，在客户机一服务器结构形式的系统设计中，用MAPINFO来设计前端的地理信息系统效果较佳，其开放性及与多种数据库兼容性较好，尤其是后台使用大型关系数据库SYBASE的TSQL编程效果更佳。但此种模式运用的设备较多，费用相当可观。我们采用VC++（4.10版本）制作大幅地图也能达到此目的，一幅城市的大区图常用的作图要素为点和线，完全可用MFC的数据串行化处理。我们设计成横向像素为7200，纵向像素为6000的大幅空白页面，使用滚动条进行自动搜索，在600*480的分辨率上，每一满屏代表一区域片图，这样大幅空白页面横向被分成12等分，纵向被分成长10等分，共有120个满屏即可容纳120块片区地图。
　　选择一标准的南京市区详图（1：10000），上面标有南京市所有道路、水系、植被、高地、桥梁、重点单位及大大小小所有地名，然后在这张详图上进行横向12等分、纵向10等分处理，用标尺把南京市区全图分成了120个片区图。如地图还提供地下管线情况，同样可纳入处理。这样对每一片区图可逐一输入到计算机，对不同的地图要素可采用不同颜色来处理，这样拼接起来就是一幅南京市区全图。
　　地名的处理比较复杂，我们仍然用VC++（4.10）处理。先从地名委员会取得南京城市的所有地名近3000条（含别名），对照分析，发现有两字地名、三字地名、四字地名、五字地名等等，其中三字地名居多，有1016个，据此，我们把同字数的地名归于一类。然后查找每一地名落在何片区图中，片区图的编码用二维矩阵表示。


　　如C5、C6、D5、D6等等。形成了地名与片图的映射关系，如兰园→F6，三牌楼→D5E6，王府园→F8，竹林新村→H7等等，这样就把南京市所有地名与片图建立了映射关系。每一片图中有许多地名、街道，如在C6图中，草场门大街这一名称完全在C6中，地名与图号的映射成为“草场门大街→C6”；许多地名特别是一些小区皆在一个片图图号中，如“宝地园→C6”。但是有一些街道可能要跨几个片区，如江东北路分别落在C6和C7片区图中，映射关系相对复杂一些，即一地名对应两个或多个片区。“江东北路→C6C7”，对于这种情况，跨地图片区路名可带特征字符，即门牌号，由地名、特征字符共同确定片区图号，如“江东北路1号-200号→C6”，“江东北路200号-447号→C7”，这样就确定了一一对应关系。除此之外，加上辖区中队信息，建立成“路名――片区图号――辖区中队”的一一映射关系并建成数据库。对于两字地名库存而言，库中结构为：
struet wtld1{char dm［4］；
/*两字地名名称*/
char tz［6］；
/*特征门牌号码*/
char th［2］；
/*图号*/　　　　
char zd［6］；
/*辖区中队队号*/
}wtld1［114］；
　　对于三字地名、四字地名、五字地名，皆如上法炮制。另外要建立片图图号库，库中共有120条记录，库结构为：
struct dtxy{char th［2］；
/*片图图号*/
int xm；
/*该片图对应左上角X座标*/
int ym；
/*该片图对应左上角Y座标*/
}dtxy［120］；
　　这样就为报警信息的实时显示提供了固定库文件，这些库文件短小精悍，皆建立在本地硬盘上，安全性强。
3　报警信息文件的形成
　　在远程查号程序设计中，我们采用VC++ 4.10版，根据排队交换机返回的主叫号码来远程查询市电信局信息中心大型SYBASE数据库，得到主叫号码对应的用户名和用户地址。程序设计中要用三个关键远程通信函数：
　　打开串行口并初始化函数OpenComm(),具体形式为OpenComm(LPCSTR lpDevice,UINT nsizeinqueue,UINT nsize Outqueue);
　　写串口函数WriteComm(),具体形式为WriteComm(int port-id,Const void FAR*lep Out Buffer,int nSize―Buffer);
　　读串口函数ReadComm(),具体形式为ReadComm(int ComPort,void FAR*ipBuf,int nRead)。
　　这三个函数皆为API函数。
　　因考虑到此查号程序与市电信局信息中心远程联网，向信息中心发送的是报警电话号码，因此WriteComm()中的int nSize―Buffer为11，正好满足中国电信数字移动电话即将升11位号码要求，此处可修改，有的大城市如北京、上海为8位，有的为7位；接收的是用户名和地址信息，长度固定为100，即50个汉字，在Read Comm()中int nRead为100。在获取报警信息的同时，一方面发往空闲的接警台，另一方面在本地硬盘形成两个二进制文件fjy和fjy0，其中fjy存储报警日期、报警时间、报警电话号码、用户名和用户地址信息：
m―hPrint=fopen("fjy","w+");
fwrite(szPrintMsg,1,szPrintMsg.GetLength(),m―hPrint);
fclose(m―hPrint);
　　其中fjyo文件仅存储报警电话对应的用户地址 strUserAddr:
m―hPrint=fopen("C:\\MSDEV\\DSYP\\fjyo",
"w+");
/*在指定的目录中形成文件fjyo*/
fwrite(strUserAddr,30,1,m―hPrint);
fclose(m―hPrint);
　　在形成fjyt和fjyo的两段源码中，m―hPrint为指向文件的指针，szPrintMsg为一字符缓冲区，szPrintMsg.Get Length()为字符缓冲区的总字节长度，strUserAddr为存放报警用户地址的字符串。
4　报警文字和图形信息的定位显示
　　报警文字信息获取并定位后要立即驱动片图定位显示，我们使用多线程处理，主线程用来远程查号，辅助线程用于文字和图形信息的定位操作。文字信息的定位主要包括辖区中队的自动确认、车辆器材的调度确认、火场信息的确认、标准行车路线的自动确认；图形信息的定位包括辖区片图的确认、片图中道路和水源的自动确认。
　　在辅助线程中要根据报警地址来判断从属什么路名，然后查询对应的片图图号并把片图漫游到屏幕正中间，并注出辖区中队。
　　如下代码段表示（以两字地名为例）：
mf1 = fopen("c:\Msder\dsyp\\fjy1","r+b");
fread(wtld1,sizeof(char),(MAX*1+1)*12,mf1);
fclose(mf1);
for(int i=0;i<MAX1+1;i++{
if((strncmp(ff,wtld1［I］.dm,4))==0){
for(int j=0;j<120;j++){
if((strcmp(wtld1［I］.th,dtxy［j］.th,2))==0)
{tagPOINT pt={dtxy［j］.xm,dtxy［j］.ym};
ScrollToPosition(pt);
PDC->TextOut(dtxy［j］.Xm+560,dtxy［j］.ym+300,dtxy［j］.th);
Strncpy(gb1,wtld1［j］.zd,6);
Strcat(gb2,gb1);
PDC->TextOut(dtxy［j］.Xm+5,dtxy［j］.Ym+60,gb2);
}
}
}
　　其中（MAX1+1）为两字地名的个数，gb1、gb2为存放辖区中队队号的字符串。
　　对于三字地名、四字地名、五字地名等皆用上述方法进行匹配。所以一报警地址获取后，分别取前两个汉字、三个汉字、四个汉字等与两字地名库、三字地名库、四字地名库等匹配，直至完全定位。其中片图定位的MFC函数：
　　tagPOINT pt={dtxy［j］.Xm,dtxy［j］.Ym};
ScrollToPosition(pt);
　　该函数是通过移动滚动条的方法把文字信息对应的片图移动至屏幕正中。
作者简介：丰国炳　硕士。研究方向：计算机通信。
作者单位：丰国炳　南京公安消防指挥中心　江苏．南京（210008）
　　收稿日期:1999-04-06
