houxiao
2016-12-16 a46c525446b64fb43c850d8b3dfdb77bdf81c1c0
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);