houxiao
2016-12-16 a46c525446b64fb43c850d8b3dfdb77bdf81c1c0
add alarm out support

git-svn-id: http://192.168.1.226/svn/proxy@14 454eff88-639b-444f-9e54-f578c98de674
2个文件已修改
399 ■■■■■ 已修改文件
ProxyConsole/make.sh 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ProxyConsole/proxyconsole-hc.cpp 395 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ProxyConsole/make.sh
@@ -2,4 +2,6 @@
#gcc -pthread -lmysqlclient proxyconsole.c -o proxyconsole
g++ proxyconsole.cpp -pthread -L./HCNetSDK/lib -lhcnetsdk -lHCCore -lhpr -o proxyconsole-hc
rm proxyconsole-hc
g++ -g proxyconsole-hc.cpp -pthread -L./HCNetSDK/lib -lhcnetsdk -lHCCore -lhpr -o proxyconsole-hc
ProxyConsole/proxyconsole-hc.cpp
@@ -20,14 +20,56 @@
#include <errno.h>
#include <sys/stat.h>
#include <signal.h>
#include <string>
#include <map>
#include <vector>
#include <stdint.h>
#include <iostream>
#include <unistd.h>
#include "MD5Linux.h"
#include "HCNetSDK/incCn/HCNetSDK.h"
#define  HPR_OK 0
#define  HPR_ERROR -1
#define MAX_NUM 16
#define MAX 1024
#define fileread_buf 128
typedef std::map<std::string, int> hcnetsdk_user_t; // decoder_ip, userid
hcnetsdk_user_t g_hcnetsdk_user;
enum EquipmentType
{
    ET__FIRST,
    ET_PC_SERVER,
    ET_HCNET_DECODER__FIRST,
    ET_HCNET_DECODER_POPWIN,
    ET_HCNET_DECODER_LOGO,
    ET_HCNET_DECODER_ALARMOUT,
    ET_HCNET_DECODER__LAST,
    ET__LAST
};
struct HCNetCameraConfig
{
    int lUserID;
    std::string ip;
    int port;
    std::string username;
    std::string passwd;
    int channel;
    uint16_t byWallNo;
    uint16_t dwSubWinNo;
    uint16_t dwWinNo;
    uint16_t lAlarmOutPort;
};
typedef struct{
   int m_id;
   EquipmentType m_type;
   char serverIP[32];
   char serverport[10];
   char port[10];
@@ -35,6 +77,7 @@
   char user[64];
   char pass[64];
   int reboot;
   void* user_config;
}sockinfo,*lpsockinfo;
pthread_t thread_no[MAX_NUM];
pthread_t thread_noEQ[MAX_NUM];
@@ -58,6 +101,10 @@
int SupperConnectedflag[16]={0,},EquipConnectedflag[16]={0,},serverflag=0,GPIO_flag=0;
int EquipRealAlarmConnectedflag[16];
timer_t* timerID;
std::vector<std::string> SupperConnectedIP;
int hcnetsdk_user = -1;
int Read_MysqlData();
int UpdateMysqData(int key);
@@ -130,16 +177,24 @@
        equip_num=NUM;
        //time_lock(2016,10,28,10,10,10,30);
    }
    //serverthread
    for(i=0;i<NUM;i++){
        for(j=0;j<i;j++) if(strcmp(equipments[i].serverIP,equipments[j].serverIP)==0 && strcmp(equipments[i].serverport,equipments[j].serverport)==0) break;
        if(j<i)continue;
        
        if(SupperConnectedflag[i]==0){
    //serverthread
    for(i=0;i<NUM;i++)
    {
        for(j=0;j<i;j++)
            if(strcmp(equipments[i].serverIP,equipments[j].serverIP)==0 && strcmp(equipments[i].serverport,equipments[j].serverport)==0)
                break;
        if(j<i)
            continue;
        if(SupperConnectedflag[i]==0)
        {
           struct sockaddr_in servaddr;
           int strlen1=sizeof(servaddr);
           if(equipments[i].serverIP[0]!=0 && equipments[i].serverport[0]!=0) {
               if((sock_upper[i]=socket(PF_INET,SOCK_STREAM,0))<0){
            if(equipments[i].serverIP[0]!=0 && equipments[i].serverport[0]!=0)
            {
                if((sock_upper[i]=socket(PF_INET,SOCK_STREAM,0))<0)
                {
                   perror("socket fail1");
                   continue;
                }
@@ -153,26 +208,35 @@
                int rt = connect(sock_upper[i],(struct sockaddr*)&servaddr,strlen1);
                alarm(0);
                sigrelse(SIGALRM);
                if(rt<0){
                if(rt<0)
                {
                    printf("server connect fail-%s:%s\n",equipments[i].serverIP,equipments[i].serverport);
                    close(sock_upper[i]);
                    continue;
                }
                SupperConnectedflag[i]=1;
                SupperConnectedIP[i] = equipments[i].serverIP;
                   printf("server connect Success=:%s:%s\n",equipments[i].serverIP,equipments[i].serverport);
                pthread_create(&thread_no[i],NULL,&createServerthread,(void*)i);//super
           }
        }
    }
    //equipment thread
    for(i=0;i<NUM;i++){
        for(j=0;j<i;j++) if(strcmp(equipments[i].ip,equipments[j].ip)==0 && strcmp(equipments[i].port,equipments[j].port)==0) break;
        if(j<i)continue;
        if(EquipConnectedflag[i]==0){
           if(equipments[i].ip[0]!=0 && equipments[i].port[0]!=0) {
    for(i=0;i<NUM;i++)
    {
        for(j=0;j<i;j++)
            if(strcmp(equipments[i].ip,equipments[j].ip)==0 && strcmp(equipments[i].port,equipments[j].port)==0)
                break;
        if(j<i)
            continue;
        if(EquipConnectedflag[i]==0)
        {
           if(equipments[i].ip[0]!=0 && equipments[i].port[0]!=0)
           {
                struct sockaddr_in servaddr;
                int strlen1=sizeof(servaddr);
                if((sock_down[i]=socket(PF_INET,SOCK_STREAM,0))<0){
                if((sock_down[i]=socket(PF_INET,SOCK_STREAM,0))<0)
                {
                    perror("socket fail2");
                    continue;
                }
@@ -187,7 +251,8 @@
                int rt = connect(sock_down[i],(struct sockaddr*)&servaddr,strlen1);
                alarm(0);
                sigrelse(SIGALRM);          
                if(rt<0){
                if(rt<0)
                {
                    printf("Equipment connect fail-%s:%s\n",equipments[i].ip,equipments[i].port);
                    close(sock_down[i]);
                    continue;
@@ -202,8 +267,188 @@
            //printf("Myequipment connect ==================:");
            if(RealEventStart(i)==0) EquipRealAlarmConnectedflag[i]=1;    
        }
    }
}
int hcnetsdk_get_userid(const std::string& decode_ip)
{
    hcnetsdk_user_t::const_iterator iter = g_hcnetsdk_user.find(decode_ip);
    if(iter == g_hcnetsdk_user.end())
        return -1;
    else
        return iter->second;
}
void CALLBACK hcnetsdk_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
    printf("hcnetsdk_ExceptionCallBack: %d\n", int(dwType));
}
int hcnetsdk_alarm_alarmout(LONG lUserID, const HCNetCameraConfig& camConfig)
{
    //报警时间段
    NET_DVR_SCHEDTIME net_dvr_schedtime = {0};
    net_dvr_schedtime.byStartHour = 0;
    net_dvr_schedtime. byStartMin = 1;
    net_dvr_schedtime.byStopHour = 11;
    net_dvr_schedtime.byStopMin = 59;
    //报警设置信息
    NET_DVR_ALARMOUTCFG_V30 net_dvr_alarmoutcfg = {0};
    net_dvr_alarmoutcfg.dwSize = sizeof(net_dvr_alarmoutcfg);
    memcpy(net_dvr_alarmoutcfg.sAlarmOutName, "ac", sizeof("ac"));
    net_dvr_alarmoutcfg.dwAlarmOutDelay = 0;
    memcpy(net_dvr_alarmoutcfg.struAlarmOutTime, &net_dvr_schedtime, sizeof(net_dvr_schedtime));
    //net_dvr_alarmoutcfg.byRes[16] = 0;
    if(!NET_DVR_SetDVRConfig(lUserID,NET_DVR_SET_ALARMOUTCFG_V30,0,&net_dvr_alarmoutcfg,net_dvr_alarmoutcfg.dwSize)){
        printf("NET_DVR_SetDVRConfig failed, err: %d\n", NET_DVR_GetLastError());
    }
    //开启警报
    if(NET_DVR_SetAlarmOut(lUserID,camConfig.lAlarmOutPort,1) == FALSE){
        printf("NET_DVR_SetAlarmOut failed, err: %d\n", NET_DVR_GetLastError());
    }
    sleep(3);
    //解除警报
    NET_DVR_SetAlarmOut(lUserID,camConfig.lAlarmOutPort,0);
}
int hcnetsdk_alarm_popwin(LONG lUserID, const HCNetCameraConfig& camConfig)
{
    //LONG lUserID = hcnetsdk_get_userid(camConfig);
    if(lUserID < 0)
    {
        std::cerr << "hcnetsdk_get_userid ret -1" << std::endl;
        return -1;
    }
    //设置电视墙窗口参数,即开窗,坐标在电视墙范围之内
    DWORD m_dwWinCount=1;
    //开两个窗口
    DWORD m_dwWinNum[1];
    //1字节墙号+ 1字节保留+ 2字节窗口号m_dwWinNum[0] = 1<<24;
    //开窗时窗口号为0
    m_dwWinNum[0] = 1<<24;
    NET_DVR_VIDEOWALLWINDOWPOSITION m_struWinPos[1];
    memset(m_struWinPos, 0, sizeof(m_struWinPos));
    m_struWinPos[0].dwSize=sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION);
    m_struWinPos[0].byEnable=1;
    m_struWinPos[0].struRect.dwXCoordinate=200;
    m_struWinPos[0].struRect.dwYCoordinate=200;
    m_struWinPos[0].struRect.dwWidth=1520;
    m_struWinPos[0].struRect.dwHeight=1520;
    DWORD m_dwWinStatus[1];
    DWORD dwRetWinNum[1];
    //开窗时窗口号由设备返回
    NET_DVR_IN_PARAM struInputPapam = {0};
    struInputPapam.struCondBuf.pBuf = &m_dwWinNum;
    //输入条件缓冲区
    struInputPapam.struCondBuf.nLen = m_dwWinCount * sizeof(DWORD);
    struInputPapam.dwRecvTimeout = 5000;
    //接收超时时间
    struInputPapam.struInParamBuf.pBuf = m_struWinPos;
    struInputPapam.struInParamBuf.nLen = m_dwWinCount * sizeof(NET_DVR_VIDEOWALLWINDOWPOSITION);
    NET_DVR_OUT_PARAM struOutputPapam = {0};
    struOutputPapam.lpStatusList = m_dwWinStatus;
    struOutputPapam.struOutBuf.pBuf = dwRetWinNum;
    struOutputPapam.struOutBuf.nLen = m_dwWinCount*sizeof(DWORD);
    if (!NET_DVR_SetDeviceConfigEx(lUserID, NET_DVR_SET_VIDEOWALLWINDOWPOSITION, m_dwWinCount, &struInputPapam, &struOutputPapam)) {
        printf("NET_DVR_SET_VIDEOWALLWINDOWPOSITION error, err: %d\n", NET_DVR_GetLastError());
        return -1;
    }
    //前端设备 动态解码
    NET_DVR_PU_STREAM_CFG_V41 m_struDynamicInfo= {0};
    m_struDynamicInfo.dwSize=sizeof(m_struDynamicInfo);
    m_struDynamicInfo.byStreamMode=1;
    strcpy((char *)m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.byAddress, camConfig.ip.c_str());
    m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.wDVRPort = camConfig.port;
    strcpy((char *)m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.sUserName, camConfig.username.c_str());
    strcpy((char *)m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.sPassword, camConfig.passwd.c_str());
    m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.byChannel = camConfig.channel;
    m_struDynamicInfo.uDecStreamMode.struDecStreamDev.struDevChanInfo.byFactoryType=0;
    //int byWallNo=1,dwSubWinNo=1,dwWinNo=1;
    //DWORD dwDecChanNum=0x01000002;
    int dwWinNo = 2;//#todo get max win count and +1
    {
        //NET_DVR_WINLIST winlist;
        //BYTE pBuffer[224*sizeof(NET_DVR_SCREEN_WINCFG)];
        //winlist.dwSize = sizeof(winlist);
        //winlist.pBuffer = pBuffer;
        //winlist.dwBufLen = 224;
        //if (!NET_DVR_GetAllValidWinInfo(lUserID, &winlist))
        //    printf("NET_DVR_GetAllValidWinInfo error, err: %d\n", NET_DVR_GetLastError());
        //
        //std::cout<<"winnum="<<winlist.dwWinNum<<std::endl;
    }
    DWORD dwDecChanNum=(camConfig.byWallNo << 24) | (camConfig.dwSubWinNo << 16) | dwWinNo;
    //1字节墙号+1字节子窗口号+2字节窗口号: (byWallNo << 24) | (dwSubWinNo<<16) |dwWinNo;
    if (!NET_DVR_MatrixStartDynamic_V41(lUserID, dwDecChanNum, &m_struDynamicInfo))
    {
        printf("NET_DVR_MatrixStartDynamic_V41 error, err: %d\n", NET_DVR_GetLastError());
        return -1;
    }
    std::cout << "hcnetsdk_alarm_popwin" << std::endl;
}
int hcnetsdk_alarm_logo()
{
}
void hcnetsdk_finial()
{
    //NET_DVR_Logout(lUserID); //#todo
    NET_DVR_Cleanup();
}
int hcnetsdk_init()
{
    NET_DVR_Init();
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);
    NET_DVR_SetExceptionCallBack_V30(0, NULL,hcnetsdk_ExceptionCallBack, NULL);
    LONG lUserID;
    NET_DVR_DEVICEINFO_V30 struDeviceInfo;
    lUserID = NET_DVR_Login_V30("192.168.1.101", 8000, "admin", "a1234567", &struDeviceInfo);
    if (lUserID < 0) {
        printf("NET_DVR_Login_V30 failed, err: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return -1;
    }
    g_hcnetsdk_user.insert(std::make_pair("192.168.1.101", int(lUserID)));
    return lUserID;
}
HCNetCameraConfig* hcnetsdk_find_config(const std::string& decoder_ip)
{
    for (size_t i = 0; i < NUM; i++)
    {
        sockinfo* equip = &(equipments[i]);
        if (equip->m_type > ET_HCNET_DECODER__FIRST || equip->m_type < ET_HCNET_DECODER__LAST)
        {
            HCNetCameraConfig* camConfig = (HCNetCameraConfig*)equip->user_config;
            if (camConfig != NULL && equip->serverIP == decoder_ip)
                return camConfig;
        }
    }
    return NULL;
}
int main(int argc,char **argv)
@@ -227,6 +472,15 @@
           rsock_down[i] = -1;
       }
        
       SupperConnectedIP.resize(sizeof(SupperConnectedflag)/sizeof(int));
       hcnetsdk_user = hcnetsdk_init();
       if (hcnetsdk_user < 0)
       {
           printf("hcnetsdk_user < 0");
           exit(EXIT_FAILURE);
       }
       /*Install timer_handler as th siganl handler for SIGVTALRM */
       memset(&sa,0,sizeof(sa));
       sa.sa_handler=&timer_handler;
@@ -240,12 +494,19 @@
       /*Start a virtual timer.It counts down whenever this process is executing.*/
       setitimer(ITIMER_VIRTUAL,&timer,NULL);
       while(1);
       while(1);
}
void* createServerthread_hcnetsdk(void* arg)
{
}
//=================================================================
void* createServerthread(void* arg)
void* createServerthread_pc_server(void* arg)
 {
   int sidx = (int)arg; 
   int length=0;
@@ -269,7 +530,7 @@
      memcpy(&data[idx],equipments[i].pass,strlen(equipments[i].pass));idx+=strlen(equipments[i].pass);
  }
  data[idx++]=0x16;
  write(sock_upper[sidx],&data,idx);//send to equipment;순환문
  write(sock_upper[sidx],&data,idx);//send to equipment;
  printf("Send equipment's info to Server OK! len=:%d\n",idx);
  //=======================================data================================================
  while(1)
@@ -354,8 +615,13 @@
  puts("Server Thread is stoped..");
  close(sock_upper[sidx]);
  sock_upper[sidx] = -1;
  SupperConnectedflag[sidx]=0;//?
  SupperConnectedflag[sidx]=0;//?//#todo
  pthread_exit((void*)thread_no[sidx]);
}
void* createServerthread(void* arg)
{
    return createServerthread_pc_server(arg);
}
void* createEquipmentthread(void* arg)
@@ -415,15 +681,67 @@
            printf(" Down Socket closed \n");
            break;
        }
       else if(length>0){
            if(gCapturing[eidx]==1){
       else if(length>0)
       {
           if (strstr(buff, "ViqEventNotificationAlert") == NULL) // <urn
                continue;
            if (strstr(buff, "startTime") == NULL) // <urn
                continue;
            std::cout << buff<<std::endl;
            if(gCapturing[eidx]==1)
            {
                int k;
                for(k=0;k<16;k++){
                    if(SupperConnectedflag[k]==1){
                        write(sock_upper[k],buff,strlen(buff));
                        printf("======>>>>>>>upper send length====%d======\n",strlen(buff));
                        printf("=============================================================\n");
                for(k=0;k<16;k++)
                {
                    //if(SupperConnectedflag[k]==1)
                    //{
                    //    write(sock_upper[k],buff,strlen(buff));
                    //    printf("======>>>>>>>upper send length====%d======\n",strlen(buff));
                    //    printf("=============================================================\n");
                        //struct sockaddr peeraddr;
                        //socklen_t len = sizeof(sockaddr);
                        //if (getpeername(sock_upper[k], &peeraddr, &len) == 0)
                        //{
                        //    struct sockaddr_in* sin = (struct sockaddr_in*)(&peeraddr);
                        //    int port = sin->sin_port;
                        //    char addr_buffer[INET_ADDRSTRLEN];
                        //    if (inet_ntop(AF_INET, &(sin->sin_addr), addr_buffer, INET_ADDRSTRLEN) == NULL)
                        //    {
                        //        std::cerr << "inet_ntop err" << std::endl;
                        //    }
                        //    else
                        //    {
                        //        //std::cout << "addr:" << addr_buffer << std::endl; // #todo
                        //        HCNetCameraConfig* camConfig =  hcnetsdk_find_config(addr_buffer);
                        //        if (camConfig != NULL)
                        //        {
                        //            std::cout << "alarm " << std::endl;
                        //            hcnetsdk_alarm_popwin(*camConfig);
                        //        }
                        //    }
                        //}
                        //printf("%s",buff);
                    //}
                    //else
                    {
                        if(SupperConnectedIP.size() > k)
                        {
                            const std::string& ip(SupperConnectedIP[k]);
                            HCNetCameraConfig* camConfig =  hcnetsdk_find_config(ip);
                            int lUserData = hcnetsdk_get_userid(ip);
                            if (camConfig != NULL && lUserData >= 0)
                            {
                                std::cout << "alarm begin k=" << k << std::endl;
                                hcnetsdk_alarm_alarmout(lUserData, *camConfig);
                                std::cout << "alarm end k=" << k << std::endl;
                            }
                            else
                            {
                                //std::cout << "alarm lost k=" << k << std::endl;
                            }
                        }
                    }
                }
                continue;    
@@ -446,7 +764,7 @@
        //    .port = "80",                 // equipmentport
        //    .user = "supervisor",         // equipment username
        //    .pass = "supervisor",         // equipment password
        //    .serverIP = "192.168.1.2",     // serverip
        //    .serverIP = "192.168.1.2",     // serverip (accept alarm)
        //    .serverport = "5015",         // serverport
        //    .reboot = 0
        //},
@@ -454,14 +772,31 @@
        //{ .m_id = 1, .ip = "192.168.1.5", .port = "80", .user = "supervisor", .pass = "supervisor", .serverIP = "192.168.1.2", .serverport = "5015", .reboot = 0 },
    };
    
    {
    equipments_config[0].m_id = 1;
        equipments_config[0].m_type = ET_HCNET_DECODER_ALARMOUT;
    strcpy(equipments_config[0].ip, "192.168.1.5");
    strcpy(equipments_config[0].port, "80");
    strcpy(equipments_config[0].user, "supervisor");
    strcpy(equipments_config[0].pass, "supervisor");
    strcpy(equipments_config[0].serverIP, "192.168.1.2");
    strcpy(equipments_config[0].serverport, "5015");
        strcpy(equipments_config[0].serverIP, "192.168.1.101");
        strcpy(equipments_config[0].serverport, "8000");
        //strcpy(equipments_config[0].serverIP, "192.168.1.10");
        //strcpy(equipments_config[0].serverport, "5015");
    equipments_config[0].reboot = 0;
        HCNetCameraConfig* camConfig = new HCNetCameraConfig; // #todo delete when exit
        equipments_config[0].user_config = camConfig;
        camConfig->ip = "192.168.1.63";
        camConfig->port = 8000;
        camConfig->username = "admin";
        camConfig->passwd = "admin12345";
        camConfig->channel = 1;
        camConfig->byWallNo = 1;
        camConfig->dwSubWinNo = 1;
        camConfig->dwWinNo = 0;
        camConfig->lAlarmOutPort = 0x0001;
    }
    
    memcpy(equipments, equipments_config, sizeof(equipments_config));
    NUM = sizeof(equipments_config) / sizeof(sockinfo);