C++Builder XE6开发海康设备控制软件--报警信息读取

来源:互联网 发布:天翼阅读软件 编辑:程序博客网 时间:2024/06/05 05:06

C++Builder XE6开发海康设备控制软件,获取报警主机的信息,研究了3、4天,主要是回调函数问题,最后通过仔细研究海康的帮助文档,终于搞定,直接上代码了。


Main.cpp代码:

//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "Main.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TfrmMain *frmMain;void CALLBACK MsgCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser);void ProcessCommAlarm_CIDAlarm(NET_DVR_ALARMER *pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser);void UpdateClientList(AnsiString strAlarmTime, AnsiString strDevIP, AnsiString strAlarmMsg);void *UpdateListBoxCallback(AnsiString strAlarmTime, AnsiString strDevIP,AnsiString strAlarmMsg);//---------------------------------------------------------------------------__fastcall TfrmMain::TfrmMain(TComponent* Owner): TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TfrmMain::FormCreate(TObject *Sender){Dir = ExtractFilePath(Application->ExeName) ;m_lUserID = -1 ;iListenHandle = -1 ;iDeviceNumber = 0 ; //添加设备个数iLastErr = 0 ;CreateDirectory(String(Dir + "SdkLog").c_str(),NULL);//CreateDirectory(String(Dir + "CapPic").c_str(),NULL);//CreateDirectory(String(Dir + "Record").c_str(),NULL);m_bInitSDK = NET_DVR_Init() ;if (m_bInitSDK == false){ShowMessage("NET_DVR_Init初始化失败!") ;return;}else{char strIP[16][16];DWORD dwValidNum = 0 ;BOOL bEnableBind = false ;//void* pUser = 0 ;//获取本地PC网卡IP信息if(NET_DVR_GetLocalIP(strIP, &dwValidNum, &bEnableBind)){if (dwValidNum > 0){String StrIP = "";//取第一张网卡的IP地址为默认监听端口for(int j=0;j<16;j++)StrIP += String(strIP[0][j]) ;edtListenIP->Text = StrIP ;}}//保存SDK日志NET_DVR_SetLogToFile(3, AnsiString(Dir+ "SdkLog\\").c_str(), true);for (int i = 0; i < 200; i++){m_lAlarmHandle[i] = -1 ;}//设置报警回调函数NET_DVR_SetDVRMessageCallBack_V30(MsgCallback, NULL);}}//---------------------------------------------------------------------------//****************************相关函数***************************************//---------------------------------------------------------------------------void CALLBACK MsgCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser){//通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容switch (lCommand){case COMM_ALARMHOST_CID_ALARM://报警主机CID报警上传ProcessCommAlarm_CIDAlarm(pAlarmer, pAlarmInfo, dwBufLen, pUser);break;default:break;}}//---------------------------------------------------------------------------void ProcessCommAlarm_CIDAlarm(NET_DVR_ALARMER *pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser){NET_DVR_CID_ALARM struCIDAlarm ;//unsigned int dwSize = (unsigned int)sizeof(struCIDAlarm) ;memcpy(&struCIDAlarm, pAlarmInfo, sizeof(NET_DVR_CID_ALARM)) ;//报警设备IP地址AnsiString strIP = pAlarmer->sDeviceIP ;//报警时间:年月日时分秒AnsiString strTimeYear = AnsiString(struCIDAlarm.struTriggerTime.wYear) ;AnsiString strTimeMonth = AnsiString(struCIDAlarm.struTriggerTime.byMonth) ;AnsiString strTimeDay = AnsiString(struCIDAlarm.struTriggerTime.byDay) ;AnsiString strTimeHour = AnsiString(struCIDAlarm.struTriggerTime.byHour) ;AnsiString strTimeMinute = AnsiString(struCIDAlarm.struTriggerTime.byMinute) ;AnsiString strTimeSecond = AnsiString(struCIDAlarm.struTriggerTime.bySecond) ;AnsiString strTime = strTimeYear + "-" + strTimeMonth + "-" + strTimeDay + " "                   + strTimeHour + ":" + strTimeMinute + ":" + strTimeSecond ;AnsiString strAlarm = "报警主机CID报告,sCIDCode:" + AnsiString(int(struCIDAlarm.sCIDCode)) + ",sCIDDescribe:" + AnsiString(int(struCIDAlarm.sCIDDescribe)) + ",报告类型:" + AnsiString(int(struCIDAlarm.byReportType)) + ",防区号:" + AnsiString(int(struCIDAlarm.wDefenceNo)) + ",报警触发时间:" + strTime ;//创建该控件的主线程直接更新信息列表UpdateClientList(Now().FormatString("yyyy年mm月dd日 hh时nn分ss秒"), strIP,strAlarm);}//---------------------------------------------------------------------------void UpdateClientList(AnsiString strAlarmTime, AnsiString strDevIP, AnsiString strAlarmMsg){//列表新增报警信息//lvAlarmInfo.Items.Add(new ListViewItem(new AnsiString[] { strAlarmTime, strDevIP, strAlarmMsg }));TListItem *liAlarmInfo;liAlarmInfo = frmMain->lvAlarmInfo->Items->Add() ;liAlarmInfo->Caption = strAlarmTime ;liAlarmInfo->SubItems->Add(strDevIP) ;liAlarmInfo->SubItems->Add(strAlarmMsg) ;}//---------------------------------------------------------------------------//添加设备void __fastcall TfrmMain::btnLoginClick(TObject *Sender){if (edtIPAddress->Text==""||edtPortNumber->Text==""  ||edtUserName->Text==""||edtPassword->Text==""){ShowMessage("请输入设备地址、端口、用户名和密码!") ;return ;}if (iDeviceNumber >= 20){ShowMessage("本程序限制最多添加20台设备!");return;}DVRIPAddress = edtIPAddress->Text ; //设备IP地址或者域名DVRPortNumber = edtPortNumber->Text.ToInt() ;//设备服务端口号DVRUserName = edtUserName->Text ;//设备登录用户名DVRPassword = edtPassword->Text ;//设备登录密码NET_DVR_DEVICEINFO_V30 DeviceInfo ;//登录设备m_lUserID = NET_DVR_Login_V30(DVRIPAddress.c_str(), DVRPortNumber, DVRUserName.c_str(), DVRPassword.c_str(), &DeviceInfo) ;    if (m_lUserID < 0){iLastErr = NET_DVR_GetLastError() ;//登录失败,输出错误号ShowMessage("NET_DVR_Login_V30登录失败,错误代码" + String(iLastErr)) ;}else{//登录成功ShowMessage(DVRIPAddress+"登录成功") ;iDeviceNumber++;TListItem *liDevice;liDevice = lvDevice->Items->Add() ;   //将已注册设备添加进列表liDevice->Caption = AnsiString(m_lUserID) ;liDevice->SubItems->Add(DVRIPAddress) ;liDevice->SubItems->Add("未布防") ;}}//---------------------------------------------------------------------------//全部布防void __fastcall TfrmMain::btnSetAlarmClick(TObject *Sender){NET_DVR_SETUPALARM_PARAM struAlarmParam ;struAlarmParam.dwSize = (unsigned int)sizeof(struAlarmParam);struAlarmParam.byLevel = 1 ; //0- 一级布防,1- 二级布防struAlarmParam.byAlarmInfoType = 1 ;//智能交通设备有效,新报警信息类型struAlarmParam.byFaceAlarmDetection = 1 ;//1-人脸侦测for (int i = 0; i < iDeviceNumber; i++){m_lUserID = lvDevice->Items->Item[i]->Caption.ToInt() ;m_lAlarmHandle[m_lUserID] = NET_DVR_SetupAlarmChan_V41(m_lUserID, &struAlarmParam) ;if (m_lAlarmHandle[m_lUserID] < 0){iLastErr = NET_DVR_GetLastError() ;strErr = "布防失败,错误号:" + AnsiString(iLastErr) ; //布防失败,输出错误号lvDevice->Items->Item[i]->SubItems->Strings[1] = strErr ;}else{lvDevice->Items->Item[i]->SubItems->Strings[1] = "布防成功" ;}btnSetAlarm->Enabled = false ;}}//---------------------------------------------------------------------------//全部撤防void __fastcall TfrmMain::btnCloseAlarmClick(TObject *Sender){for (int i = 0; i < iDeviceNumber; i++){ m_lUserID = lvDevice->Items->Item[i]->Caption.ToInt() ; if (m_lAlarmHandle[m_lUserID] >= 0) {if(!NET_DVR_CloseAlarmChan_V30(m_lAlarmHandle[m_lUserID])){iLastErr = NET_DVR_GetLastError() ;strErr = "撤防失败,错误号:" + AnsiString(iLastErr) ; //撤防失败,输出错误号lvDevice->Items->Item[i]->SubItems->Strings[1] = strErr ;}else{lvDevice->Items->Item[i]->SubItems->Strings[1] = "未布防" ;m_lAlarmHandle[i] = -1;} } else {lvDevice->Items->Item[i]->SubItems->Strings[1] = "未布防" ; }}btnSetAlarm->Enabled = true ;}//---------------------------------------------------------------------------//启动监听void __fastcall TfrmMain::btnStartListenClick(TObject *Sender){AnsiString sLocalIP = edtListenIP->Text ;unsigned int wLocalPort = edtListenPort->Text.ToInt() ;void* pUser = 0 ;iListenHandle = NET_DVR_StartListen_V30(sLocalIP.c_str(), wLocalPort, m_falarmData, pUser) ;if (iListenHandle < 0){iLastErr = NET_DVR_GetLastError() ;strErr = "启动监听失败,错误号:" + AnsiString(iLastErr) ;  //撤防失败,输出错误号ShowMessage(strErr) ;}else{ShowMessage("成功启动监听!") ;btnStopListen->Enabled = true ;btnStartListen->Enabled = false ;}}//---------------------------------------------------------------------------//停止监听void __fastcall TfrmMain::btnStopListenClick(TObject *Sender){if(NET_DVR_StopListen_V30(iListenHandle)){iLastErr = NET_DVR_GetLastError() ;strErr = "停止监听失败,错误号:" + AnsiString(iLastErr) ;  //撤防失败,输出错误号ShowMessage(strErr) ;}else{ShowMessage("停止监听!") ;btnStopListen->Enabled = false ;btnStartListen->Enabled = true ;}}//---------------------------------------------------------------------------
Main.h代码:

