[摘 要] 通信電纜防盜報警系統作為各大通信網點的安全監控系統,可將網點的報警信息傳送至主控中心的信息管理系統,實現對各監察地區的集中監控,發現情況統一調動,并可實現報警信息的統計、查詢。 本文闡述了其后臺信息管理系統的設計和實現方案。
[關鍵詞] 通信電纜;串口通信;監控;防盜報警
[中圖分類號]F270.7;C931.6[文獻標識碼]A[文章編號]1673-0194(2008)14-0090-03
1 概 述
隨著有色金屬價格的日益高漲,受經濟利益驅動,犯罪分子對中國電信和中國網通等龐大戶外通信線纜瘋狂盜割,以獲取電纜中的銅材,給國家造成了極大的經濟損失,同時通信的中斷也給人民的生活帶來不便。通信電纜防盜報警系統,不但可對通信電纜實施24小時監控,迅速、精確檢測到通信電纜的斷線距離和方位,在最短的時間內語音通知值班人員,而且可把相應數據送至監控中心,通過電腦清晰地了解斷纜的詳細資料,有效地打擊盜竊通信電纜的犯罪行為,保障通信線路暢通。
2 系統結構
通信電纜防盜報警系統,由通信電纜防盜報警器、通信電纜防盜報警系統主機和安裝在后臺微機上的信息管理系統組成,整個系統可實現對電纜線路的防盜、報警和報警后的數據處理、電子地圖定位及數據備份等功能。該系統采用分布式監控方式,每個監控網點配備一臺通信電纜防盜報警器,通過電話線,利用撥號方式與系統主機聯網。系統主機是組網中心的控制臺,安放在集中監控值班室,通過RS-232口與后臺微機相連接。當監控機房有報警信息時,相關報警器立即報警,通過電話以語音的方式通知值班人員,同時將告警信息及時上傳給系統主機,再由系統主機傳送給信息管理系統,并在信息管理系統上顯示出告警機房的詳細信息。
系統主機是整個監控系統的核心部分,它的主要作用就是通過公眾電話網接收來自通信電纜防盜報警器的報警信息和自檢信息,將信息發送到信息管理系統,以備實時查詢;并將來自信息管理系統的與通信電纜防盜報警器相關的控制信息發送到相應的報警器。
整個通信電纜防盜報警系統的結構如圖1所示。

3 系統設計
本信息管理系統用C++ Builder設計,采用Access數據庫,主要實現報警信息的接收、報警信息的保存、報警信息的查詢等功能。
3. 1信息接收
本信息管理系統通過RS-232串行口接收來自系統主機的數據,在系統運行時,首先要對微機的串口進行初始化,并設置好相應的通信參數。串行數據的接收通過創建的串口監控線程完成,當接收完一幀數據(幀起始標識為0XAA,結束標識為0XBB),則發送消息,激發消息處理例程將接收到的一幀數據保存到數據庫中。具體的設計如下:
⑴打開串口
hCom=CreateFile(comname.c_str(),//文件名
GENERIC_READ|GENERIC_WRITE,//訪問模式允許讀寫
0,//此項必須是0
NULL,//無安全參數
OPEN_EXISTING,//創建方式
FILE_FLAG_OVERLAPPED,//異步工作方式
NULL);
⑵配置串口
//設置dcb結構成員變量
dcb.BaudRate=4800;
dcb.fParity=0;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.ByteSize=8;
dcb.fNull=FALSE;
if(!SetCommState(hCom,dcb)) //重新配置串口
ShowMessage(\"SetCommState failed\");
⑶創建線程
Read232 = new hComThread(1);// 創建串口監控線程
⑷串口監控線程
在串口監控線程中,監控串口的狀態,當檢測到有數據到來時,則接收數據,并將接收的數據保存到輸入緩沖區中:
ReadStat=ReadFile(hCom,//用CreateFile 獲得的文件句柄
ReadBuff,//輸入緩沖區首址
1, //設定讀入字節數
BytesRead,//實際讀入字節數
os);//重疊操作方式數據結構地址
如果收到的數據為幀結束標識0XBB,則表示一幀數據接收完畢,則使用PostMessage發送消息:
if(ReadBuff[0]==0xBB)
PostMessage(Form1->Handle,Wm_commNotify,0,0);//發送消息
⑸對自定義消息的處理
在本系統中,運用了自定義消息。使用自定義消息有兩個優點:一是發消息時,無須知道接受者的具體類型,只要知道窗口的句柄;二是消息可以廣播給多個接收者。它也有靜態和動態的兩種函數響應映射關系。本系統中,在窗體類的頭文件(.h)中加入自定義消息Wm_commNotify,并靜態地對這個自定義消息建立函數映射關系:
#define Wm_commNotify (WM_USER+12)
//定義響應函數
void __fastcall MsgcommProcess(TMessage Message);
//建立響應函數(Handle)與自定義消息(Wm_commNotify)的映射:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(Wm_commNotify,TMessage,MsgcommProcess)
END_MESSAGE_MAP(TForm)
定義消息處理函數:
void __fastcall TForm1::MsgcommProcess(TMessage Message)
{
//消息處理函數的函數體
}
3. 2信息保存
在消息處理函數MsgcommProcess中,對接收到的一幀信息進行驗證,如果數據接收正確,則添加到Access數據庫中,并同時向系統主機發送正確接收數據信息。
ADOCommand1->CommandText=\"insert into BaoJing(支局號,網點地址,網點名稱,報警時間,線路狀態,斷線距離,信息類型) values (:netno,:addr,:name,:datetime,:zt,:dxjl,:xxlx)\";
……
ADOCommand1->Execute();//添加到數據庫中
3. 3信息查詢

通信電纜防盜報警系統的信息查詢界面如圖2所示。既可以查詢全部信息,也可以根據選擇的項目進行查詢。同時可根據用戶的需要,將查詢結果導出到Excel文件中。
其中,查詢結果導出到Excel文件中的操作包括:
⑴建立Excel的Ole對象Ex
Ex = Variant::CreateObject(\"Excel.Application\");
⑵打開指定的Excel報表文件
報表文件中最好設定只有一個Sheet。
Ex.OlePropertyGet(\"WorkBooks\").OleProcedure(\"Open\",ExcelFileName.c_str());
Wb = Ex.OlePropertyGet(\"ActiveWorkBook\");
Sheet = Wb.OlePropertyGet(\"ActiveSheet\");//獲得當前默認的Sheet
⑶清空Excel表
這里用循環清空到第300行。對于一般的表格已經足夠了。從第4行開始,到第300行止。一般第一行是表標題,第二行是副標題或者制表日期。
AnsiString strRowTemp;
AnsiString strRange;
int iCols,iRows;//記錄列數和行數
for(iRows=4;iRows<300;iRows++)
{ //假設只有14列。
for (iCols = 1;iCols <=14;iCols++)
{//清空行
Sheet.OlePropertyGet(\"Cells\",iRows,iCols).OlePropertySet(\"Value\",\"\");
}
}
⑷向Excel表中寫數據
iRows = 4;
ADOQuery1->First();
while(!ADOQuery1->Eof)
{//循環取字段的數據放到Excel表對應的行列中
for(iCols=1;iCols<=14;iCols++)
{
strRowTemp = ADOQuery1->Fields->Fields[iCols-1]->AsString;
Sheet.OlePropertyGet(\"Cells\",iRows,iCols).OlePropertySet(\"Value\",
(\"'\"+strRowTemp).c_str());
}
iRows++;
ADOQuery1->Next();
}
Wb.OleProcedure(\"Save\");//保存表格
Wb.OleProcedure(\"Close\");//關閉表格
Ex.OleFunction(\"Quit\");//退出Excel
4 結束語
以系統主機為核心的分布式通信電纜防盜報警系統,配合后臺信息管理系統協同工作,可實現更高層的智能化、自動化集中監控報警及報警信息的查詢、統計,為用戶提供了極大的方便。
主要參考文獻
[1] 劉光. C++ Builder數據庫系統設計與開發[M]. 北京:清華大學出版社,2003.
[2] 范逸之,江文賢,陳立元. C++ Builder與RS-232串行通信控制[M]. 北京:清華大學出版社,2002.
[3] 陳燦煌. C++ Builder 6徹底研究[M]. 北京:中國鐵道出版社,2003.