//---------------------------------------------------------------------------#ifndef MainH#define MainH//---------------------------------------------------------------------------#include "HCNetSDK.h"#include "AlarmDemoPCH.h"#include <System.Classes.hpp>#include <Vcl.Controls.hpp>#include <Vcl.StdCtrls.hpp>#include <Vcl.Forms.hpp>#include <Vcl.ComCtrls.hpp>#include <Vcl.ExtCtrls.hpp>//---------------------------------------------------------------------------template<typename dst_type,typename src_type>dst_type pointer_cast(src_type src){    return *static_cast<dst_type*>(static_cast<void*>(&src));}class TfrmMain : public TForm{__published:// IDE-managed ComponentsTButton *btnLogin;TEdit *edtPortNumber;TEdit *edtPassword;TLabel *lblPsw;TLabel *lblPort;TEdit *edtUserName;TLabel *lblUser;TEdit *edtIPAddress;TLabel *lblIP;TListView *lvAlarmInfo;TListView *lvDevice;TPanel *pnlListen;TButton *btnStartListen;TEdit *edtListenPort;TLabel *lbllListenPort;TEdit *edtListenIP;TLabel *lblListenIP;TButton *btnStopListen;TButton *btnCloseAlarm;TButton *btnSetAlarm;TLabel *Label1;void __fastcall FormCreate(TObject *Sender);void __fastcall btnLoginClick(TObject *Sender);void __fastcall btnSetAlarmClick(TObject *Sender);void __fastcall btnCloseAlarmClick(TObject *Sender);void __fastcall btnStartListenClick(TObject *Sender);void __fastcall btnStopListenClick(TObject *Sender);private:// User declarationspublic:// User declarations__fastcall TfrmMain(TComponent* Owner);unsigned int iLastErr;int m_lUserID,m_lAlarmHandle[200],iListenHandle,iDeviceNumber,DVRPortNumber ;bool m_bInitSDK;AnsiString Dir,DVRIPAddress,DVRUserName,DVRPassword,strErr;NET_VCA_TRAVERSE_PLANE m_struTraversePlane;    MSGCallBack m_falarmData;NET_VCA_INTRUSION m_struIntrusion;NET_DVR_PDC_ALRAM_INFO m_struStatFrame;NET_DVR_PDC_ALRAM_INFO m_struStatTime;};//---------------------------------------------------------------------------extern PACKAGE TfrmMain *frmMain;//---------------------------------------------------------------------------#endif



0 0
原创粉丝点击