xuxiuxi
2017-08-01 3846cd12e4e39c2026184f120706d7f7ca9d79c0
ProxyServer/proxyserver.c
@@ -1,2194 +1,2599 @@
/*
 * proxyserver.c
 *
 *  Created on: Oct 9, 2016
 *      Author: JKM
 */
#include <dirent.h>
#include "proxyserver.h"
int RequestChannel;
char* gAnalyzerIP;
char* gUser;
char* gPass;
int GSocket;
int gMySock[16];
int threadIdx=0;
char byte_array[2600];
char buff[102400];
int gGettingStep=0;
char uri[300];
time_t StartTm,EndTm;
int bMetadataSaving=0;
int bZipFileSaving=0;
unsigned char *memoryband[100];
int bandsize[100];
int bandCount = 0;
char ZipSerFileName[1000][300];
int ZipSerFileNum=0;
int ZipCountidx;
char NetInfo[128];
char EventString[100000];
EVENT_LOG myEventLogs[200];
int EventCount=0;
int FindIdx(char* IP);
int FindEmpty();
void* MyEquipmentthread(void* arg);
pthread_t thread_noEQ[16];
int gCapturing[16];
SESSION sessions[16];
#define MAX_NUM 16
#define MAX 1024
#define fileread_buf 128
AlarmInfo RealAlarmEvent[16][1000];
/////////////////////////////////////////////////
char* strnncat(char*s1,char*s2,int n)
{
   int len = strlen(s1);
   for(int i=0;i<n;i++)
   {
      s1[len+i]=s2[i];
   }
   return s1;
}
void SearchAppendString(char *buff,char* token1,char* token2,char* dispName)
{
   int len = strlen(token1);
   int sidx = stringcmp((char*)buff,token1,len);
   int eidx = stringcmp((char*)buff,token2,len+1);
   if(sidx >=0 && eidx>=0 && eidx>sidx+len)   {
      strcat(EventString,dispName);strnncat(EventString,&buff[sidx+len],eidx-sidx-len);
      strcat(EventString,"\n");
   }
}
char* GetDeviceInfo(char* AnalyserIP)
{
   memset(EventString,0,100000);
   gAnalyzerIP = AnalyserIP;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return "Param Error";
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      return "socket fail2";
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      close(GSocket);
      return "Equipment connect fail";
   }
   int length = 0;//GET /PSIA/System/deviceInfo HTTP/1.1
   length = sprintf(byte_array,"GET /PSIA/System/deviceInfo HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",AnalyserIP);
   write(GSocket,byte_array,length);
   //   printf("%s",byte_array);
   memset(EventString,0,100000);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(stringcmp((char*)buff,"<urn:DeviceInfo",15)>=0){
         SearchAppendString((char*)buff,"<urn:deviceName>","</urn:deviceName>","deviceName:");
         SearchAppendString((char*)buff,"<urn:deviceID>","</urn:deviceID>","deviceID:");
         SearchAppendString((char*)buff,"<urn:deviceDescription>","</urn:deviceDescription>","deviceDescription:");
         SearchAppendString((char*)buff,"<urn:model>","</urn:model>","model:");
         SearchAppendString((char*)buff,"<urn:serialNumber>","</urn:serialNumber>","serialNumber:");
         SearchAppendString((char*)buff,"<urn:macAddress>","</urn:macAddress>","macAddress:");
         SearchAppendString((char*)buff,"<urn:firmwareVersion>","</urn:firmwareVersion>","firmwareVersion:");
         SearchAppendString((char*)buff,"<urn:bootVersion>","</urn:bootVersion>","bootVersion:");
         SearchAppendString((char*)buff,"<urn1:httpPort>","</urn1:httpPort>","httpPort:");
         SearchAppendString((char*)buff,"<urn1:httpsPort>","</urn1:httpsPort>","httpsPort:");
         SearchAppendString((char*)buff,"<urn1:rtspPort>","</urn1:rtspPort>","rtspPort:");
         SearchAppendString((char*)buff,"<urn1:httpsEnabled>","</urn1:httpsEnabled>","httpsEnabled:");
         SearchAppendString((char*)buff,"<urn1:webAuthenticationType>","</urn1:webAuthenticationType>","webAuthenticationType:");
         SearchAppendString((char*)buff,"<urn1:rtspAuthenticationEnabled>","</urn1:rtspAuthenticationEnabled>","rtspAuthenticationEnabled:");
         close(GSocket);
         return EventString;
      }
   }
   return EventString;
}
char* GetAnalyserNet(void)                                                                                    //5.获取当前转发器的ip      参数:无。返回:当前的ip地址子网掩码和网关
{
   memset(NetInfo,0,128);
   /// function
   return NetInfo;
}
int SetAnalyserNet(char* NetInfo)                                                                              //6.手动设置转发器的ip      参数:ip,子网掩码,默认网关   。   返回:修改状态(成功或者失败)
{
   int ret=0;
   /// function
   return ret;
}
//// 功能:查看分析器连接状态
//// 输入:分析器IP
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int GetConnectState(char* AnalyserIP)
{
   return net_test(AnalyserIP,"80");
}
//// 功能:重启分析器
//// 输入:分析器IP,用户,密码,RestartKind=0(GPIO out),RestartKind=1(Protocol Mode), no(GPIO Pin no=>0~15)
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int RestartAnalyser(char* AnalyserIP,char* user,char* pass,int RestartKind,int no)
{
   switch(RestartKind){
   case 0:
      if(no<0 || no>15) return -1;
      GPIOinit();
      GPIOoutput(no);
      printf("GPIO output no=%d",no);
      return 0;
   case 1:
      return RestartCommand(AnalyserIP,user,pass);
   default:
      return -1;
   }
   return 0;
}
//// 功能:开始查看实时监控
//// 输入:分析器IP,用户,密码
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int RealEventStart(char* AnalyserIP,char* user,char* pass)
{
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   int bbbb=0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return -1;
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   int length = 0;
   length = sprintf(byte_array,"POST /PSIA/VIQ/System/sessions/permanent HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",AnalyserIP);
   write(GSocket,byte_array,length);
//   printf("%s",byte_array);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0 && bbbb==0)
      {
         // analyse reception
         MakeAuthorizedPacketReal(buff,length,"POST","/PSIA/VIQ/System/sessions/permanent");
         zclock_sleep(100);
         write(GSocket,byte_array,strlen(byte_array));
//         printf("%s\n",(char*)byte_array);
         bbbb=1;
         continue;
      }
      if(bbbb==1){
         int sidx = stringcmp((char*)buff,"<urn:id>",8);
         if(sidx >=0){//<urn:ViqDateTimeInterval urn:version="1.0" xmlns:urn="urn:videoiq-com"><urn:startTime urn:version="1.0"><urn:date>2016-08-18T01:07:20.749</urn:date><urn:offset>0</urn:offset></urn:startTime><urn:endTime urn:version="1.0"><urn:date>2016-08-29T08:33:48.231</urn:date><urn:offset>0</urn:offset></urn:endTime></urn:ViqDateTimeInterval>
            int eidx = stringcmp((char*)buff,"</urn:id>",9);
            if(eidx>=0 && sidx+8<eidx){
               int Idx=FindIdx(gAnalyzerIP);
               if(Idx==-1){
                  Idx = FindEmpty();
                  strcpy(sessions[Idx].IP,gAnalyzerIP);
                  memcpy(sessions[Idx].ID,&buff[sidx+8],eidx-sidx-8);
               }
               memcpy(sessions[Idx].ID,&buff[sidx+8],eidx-sidx-8);
               bbbb=2;
//               printf("SessionID =======> %s\n",(char*)sessions[Idx].ID);
               break;
            }
         }
      }
   }
   close(GSocket);
   int Idx=FindIdx(gAnalyzerIP);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   char uri[200];
   sprintf(uri,"/PSIA/Custom/Event/notification/notificationStream?sessionId=%s",sessions[Idx].ID);
   length = sprintf(byte_array,"GET %s HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",uri,gAnalyzerIP);
   write(GSocket,byte_array,strlen(byte_array));
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0 && bbbb==2)
      {
         char uri[200];
         sprintf(uri,"/PSIA/Custom/Event/notification/notificationStream?sessionId=%s",sessions[Idx].ID);
         MakeAuthorizedPacketReal(buff,length,"GET",uri);
         write(GSocket,byte_array,strlen(byte_array));
//         printf("%s\n",(char*)byte_array);
         bbbb=3;
         continue;
      }
      /*if(memorycmp((unsigned char*)buff,length, "ViqEventNotificationAlert",25)>0 && bbbb==3 )
      {
         if(RealAlarmEventNum[Idx]<1000-1)   {
            memset(&RealAlarmEvent[Idx][RealAlarmEventNum[Idx]],0,sizeof(AlarmInfo));
            AnalyXMLUrnEVENT(buff,length,&RealAlarmEvent[Idx][RealAlarmEventNum[Idx]++]);
         }
         continue;
      }
*/
      if(stringcmp(buff,"multipart/text; boundary=VIQeventEVENTeventVIQ",46)>0 && bbbb==3)
///      if(stringcmp(buff,"HTTP/1.1 200 OK",15)>0 && bbbb==3)
      {
         gMySock[Idx]=GSocket;
         pthread_create(&thread_noEQ[Idx],NULL,&MyEquipmentthread,(void*)Idx);//super(void*)(&equipments[0])
         gCapturing[Idx]=1;
         return 0;
      }
   }
   return -2;
}
//// 功能:停止查看实时监控
//// 输入:分析器IP
//// 输出:0(成功), -1(初始化失败)
int RealEventStop(char* AnalyserIP)
{
   int Idx=FindIdx(AnalyserIP);
   if(Idx>=0 && Idx<16){
      gCapturing[Idx]=0;
      sessions[Idx].IP[0]=0;
   }
   else return -1;
   return 0;
}
//// 功能:查看实时监控线程
//// 输入:分析器编号
void* MyEquipmentthread(void* arg)
{
   int eidx = (int)arg;
   int length;
   puts("Step.2 ========>Equipment Thread is strarted......");
   while(gCapturing[eidx]==1)
   {
      length=read(gMySock[eidx],&buff,sizeof(buff)-1);
      if(length<=0)
      {
         printf("\n \\\\\\ Read error \n");
         break;
      }
      else if(length>0){
         if(memorycmp((unsigned char*)buff,length, "ViqEventNotificationAlert",25)>0 )
         {
            if(RealAlarmEventNum[eidx]<1000-1)   {
               memset(&RealAlarmEvent[eidx][RealAlarmEventNum[eidx]],0,sizeof(AlarmInfo));
               AnalyXMLUrnEVENT(buff,length,&RealAlarmEvent[eidx][RealAlarmEventNum[eidx]++]);
            }
//            printf("%s=============================%d\n",(char*)buff,RealAlarmEventNum[eidx]);
//            printf("%s\n",RealAlarmEvent[eidx][1].channelId);
            continue;
         }
      }
   }
   close(gMySock[eidx]);
   puts("Equipment Thread is stoped..");
   pthread_exit((void*)thread_noEQ[eidx]);
}
               /*
               --VIQeventEVENTeventVIQ
                  Content-type: application/xml; charset="UTF-8"
                  <urn:ViqEventNotificationAlert urn:version="1.0" xmlns:urn="urn:videoiq-com">
                  <urn:channelId>3</urn:channelId>
                  <urn:eventId>6478</urn:eventId>
                  <urn:startTime urn:version="1.0">
                  <urn:date>2016-11-07T08:50:54.063</urn:date><urn:offset>28800000</urn:offset>
                  </urn:startTime>
                  <urn:clipUrl>/media/clips/3/2016/11/7/8/3/2016_11_07-08_50_48.mp4</urn:clipUrl>
                  <urn:ruleId>17</urn:ruleId>
                  <urn:ruleName>Video Lost Rule</urn:ruleName>
                  <urn:soiId>-1</urn:soiId>
                  <urn:soiName>Reserved SOI</urn:soiName>
                  <urn:activity>Video Lost</urn:activity>
                  <urn:objectType>Unknown</urn:objectType>
                  <urn:aborted>false</urn:aborted>
                  <urn:acknowledged>false</urn:acknowledged>
                  <urn:ackNotes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/><urn:falseAlarm>false</urn:falseAlarm>
                  <urn:debugMessage>2016/11/07 08:50:54.63: Video lost detected: 101. Event (id=6478) started.</urn:debugMessage>
                  </urn:ViqEventNotificationAlert>
                  */
//// 功能:获取实时监控报警
//// 输入:分析器IP
//// 输出:结果
char* GetRealEvent(char* AnalyserIP)                                             //3.查看实时监控         参数:分析器IP。返回:信道号及其对应的视频流地址
{
   int Idx=FindIdx(AnalyserIP);
   memset(EventString,0,100000);
   if(Idx>=0 && Idx<16 && RealAlarmEventNum[Idx]>0){
      for (int i=0;i<RealAlarmEventNum[Idx];i++)
      {
         strcat(EventString,RealAlarmEvent[Idx][i].channelId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].eventId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].startTime);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].endTime);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].clipUrl);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].ruleId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].ruleName);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].soiId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].soiName);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].activity);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].objectType);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].aborted);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].acknowledged);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].debugMessage);
         strcat(EventString,"\n");
      }
   }
   return EventString;
}
//// 查询报警记录
//// 输入:分析器IP,开始时间,结束时间,信道号,用户,密码
//// 输出:查询结果。(包括信道号,报警时间,播放地址,等。)
char* GetPHPSearchMetaInfo(char* AnalyserIP,char* user,char* pass,int Channel,int s_year,int s_month,int s_day,int s_hour,int s_minute,int s_sec,int e_year,int e_month,int e_day,int e_hour,int e_minute,int e_sec)
{
   char* result;
   MyTime mstart_time;
   mstart_time.Year=s_year;
   mstart_time.Month=s_month;
   mstart_time.Day=s_day;
   mstart_time.Hour=s_hour;
   mstart_time.Min=s_minute;
   mstart_time.Sec=s_sec;
   MyTime mEnd_time;
   mEnd_time.Year=e_year;
   mEnd_time.Month=e_month;
   mEnd_time.Day=e_day;
   mEnd_time.Hour=e_hour;
   mEnd_time.Min=e_minute;
   mEnd_time.Sec=e_sec;
   result=GetSearchMetaInfo(AnalyserIP,user,pass,Channel,&mstart_time,&mEnd_time);
   return result;
}
char* GetMp4Info(char* AnalyserIP,char* user,char* pass,int Channel,char* path)
{
   char Pathbuffer[100] = {0};
   RequestChannel = Channel;
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   bMetadataSaving = 0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return "-1";
   int length;
   int bMp4FileSaving=0;
   int Mp4FileAppendingSiz=0;
   int Mp4FileSiz;
   int file;
   char* result;
   char* httpUri = path;
   int iidx =0,llen=0;
   llen = sprintf(byte_array,"GET %s %s",httpUri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Pragma: no-cache\r\n"); iidx+=llen;
   //   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",Equipments[EquipIdx].ip); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:80\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n\r\n"); iidx+=llen;
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return "-3";
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return "-4";
   }
   //printf("byte_array==%s",byte_array);
   write(GSocket,byte_array,iidx);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      //printf("buff==%s",buff);
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
      {
         // analyse reception
         //printf("===================================");
         MakeAuthorizedPacketSimp(buff,length,"GET",httpUri);
         write(GSocket,byte_array,strlen(byte_array));
         continue;
      }
      if(httpUri[0]!=0){
         printf("**************************************flag======%d\n",bMp4FileSaving);
         if(bMp4FileSaving==1){
            if((file = open(Pathbuffer, O_RDWR, S_IREAD|S_IWRITE)) <0){
               printf("open file fail===2!\n");
               result="File open error(2)!";
               close(GSocket);
               return result;
            }
            lseek(file,0,SEEK_END);
            write(file,&buff[0], length);//CString m_data
            Mp4FileAppendingSiz += length;
            if (Mp4FileAppendingSiz>=Mp4FileSiz+8)
            {
               int sidx = memorycmp((unsigned char*)buff,length, "moov",4);
               Mp4FileSiz+=buff[sidx-4]*256*256*256+buff[sidx-3]*256*256+buff[sidx-2]*256+buff[sidx-1]; //movie box size
               printf("**************************************Mp4FileSiz======%d\n",Mp4FileSiz);
            }
            if (Mp4FileAppendingSiz>=Mp4FileSiz)
            {
               close(file);
               bMp4FileSaving = false;
               break;
            }
         }
         else
         {
            int sidx = memorycmp((unsigned char*)buff,length, "ftypmp42",8);
            if(sidx>=0){
               bMp4FileSaving= 1;
               Mp4FileAppendingSiz = length-sidx+4;
         printf("**************************************Mp4FileAppendingSiz======%d\n",Mp4FileAppendingSiz);
               if(length>36){
                  //printf("****************************************");
                  Mp4FileSiz = 24 + buff[sidx+20]*256*256*256+buff[sidx+21]*256*256+buff[sidx+22]*256+buff[sidx+23];// file_type box size + Media databox size
         printf("**************************************Mp4FileSiz======%d\n",Mp4FileSiz);
                  int count=0,i;
                  for(i=0;i<strlen(httpUri);i++){
                     if(httpUri[i]=='/') {
                        count++;
                        if(count>=9) break;
                     }
                  }
                  sprintf(Pathbuffer,"/tmp/%s",/*RequestChannel*/&httpUri[i+1]); iidx+=llen;
                  if((file = open(Pathbuffer,O_CREAT|O_RDWR,S_IREAD|S_IWRITE)) <0){
                     printf("open file fail===1!\n");
                     result="File open error(1)!";
                     close(GSocket);
                     return result;
                  }
                  write(file,&buff[sidx-4], length-sidx+4);
               }
            }
         }
      }
   }
   close(GSocket);
   return "ok";
}
//// 查询报警记录
//// 输入:分析器IP,开始时间,结束时间,信道号,用户,密码
//// 输出:查询结果。(包括信道号,报警时间,播放地址,等。)
char* GetSearchMetaInfo(char* AnalyserIP,char* user,char* pass,int Channel,lpMyTime StartTm,lpMyTime EndTm)
{
   RequestChannel = Channel;
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   bMetadataSaving = 0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return "-1";
//   if(gGettingStep>0) return -2;
   struct tm ttm;
   time_t StepTm;
   int length;
   char* httpUri;
   char sss[24],eee[24];
   chmod("/home",0777);
   const char* folderr;
   const char* filename1;
   folderr="/home/tmpZip";
   filename1="/home/tmp.zip";
   struct stat sb;
   if(stat(folderr,&sb)==0 && S_ISDIR(sb.st_mode))
      {
         delete_folder("/home/tmpZip");
      }
   if (doesFileExist(filename1))
      {
         delete_file("/home/tmp.zip");
      }
   if(RequestChannel==0) httpUri= "/PSIA/VIQ/Event/metadata/0/files";
   if(RequestChannel==1) httpUri= "/PSIA/VIQ/Event/metadata/1/files";
   if(RequestChannel==2) httpUri= "/PSIA/VIQ/Event/metadata/2/files";
   if(RequestChannel==3) httpUri= "/PSIA/VIQ/Event/metadata/3/files";
   ttm.tm_year=StartTm->Year;ttm.tm_mon=StartTm->Month;ttm.tm_mday=StartTm->Day;ttm.tm_hour=StartTm->Hour;ttm.tm_min=StartTm->Min;ttm.tm_sec=StartTm->Sec;
   time_t SearchStartTm = mktime(&ttm);
   ttm.tm_year=EndTm->Year;ttm.tm_mon=EndTm->Month;ttm.tm_mday=EndTm->Day;ttm.tm_hour=EndTm->Hour;ttm.tm_min=EndTm->Min;ttm.tm_sec=EndTm->Sec;
   time_t SearchEndTm = mktime(&ttm);
   printf("stm=%d,etm=%d\n",(int)SearchStartTm,(int)SearchEndTm);
   for (StepTm=SearchEndTm;StepTm>SearchStartTm;StepTm-=2*3600)
   {
      zclock_sleep(200);
//      printf(" ==== Search loop function execution  =================%d,%d \n",(int)StepTm,(int)SearchStartTm);
      struct sockaddr_in servaddr;
      int strlen1=sizeof(servaddr);
      if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
            perror("socket fail2");
            return "-3";
      }
      memset(&servaddr,0,strlen1);
      servaddr.sin_family=AF_INET;
      inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
      servaddr.sin_port=htons(80);
      if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
         printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
         close(GSocket);
         return "-4";
      }
      time_t ttt=StepTm-2*3600;
      struct tm *t;
      t = localtime(&ttt);
      sprintf(sss,"%d-%02d-%02dT%02d:%02d:%02d.000",t->tm_year+2000-100,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);// = "2016-08-26T07:31:00.000";
      sss[23]=0;
      t = localtime(&StepTm);
      sprintf(eee,"%d-%02d-%02dT%02d:%02d:%02d.000",t->tm_year+2000-100,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);// = "2016-08-26T07:31:00.000";
      eee[23]=0;
      RequestMetaFiles(gAnalyzerIP,httpUri,sss,eee);
      write(GSocket,byte_array,strlen(byte_array));
      //用以下方法将socket设置为非阻塞方式
//      int flags = fcntl(GSocket, F_GETFL, 0);
//      fcntl(GSocket, F_SETFL, flags | O_NONBLOCK);
      while(1){
         memset(buff,0,sizeof(buff));
         length=read(GSocket,&buff,sizeof(buff));
         if(length<=0)
         {
            close(GSocket);
            break;
         }
         if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
         {
            // analyse reception
            MakeAuthorizedPacketSimp111(buff,length,"GET",httpUri,sss,eee);
            write(GSocket,byte_array,strlen(byte_array));
            continue;
         }
         if(bMetadataSaving==1){
            memoryband[bandCount] = (unsigned char*)malloc(length);
            memcpy(memoryband[bandCount], buff, length);
            bandsize[bandCount] = length;
            if(bandCount<99) bandCount++;
            int eidx = stringcmp((char*)buff,"</urn:strings></urn:ViqStrings></urn:ViqStringsList>",52);
            if(eidx >=0){
               bMetadataSaving = 0;
               int SSize=0;
               for (int i=0;i<bandCount;i++) SSize+=bandsize[i];
               char *tmpp = (char*)malloc(SSize);
               int xx=0;
               for (int i=0;i<bandCount;i++)
               {
                  memcpy(&tmpp[xx],memoryband[i],bandsize[i]);
                  xx=bandsize[i];
                  free(memoryband[i]);
               }
               memcpy(buff,tmpp,SSize);
               free(tmpp);
               goto lpp123;
               printf("**********Special*******************************ZipSerFileNum = %d",ZipSerFileNum);
            }
         }
         else{
            int sidx = stringcmp((char*)buff,"<urn:ViqStringsList urn:version=",32);
            if(sidx >=0){
               bMetadataSaving = 1;
               bandCount = 0;
               memoryband[bandCount] = (unsigned char*)malloc(length-sidx);
               memcpy(memoryband[bandCount], &buff[sidx], length-sidx);
               bandsize[bandCount] = length-sidx;
               if(bandCount<99) bandCount++;
               int eidx = stringcmp((char*)buff,"</urn:strings></urn:ViqStrings></urn:ViqStringsList>",52);
               if(eidx >=0 && sidx<eidx){
                  free(memoryband[0]);
                  bandCount = 0;
                  bMetadataSaving = 0;
                  buff[eidx]=0;
                  int ptr=0;
                  ////// analyze buffer
lpp123:               sidx = stringcmp((char*)&buff[ptr],"http://changeit:80/media",24);
                  if(sidx >=0){//http://changeit:80/media/metadata/0/2016/8/25/1/2/s_5b4103706a6411e6855e574ec330e01d_20160825_013633_93003.zip
                     int zipidx =-1;zipidx =  stringcmp((char*)&buff[ptr],".zip",4);
                     int seridx =-1;seridx =  stringcmp((char*)&buff[ptr],".ser",4);
                     int kkk=-1;
                     if(zipidx>=0){
                         if(seridx>=0){
                           if(zipidx<seridx) kkk = zipidx;
                           else kkk = seridx;
                          }
                          else kkk = zipidx;
                      }
                      else{
                         if(seridx>=0) kkk = seridx;
                      }
                     if(kkk>=0 && kkk>sidx+18)
                     {
                        //下载metadata
                        char pathbuf[250] ;
                        strncpy(pathbuf,(char*)&buff[ptr+sidx+18],kkk-sidx-18+4);
                        pathbuf[kkk-sidx-18+4]=0;
                        int i;
                        for (i=0;i<ZipSerFileNum;i++)
                        {
                           if(strcmp(pathbuf,ZipSerFileName[i])==0) break;
                        }
                        if(i>=ZipSerFileNum){
                           strcpy(ZipSerFileName[ZipSerFileNum],pathbuf);
                           if(ZipSerFileNum<1000-1) ZipSerFileNum++;
                        }
                        ptr=ptr+kkk+4;
                        goto lpp123;
                     }
                  }
               }
            }
         }
       }// while end
   }//for
   //////// get
   for(ZipCountidx = 0; ZipCountidx<ZipSerFileNum; ZipCountidx++)
   {
      if(stringcmp((char*)ZipSerFileName[ZipCountidx],".ser",4)>=0) continue;
      zclock_sleep(200);
//      printf(" ==== Search loop function execution  =================%d,%d \n",(int)StepTm,(int)SearchStartTm);
      struct sockaddr_in servaddr;
      int strlen1=sizeof(servaddr);
      if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
            perror("socket fail2");
            return "-3";
      }
      memset(&servaddr,0,strlen1);
      servaddr.sin_family=AF_INET;
      inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
      servaddr.sin_port=htons(80);
      if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
         printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
         close(GSocket);
         return "-4";
      }
      httpUri = ZipSerFileName[ZipCountidx];//"/media/metadata/0/2016/8/25/1/2/s_5b4103706a6411e6855e574ec330e01d_20160825_013633_93003.zip";
      RequestZipSerFiles(gAnalyzerIP,httpUri);
      write(GSocket,byte_array,strlen(byte_array));
//      printf("==========================================================================================================================>>>>>>>>\n");
//      printf("%s",byte_array);
      while(1){
         length=read(GSocket,&buff,sizeof(buff)-1);
         if(length<=0)
         {
            close(GSocket);
            break;
         }
         if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
         {
            // analyse reception
            MakeAuthorizedPacketSimp(buff,length,"GET",httpUri);
            write(GSocket,byte_array,strlen(byte_array));
//            printf("%s",byte_array);
            continue;
         }
         if(memorycmp((unsigned char*)buff,length, "Error 404 NOT_FOUND",19)>0)
         {
            break;
         }
         if(bZipFileSaving==1){
            //下载Zip filesave
            int file;
            if((file = open("/home/tmp.zip", O_RDWR, S_IREAD|S_IWRITE)) <0)
               printf("open file fail!\n");
            lseek(file,0,SEEK_END);
            write(file,&buff[0], length);//CString m_data
            close(file);
            //mp4Save(_T("tmp.zip"),(unsigned char*)buffer, size,CFile::modeWrite| CFile::typeBinary);
            char tmppattern[8]; tmppattern[0]='P';tmppattern[1]='K';tmppattern[2]=0x05;tmppattern[3]=0x06;tmppattern[4]=0x00;tmppattern[5]=0x00;
            if(memorycmp((unsigned char*)&buff[0],length, tmppattern,8)>=0) {
               bZipFileSaving = 0;
               close(GSocket);
               //Convert Zip file to Ser file
               system("unzip -o /home/tmp.zip -d /home/tmpZip");
            }
         }
         else{
            int sidx = stringcmp((char*)buff,"PK",2);
            if(sidx >=0){//下载Zip filesave
               delete_file("/home/tmp.zip");
               //下载Zip filesave
               bZipFileSaving = 1;
               int file;
               if((file = open("/home/tmp.zip",O_CREAT|O_RDWR,S_IREAD|S_IWRITE)) <0)
                  printf("open file fail!\n");
               write(file,&buff[sidx], length-sidx);//CString m_data
               close(file);
               char tmppattern[8]; tmppattern[0]='P';tmppattern[1]='K';tmppattern[2]=0x05;tmppattern[3]=0x06;tmppattern[4]=0x00;tmppattern[5]=0x00;
               if(memorycmp((unsigned char*)&buff[sidx],length-sidx, tmppattern,8)>=0)
                {
                  bZipFileSaving = 0;
                  close(GSocket);
                  //Convert Zip file to Ser file
                  system("unzip -o /home/tmp.zip -d /home/tmpZip");
               }
            }
         }
      }//while
   }//for
   int   i,res=0,num=0; //得长度
   filenames filename[100];
   num = GetFileNameInFolder("/home/tmpZip",filename);
   char stringpath[1024];
   unsigned char p_save_buf[6144000];
   for(i=0;i<num;i++)
   {
      if(filename[i].name[0]=='.') continue;
      memset(stringpath,0,1024);
      memcpy(stringpath,"/home/tmpZip/",13);
      strcat(stringpath,filename[i].name);
      int handle;
      if((handle = open(stringpath, O_RDWR, S_IREAD|S_IWRITE)) <0)
         printf("open file fail!\n");
      res = read(handle,p_save_buf,6144000);//CString m_data
      close(handle);
      AnalySerFile((char*)p_save_buf,res);
   }
   memset(EventString,0,100000);
   //for(i=0;i<1000;i++)
   printf("EventCount===========================%d\n",EventCount);
   for (int i=0;i<EventCount;i++)
   {
      strcat(EventString,myEventLogs[i].Date);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].Time);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].Duration);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].clipUrl);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].Region);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].Rule);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].DebugMessageS);
      strcat(EventString,"\n");
      strcat(EventString,myEventLogs[i].DebugMessageE);
      strcat(EventString,"\n");
   }
   return EventString;
   //return "333333333333333333333333333333333333333333333333333333333333333333789";
}
//// 功能:重启分析器(协议)
//// 输入:分析器IP,用户,密码
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int RestartCommand(char* AnalyserIP,char* user,char* pass)
{
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   int bbbb=0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return -1;
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   int length = 0;
   length = sprintf(byte_array,"PUT /PSIA/System/reboot HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",AnalyserIP);
   write(GSocket,byte_array,length);
//   printf("%s",byte_array);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
      {
         // analyse reception
         MakeAuthorizedPacketRestart(buff,length,"PUT","/PSIA/System/reboot");//////????????
         bbbb=1;
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "HTTP/1.1 200 OK",15)>0) break;
   }
   close(GSocket);
   if (bbbb==0) return -1;
//   zclock_sleep(200);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   write(GSocket,byte_array,strlen(byte_array));
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         return -3;
      }
      if(memorycmp((unsigned char*)buff,length, "HTTP/1.1 200 OK",15)>0) break;
   }
   close(GSocket);
   return 0;
}
void RequestMetaFiles(char* AnaylyIP,char* httpUri,char* Tm1,char* Tm2)
{
   char byte_arrayxxx[1600];
   int lengthxxx = 0;
   memset(byte_array,0,1600);
   UrnStringToBytes(byte_arrayxxx,&lengthxxx,Tm1,Tm2);// xml
   int iidx =0,llen=0;;
   llen = sprintf(byte_array,"GET %s %s",httpUri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: %d\r\n",lengthxxx); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Content-Type: text/xml\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:%d\r\n",AnaylyIP,80); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
}
void RequestZipSerFiles(char* AnaylyIP,char* httpUri)
{
   memset(byte_array,0,1600);
   int iidx =0,llen=0;;
   llen = sprintf(byte_array,"GET %s %s",httpUri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"User-Agent: Java/1.6.0_05\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:%d\r\n",AnaylyIP,80); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n\r\n"); iidx+=llen;
}
void UrnStringToBytes(char* byte_array_out,int * byte_array_length_out,char* StartTim,char* EndTime)
{
   int idx=0,len;
   idx = sprintf(byte_array_out,"<urn:ViqDateTimeInterval urn:version=");
   byte_array_out[idx++]=0x22;//'"'
   byte_array_out[idx++]=0x31;//'1'
   byte_array_out[idx++]=0x2e;//'.'
   byte_array_out[idx++]=0x30;//'0'
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx]," xmlns:urn=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"urn:videoiq-com");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"><urn:startTime urn:version=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   byte_array_out[idx++]=0x31;//'1'
   byte_array_out[idx++]=0x2e;//'.'
   byte_array_out[idx++]=0x30;//'0'
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"><urn:date>%s</urn:date><urn:offset>0</urn:offset></urn:startTime><urn:endTime urn:version=",StartTim);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   byte_array_out[idx++]=0x31;//'1'
   byte_array_out[idx++]=0x2e;//'.'
   byte_array_out[idx++]=0x30;//'0'
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"><urn:date>%s</urn:date><urn:offset>0</urn:offset></urn:endTime></urn:ViqDateTimeInterval>",EndTime);idx+=len;//2016-08-26T09:31:00.000
   *byte_array_length_out = idx;
}
///// for Restart
void MakeAuthorizedPacketRestart(char* buff,int length, char* Method,char* uri)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,nonce_buf2,auth_buf3,domain_buf4,len);
//   printf("%s,%s,%s,%s\n",Realm_buf1,nonce_buf2,auth_buf3,domain_buf4);
//   printf("%d,%d,%d,%d\n",len[0],len[1],len[2],len[3]);
   char* cnonce_buf="08a9d86c1b5e45963cf82f43dca59c51";
   //Authorization: Digest username="supervisor",realm="VideoIQ",nonce="IcTFMVgBAAAHmywcsJspvAlyBqpQy",uri="/PSIA/System/reboot",algorithm="MD5",cnonce="08a9d86c1b5e45963cf82f43dca59c51",nc=00000001,qop="auth",response="0c31efdd27017412cd0b6aaf550da084"
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[1]]=0;
   auth_buf3[len[2]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   int lengthxxx = 0;
   int iidx = 0;
   AurhorizationResponseBytesReatart(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   int llen = sprintf(byte_array,"%s %s HTTP/1.1\r\n",Method,uri); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Type: text/xml\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: 0\r\n"); iidx+=llen;
   //               llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0;
}
//for real event
void MakeAuthorizedPacketReal(char* buff,int length, char* Method,char* uri)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,nonce_buf2,auth_buf3,domain_buf4, len);
   char* cnonce_buf="163acd0e58793a190f29ee879d4b224f";//"08a9d86c1b5e45963cf82f43dca59c51";
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[1]]=0;
   auth_buf3[len[2]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
//   printf("%s:%s:%s:%s:auth:%s\n",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   int lengthxxx = 0;
   int iidx = 0;
   AurhorizationResponseBytesReal(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   int llen = sprintf(byte_array,"%s %s HTTP/1.1\r\n",Method,uri); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Type: text/xml\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: 0\r\n"); iidx+=llen;
   //               llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0;
}
//RequestZipSerFileDownload..
void MakeAuthorizedPacketSimp(char* buff,int length, char* Method,char* uri)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,domain_buf4,nonce_buf2,auth_buf3, len);
   char* cnonce_buf="7e4c63bd7cb20c49ceafd1bd812428da";
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[2]]=0;
   auth_buf3[len[3]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   int lengthxxx = 0;
   int iidx = 0;
   AurhorizationResponseBytes(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   int llen = sprintf(byte_array,"%s %s HTTP/1.1\r\n",Method,uri); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Type: text/xml\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: 0\r\n"); iidx+=llen;
   //               llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0;
}
void MakeAuthorizedPacketSimp111(char* buff,int length, char* Method,char* uri,char* Tm1,char* Tm2)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,nonce_buf2,auth_buf3,domain_buf4, len);
   char* cnonce_buf="7e4c63bd7cb20c49ceafd1bd812428da";
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[1]]=0;
   auth_buf3[len[2]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   char xmlbyte_array[512];
   int lengthxxx = 0;
   int iidx = 0;
   int llen11=0;
   AurhorizationResponseBytes(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   UrnStringToBytes(xmlbyte_array,&llen11,Tm1,Tm2);//xml calculation
   int llen = sprintf(byte_array,"GET %s %s",uri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: %d\r\n",llen11); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Content-Type: text/xml\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:%d\r\n",gAnalyzerIP,80); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   strncpy(&byte_array[iidx],xmlbyte_array,length); iidx+=length;
   byte_array[iidx]=0;
}
int FindIdx(char* IP)
{
   for (int i=0;i<16;i++)
   {
      if(strcmp(sessions[i].IP,IP)==0) return i;
   }
   return -1;
}
int FindEmpty()
{
   for (int i=0;i<16;i++)
   {
      if(sessions[i].IP[0]==0) return i;
   }
   return -1;
}
int DivideTimeToYMDHMS(char* DateTimeStr,int* year,int* month,int* day, int* hour,int* min,int* sec)
{
   int yy,mm,dd,hh,Mm,ss;
   //DivideTime(DateTimeStr,DateStr,TimeStr);
   sscanf(DateTimeStr,"%d-%d-%dT%d:%d:%d",&yy,&mm,&dd,&hh,&Mm,&ss);
   *year = yy;
   *month = mm;
   *day = dd;
   *hour = hh;
   *min = Mm;
   *sec = ss;
   return 0;
}
int CharToByte(char* chars, char* bytes, unsigned int count,char* ptr1,char* ptr2,char* ptr3,char* ptr4,unsigned char* number){
   int p=0;
   int n=0;
   int i=0;
   unsigned char temp;
   for(i = 0; i < count; i++)
   {
      temp = (unsigned char)chars[i];
      if (p==1)
      {
         if (temp!=0x22)
         {
            bytes[n++]=(unsigned char)chars[i];
         }
      }
      if (temp==0x22)
      {
         p=p+1;
      }
      if (p==2)
      {
         bytes[n++]=0x2C;
         p=0;
      }
   }
   char* token=NULL;
   char s[]=",";
   token=strtok(bytes,s);
   number[0]=strlen(token);
   memcpy(ptr1,token,strlen(token));
   int nn=0;
   while(token!=NULL)
   {
      token=strtok(NULL,s);
      nn=nn+1;
      if (nn==1)
      {
         number[1]=strlen(token);
         memcpy(ptr2,token,strlen(token));
      }
      if (nn==2)
      {
         //ptr3=new char[strlen(token)];
         number[2]=strlen(token);
         memcpy(ptr3,token,strlen(token));
      }
      if (nn==3)
      {
         if(token!=NULL)
         {
            number[3]=strlen(token);
            memcpy(ptr4,token,strlen(token));
         }//ptr3=new char[strlen(token)];
      }
   }
   return n;
}
void AnalySerFile(char* p_save_buf,int res)
{
   int ParagraphIdx;
   bool somewhat;
first:
   somewhat=false;
   memset(myEventLogs[EventCount].DebugMessageS,0,200);
   memset(myEventLogs[EventCount].DebugMessageE,0,200);
   memset(myEventLogs[EventCount].Rule,0,20);
   memset(myEventLogs[EventCount].Region,0,30);
   memset(myEventLogs[EventCount].clipUrl,0,200);
   memset(myEventLogs[EventCount].Date,0,15);
   memset(myEventLogs[EventCount].Time,0,15);
   memset(myEventLogs[EventCount].Duration,0,20);
   ParagraphIdx = memorycmp((unsigned char*)p_save_buf,res, "com.videoiq.fusion.cameraapi.metadata.Incident",46);
   if(ParagraphIdx<0) ParagraphIdx = res;
   int tmpSidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "started.",8);
   int tmpEidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "Event ended.",12);
   if(tmpSidx<0 && tmpEidx<0) goto last;
   if(tmpSidx>=0 && tmpEidx<0){// Started paragraph
      int sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "ruleName",8);
      if(sidx>=0 && p_save_buf[sidx+8]==0x08){
         int flen = p_save_buf[sidx+8+1]*256+p_save_buf[sidx+8+2];
         memcpy(myEventLogs[EventCount].Rule,&p_save_buf[sidx+8+3],flen);
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "soiName",7);
      if(sidx>=0 && p_save_buf[sidx+7]==0x08){
         int flen = p_save_buf[sidx+7+1]*256+p_save_buf[sidx+7+2];
         memcpy(myEventLogs[EventCount].Region,&p_save_buf[sidx+7+3],flen);
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "activity",8);
      if(sidx>=0){
         myEventLogs[EventCount].ActivityNum[0]=p_save_buf[sidx+8];
         myEventLogs[EventCount].ActivityNum[1]=p_save_buf[sidx+8+1];
         myEventLogs[EventCount].ActivityNum[2]=p_save_buf[sidx+8+2];
         myEventLogs[EventCount].ActivityNum[3]=p_save_buf[sidx+8+3];
         myEventLogs[EventCount].ActivityNum[4]=p_save_buf[sidx+8+4];
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "clipUrl",7);
      if(sidx>=0 && p_save_buf[sidx+7]==0x08){
         int flen = (unsigned char)p_save_buf[sidx+7+1]*256+(unsigned char)p_save_buf[sidx+7+2];
         memcpy(myEventLogs[EventCount].clipUrl,&p_save_buf[sidx+7+3],flen);
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "debugMessage",12);
      if(sidx>=0 && p_save_buf[sidx+12]==0x08){
         int flen = (unsigned char)p_save_buf[sidx+12+1]*256+(unsigned char)p_save_buf[sidx+12+2];
         memcpy(myEventLogs[EventCount].DebugMessageS,&p_save_buf[sidx+12+3],flen);
      }
      char tmp[200];
      int tlen=0;
      memset(tmp,0,200);
      tlen = strlen(myEventLogs[EventCount].DebugMessageS);
      memcpy(tmp,myEventLogs[EventCount].DebugMessageS,tlen);
      if(myEventLogs[EventCount].DebugMessageS[0]!=0) somewhat = true;
      // Get Vide lost
      int eidx = memorycmp((unsigned char*)tmp,tlen, "Video lost detected",19);
      if(eidx>=0){
         strcpy(myEventLogs[EventCount].Rule,"Video Lost Rule");
      }
      // Get System Event
      eidx = memorycmp((unsigned char*)tmp,tlen, "System activity detected",24);
      if(eidx>=0){
         strcpy(myEventLogs[EventCount].Rule,"System Event Rule");
      }
      // Get Start Time
      eidx = memorycmp((unsigned char*)tmp,tlen, " ",1);
      if (eidx>=0){
         memcpy(myEventLogs[EventCount].Date,tmp,eidx);
         memcpy(tmp,&tmp[eidx+1],tlen-eidx);
         eidx = memorycmp((unsigned char*)tmp,tlen-eidx, " ",1);
         if (eidx>=0){
            memcpy(myEventLogs[EventCount].Time,tmp,eidx-1);
            memcpy(tmp,&tmp[eidx+1],tlen-eidx);
            somewhat = true;
         }
      }
   }
   if(tmpSidx>=0 && tmpEidx>=0){// Started. Event Ended paragraph
      int sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "debugMessage",12);
      if(sidx>=0 && p_save_buf[sidx+12]==0x08)
      {
         int flen = (unsigned char)p_save_buf[sidx+12+1]*256+(unsigned char)p_save_buf[sidx+12+2];
         char tmpdeg[200];
         memset(tmpdeg,0,200);
         memcpy(tmpdeg,&p_save_buf[sidx+12+3],flen);
         // find owner record
         int i;
         for (i=0;i<EventCount;i++)
         {
            int j,llen = strlen(myEventLogs[i].DebugMessageS);
            for (j=0;j<llen;j++)
            {
               if(myEventLogs[i].DebugMessageS[j] != tmpdeg[j]) break;
            }
            if(j>=llen) break;
         }
         if(i<EventCount)// Started message Matched OK
         {
            sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "activity",8);
            if(sidx>=0){
               myEventLogs[i].ActivityNum[0]=p_save_buf[sidx+8];
               myEventLogs[i].ActivityNum[1]=p_save_buf[sidx+8+1];
               myEventLogs[i].ActivityNum[2]=p_save_buf[sidx+8+2];
               myEventLogs[i].ActivityNum[3]=p_save_buf[sidx+8+3];
               myEventLogs[i].ActivityNum[4]=p_save_buf[sidx+8+4];
            }
            //            goto last;
            //            strcpy(myEventLogs[i].DebugMessageE,tmpdeg);
            //            goto last;
            // get End time
            char tmp[200];
            memset(tmp,0,200);
            memcpy(tmp,tmpdeg,flen);
            int msglen = flen;
            //            goto last;
            int eeidx = memorycmp((unsigned char*)tmp,flen, "started.",8);
            if (eeidx>=0){
               memcpy(tmp,&tmp[eeidx+8+1],flen-eeidx-8-1);
               flen = flen-eeidx-8-1 ;
               tmp[flen]=0;
               char tmpDate[15];
               char tmpTime[15];
               int eidx = memorycmp((unsigned char*)tmp,flen, " ",1);
               if (eidx>=0){
                  memcpy(tmpDate,tmp,eidx);
                  tmpDate[eidx]=0;
                  memcpy(tmp,&tmp[eidx+1],flen-eidx);
                  eidx = memorycmp((unsigned char*)tmp,flen-eidx, " ",1);
                  if (eidx>=0){
                     memcpy(tmpTime,tmp,eidx-1);
                     tmpTime[eidx-1]=0;
                     //// Calculation duration
                     int yy2,mm2,dd2,hh2,Mm2,ss2;
                     int yy,mm,dd,hh,Mm,ss;
                     sscanf(myEventLogs[i].Date,"%d/%d/%d",&yy,&mm,&dd);
                     sscanf(myEventLogs[i].Time,"%d:%d:%d",&hh,&Mm,&ss);
                     sscanf(tmpDate,"%d/%d/%d",&yy2,&mm2,&dd2);
                     sscanf(tmpTime,"%d:%d:%d",&hh2,&Mm2,&ss2);
                     struct tm ttm;
                     ttm.tm_year = yy-2000+100;ttm.tm_mon=mm;ttm.tm_mday = dd;ttm.tm_hour=hh;ttm.tm_min=Mm;ttm.tm_sec=ss;
                     time_t StartTm = mktime(&ttm);
                     ttm.tm_year = yy2-2000+100;ttm.tm_mon=mm2;ttm.tm_mday = dd2;ttm.tm_hour=hh2;ttm.tm_min=Mm2;ttm.tm_sec=ss2;
                     time_t EndTm = mktime(&ttm);
                     int dur = EndTm-StartTm;
                     sprintf(myEventLogs[i].Duration,"%d 秒",dur);
                     memcpy(myEventLogs[i].DebugMessageE,tmpdeg,msglen);
                  }
               }
            }
         }
      }
   }
   char ttmp[5000];
   if((myEventLogs[EventCount].DebugMessageE[0]!=0|| myEventLogs[EventCount].DebugMessageS[0]!=0) && myEventLogs[EventCount].Rule[0]==0 && myEventLogs[EventCount].Region[0]==0){
      memcpy(ttmp,(unsigned char*)p_save_buf,5000);
   }
   if(somewhat && EventCount<200-1){///repair
      sprintf(myEventLogs[EventCount].Camera,"%d",RequestChannel+1);
      int i;
      for (i=0;i<EventCount;i++)
      {
         if(strcmp(myEventLogs[i].clipUrl,myEventLogs[EventCount].clipUrl)==0) break;
      }
      if(i>=EventCount)   {
         EventCount++;
      }
   }
last:
   res = res - ParagraphIdx - 46 ;
   if (res<=0)
      return;
   memcpy((unsigned char*)p_save_buf,&p_save_buf[ParagraphIdx + 46],res);
   goto first;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
int memorycmp(unsigned char* src ,int slen, char* token, int len)
{
   int start=0,k,i,klen=strlen(token);
lp1:
   for(i=start;i<slen;i++) if(src[i]==token[0]) break;
   if (i>=slen) return -1;
   k=i;
   for(i=0;i<klen;i++)
   {
      if(src[k+i]!=token[i])
      {
         start=k+i;
         goto lp1;
      }
   }
   if(i>=klen) return k;
   return -1;
}
int stringcmp(char* src ,char* token, int len)
{
   int start=0,k,i,slen=strlen(src);
lp:
   for(i=start;i<slen;i++) if(src[i]==token[0]) break;
   if (i>=slen) return -1;
   k=i;
   for(i=0;i<len;i++)
   {
      if(src[k+i]!=token[i])
      {
         start=k+i;
         goto lp;
      }
   }
   if(i>=len) return k;
   return -1;
}
void AurhorizationResponseBytes(char* byte_array_out,int * byte_array_length_out,char *Myuri, char *nonce,char *cnonce,char *response)
{
   //   Authorization: Digest username="supervisor", realm="VideoIQ", nonce="n99u1VYBAABAf0HT+h92EO4hT2CzmfxG", uri="/PSIA/VIQ/Event/metadata/0/files", response="7d8d929e39655ad9f3e6e94e9004792e", qop=auth, nc=00000001, cnonce="0d2175d8cdb63f84f18894200e129ace", algorithm="MD5"
   int idx=0,len;
   idx = sprintf(byte_array_out,"%s","Authorization: Digest username=");
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","supervisor");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",realm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","VideoIQ");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx], "%s",nonce);idx+=len;//"n99u1VYBAABAf0HT+h92EO4hT2CzmfxG"
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",uri=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",Myuri);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",algorithm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","MD5");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",response=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",response);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",qop=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","auth");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nc=00000001,cnonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",cnonce);idx+=len;//cnonce
   byte_array_out[idx++]=0x22;//'"'
   *byte_array_length_out = idx;
}
void AurhorizationResponseBytesReal(char* byte_array_out,int * byte_array_length_out,char *Myuri, char *nonce,char *cnonce,char *response)
{
   //   Authorization: Digest username="supervisor", realm="VideoIQ", nonce="n99u1VYBAABAf0HT+h92EO4hT2CzmfxG", uri="/PSIA/VIQ/Event/metadata/0/files", response="7d8d929e39655ad9f3e6e94e9004792e", qop=auth, nc=00000001, cnonce="0d2175d8cdb63f84f18894200e129ace", algorithm="MD5"
   int idx=0,len;
   idx = sprintf(byte_array_out,"%s","Authorization: Digest username=");
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","supervisor");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",realm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","VideoIQ");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx], "%s",nonce);idx+=len;//"n99u1VYBAABAf0HT+h92EO4hT2CzmfxG"
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",uri=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",Myuri);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",algorithm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","MD5");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",cnonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",cnonce);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nc=00000001,qop=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","auth");idx+=len;//cnonce
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",response=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",response);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   *byte_array_length_out = idx;
}
void AurhorizationResponseBytesReatart(char* byte_array_out,int * byte_array_length_out,char *Myuri, char *nonce,char *cnonce,char *response)
{
   int idx=0,len;
   idx = sprintf(byte_array_out,"%s","Authorization: Digest username=");
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","supervisor");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",realm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","VideoIQ");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx], "%s",nonce);idx+=len;//"n99u1VYBAABAf0HT+h92EO4hT2CzmfxG"
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",uri=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",Myuri);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",algorithm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","MD5");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",cnonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",cnonce);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nc=00000001");idx+=len;
   len = sprintf(&byte_array_out[idx],"%s",",qop=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","auth");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",response=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",response);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   *byte_array_length_out = idx;
}
               /*
               --VIQeventEVENTeventVIQ
                  Content-type: application/xml; charset="UTF-8"
                  <urn:ViqEventNotificationAlert urn:version="1.0" xmlns:urn="urn:videoiq-com">
                  <urn:channelId>3</urn:channelId>
                  <urn:eventId>6478</urn:eventId>
                  <urn:startTime urn:version="1.0">
                  <urn:date>2016-11-07T08:50:54.063</urn:date><urn:offset>28800000</urn:offset>
                  </urn:startTime>
                  <urn:clipUrl>/media/clips/3/2016/11/7/8/3/2016_11_07-08_50_48.mp4</urn:clipUrl>
                  <urn:ruleId>17</urn:ruleId>
                  <urn:ruleName>Video Lost Rule</urn:ruleName>
                  <urn:soiId>-1</urn:soiId>
                  <urn:soiName>Reserved SOI</urn:soiName>
                  <urn:activity>Video Lost</urn:activity>
                  <urn:objectType>Unknown</urn:objectType>
                  <urn:aborted>false</urn:aborted>
                  <urn:acknowledged>false</urn:acknowledged>
                  <urn:ackNotes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/><urn:falseAlarm>false</urn:falseAlarm>
                  <urn:debugMessage>2016/11/07 08:50:54.63: Video lost detected: 101. Event (id=6478) started.</urn:debugMessage>
                  </urn:ViqEventNotificationAlert>
                  */
int AnalyXMLUrnEVENT(char* buff,int length,AlarmInfo* RealAlarmEvent)
{
   int sidx,eidx;
   sidx = stringcmp((char*)buff,"<urn:channelId>",15);
   eidx = stringcmp((char*)buff,"</urn:channelId>",16);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->channelId,&buff[sidx+15],eidx-sidx-15);
   sidx = stringcmp((char*)buff,"<urn:eventId>",13);
   eidx = stringcmp((char*)buff,"</urn:eventId>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->eventId,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:startTime",14);
   eidx = stringcmp((char*)buff,"</urn:startTime",15);
   char tmp[200];
   memset(tmp,0,200);
   if(sidx>=0 && eidx>=0 && sidx < eidx){
      memcpy(tmp,&buff[sidx+15],eidx-sidx-14);
      sidx=stringcmp((char*)tmp,"<urn:date>",10);
      eidx = stringcmp((char*)tmp,"</urn:date>",11);
      if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->startTime,&tmp[sidx+10],eidx-sidx-10);
      sidx=stringcmp((char*)tmp,"<urn:offset>",12);
      eidx = stringcmp((char*)tmp,"</urn:offset>",13);
      if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->soffset,&tmp[sidx+12],eidx-sidx-12);
   }
   sidx = stringcmp((char*)buff,"<urn:endTime",12);
   if(sidx>=0){
      int ssidx=stringcmp((char*)buff,"<urn:date>",10);
      eidx = stringcmp((char*)buff,"</urn:date>",11);
      if(ssidx>=0 && eidx>=0 && ssidx < eidx) memcpy(RealAlarmEvent->endTime,&buff[ssidx+10],eidx-ssidx-10);
   }
   sidx = stringcmp((char*)buff,"<urn:clipUrl>",13);
   eidx = stringcmp((char*)buff,"</urn:clipUrl>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->clipUrl,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:ruleId>",12);
   eidx = stringcmp((char*)buff,"</urn:ruleId>",13);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->ruleId,&buff[sidx+12],eidx-sidx-12);
   sidx = stringcmp((char*)buff,"<urn:ruleName>",14);
   eidx = stringcmp((char*)buff,"</urn:ruleName>",15);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->ruleName,&buff[sidx+14],eidx-sidx-14);
   sidx = stringcmp((char*)buff,"<urn:soiId>",11);
   eidx = stringcmp((char*)buff,"</urn:soiId>",12);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->soiId,&buff[sidx+11],eidx-sidx-11);
   sidx = stringcmp((char*)buff,"<urn:soiName>",13);
   eidx = stringcmp((char*)buff,"</urn:soiName>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->soiName,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:activity>",14);
   eidx = stringcmp((char*)buff,"</urn:activity>",15);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->activity,&buff[sidx+14],eidx-sidx-14);
   sidx = stringcmp((char*)buff,"<urn:objectType>",16);
   eidx = stringcmp((char*)buff,"</urn:objectType>",17);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->objectType,&buff[sidx+16],eidx-sidx-16);
   sidx = stringcmp((char*)buff,"<urn:aborted>",13);
   eidx = stringcmp((char*)buff,"</urn:aborted>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->aborted,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:acknowledged>",18);
   eidx = stringcmp((char*)buff,"</urn:acknowledged>",19);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->acknowledged,&buff[sidx+18],eidx-sidx-18);
   sidx = stringcmp((char*)buff,"<urn:debugMessage>",18);
   eidx = stringcmp((char*)buff,"</urn:debugMessage>",19);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->debugMessage,&buff[sidx+18],eidx-sidx-18);
   return 0;
}
//判断是否为目录
bool is_dir(const char *path)
{
    struct stat statbuf;
    if(lstat(path, &statbuf) ==0)//lstat返回文件的信息,文件信息存放在stat结构中
    {
        return S_ISDIR(statbuf.st_mode) != 0;//S_ISDIR宏,判断文件类型是否为目录
    }
    return false;
}
//判断是否为常规文件
bool is_file(const char *path)
{
    struct stat statbuf;
    if(lstat(path, &statbuf) ==0)
        return S_ISREG(statbuf.st_mode) != 0;//判断文件是否为常规文件
    return false;
}
//判断是否是特殊目录
bool is_special_dir(const char *path)
{
    return strcmp(path, ".") == 0 || strcmp(path, "..") == 0;
}
//生成完整的文件路径
void get_file_path(const char *path, const char *file_name,  char *file_path)
{
    strcpy(file_path, path);
    if(file_path[strlen(path) - 1] != '/')
        strcat(file_path, "/");
    strcat(file_path, file_name);
}
void delete_file(const char *path)
{
   char cmd[30];
   memset(cmd,0,30);
   sprintf(cmd,"rm -f %s",path);
   system(cmd);
}
void delete_folder(const char *path)
{
   char cmd[30];
   memset(cmd,0,30);
   sprintf(cmd,"rm -r %s",path);
   system(cmd);
}
int doesFileExist(const char *filename)
{
   struct stat st;
   int result=stat(filename,&st);
   if (result==0)
    return 1;
    else return 0;
 }
int GetFileNameInFolder(char* dirname,lpfilenames lpfilename)
{
   int num=0;
    DIR *p_dir;
    struct dirent *p_dirent;
    if((p_dir = opendir(dirname)) == NULL){
        printf("---->can\'t open %s\n",dirname);
        return 0;
    }
    while((p_dirent = readdir(p_dir))){
        strcpy(lpfilename[num].name ,p_dirent->d_name);
      num++;
    }
    return num;
}
int net_test(char* serverIP,char* port)
{
   struct sockaddr_in servaddr;
   int strlen=sizeof(servaddr);
   int sockfdd;
   if((sockfdd=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail");
      close(sockfdd);
      return -1;
   }
   memset(&servaddr,0,strlen);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,serverIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(atoi(port));
   if(connect(sockfdd,(struct sockaddr*)&servaddr,strlen)<0){
      //      perror("connect fail-3");
      close(sockfdd);
      return -2;
   }
   close(sockfdd);
   return 0;
}
void GPIOinit(void)
{
   int retVal = -1;
   int PortNum = 0xA06;
   unsigned char wVal = 0x15;
   retVal = GPIO_OPEN(PortNum);
   printf("GPIO OPEN RES = %d  \n",retVal);
   GPIO_WRITE(PortNum,wVal);
   printf("GPIO WRITE VALUE = 0x%X \n", wVal);
   retVal = GPIO_READ(PortNum);
   printf("GPIO READ VALUE 02 = 0x%X  \n",retVal);
   GPIO_CLOSE(PortNum);
}
int GPIOoutput(int no)
{
   int PortNum = 0xA06;
   switch(no){
   case 0:
      GPIO_WRITE(PortNum,0x15);
      return 0;
   case 1:
      GPIO_WRITE(PortNum,0x57);
      return 0;
   case 2:
      GPIO_WRITE(PortNum,0x5D);
      return 0;
   case 3:
      GPIO_WRITE(PortNum,0x5F);
      return 0;
   case 4:
      GPIO_WRITE(PortNum,0x75);
      return 0;
   case 5:
      GPIO_WRITE(PortNum,0x77);
      return 0;
   case 6:
      GPIO_WRITE(PortNum,0x7D);
      return 0;
   case 7:
      GPIO_WRITE(PortNum,0x7F);
      return 0;
   case 8:
      GPIO_WRITE(PortNum,0xD5);
      return 0;
   case 9:
      GPIO_WRITE(PortNum,0xD7);
      return 0;
   case 10:
      GPIO_WRITE(PortNum,0xDD);
      return 0;
   case 11:
      GPIO_WRITE(PortNum,0xDF);
      return 0;
   case 12:
      GPIO_WRITE(PortNum,0xF5);
      return 0;
   case 13:
      GPIO_WRITE(PortNum,0xF7);
      return 0;
   case 14:
      GPIO_WRITE(PortNum,0xFD);
      return 0;
   case 15:
      GPIO_WRITE(PortNum,0xFF);
      return 0;
   }
   return -1;
}
int GPIO_OPEN(int PortNum)
{
   return ioperm(PortNum, 0x01, 0x01);
}
void GPIO_CLOSE(int PortNum)
{
   ioperm(PortNum, 0x01, 0x00);
}
int GPIO_READ(int PortNum)
{
  return inb(PortNum);
}
void GPIO_WRITE(int PortNum,unsigned char DATA)
{
  outb(DATA,PortNum);
}
//=====================================MD5 Function Definition============================================
void MD5Init (MD5_CTX *context)    /* context */
{
  context->count[0] = context->count[1] = 0;
  context->state[0] = 0x67452301;    /* Load magic initialization constants.*/
  context->state[1] = 0xefcdab89;
  context->state[2] = 0x98badcfe;
  context->state[3] = 0x10325476;
}
/* -----------------------------------------------------------------------------------
   MD5 block update operation. Continues an MD5 message-digest
   operation, processing another message block, and updating the  context.
-------------------------------------------------------------------------------------*/
                /* context */     /* input block */  /* length of input block */
void MD5Update (MD5_CTX *context, unsigned char *input,unsigned int inputLen  )
{
  unsigned int i, index, partLen;
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);   /* Compute number of bytes mod 64 */
  if ( (context->count[0] += ( (UINT4)inputLen << 3) ) < ( (UINT4)inputLen << 3 ) )
      context->count[1]++;
  context->count[1] += ((UINT4)inputLen >> 29);
  partLen = 64 - index;
  /* Transform as many times as possible.*/
  if (inputLen >= partLen)
  {
   MD5_memcpy( (POINTER)&context->buffer[index], (POINTER)input, partLen);
   MD5Transform (context->state, context->buffer);
   for (i = partLen; i + 63 < inputLen; i += 64)
         MD5Transform (context->state, &input[i]);
   index = 0;
  }
  else
      i = 0;
  /* Buffer remaining input */
  MD5_memcpy( (POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i );
}
/*
  MD5 finalization. Ends an MD5 message-digest operation, writing the
  the message digest and zeroizing the context.
*/
void MD5Final (unsigned char digest[16], MD5_CTX *context)
                /* message digest */      /* context */
{
  unsigned char bits[8];
  unsigned int index, padLen;
  Encode (bits, context->count, 8); /* Save number of bits */
  /* Pad out to 56 mod 64.*/
  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  padLen = (index < 56) ? (56 - index) : (120 - index);
  MD5Update (context,(unsigned char*) PADDING, padLen);
  MD5Update (context, bits, 8);   /* Append length (before padding) */
  Encode (digest, context->state, 16); /* Store state in digest */
  /* Zeroize sensitive information.*/
  MD5_memset ((POINTER)context, 0, sizeof (*context));
}
/* MD5 basic transformation. Transforms state based on block.
 */
void MD5Transform (UINT4 state[4],unsigned char block[64])
{
   UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
   Decode (x, block, 64);
  /* Round 1 */
  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  /* Round 2 */
  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  /* Round 3 */
  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
  /* Round 4 */
  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;
  /* Zeroize sensitive information.*/
  MD5_memset ((POINTER)x, 0, sizeof (x));
}
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
  a multiple of 4.
 */
void Encode (unsigned char *output,UINT4 *input,unsigned int len)
{
  unsigned int i, j;
  for (i = 0, j = 0; j < len; i++, j += 4)
  {
   output[j] = (unsigned char)(input[i] & 0xff);
   output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
   output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
   output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  }
}
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
  a multiple of 4.
 */
void Decode (UINT4 *output,unsigned char *input,unsigned int len)
{
  unsigned int i, j;
  for (i = 0, j = 0; j < len; i++, j += 4)
   output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
}
/* Note: Replace "for loop" with standard memcpy if possible. */
void MD5_memcpy (POINTER output,POINTER input,unsigned int len)
{
  unsigned int i;
  for (i = 0; i < len; i++)
     output[i] = input[i];
}
/* Note: Replace "for loop" with standard memset if possible. */
void MD5_memset (POINTER output,int value,unsigned int len)
{
  unsigned int i;
  for (i = 0; i < len; i++)
    ((char *)output)[i] = (char)value;
}
/* Digests a string and prints the result. */
char* MDString (char *string)
{
  MD5_CTX context;
  unsigned char digest[16];
  char output1[33];
  static  char output[33]={"\0"};
  unsigned int len = strlen (string);
  int i;
  MD5Init (&context);
  MD5Update (&context, (unsigned char*)string, len);
  MD5Final (digest, &context);
  for (i = 0; i < 16; i++)
  {
     sprintf(&(output1[2*i]),"%02x",(unsigned char)digest[i]);
     //sprintf(&(output1[2*i+1]),"%02x",(unsigned char)(digest[i]<<4));
  }
  for(i=0;i<32;i++)
  output[i]=output1[i];
  return output;
}
/*
 * proxyserver.c
 *
 *  Created on: Oct 9, 2016
 *      Author: JKM
 */
#include<dirent.h>
#include"proxyserver.h"
#include <syslog.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
int RequestChannel;
char* gAnalyzerIP;
char* gUser;
char* gPass;
int GSocket;
int gMySock[16];
int threadIdx=0;
char byte_array[2600];
int gGettingStep=0;
char uri[300];
time_t StartTm,EndTm;
int bMetadataSaving=0;
int bZipFileSaving=0;
unsigned char *memoryband[100];
int bandsize[100];
int bandCount = 0;
char ZipSerFileName[1000][300];
int ZipSerFileNum=0;
int ZipCountidx;
char NetInfo[128];
char EventString[1 * 1024 * 1024];
EVENT_LOG myEventLogs[2000];
int EventCount=0;
int EventCountInSearchRange=0;
int FindIdx(char* IP);
int FindEmpty();
void* MyEquipmentthread(void* arg);
pthread_t thread_noEQ[16];
int gCapturing[16];
SESSION sessions[16];
#define MAX_NUM 16
#define MAX 1024
#define fileread_buf 128
AlarmInfo RealAlarmEvent[16][1000];
//#define DBG_LOG
#define ZIP_HOME "/tmp"
/////////////////////////////////////////////////
char* strnncat(char*s1,char*s2,int n)
{
   int len = strlen(s1);
   for(int i=0;i<n;i++)
   {
      s1[len+i]=s2[i];
   }
   return s1;
}
void SearchAppendString(char *buff,char* token1,char* token2,char* dispName)
{
   int len = strlen(token1);
   int sidx = stringcmp((char*)buff,token1,len);
   int eidx = stringcmp((char*)buff,token2,len+1);
   if(sidx >=0 && eidx>=0 && eidx>sidx+len)   {
      strcat(EventString,dispName);strnncat(EventString,&buff[sidx+len],eidx-sidx-len);
      strcat(EventString,"\n");
   }
}
char* GetDeviceInfo(char* AnalyserIP)
{
   char buff[102400];
   memset(EventString,0,sizeof(EventString));
   gAnalyzerIP = AnalyserIP;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return "Param Error";
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      return "socket fail2";
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      close(GSocket);
      return "Equipment connect fail";
   }
   int length = 0;//GET /PSIA/System/deviceInfo HTTP/1.1
   length = sprintf(byte_array,"GET /PSIA/System/deviceInfo HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",AnalyserIP);
   write(GSocket,byte_array,length);
   //   printf("%s",byte_array);
   memset(EventString,0,sizeof(EventString));
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(stringcmp((char*)buff,"<urn:DeviceInfo",15)>=0){
         SearchAppendString((char*)buff,"<urn:deviceName>","</urn:deviceName>","deviceName:");
         SearchAppendString((char*)buff,"<urn:deviceID>","</urn:deviceID>","deviceID:");
         SearchAppendString((char*)buff,"<urn:deviceDescription>","</urn:deviceDescription>","deviceDescription:");
         SearchAppendString((char*)buff,"<urn:model>","</urn:model>","model:");
         SearchAppendString((char*)buff,"<urn:serialNumber>","</urn:serialNumber>","serialNumber:");
         SearchAppendString((char*)buff,"<urn:macAddress>","</urn:macAddress>","macAddress:");
         SearchAppendString((char*)buff,"<urn:firmwareVersion>","</urn:firmwareVersion>","firmwareVersion:");
         SearchAppendString((char*)buff,"<urn:bootVersion>","</urn:bootVersion>","bootVersion:");
         SearchAppendString((char*)buff,"<urn1:httpPort>","</urn1:httpPort>","httpPort:");
         SearchAppendString((char*)buff,"<urn1:httpsPort>","</urn1:httpsPort>","httpsPort:");
         SearchAppendString((char*)buff,"<urn1:rtspPort>","</urn1:rtspPort>","rtspPort:");
         SearchAppendString((char*)buff,"<urn1:httpsEnabled>","</urn1:httpsEnabled>","httpsEnabled:");
         SearchAppendString((char*)buff,"<urn1:webAuthenticationType>","</urn1:webAuthenticationType>","webAuthenticationType:");
         SearchAppendString((char*)buff,"<urn1:rtspAuthenticationEnabled>","</urn1:rtspAuthenticationEnabled>","rtspAuthenticationEnabled:");
         close(GSocket);
         return EventString;
      }
   }
   return EventString;
}
int InsertAnalyser(char *AnalyserName,char* AnalyserIP,char* AnalyserPort,char* ServerIP,char* ServerPort,char* user,char* pass,char* resol,char* commType)
{
   int ret=0;
   ret=Check_MysqlData(AnalyserName,AnalyserIP,AnalyserPort,ServerIP,ServerPort,user, pass, resol, commType);
   if(ret !=9)
      return InsertMysqlData(AnalyserName,AnalyserIP,AnalyserPort,ServerIP,ServerPort,user, pass, resol, commType);
   else
     return 0;
}
int DeleteAnalyser(char* AnalyserIP)                                                                           //8.删除设备   参数:设备ip   返回:成功或失败的提示。
{
   int ret=0;
   MYSQL *conn;
   char *server="localhost";
   char *user="root";
   char *password="123";
   char *database="opentutorials";
   char query[255];
   if(!(conn=mysql_init((MYSQL*)NULL))){
      printf("init fail\n");
      return -1;
   }
   if(!mysql_real_connect(conn,server,user,password,NULL,3306,NULL,0)){
      printf("connect error.\n");
      return -1;
   }
   if(mysql_select_db(conn,database)!=0){
      mysql_close(conn);
      printf("select_db_fail.\n");
      return -1;
   }
   sprintf(query, "delete from tbl_deviceinfo where equipmentip='%s';",AnalyserIP);
   if(mysql_query(conn,query)){
      printf("query fail\n");
      return -1;
   }
   mysql_close(conn);
   return ret;
}
char* GetAnalyserAll()                                                                                    //9.鏌ヨ璁惧   鍙傛暟锛氭棤      杩斿洖锛氬垎鏋愬櫒鐨勫悕绉板拰ip
{
   memset(EventString,0,sizeof(EventString));
   int ret = Read_MysqlData();
   if(ret==0)   return    EventString;
   else  return "fail";
}
char* GetAnalyserNet(void)                                                                                    //5.鑾峰彇褰撳墠杞彂鍣ㄧ殑ip      鍙傛暟锛氭棤銆傝繑鍥烇細褰撳墠鐨刬p鍦板潃瀛愮綉鎺╃爜鍜岀綉鍏?
{
   memset(NetInfo,0,128);
   /// function
   return NetInfo;
}
int SetAnalyserNet(char* NetInfo)                                                                              //6.鎵嬪姩璁剧疆杞彂鍣ㄧ殑ip      鍙傛暟锛歩p锛屽瓙缃戞帺鐮侊紝榛樿缃戝叧   銆?杩斿洖锛氫慨鏀圭姸鎬?鎴愬姛鎴栬€呭け璐?
{
   int ret=0;
   /// function
   return ret;
}
//// 功能:查看分析器连接状态
//// 输入:分析器IP
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int GetConnectState(char* AnalyserIP)
{
   return net_test(AnalyserIP,"80");
}
//// 功能:重启分析器
//// 输入:分析器IP,用户,密码,RestartKind=0(GPIO out),RestartKind=1(Protocol Mode), no(GPIO Pin no=>0~15)
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int RestartAnalyser(char* AnalyserIP,char* user,char* pass,int RestartKind,int no)
{
   switch(RestartKind){
   case 0:
      if(no<0 || no>15) return -1;
      GPIOinit();
      GPIOoutput(no);
      printf("GPIO output no=%d",no);
      return 0;
   case 1:
      return RestartCommand(AnalyserIP,user,pass);
   default:
      return -1;
   }
   return 0;
}
//// 功能:开始查看实时监控
//// 输入:分析器IP,用户,密码
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int RealEventStart(char* AnalyserIP,char* user,char* pass)
{
   char buff[10240];
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   int bbbb=0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return -1;
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   int length = 0;
   length = sprintf(byte_array,"POST /PSIA/VIQ/System/sessions/permanent HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",AnalyserIP);
   write(GSocket,byte_array,length);
//   printf("%s",byte_array);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0 && bbbb==0)
      {
         // analyse reception
         MakeAuthorizedPacketReal(buff,length,"POST","/PSIA/VIQ/System/sessions/permanent");
         zclock_sleep(100);
         write(GSocket,byte_array,strlen(byte_array));
//         printf("%s\n",(char*)byte_array);
         bbbb=1;
         continue;
      }
      if(bbbb==1){
         int sidx = stringcmp((char*)buff,"<urn:id>",8);
         if(sidx >=0){//<urn:ViqDateTimeInterval urn:version="1.0" xmlns:urn="urn:videoiq-com"><urn:startTime urn:version="1.0"><urn:date>2016-08-18T01:07:20.749</urn:date><urn:offset>0</urn:offset></urn:startTime><urn:endTime urn:version="1.0"><urn:date>2016-08-29T08:33:48.231</urn:date><urn:offset>0</urn:offset></urn:endTime></urn:ViqDateTimeInterval>
            int eidx = stringcmp((char*)buff,"</urn:id>",9);
            if(eidx>=0 && sidx+8<eidx){
               int Idx=FindIdx(gAnalyzerIP);
               if(Idx==-1){
                  Idx = FindEmpty();
                  strcpy(sessions[Idx].IP,gAnalyzerIP);
                  memcpy(sessions[Idx].ID,&buff[sidx+8],eidx-sidx-8);
               }
               memcpy(sessions[Idx].ID,&buff[sidx+8],eidx-sidx-8);
               bbbb=2;
//               printf("SessionID =======> %s\n",(char*)sessions[Idx].ID);
               break;
            }
         }
      }
   }
   close(GSocket);
   int Idx=FindIdx(gAnalyzerIP);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   char uri[200];
   sprintf(uri,"/PSIA/Custom/Event/notification/notificationStream?sessionId=%s",sessions[Idx].ID);
   length = sprintf(byte_array,"GET %s HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",uri,gAnalyzerIP);
   write(GSocket,byte_array,strlen(byte_array));
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0 && bbbb==2)
      {
         char uri[200];
         sprintf(uri,"/PSIA/Custom/Event/notification/notificationStream?sessionId=%s",sessions[Idx].ID);
         MakeAuthorizedPacketReal(buff,length,"GET",uri);
         write(GSocket,byte_array,strlen(byte_array));
//         printf("%s\n",(char*)byte_array);
         bbbb=3;
         continue;
      }
      /*if(memorycmp((unsigned char*)buff,length, "ViqEventNotificationAlert",25)>0 && bbbb==3 )
      {
         if(RealAlarmEventNum[Idx]<1000-1)   {
            memset(&RealAlarmEvent[Idx][RealAlarmEventNum[Idx]],0,sizeof(AlarmInfo));
            AnalyXMLUrnEVENT(buff,length,&RealAlarmEvent[Idx][RealAlarmEventNum[Idx]++]);
         }
         continue;
      }
*/
      if(stringcmp(buff,"multipart/text; boundary=VIQeventEVENTeventVIQ",46)>0 && bbbb==3)
///      if(stringcmp(buff,"HTTP/1.1 200 OK",15)>0 && bbbb==3)
      {
         gMySock[Idx]=GSocket;
         pthread_create(&thread_noEQ[Idx],NULL,&MyEquipmentthread,(void*)Idx);//super(void*)(&equipments[0])
         gCapturing[Idx]=1;
         return 0;
      }
   }
   return -2;
}
//// 功能:停止查看实时监控
//// 输入:分析器IP
//// 输出:0(成功), -1(初始化失败)
int RealEventStop(char* AnalyserIP)
{
   int Idx=FindIdx(AnalyserIP);
   if(Idx>=0 && Idx<16){
      gCapturing[Idx]=0;
      sessions[Idx].IP[0]=0;
   }
   else return -1;
   return 0;
}
//// 功能:查看实时监控线程
//// 输入:分析器编号
void* MyEquipmentthread(void* arg)
{
   int eidx = (int)arg;
   int length;
   char buff[10240];
   puts("Step.2 ========>Equipment Thread is strarted......");
   while(gCapturing[eidx]==1)
   {
      length=read(gMySock[eidx],&buff,sizeof(buff)-1);
      if(length<=0)
      {
         printf("\n \\\\\\ Read error \n");
         break;
      }
      else if(length>0){
         if(memorycmp((unsigned char*)buff,length, "ViqEventNotificationAlert",25)>0 )
         {
            if(RealAlarmEventNum[eidx]<1000-1)   {
               memset(&RealAlarmEvent[eidx][RealAlarmEventNum[eidx]],0,sizeof(AlarmInfo));
               AnalyXMLUrnEVENT(buff,length,&RealAlarmEvent[eidx][RealAlarmEventNum[eidx]++]);
            }
//            printf("%s=============================%d\n",(char*)buff,RealAlarmEventNum[eidx]);
//            printf("%s\n",RealAlarmEvent[eidx][1].channelId);
            continue;
         }
      }
   }
   close(gMySock[eidx]);
   puts("Equipment Thread is stoped..");
   pthread_exit((void*)thread_noEQ[eidx]);
}
               /*
               --VIQeventEVENTeventVIQ
                  Content-type: application/xml; charset="UTF-8"
                  <urn:ViqEventNotificationAlert urn:version="1.0" xmlns:urn="urn:videoiq-com">
                  <urn:channelId>3</urn:channelId>
                  <urn:eventId>6478</urn:eventId>
                  <urn:startTime urn:version="1.0">
                  <urn:date>2016-11-07T08:50:54.063</urn:date><urn:offset>28800000</urn:offset>
                  </urn:startTime>
                  <urn:clipUrl>/media/clips/3/2016/11/7/8/3/2016_11_07-08_50_48.mp4</urn:clipUrl>
                  <urn:ruleId>17</urn:ruleId>
                  <urn:ruleName>Video Lost Rule</urn:ruleName>
                  <urn:soiId>-1</urn:soiId>
                  <urn:soiName>Reserved SOI</urn:soiName>
                  <urn:activity>Video Lost</urn:activity>
                  <urn:objectType>Unknown</urn:objectType>
                  <urn:aborted>false</urn:aborted>
                  <urn:acknowledged>false</urn:acknowledged>
                  <urn:ackNotes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/><urn:falseAlarm>false</urn:falseAlarm>
                  <urn:debugMessage>2016/11/07 08:50:54.63: Video lost detected: 101. Event (id=6478) started.</urn:debugMessage>
                  </urn:ViqEventNotificationAlert>
                  */
//// 功能:获取实时监控报警
//// 输入:分析器IP
//// 输出:结果
char* GetRealEvent(char* AnalyserIP)                                             //3.查看实时监控         参数:分析器IP。返回:信道号及其对应的视频流地址
{
   int Idx=FindIdx(AnalyserIP);
   memset(EventString,0,sizeof(EventString));
   if(Idx>=0 && Idx<16 && RealAlarmEventNum[Idx]>0){
      for (int i=0;i<RealAlarmEventNum[Idx];i++)
      {
         strcat(EventString,RealAlarmEvent[Idx][i].channelId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].eventId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].startTime);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].endTime);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].clipUrl);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].ruleId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].ruleName);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].soiId);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].soiName);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].activity);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].objectType);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].aborted);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].acknowledged);
         strcat(EventString,"\n");
         strcat(EventString,RealAlarmEvent[Idx][i].debugMessage);
         strcat(EventString,"\n");
      }
   }
   return EventString;
}
//// 查询报警记录
//// 输入:分析器IP,开始时间,结束时间,信道号,用户,密码
//// 输出:查询结果。(包括信道号,报警时间,播放地址,等。)
char* GetPHPSearchMetaInfo(char* AnalyserIP,char* user,char* pass,int Channel,int s_year,int s_month,int s_day,int s_hour,int s_minute,int s_sec,int e_year,int e_month,int e_day,int e_hour,int e_minute,int e_sec)
{
   openlog("proxyserver", LOG_CONS | LOG_PID, 0);
   char* result;
   MyTime mstart_time;
   mstart_time.Year=s_year;
   mstart_time.Month=s_month;
   mstart_time.Day=s_day;
   mstart_time.Hour=s_hour;
   mstart_time.Min=s_minute;
   mstart_time.Sec=s_sec;
   MyTime mEnd_time;
   mEnd_time.Year=e_year;
   mEnd_time.Month=e_month;
   mEnd_time.Day=e_day;
   mEnd_time.Hour=e_hour;
   mEnd_time.Min=e_minute;
   mEnd_time.Sec=e_sec;
   result=GetSearchMetaInfo(AnalyserIP,user,pass,Channel,&mstart_time,&mEnd_time);
   return result;
}
char* GetMp4Info(char* AnalyserIP,char* user,char* pass,int Channel,char* path)
{
   char Pathbuffer[100] = {0};
   char buff[102400];
   RequestChannel = Channel;
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   bMetadataSaving = 0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return "-1";
   int length;
   int bMp4FileSaving=0;
   int Mp4FileAppendingSiz=0;
   int Mp4FileSiz;
   int file;
   char* result;
   char* httpUri = path;
   int iidx =0,llen=0;
   llen = sprintf(byte_array,"GET %s %s",httpUri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Pragma: no-cache\r\n"); iidx+=llen;
   //   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",Equipments[EquipIdx].ip); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:80\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n\r\n"); iidx+=llen;
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail2");
      return "-3";
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      printf("Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return "-4";
   }
   //printf("byte_array==%s",byte_array);
   write(GSocket,byte_array,iidx);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      //printf("buff==%s",buff);
      if(length<=0)
      {
         close(GSocket);
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
      {
         // analyse reception
         //printf("===================================");
         MakeAuthorizedPacketSimp(buff,length,"GET",httpUri);
         write(GSocket,byte_array,strlen(byte_array));
         continue;
      }
      if(httpUri[0]!=0){
         printf("**************************************flag======%d\n",bMp4FileSaving);
         if(bMp4FileSaving==1){
            if((file = open(Pathbuffer, O_RDWR, S_IREAD|S_IWRITE)) <0){
               printf("open file fail===2!\n");
               result="File open error(2)!";
               close(GSocket);
               return result;
            }
            lseek(file,0,SEEK_END);
            write(file,&buff[0], length);//CString m_data
            Mp4FileAppendingSiz += length;
            if (Mp4FileAppendingSiz>=Mp4FileSiz+8)
            {
               int sidx = memorycmp((unsigned char*)buff,length, "moov",4);
               Mp4FileSiz+=buff[sidx-4]*256*256*256+buff[sidx-3]*256*256+buff[sidx-2]*256+buff[sidx-1]; //movie box size
               printf("**************************************Mp4FileSiz======%d\n",Mp4FileSiz);
            }
            if (Mp4FileAppendingSiz>=Mp4FileSiz)
            {
               close(file);
               bMp4FileSaving = false;
               break;
            }
         }
         else
         {
            int sidx = memorycmp((unsigned char*)buff,length, "ftypmp42",8);
            if(sidx>=0){
               bMp4FileSaving= 1;
               Mp4FileAppendingSiz = length-sidx+4;
         printf("**************************************Mp4FileAppendingSiz======%d\n",Mp4FileAppendingSiz);
               if(length>36){
                  //printf("****************************************");
                  Mp4FileSiz = 24 + buff[sidx+20]*256*256*256+buff[sidx+21]*256*256+buff[sidx+22]*256+buff[sidx+23];// file_type box size + Media databox size
         printf("**************************************Mp4FileSiz======%d\n",Mp4FileSiz);
                  int count=0,i;
                  for(i=0;i<strlen(httpUri);i++){
                     if(httpUri[i]=='/') {
                        count++;
                        if(count>=9) break;
                     }
                  }
                  sprintf(Pathbuffer,"/tmp/%s",/*RequestChannel*/&httpUri[i+1]); iidx+=llen;
                  if((file = open(Pathbuffer,O_CREAT|O_RDWR,S_IREAD|S_IWRITE)) <0){
                     printf("open file fail===1!\n");
                     result="File open error(1)!";
                     close(GSocket);
                     return result;
                  }
                  write(file,&buff[sidx-4], length-sidx+4);
               }
            }
         }
      }
   }
   close(GSocket);
   return "ok";
}
void DownloadSerFile(const char* uri)
{
   return;
   char buff[1024];
   sprintf(buff, "cd " ZIP_HOME "/tmpZip/;" " curl -u supervisor:supervisor 'http://%s%s' -O" , gAnalyzerIP, uri);
   int ret = system(buff);
   printf("DownloadSerFile, ret=%d, %s\n", ret, buff);
}
//// 查询报警记录
//// 输入:分析器IP,开始时间,结束时间,信道号,用户,密码
//// 输出:查询结果。(包括信道号,报警时间,播放地址,等。)
char* GetSearchMetaInfo(char* AnalyserIP,char* user,char* pass,int Channel,lpMyTime StartTm,lpMyTime EndTm)
{
   char buff[102400];
   //reset
   memset(ZipSerFileName, 0, sizeof(ZipSerFileName));
   ZipSerFileNum=0;
   ZipCountidx;
   EventCount = 0;
   EventCountInSearchRange = 0;
   RequestChannel = -1;
   memset(myEventLogs, 0, sizeof(myEventLogs));
   memset(EventString, 0, sizeof(EventString));
   memset(byte_array, 0, sizeof(byte_array));
   RequestChannel = Channel;
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   bMetadataSaving = 0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return "-1";
//   if(gGettingStep>0) return -2;
   //chmod(ZIP_HOME,0777);
   //delete_file(ZIP_HOME "/tmp.zip");
   //delete_file(ZIP_HOME "/tmpZip/*");
   struct tm ttm;
   time_t StepTm;
   int length;
   char* httpUri;
   char sss[24],eee[24];
   chmod(ZIP_HOME,0777);
   const char* folderr;
   const char* filename1;
   folderr=ZIP_HOME "/tmpZip";
   filename1=ZIP_HOME "/tmp.zip";
   struct stat sb;
   //if(stat(folderr,&sb)==0 && S_ISDIR(sb.st_mode))
   //   {
         delete_folder(ZIP_HOME "/tmpZip");
   //   }
   //if (doesFileExist(filename1))
   //   {
         delete_file(ZIP_HOME "/tmp.zip");
   //   }
   if(RequestChannel==0) httpUri= "/PSIA/VIQ/Event/metadata/0/files";
   if(RequestChannel==1) httpUri= "/PSIA/VIQ/Event/metadata/1/files";
   if(RequestChannel==2) httpUri= "/PSIA/VIQ/Event/metadata/2/files";
   if(RequestChannel==3) httpUri= "/PSIA/VIQ/Event/metadata/3/files";
   ttm.tm_year=StartTm->Year - 1900;
   ttm.tm_mon=StartTm->Month - 1;
   ttm.tm_mday=StartTm->Day;
   ttm.tm_hour=StartTm->Hour;
   ttm.tm_min=StartTm->Min;
   ttm.tm_sec=StartTm->Sec;
   time_t SearchStartTm = mktime(&ttm);
   SearchStartTm -= 8 * 60 * 60;
   ttm.tm_year=EndTm->Year - 1900;
   ttm.tm_mon=EndTm->Month - 1;
   ttm.tm_mday=EndTm->Day;
   ttm.tm_hour=EndTm->Hour;
   ttm.tm_min=EndTm->Min;
   ttm.tm_sec=EndTm->Sec;
   time_t SearchEndTm = mktime(&ttm);
   SearchEndTm -= 8 * 60 * 60;
#ifdef DBG_LOG
   syslog(LOG_USER | LOG_INFO, "SearchStartTm=%d,SearchEndTm=%d\n",(int)SearchStartTm,(int)SearchEndTm);
#endif
   //for (StepTm=SearchEndTm; StepTm>SearchStartTm; StepTm-=1*3600)
   {
      zclock_sleep(200);
//      printf(" ==== Search loop function execution  =================%d,%d \n",(int)StepTm,(int)SearchStartTm);
      struct sockaddr_in servaddr;
      int strlen1=sizeof(servaddr);
      if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
            syslog(LOG_USER | LOG_INFO, "socket fail2");
            return "-3";
      }
      memset(&servaddr,0,strlen1);
      servaddr.sin_family=AF_INET;
      inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
      servaddr.sin_port=htons(80);
      if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
         syslog(LOG_USER | LOG_INFO, "Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
         close(GSocket);
         return "-4";
      }
      time_t ttt=SearchStartTm;
      struct tm *t;
      //ttt-=4*60*60;
      t = localtime(&ttt);
      sprintf(sss,"%d-%02d-%02dT%02d:%02d:%02d.000",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);// = "2016-08-26T07:31:00.000";
      sss[23]=0;
      ttt=SearchEndTm;
      //ttt+=4*60*60;
      t = localtime(&ttt);
      sprintf(eee,"%d-%02d-%02dT%02d:%02d:%02d.000",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);// = "2016-08-26T07:31:00.000";
      eee[23]=0;
#ifdef DBG_LOG
      syslog(LOG_USER | LOG_INFO, "SearchStartTm=%s, SearchEndTm=%s\n", sss, eee);
#endif
      RequestMetaFiles(gAnalyzerIP,httpUri,sss,eee);
      write(GSocket,byte_array,strlen(byte_array));
      //#test
      {
         length=read(GSocket,&buff,sizeof(buff));
         //#test
         //{
         //   FILE * pFile = fopen ("pro.txt","rb");
         //   length = fread ( buff, 1, sizeof(buff), pFile );
         //   fclose(pFile);
         //   bMetadataSaving = 0;
         //}
         if(length<=0)
         {
            close(GSocket);
            syslog(LOG_USER | LOG_INFO, "length<=0");
         }
         if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
         {
            // analyse reception
            MakeAuthorizedPacketSimp111(buff,length,"GET",httpUri,sss,eee);
            write(GSocket,byte_array,strlen(byte_array));
         }
         //FILE * pFile = fopen ("pro.txt","rb");
         //length = fread ( buff, 1, sizeof(buff), pFile );
         xmlParserCtxtPtr ctxt;
         char chars[5000];
         xmlDocPtr doc; /* the resulting document tree */
         int res,totalres=0;
         char* pBuff = buff;
         while ((res = read(GSocket,chars,sizeof(chars))) > 0)
         {
            memcpy(pBuff, chars, res);
            pBuff+=res;
            totalres+=res;
         }
         *pBuff='\0';
         //res = fread ( chars, 1, sizeof(chars), pFile );
         char* urnbegin=strstr(buff, "<urn:");
         //ctxt = xmlCreatePushParserCtxt(NULL, NULL, urnbegin, totalres-(urnbegin-buff), NULL);
         //if (ctxt == NULL) {
         //   fprintf(stderr, "Failed to create parser context !\n");
         //}
         //
         //xmlParseChunk(ctxt, urnbegin, totalres-(urnbegin-buff), 1);
         //while ((res = fread ( chars, 1, sizeof(chars), pFile )) > 0) { // fread(chars, 4)
         //while ((res = read(GSocket,chars,sizeof(chars))) > 0) {
         //   xmlParseChunk(ctxt, chars, res, 0);
         //}
         //doc = ctxt->myDoc;
         doc = xmlParseDoc(urnbegin);
         //res = ctxt->wellFormed;
         //xmlFreeParserCtxt(ctxt);
         //if (!res) {
         //   fprintf(stderr, "Failed to parse %s\n", "pro.txt");
         //}
         /* Create xpath evaluation context */
         xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
         if(xpathCtx == NULL) {
            fprintf(stderr,"Error: unable to create new XPath context\n");
            xmlFreeDoc(doc);
            return(-1);
         }
         //xmlNode * root_element = xmlDocGetRootElement(doc);
         //{
         //   xmlNode *cur_node = NULL;
            //
         //   for (cur_node = root_element; cur_node; cur_node = cur_node->next) {
         //      if (cur_node->type == XML_ELEMENT_NODE) {
         //         syslog(LOG_USER | LOG_INFO, "node type: Element, name: %s    %s\n", cur_node->ns->prefix,cur_node->ns->href   );
         //      }
         //   }
         //}
         if(xmlXPathRegisterNs(xpathCtx, "urn", "urn:videoiq-com") != 0) {
            fprintf(stderr,"Error: unable to register NS with prefix=\"\" and href=\"\"\n");
            return(-1);
         }
         xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression("//urn:strings", xpathCtx);
         if(xpathObj == NULL) {
            fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", "urn:strings");
            xmlXPathFreeContext(xpathCtx);
            xmlFreeDoc(doc);
            return(-1);
         }
         ZipSerFileNum=0;
         xmlNodeSetPtr nodes = xpathObj->nodesetval;
         for(int i = 0; i<nodes->nodeNr; i++)
         {
            const char* uri=xmlNodeGetContent(nodes->nodeTab[i]);
            strcpy(ZipSerFileName[ZipSerFileNum], uri+18);
            ZipSerFileNum++;
            syslog(LOG_USER | LOG_INFO, "%s\n", uri+18);
         }
         syslog(LOG_USER | LOG_INFO, "ser parse finished\n");
         xmlFreeDoc(doc);
         //fclose(pFile);
         close(GSocket);
      }
   }//for
   //////// get
   syslog(LOG_USER | LOG_INFO, "ZipSerFileNum=%d\n", ZipSerFileNum);
   for(ZipCountidx = 0; ZipCountidx<ZipSerFileNum; ZipCountidx++)
   {
   syslog(LOG_USER | LOG_INFO, "ZipSerFileName[%d]=%s\n", ZipCountidx, (char*)ZipSerFileName[ZipCountidx]);
      if(stringcmp((char*)ZipSerFileName[ZipCountidx],".ser",4)>=0)
      {
         DownloadSerFile(ZipSerFileName[ZipCountidx]);
         continue;
      }
      zclock_sleep(200);
//      printf(" ==== Search loop function execution  =================%d,%d \n",(int)StepTm,(int)SearchStartTm);
      struct sockaddr_in servaddr;
      int strlen1=sizeof(servaddr);
      if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
            syslog(LOG_USER | LOG_INFO, "socket fail2");
            return "-3";
      }
      memset(&servaddr,0,strlen1);
      servaddr.sin_family=AF_INET;
      inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
      servaddr.sin_port=htons(80);
      if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
         syslog(LOG_USER | LOG_INFO, "Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
         close(GSocket);
         return "-4";
      }
      httpUri = ZipSerFileName[ZipCountidx];//"/media/metadata/0/2016/8/25/1/2/s_5b4103706a6411e6855e574ec330e01d_20160825_013633_93003.zip";
      RequestZipSerFiles(gAnalyzerIP, httpUri);
      write(GSocket,byte_array,strlen(byte_array));
//      printf("==========================================================================================================================>>>>>>>>\n");
//      printf("%s",byte_array);
      while(1){
         length=read(GSocket,&buff,sizeof(buff)-1);
         if(length<=0)
         {
            close(GSocket);
            break;
         }
         if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
         {
            // analyse reception
            MakeAuthorizedPacketSimp(buff,length,"GET",httpUri);
            write(GSocket,byte_array,strlen(byte_array));
//            printf("%s",byte_array);
            continue;
         }
         if(memorycmp((unsigned char*)buff,length, "Error 404 NOT_FOUND",19)>0)
         {
            break;
         }
         if(bZipFileSaving==1){
            //下载Zip filesave
            int file;
            if((file = open(ZIP_HOME "/tmp.zip", O_RDWR, S_IREAD|S_IWRITE)) <0)
               printf("open file fail!\n");
            lseek(file,0,SEEK_END);
            write(file,&buff[0], length);//CString m_data
            close(file);
            //mp4Save(_T("tmp.zip"),(unsigned char*)buffer, size,CFile::modeWrite| CFile::typeBinary);
            char tmppattern[8]; tmppattern[0]='P';tmppattern[1]='K';tmppattern[2]=0x05;tmppattern[3]=0x06;tmppattern[4]=0x00;tmppattern[5]=0x00;
            if(memorycmp((unsigned char*)&buff[0],length, tmppattern,8)>=0) {
               bZipFileSaving = 0;
               close(GSocket);
               //Convert Zip file to Ser file
               int ret=system("unzip -o " ZIP_HOME "/tmp.zip -d " ZIP_HOME "/tmpZip");
#ifdef DBG_LOG
               syslog(LOG_USER | LOG_INFO, "unzip1 ret=%d\n", ret);
#endif
            }
         }
         else{
            int sidx = stringcmp((char*)buff,"PK",2);
            if(sidx >=0){//下载Zip filesave
               delete_file(ZIP_HOME "/tmp.zip");
               //delete_file(ZIP_HOME "/tmpZip/*");
               //下载Zip filesave
               bZipFileSaving = 1;
               int file;
               if((file = open(ZIP_HOME "/tmp.zip",O_CREAT|O_RDWR,S_IREAD|S_IWRITE)) <0)
                  printf("open file fail!\n");
               write(file,&buff[sidx], length-sidx);//CString m_data
               close(file);
               char tmppattern[8]; tmppattern[0]='P';tmppattern[1]='K';tmppattern[2]=0x05;tmppattern[3]=0x06;tmppattern[4]=0x00;tmppattern[5]=0x00;
               if(memorycmp((unsigned char*)&buff[sidx],length-sidx, tmppattern,8)>=0)
                {
                  bZipFileSaving = 0;
                  close(GSocket);
                  //Convert Zip file to Ser file
                  int ret=system("unzip -o " ZIP_HOME "/tmp.zip -d " ZIP_HOME "/tmpZip");
#ifdef DBG_LOG
               syslog(LOG_USER | LOG_INFO, "unzip0 ret=%d\n", ret);
#endif
               }
            }
         }
      }//while
   }//for
   int res=0,num=0; //得长度
   filenames filename[100];
   num = GetFileNameInFolder(ZIP_HOME "/tmpZip",filename);
   char stringpath[1024];
   unsigned char p_save_buf[6144000];
   for(int i=0;i<num;i++)
   {
      if(filename[i].name[0]=='.') continue;
      memset(stringpath,0,1024);
      memcpy(stringpath, ZIP_HOME "/tmpZip/",13);
      strcat(stringpath,filename[i].name);
      int handle;
      if((handle = open(stringpath, O_RDWR, S_IREAD|S_IWRITE)) <0)
         printf("open file fail!\n");
      res = read(handle,p_save_buf,6144000);//CString m_data
      close(handle);
      AnalySerFile((char*)p_save_buf,res,SearchStartTm,SearchEndTm);
   }
   memset(EventString,0,sizeof(EventString));
   //for(i=0;i<1000;i++)
#ifdef DBG_LOG
   syslog(LOG_USER | LOG_INFO, "EventCount===========================%d\n",EventCount);
   syslog(LOG_USER | LOG_INFO, "EventCountInSearchRange==============%d\n",EventCountInSearchRange);
#endif
   strcat(EventString,"[");
   for (int i=0;i<EventCount;i++)
   {
#ifndef DBG_LOG
      if (! myEventLogs[i].InSearchRange)
         continue;
#endif
      strcat(EventString,"{");
      strcat(EventString,"\"datetime\":\"");
      strcat(EventString,myEventLogs[i].Date);
      strcat(EventString," ");
      strcat(EventString,myEventLogs[i].Time);
      strcat(EventString,"\",\"path\":\"");
      strcat(EventString,myEventLogs[i].clipUrl);
      strcat(EventString,"\"}");
      if (i < EventCount - 1)
         strcat(EventString,",");
      //strcat(EventString,myEventLogs[i].Date);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].Time);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].Duration);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].clipUrl);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].Region);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].Rule);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].DebugMessageS);
      //strcat(EventString,"\n");
      //strcat(EventString,myEventLogs[i].DebugMessageE);
      //strcat(EventString,"\n");
   }
   strcat(EventString,"]");
   return EventString;
   //return "333333333333333333333333333333333333333333333333333333333333333333789";
}
//// 功能:重启分析器(协议)
//// 输入:分析器IP,用户,密码
//// 输出:0(成功), -1(初始化失败),-2(连接失败)
int RestartCommand(char* AnalyserIP,char* user,char* pass)
{
   char buff[10240];
   gAnalyzerIP = AnalyserIP;
   gUser = user;
   gPass = pass;
   int bbbb=0;
   if(AnalyserIP==NULL || AnalyserIP[0]==0) return -1;
   struct sockaddr_in servaddr;
   int strlen1=sizeof(servaddr);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      syslog(LOG_USER | LOG_INFO, "socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      syslog(LOG_USER | LOG_INFO, "Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   int length = 0;
   length = sprintf(byte_array,"PUT /PSIA/System/reboot HTTP/1.1\r\nContent-Type: text/xml\r\nHost: %s\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n",AnalyserIP);
   write(GSocket,byte_array,length);
//   printf("%s",byte_array);
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "WWW-Authenticate:",17)>0)
      {
         // analyse reception
         MakeAuthorizedPacketRestart(buff,length,"PUT","/PSIA/System/reboot");//////????????
         bbbb=1;
         break;
      }
      if(memorycmp((unsigned char*)buff,length, "HTTP/1.1 200 OK",15)>0) break;
   }
   close(GSocket);
   if (bbbb==0)
   {
      syslog(LOG_USER | LOG_INFO, "bbbb==0");
      return -1;
   }
//   zclock_sleep(200);
   if((GSocket=socket(PF_INET,SOCK_STREAM,0))<0){
      syslog(LOG_USER | LOG_INFO, "socket fail2");
      return -1;
   }
   memset(&servaddr,0,strlen1);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,gAnalyzerIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(80);
   if(connect(GSocket,(struct sockaddr*)&servaddr,strlen1)<0){
      syslog(LOG_USER | LOG_INFO, "Equipment connect fail-%s:%d\n",gAnalyzerIP,80);
      close(GSocket);
      return -2;
   }
   write(GSocket,byte_array,strlen(byte_array));
   while(1){
      memset(buff,0,sizeof(buff));
      length=read(GSocket,&buff,sizeof(buff));
      if(length<=0)
      {
         close(GSocket);
         return -3;
      }
      if(memorycmp((unsigned char*)buff,length, "HTTP/1.1 200 OK",15)>0) break;
   }
   close(GSocket);
   return 0;
}
void RequestMetaFiles(char* AnaylyIP,char* httpUri,char* Tm1,char* Tm2)
{
#ifdef DBG_LOG
   syslog(LOG_USER | LOG_INFO, "RequestMetaFiles, httpUri=%s\n", httpUri);
#endif
   char byte_arrayxxx[1600];
   int lengthxxx = 0;
   memset(byte_array,0,sizeof(byte_array));
   UrnStringToBytes(byte_arrayxxx,&lengthxxx,Tm1,Tm2);// xml
   int iidx =0,llen=0;;
   llen = sprintf(byte_array,"GET %s %s",httpUri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: %d\r\n",lengthxxx); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Content-Type: text/xml\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:%d\r\n",AnaylyIP,80); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
}
void RequestZipSerFiles(char* AnaylyIP,char* httpUri)
{
#ifdef DBG_LOG
   syslog(LOG_USER | LOG_INFO, "RequestZipSerFiles, httpUri=%s\n", httpUri);
#endif
   memset(byte_array,0,sizeof(byte_array));
   int iidx =0,llen=0;;
   llen = sprintf(byte_array,"GET %s %s",httpUri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"User-Agent: Java/1.6.0_05\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:%d\r\n",AnaylyIP,80); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n\r\n"); iidx+=llen;
}
void UrnStringToBytes(char* byte_array_out,int * byte_array_length_out,char* StartTim,char* EndTime)
{
   int idx=0,len;
   idx = sprintf(byte_array_out,"<urn:ViqDateTimeInterval urn:version=");
   byte_array_out[idx++]=0x22;//'"'
   byte_array_out[idx++]=0x31;//'1'
   byte_array_out[idx++]=0x2e;//'.'
   byte_array_out[idx++]=0x30;//'0'
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx]," xmlns:urn=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"urn:videoiq-com");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"><urn:startTime urn:version=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   byte_array_out[idx++]=0x31;//'1'
   byte_array_out[idx++]=0x2e;//'.'
   byte_array_out[idx++]=0x30;//'0'
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"><urn:date>%s</urn:date><urn:offset>0</urn:offset></urn:startTime><urn:endTime urn:version=",StartTim);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   byte_array_out[idx++]=0x31;//'1'
   byte_array_out[idx++]=0x2e;//'.'
   byte_array_out[idx++]=0x30;//'0'
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"><urn:date>%s</urn:date><urn:offset>0</urn:offset></urn:endTime></urn:ViqDateTimeInterval>",EndTime);idx+=len;//2016-08-26T09:31:00.000
   *byte_array_length_out = idx;
}
///// for Restart
void MakeAuthorizedPacketRestart(char* buff,int length, char* Method,char* uri)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,nonce_buf2,auth_buf3,domain_buf4,len);
//   printf("%s,%s,%s,%s\n",Realm_buf1,nonce_buf2,auth_buf3,domain_buf4);
//   printf("%d,%d,%d,%d\n",len[0],len[1],len[2],len[3]);
   char* cnonce_buf="08a9d86c1b5e45963cf82f43dca59c51";
   //Authorization: Digest username="supervisor",realm="VideoIQ",nonce="IcTFMVgBAAAHmywcsJspvAlyBqpQy",uri="/PSIA/System/reboot",algorithm="MD5",cnonce="08a9d86c1b5e45963cf82f43dca59c51",nc=00000001,qop="auth",response="0c31efdd27017412cd0b6aaf550da084"
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[1]]=0;
   auth_buf3[len[2]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   int lengthxxx = 0;
   int iidx = 0;
   AurhorizationResponseBytesReatart(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   int llen = sprintf(byte_array,"%s %s HTTP/1.1\r\n",Method,uri); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Type: text/xml\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: 0\r\n"); iidx+=llen;
   //               llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0;
}
//for real event
void MakeAuthorizedPacketReal(char* buff,int length, char* Method,char* uri)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,nonce_buf2,auth_buf3,domain_buf4, len);
   char* cnonce_buf="163acd0e58793a190f29ee879d4b224f";//"08a9d86c1b5e45963cf82f43dca59c51";
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[1]]=0;
   auth_buf3[len[2]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
//   printf("%s:%s:%s:%s:auth:%s\n",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   int lengthxxx = 0;
   int iidx = 0;
   AurhorizationResponseBytesReal(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   int llen = sprintf(byte_array,"%s %s HTTP/1.1\r\n",Method,uri); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Type: text/xml\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: 0\r\n"); iidx+=llen;
   //               llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0;
}
//RequestZipSerFileDownload..
void MakeAuthorizedPacketSimp(char* buff,int length, char* Method,char* uri)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,domain_buf4,nonce_buf2,auth_buf3, len);
   char* cnonce_buf="7e4c63bd7cb20c49ceafd1bd812428da";
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[2]]=0;
   auth_buf3[len[3]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   int lengthxxx = 0;
   int iidx = 0;
   AurhorizationResponseBytes(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   int llen = sprintf(byte_array,"%s %s HTTP/1.1\r\n",Method,uri); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Type: text/xml\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   llen = sprintf(&byte_array[iidx],"Host: %s\r\n",gAnalyzerIP); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: 0\r\n"); iidx+=llen;
   //               llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0;
}
void MakeAuthorizedPacketSimp111(char* buff,int length, char* Method,char* uri,char* Tm1,char* Tm2)
{
   char Device[150] ;
   char Realm_buf1[512] ;
   char nonce_buf2[512] ;
   char auth_buf3[512] ;
   char domain_buf4[512] ;
   unsigned char len[4];
   memset(Device,0,150);
   memset(domain_buf4,0,512);
   CharToByte((char*)buff, Device, length,Realm_buf1,nonce_buf2,auth_buf3,domain_buf4, len);
   char* cnonce_buf="7e4c63bd7cb20c49ceafd1bd812428da";
   Realm_buf1[len[0]]=0;
   nonce_buf2[len[1]]=0;
   auth_buf3[len[2]]=0;
   char* nc="00000001";
   //CString qop;qop=auth_buf3;/////////////////////////////
   char User[200];
   memset(User,0,200);
   sprintf(User,"%s:%s:%s",gUser,Realm_buf1,gPass);
   char urii[200];
   int kk=sprintf(urii,"%s:%s",Method,uri);//PUT:/PSIA/System/reboot";
   urii[kk]=0;
   char* A1 = MDString(User);
   char AA1[33];
   memset(AA1,0,33);
   memcpy(AA1,A1,strlen(A1));
   char* A2 = MDString(urii);
   char AA2[33];
   memset(AA2,0,33);
   memcpy(AA2,A2,strlen(A2));
   char rrr[200];
   memset(rrr,0,200);
   sprintf(rrr,"%s:%s:%s:%s:auth:%s",AA1,nonce_buf2,nc,cnonce_buf,AA2);
   char* response = MDString(rrr);
   char res[33];
   memset(res,0,33);
   memcpy(res,response,strlen(response));
   //// 第二次 发送
   char byte_arrayxxx[2600];
   char xmlbyte_array[512];
   int lengthxxx = 0;
   int iidx = 0;
   int llen11=0;
   AurhorizationResponseBytes(byte_arrayxxx,&lengthxxx,uri,nonce_buf2,cnonce_buf,res);
   UrnStringToBytes(xmlbyte_array,&llen11,Tm1,Tm2);//xml calculation
   int llen = sprintf(byte_array,"GET %s %s",uri,"HTTP/1.1\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Content-Length: %d\r\n",llen11); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Content-Type: text/xml\r\n"); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"Host: %s:%d\r\n",gAnalyzerIP,80); iidx+=llen;
   llen = sprintf(&byte_array[iidx],"%s","Connection: Keep_Alive\r\n"); iidx+=llen;
   strncpy(&byte_array[iidx],byte_arrayxxx,lengthxxx); iidx+=lengthxxx;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   byte_array[iidx]=0x0d; iidx+=1;
   byte_array[iidx]=0x0a; iidx+=1;
   strncpy(&byte_array[iidx],xmlbyte_array,length); iidx+=length;
   byte_array[iidx]=0;
}
int FindIdx(char* IP)
{
   for (int i=0;i<16;i++)
   {
      if(strcmp(sessions[i].IP,IP)==0) return i;
   }
   return -1;
}
int FindEmpty()
{
   for (int i=0;i<16;i++)
   {
      if(sessions[i].IP[0]==0) return i;
   }
   return -1;
}
int DivideTimeToYMDHMS(char* DateTimeStr,int* year,int* month,int* day, int* hour,int* min,int* sec)
{
   int yy,mm,dd,hh,Mm,ss;
   //DivideTime(DateTimeStr,DateStr,TimeStr);
   sscanf(DateTimeStr,"%d-%d-%dT%d:%d:%d",&yy,&mm,&dd,&hh,&Mm,&ss);
   *year = yy;
   *month = mm;
   *day = dd;
   *hour = hh;
   *min = Mm;
   *sec = ss;
   return 0;
}
int CharToByte(char* chars, char* bytes, unsigned int count,char* ptr1,char* ptr2,char* ptr3,char* ptr4,unsigned char* number){
   int p=0;
   int n=0;
   int i=0;
   unsigned char temp;
   for(i = 0; i < count; i++)
   {
      temp = (unsigned char)chars[i];
      if (p==1)
      {
         if (temp!=0x22)
         {
            bytes[n++]=(unsigned char)chars[i];
         }
      }
      if (temp==0x22)
      {
         p=p+1;
      }
      if (p==2)
      {
         bytes[n++]=0x2C;
         p=0;
      }
   }
   char* token=NULL;
   char s[]=",";
   token=strtok(bytes,s);
   number[0]=strlen(token);
   memcpy(ptr1,token,strlen(token));
   int nn=0;
   while(token!=NULL)
   {
      token=strtok(NULL,s);
      nn=nn+1;
      if (nn==1)
      {
         number[1]=strlen(token);
         memcpy(ptr2,token,strlen(token));
      }
      if (nn==2)
      {
         //ptr3=new char[strlen(token)];
         number[2]=strlen(token);
         memcpy(ptr3,token,strlen(token));
      }
      if (nn==3)
      {
         if(token!=NULL)
         {
            number[3]=strlen(token);
            memcpy(ptr4,token,strlen(token));
         }//ptr3=new char[strlen(token)];
      }
   }
   return n;
}
void AnalySerFile(char* p_save_buf,int res, int SearchStartTm, int SearchEndTm)
{
   int ParagraphIdx;
   bool somewhat;
first:
   somewhat=false;
   memset(myEventLogs[EventCount].DebugMessageS,0,200);
   memset(myEventLogs[EventCount].DebugMessageE,0,200);
   memset(myEventLogs[EventCount].Rule,0,20);
   memset(myEventLogs[EventCount].Region,0,30);
   memset(myEventLogs[EventCount].clipUrl,0,200);
   memset(myEventLogs[EventCount].Date,0,15);
   memset(myEventLogs[EventCount].Time,0,15);
   memset(myEventLogs[EventCount].Duration,0,20);
   ParagraphIdx = memorycmp((unsigned char*)p_save_buf,res, "com.videoiq.fusion.cameraapi.metadata.Incident",46);
   if(ParagraphIdx<0) ParagraphIdx = res;
   int tmpSidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "started.",8);
   int tmpEidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "Event ended.",12);
   if(tmpSidx<0 && tmpEidx<0) goto last;
   if(tmpSidx>=0 && tmpEidx<0){// Started paragraph
      int sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "ruleName",8);
      if(sidx>=0 && p_save_buf[sidx+8]==0x08){
         int flen = p_save_buf[sidx+8+1]*256+p_save_buf[sidx+8+2];
         memcpy(myEventLogs[EventCount].Rule,&p_save_buf[sidx+8+3],flen);
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "soiName",7);
      if(sidx>=0 && p_save_buf[sidx+7]==0x08){
         int flen = p_save_buf[sidx+7+1]*256+p_save_buf[sidx+7+2];
         memcpy(myEventLogs[EventCount].Region,&p_save_buf[sidx+7+3],flen);
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "activity",8);
      if(sidx>=0){
         myEventLogs[EventCount].ActivityNum[0]=p_save_buf[sidx+8];
         myEventLogs[EventCount].ActivityNum[1]=p_save_buf[sidx+8+1];
         myEventLogs[EventCount].ActivityNum[2]=p_save_buf[sidx+8+2];
         myEventLogs[EventCount].ActivityNum[3]=p_save_buf[sidx+8+3];
         myEventLogs[EventCount].ActivityNum[4]=p_save_buf[sidx+8+4];
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "clipUrl",7);
      if(sidx>=0 && p_save_buf[sidx+7]==0x08){
         int flen = (unsigned char)p_save_buf[sidx+7+1]*256+(unsigned char)p_save_buf[sidx+7+2];
         memcpy(myEventLogs[EventCount].clipUrl,&p_save_buf[sidx+7+3],flen);
         // ensure accurate range
         {
            const char* dtInUrlPos = strrchr(myEventLogs[EventCount].clipUrl, '/');
            //printf("%s\n", dtInUrlPos);
            struct tm dtInUrl;
            memset(&dtInUrl, 0, sizeof(dtInUrl));
            sscanf(dtInUrlPos, "/%d_%d_%d-%d_%d_%d.",
               &dtInUrl.tm_year, &dtInUrl.tm_mon, &dtInUrl.tm_mday, &dtInUrl.tm_hour, &dtInUrl.tm_min, &dtInUrl.tm_sec);
            dtInUrl.tm_year-=1900;
            dtInUrl.tm_mon--;
            time_t tt = mktime(&dtInUrl);
            if(tt<SearchStartTm||tt>SearchEndTm)
            {
               myEventLogs[EventCount].InSearchRange = 0;
#ifdef DBG_LOG
               sprintf(myEventLogs[EventCount].clipUrl,"%s ER %d",myEventLogs[EventCount].clipUrl, tt);
#endif
            }
            else
            {
               myEventLogs[EventCount].InSearchRange = 1;
#ifdef DBG_LOG
               sprintf(myEventLogs[EventCount].clipUrl,"%s OK %d",myEventLogs[EventCount].clipUrl, tt);
#endif
               EventCountInSearchRange++;
            }
         }
      }
      sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "debugMessage",12);
      if(sidx>=0 && p_save_buf[sidx+12]==0x08){
         int flen = (unsigned char)p_save_buf[sidx+12+1]*256+(unsigned char)p_save_buf[sidx+12+2];
         memcpy(myEventLogs[EventCount].DebugMessageS,&p_save_buf[sidx+12+3],flen);
      }
      char tmp[200];
      int tlen=0;
      memset(tmp,0,200);
      tlen = strlen(myEventLogs[EventCount].DebugMessageS);
      memcpy(tmp,myEventLogs[EventCount].DebugMessageS,tlen);
      if(myEventLogs[EventCount].DebugMessageS[0]!=0) somewhat = true;
      // Get Vide lost
      int eidx = memorycmp((unsigned char*)tmp,tlen, "Video lost detected",19);
      if(eidx>=0){
         strcpy(myEventLogs[EventCount].Rule,"Video Lost Rule");
      }
      // Get System Event
      eidx = memorycmp((unsigned char*)tmp,tlen, "System activity detected",24);
      if(eidx>=0){
         strcpy(myEventLogs[EventCount].Rule,"System Event Rule");
      }
      // Get Start Time
      eidx = memorycmp((unsigned char*)tmp,tlen, " ",1);
      if (eidx>=0){
         memcpy(myEventLogs[EventCount].Date,tmp,eidx);
         memcpy(tmp,&tmp[eidx+1],tlen-eidx);
         eidx = memorycmp((unsigned char*)tmp,tlen-eidx, " ",1);
         if (eidx>=0){
            memcpy(myEventLogs[EventCount].Time,tmp,eidx-1);
            memcpy(tmp,&tmp[eidx+1],tlen-eidx);
            somewhat = true;
         }
      }
   }
   if(tmpSidx>=0 && tmpEidx>=0){// Started. Event Ended paragraph
      int sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "debugMessage",12);
      if(sidx>=0 && p_save_buf[sidx+12]==0x08)
      {
         int flen = (unsigned char)p_save_buf[sidx+12+1]*256+(unsigned char)p_save_buf[sidx+12+2];
         char tmpdeg[200];
         memset(tmpdeg,0,200);
         memcpy(tmpdeg,&p_save_buf[sidx+12+3],flen);
         // find owner record
         int i;
         for (i=0;i<EventCount;i++)
         {
            int j,llen = strlen(myEventLogs[i].DebugMessageS);
            for (j=0;j<llen;j++)
            {
               if(myEventLogs[i].DebugMessageS[j] != tmpdeg[j]) break;
            }
            if(j>=llen) break;
         }
         if(i<EventCount)// Started message Matched OK
         {
            sidx = memorycmp((unsigned char*)p_save_buf,ParagraphIdx, "activity",8);
            if(sidx>=0){
               myEventLogs[i].ActivityNum[0]=p_save_buf[sidx+8];
               myEventLogs[i].ActivityNum[1]=p_save_buf[sidx+8+1];
               myEventLogs[i].ActivityNum[2]=p_save_buf[sidx+8+2];
               myEventLogs[i].ActivityNum[3]=p_save_buf[sidx+8+3];
               myEventLogs[i].ActivityNum[4]=p_save_buf[sidx+8+4];
            }
            //            goto last;
            //            strcpy(myEventLogs[i].DebugMessageE,tmpdeg);
            //            goto last;
            // get End time
            char tmp[200];
            memset(tmp,0,200);
            memcpy(tmp,tmpdeg,flen);
            int msglen = flen;
            //            goto last;
            int eeidx = memorycmp((unsigned char*)tmp,flen, "started.",8);
            if (eeidx>=0){
               memcpy(tmp,&tmp[eeidx+8+1],flen-eeidx-8-1);
               flen = flen-eeidx-8-1 ;
               tmp[flen]=0;
               char tmpDate[15];
               char tmpTime[15];
               int eidx = memorycmp((unsigned char*)tmp,flen, " ",1);
               if (eidx>=0){
                  memcpy(tmpDate,tmp,eidx);
                  tmpDate[eidx]=0;
                  memcpy(tmp,&tmp[eidx+1],flen-eidx);
                  eidx = memorycmp((unsigned char*)tmp,flen-eidx, " ",1);
                  if (eidx>=0){
                     memcpy(tmpTime,tmp,eidx-1);
                     tmpTime[eidx-1]=0;
                     //// Calculation duration
                     int yy2,mm2,dd2,hh2,Mm2,ss2;
                     int yy,mm,dd,hh,Mm,ss;
                     sscanf(myEventLogs[i].Date,"%d/%d/%d",&yy,&mm,&dd);
                     sscanf(myEventLogs[i].Time,"%d:%d:%d",&hh,&Mm,&ss);
                     sscanf(tmpDate,"%d/%d/%d",&yy2,&mm2,&dd2);
                     sscanf(tmpTime,"%d:%d:%d",&hh2,&Mm2,&ss2);
                     struct tm ttm;
                     ttm.tm_year = yy-1900;
                     ttm.tm_mon=mm - 1;
                     ttm.tm_mday = dd;
                     ttm.tm_hour=hh;
                     ttm.tm_min=Mm;
                     ttm.tm_sec=ss;
                     time_t StartTm = mktime(&ttm);
                     ttm.tm_year = yy2-1900;
                     ttm.tm_mon=mm2 - 1;
                     ttm.tm_mday = dd2;
                     ttm.tm_hour=hh2;
                     ttm.tm_min=Mm2;
                     ttm.tm_sec=ss2;
                     time_t EndTm = mktime(&ttm);
                     int dur = EndTm-StartTm;
                     sprintf(myEventLogs[i].Duration,"%d 秒",dur);
                     memcpy(myEventLogs[i].DebugMessageE,tmpdeg,msglen);
                     //calc offset datetime
                     StartTm+=8*60*60;
                     struct tm* toffset = localtime(&StartTm);
                     sprintf(myEventLogs[i].Date, "%d/%d/%d", toffset->tm_year+1900, toffset->tm_mon+1, toffset->tm_mday);
                     sprintf(myEventLogs[i].Time, "%d:%d:%d", toffset->tm_hour, toffset->tm_min, toffset->tm_sec);
                  }
               }
            }
         }
      }
   }
   char ttmp[5000];
   if((myEventLogs[EventCount].DebugMessageE[0]!=0|| myEventLogs[EventCount].DebugMessageS[0]!=0) && myEventLogs[EventCount].Rule[0]==0 && myEventLogs[EventCount].Region[0]==0){
      memcpy(ttmp,(unsigned char*)p_save_buf,5000);
   }
   if(somewhat && EventCount<2000-1){///repair //#todo 12.7
      sprintf(myEventLogs[EventCount].Camera,"%d",RequestChannel+1);
      int i;
      for (i=0;i<EventCount;i++)
      {
         if(strcmp(myEventLogs[i].clipUrl,myEventLogs[EventCount].clipUrl)==0) break;
      }
      if(i>=EventCount)   {
         EventCount++;
      }
   }
last:
   res = res - ParagraphIdx - 46 ;
   if (res<=0)
      return;
   memcpy((unsigned char*)p_save_buf,&p_save_buf[ParagraphIdx + 46],res);
   goto first;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
int memorycmp(unsigned char* src ,int slen, char* token, int len)
{
   int start=0,k,i,klen=strlen(token);
lp1:
   for(i=start;i<slen;i++) if(src[i]==token[0]) break;
   if (i>=slen) return -1;
   k=i;
   for(i=0;i<klen;i++)
   {
      if(src[k+i]!=token[i])
      {
         start=k+i;
         goto lp1;
      }
   }
   if(i>=klen) return k;
   return -1;
}
int stringcmp(char* src ,char* token, int len)
{
   int start=0,k,i,slen=strlen(src);
lp:
   for(i=start;i<slen;i++) if(src[i]==token[0]) break;
   if (i>=slen) return -1;
   k=i;
   for(i=0;i<len;i++)
   {
      if(src[k+i]!=token[i])
      {
         start=k+i;
         goto lp;
      }
   }
   if(i>=len) return k;
   return -1;
}
void AurhorizationResponseBytes(char* byte_array_out,int * byte_array_length_out,char *Myuri, char *nonce,char *cnonce,char *response)
{
   //   Authorization: Digest username="supervisor", realm="VideoIQ", nonce="n99u1VYBAABAf0HT+h92EO4hT2CzmfxG", uri="/PSIA/VIQ/Event/metadata/0/files", response="7d8d929e39655ad9f3e6e94e9004792e", qop=auth, nc=00000001, cnonce="0d2175d8cdb63f84f18894200e129ace", algorithm="MD5"
   int idx=0,len;
   idx = sprintf(byte_array_out,"%s","Authorization: Digest username=");
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","supervisor");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",realm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","VideoIQ");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx], "%s",nonce);idx+=len;//"n99u1VYBAABAf0HT+h92EO4hT2CzmfxG"
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",uri=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",Myuri);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",algorithm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","MD5");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",response=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",response);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",qop=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","auth");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nc=00000001,cnonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",cnonce);idx+=len;//cnonce
   byte_array_out[idx++]=0x22;//'"'
   *byte_array_length_out = idx;
}
void AurhorizationResponseBytesReal(char* byte_array_out,int * byte_array_length_out,char *Myuri, char *nonce,char *cnonce,char *response)
{
   //   Authorization: Digest username="supervisor", realm="VideoIQ", nonce="n99u1VYBAABAf0HT+h92EO4hT2CzmfxG", uri="/PSIA/VIQ/Event/metadata/0/files", response="7d8d929e39655ad9f3e6e94e9004792e", qop=auth, nc=00000001, cnonce="0d2175d8cdb63f84f18894200e129ace", algorithm="MD5"
   int idx=0,len;
   idx = sprintf(byte_array_out,"%s","Authorization: Digest username=");
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","supervisor");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",realm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","VideoIQ");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx], "%s",nonce);idx+=len;//"n99u1VYBAABAf0HT+h92EO4hT2CzmfxG"
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",uri=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",Myuri);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",algorithm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","MD5");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",cnonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",cnonce);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nc=00000001,qop=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","auth");idx+=len;//cnonce
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",response=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",response);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   *byte_array_length_out = idx;
}
void AurhorizationResponseBytesReatart(char* byte_array_out,int * byte_array_length_out,char *Myuri, char *nonce,char *cnonce,char *response)
{
   int idx=0,len;
   idx = sprintf(byte_array_out,"%s","Authorization: Digest username=");
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","supervisor");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",realm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","VideoIQ");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx], "%s",nonce);idx+=len;//"n99u1VYBAABAf0HT+h92EO4hT2CzmfxG"
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",uri=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",Myuri);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",algorithm=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","MD5");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",cnonce=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",cnonce);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",nc=00000001");idx+=len;
   len = sprintf(&byte_array_out[idx],"%s",",qop=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s","auth");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",",response=");idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   len = sprintf(&byte_array_out[idx],"%s",response);idx+=len;
   byte_array_out[idx++]=0x22;//'"'
   *byte_array_length_out = idx;
}
               /*
               --VIQeventEVENTeventVIQ
                  Content-type: application/xml; charset="UTF-8"
                  <urn:ViqEventNotificationAlert urn:version="1.0" xmlns:urn="urn:videoiq-com">
                  <urn:channelId>3</urn:channelId>
                  <urn:eventId>6478</urn:eventId>
                  <urn:startTime urn:version="1.0">
                  <urn:date>2016-11-07T08:50:54.063</urn:date><urn:offset>28800000</urn:offset>
                  </urn:startTime>
                  <urn:clipUrl>/media/clips/3/2016/11/7/8/3/2016_11_07-08_50_48.mp4</urn:clipUrl>
                  <urn:ruleId>17</urn:ruleId>
                  <urn:ruleName>Video Lost Rule</urn:ruleName>
                  <urn:soiId>-1</urn:soiId>
                  <urn:soiName>Reserved SOI</urn:soiName>
                  <urn:activity>Video Lost</urn:activity>
                  <urn:objectType>Unknown</urn:objectType>
                  <urn:aborted>false</urn:aborted>
                  <urn:acknowledged>false</urn:acknowledged>
                  <urn:ackNotes xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/><urn:falseAlarm>false</urn:falseAlarm>
                  <urn:debugMessage>2016/11/07 08:50:54.63: Video lost detected: 101. Event (id=6478) started.</urn:debugMessage>
                  </urn:ViqEventNotificationAlert>
                  */
int AnalyXMLUrnEVENT(char* buff,int length,AlarmInfo* RealAlarmEvent)
{
   int sidx,eidx;
   sidx = stringcmp((char*)buff,"<urn:channelId>",15);
   eidx = stringcmp((char*)buff,"</urn:channelId>",16);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->channelId,&buff[sidx+15],eidx-sidx-15);
   sidx = stringcmp((char*)buff,"<urn:eventId>",13);
   eidx = stringcmp((char*)buff,"</urn:eventId>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->eventId,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:startTime",14);
   eidx = stringcmp((char*)buff,"</urn:startTime",15);
   char tmp[200];
   memset(tmp,0,200);
   if(sidx>=0 && eidx>=0 && sidx < eidx){
      memcpy(tmp,&buff[sidx+15],eidx-sidx-14);
      sidx=stringcmp((char*)tmp,"<urn:date>",10);
      eidx = stringcmp((char*)tmp,"</urn:date>",11);
      if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->startTime,&tmp[sidx+10],eidx-sidx-10);
      sidx=stringcmp((char*)tmp,"<urn:offset>",12);
      eidx = stringcmp((char*)tmp,"</urn:offset>",13);
      if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->soffset,&tmp[sidx+12],eidx-sidx-12);
   }
   sidx = stringcmp((char*)buff,"<urn:endTime",12);
   if(sidx>=0){
      int ssidx=stringcmp((char*)buff,"<urn:date>",10);
      eidx = stringcmp((char*)buff,"</urn:date>",11);
      if(ssidx>=0 && eidx>=0 && ssidx < eidx) memcpy(RealAlarmEvent->endTime,&buff[ssidx+10],eidx-ssidx-10);
   }
   sidx = stringcmp((char*)buff,"<urn:clipUrl>",13);
   eidx = stringcmp((char*)buff,"</urn:clipUrl>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->clipUrl,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:ruleId>",12);
   eidx = stringcmp((char*)buff,"</urn:ruleId>",13);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->ruleId,&buff[sidx+12],eidx-sidx-12);
   sidx = stringcmp((char*)buff,"<urn:ruleName>",14);
   eidx = stringcmp((char*)buff,"</urn:ruleName>",15);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->ruleName,&buff[sidx+14],eidx-sidx-14);
   sidx = stringcmp((char*)buff,"<urn:soiId>",11);
   eidx = stringcmp((char*)buff,"</urn:soiId>",12);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->soiId,&buff[sidx+11],eidx-sidx-11);
   sidx = stringcmp((char*)buff,"<urn:soiName>",13);
   eidx = stringcmp((char*)buff,"</urn:soiName>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->soiName,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:activity>",14);
   eidx = stringcmp((char*)buff,"</urn:activity>",15);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->activity,&buff[sidx+14],eidx-sidx-14);
   sidx = stringcmp((char*)buff,"<urn:objectType>",16);
   eidx = stringcmp((char*)buff,"</urn:objectType>",17);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->objectType,&buff[sidx+16],eidx-sidx-16);
   sidx = stringcmp((char*)buff,"<urn:aborted>",13);
   eidx = stringcmp((char*)buff,"</urn:aborted>",14);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->aborted,&buff[sidx+13],eidx-sidx-13);
   sidx = stringcmp((char*)buff,"<urn:acknowledged>",18);
   eidx = stringcmp((char*)buff,"</urn:acknowledged>",19);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->acknowledged,&buff[sidx+18],eidx-sidx-18);
   sidx = stringcmp((char*)buff,"<urn:debugMessage>",18);
   eidx = stringcmp((char*)buff,"</urn:debugMessage>",19);
   if(sidx>=0 && eidx>=0 && sidx < eidx) memcpy(RealAlarmEvent->debugMessage,&buff[sidx+18],eidx-sidx-18);
   return 0;
}
//判断是否为目录
bool is_dir(const char *path)
{
    struct stat statbuf;
    if(lstat(path, &statbuf) ==0)//lstat返回文件的信息,文件信息存放在stat结构中
    {
        return S_ISDIR(statbuf.st_mode) != 0;//S_ISDIR宏,判断文件类型是否为目录
    }
    return false;
}
//判断是否为常规文件
bool is_file(const char *path)
{
    struct stat statbuf;
    if(lstat(path, &statbuf) ==0)
        return S_ISREG(statbuf.st_mode) != 0;//判断文件是否为常规文件
    return false;
}
//判断是否是特殊目录
bool is_special_dir(const char *path)
{
    return strcmp(path, ".") == 0 || strcmp(path, "..") == 0;
}
//生成完整的文件路径
void get_file_path(const char *path, const char *file_name,  char *file_path)
{
    strcpy(file_path, path);
    if(file_path[strlen(path) - 1] != '/')
        strcat(file_path, "/");
    strcat(file_path, file_name);
}
void delete_file(const char *path)
{
   char cmd[30];
   memset(cmd,0,30);
   sprintf(cmd,"rm -f %s",path);
   int ret = system(cmd);
#ifdef DBG_LOG
   syslog(LOG_USER | LOG_INFO, "delete_file, ret=%d, %s\n", ret, path);
#endif
}
void delete_folder(const char *path)
{
   char cmd[30];
   memset(cmd,0,30);
   sprintf(cmd,"rm -r %s",path);
   int ret = system(cmd);
#ifdef DBG_LOG
   syslog(LOG_USER | LOG_INFO, "delete_folder, ret=%d, %s\n", ret, path);
#endif
}
int doesFileExist(const char *filename)
{
   struct stat st;
   int result=stat(filename,&st);
   if (result==0)
    return 1;
    else return 0;
 }
int GetFileNameInFolder(char* dirname,lpfilenames lpfilename)
{
   int num=0;
    DIR *p_dir;
    struct dirent *p_dirent;
    if((p_dir = opendir(dirname)) == NULL){
        printf("---->can\'t open %s\n",dirname);
        return 0;
    }
    while((p_dirent = readdir(p_dir))){
        strcpy(lpfilename[num].name ,p_dirent->d_name);
      num++;
    }
    return num;
}
int net_test(char* serverIP,char* port)
{
   struct sockaddr_in servaddr;
   int strlen=sizeof(servaddr);
   int sockfdd;
   if((sockfdd=socket(PF_INET,SOCK_STREAM,0))<0){
      perror("socket fail");
      close(sockfdd);
      return -1;
   }
   memset(&servaddr,0,strlen);
   servaddr.sin_family=AF_INET;
   inet_pton(AF_INET,serverIP,&servaddr.sin_addr);
   servaddr.sin_port=htons(atoi(port));
   if(connect(sockfdd,(struct sockaddr*)&servaddr,strlen)<0){
      //      perror("connect fail-3");
      close(sockfdd);
      return -2;
   }
   close(sockfdd);
   return 0;
}
void GPIOinit(void)
{
   int retVal = -1;
   int PortNum = 0xA06;
   unsigned char wVal = 0x15;
   retVal = GPIO_OPEN(PortNum);
   printf("GPIO OPEN RES = %d  \n",retVal);
   GPIO_WRITE(PortNum,wVal);
   printf("GPIO WRITE VALUE = 0x%X \n", wVal);
   retVal = GPIO_READ(PortNum);
   printf("GPIO READ VALUE 02 = 0x%X  \n",retVal);
   GPIO_CLOSE(PortNum);
}
int GPIOoutput(int no)
{
   int PortNum = 0xA06;
   switch(no){
   case 0:
      GPIO_WRITE(PortNum,0x15);
      return 0;
   case 1:
      GPIO_WRITE(PortNum,0x57);
      return 0;
   case 2:
      GPIO_WRITE(PortNum,0x5D);
      return 0;
   case 3:
      GPIO_WRITE(PortNum,0x5F);
      return 0;
   case 4:
      GPIO_WRITE(PortNum,0x75);
      return 0;
   case 5:
      GPIO_WRITE(PortNum,0x77);
      return 0;
   case 6:
      GPIO_WRITE(PortNum,0x7D);
      return 0;
   case 7:
      GPIO_WRITE(PortNum,0x7F);
      return 0;
   case 8:
      GPIO_WRITE(PortNum,0xD5);
      return 0;
   case 9:
      GPIO_WRITE(PortNum,0xD7);
      return 0;
   case 10:
      GPIO_WRITE(PortNum,0xDD);
      return 0;
   case 11:
      GPIO_WRITE(PortNum,0xDF);
      return 0;
   case 12:
      GPIO_WRITE(PortNum,0xF5);
      return 0;
   case 13:
      GPIO_WRITE(PortNum,0xF7);
      return 0;
   case 14:
      GPIO_WRITE(PortNum,0xFD);
      return 0;
   case 15:
      GPIO_WRITE(PortNum,0xFF);
      return 0;
   }
   return -1;
}
int GPIO_OPEN(int PortNum)
{
   return ioperm(PortNum, 0x01, 0x01);
}
void GPIO_CLOSE(int PortNum)
{
   ioperm(PortNum, 0x01, 0x00);
}
int GPIO_READ(int PortNum)
{
  return inb(PortNum);
}
void GPIO_WRITE(int PortNum,unsigned char DATA)
{
  outb(DATA,PortNum);
}
int Read_MysqlData(){
   int ret=0;
   MYSQL *conn;
   MYSQL_RES *res;
   MYSQL_ROW row;
   char *server="localhost";
   char *user="root";
   char *password="123";
   char *database="opentutorials";
   puts("Step.0 ========>MySQL is getting......");
   if(!(conn=mysql_init((MYSQL*)NULL))){
      printf("init fail\n");
      return -1;
   }
   if(!mysql_real_connect(conn,server,user,password,NULL,3306,NULL,0)){
      printf("connect error.\n");
      return -1;
   }
   if(mysql_select_db(conn,database)!=0){
      mysql_close(conn);
      printf("select_db_fail.\n");
      return -1;
   }
   if(mysql_query(conn,"select * from tbl_deviceinfo")){
      printf("query fail\n");
      return -1;
   }
   res=mysql_store_result(conn);
   while((row=mysql_fetch_row(res))!=NULL){
      strcat(EventString,row[1]);   strcat(EventString,":");
      strcat(EventString,row[2]); strcat(EventString,":");
      strcat(EventString,row[3]);   strcat(EventString,":");
      strcat(EventString,row[4]);   strcat(EventString,":");
      strcat(EventString,row[5]);   strcat(EventString,":");
      strcat(EventString,row[6]);   strcat(EventString,":");
      strcat(EventString,row[7]);   strcat(EventString,":");
      strcat(EventString,row[8]);   strcat(EventString,":");
      strcat(EventString,row[9]);   strcat(EventString,":");
      strcat(EventString,row[10]);strcat(EventString,"\n");
   }
   mysql_close(conn);
   return ret;
}
int UpdateMysqData(int key)
{
   int ret=0;
   MYSQL *conn;
   char *server="localhost";
   char *user="root";
   char *password="123";
   char *database="opentutorials";
   char query[255];
   puts("Step.0 ========>MySQL is getting......");
   if(!(conn=mysql_init((MYSQL*)NULL))){
      printf("init fail\n");
      exit(1);
   }
   if(!mysql_real_connect(conn,server,user,password,NULL,3306,NULL,0)){
      printf("connect error.\n");
      exit(1);
   }
   if(mysql_select_db(conn,database)!=0){
      mysql_close(conn);
      printf("select_db_fail.\n");
      exit(1);
   }
   sprintf(query,"UPDATE tbl_deviceinfo SET reboot=0 where id=%d",key);
   if(mysql_query(conn,query)){
      printf("query fail\n");
      exit(1);
   }
   mysql_close(conn);
   return ret;
}
int Check_MysqlData(char *AnalyserName,char* AnalyserIP,char* AnalyserPort,char* ServerIP,char* ServerPort,char* user,char* pass,char* resol,char* commType){
   int ret=0;
   MYSQL *conn;
   MYSQL_RES *res;
   MYSQL_ROW row;
   char *server="localhost";
   char *user1="root";
   char *password="123";
   char *database="opentutorials";
    puts("Step.0 ========>MySQL is getting......");
   if(!(conn=mysql_init((MYSQL*)NULL))){
      printf("init fail\n");
      exit(1);
   }
   if(!mysql_real_connect(conn,server,user1,password,NULL,3306,NULL,0)){
      printf("connect error.\n");
      exit(1);
   }
   if(mysql_select_db(conn,database)!=0){
      mysql_close(conn);
      printf("select_db_fail.\n");
      exit(1);
   }
   if(mysql_query(conn,"select * from tbl_deviceinfo")){
      printf("query fail\n");
      exit(1);
   }
   res=mysql_store_result(conn);
   while((row=mysql_fetch_row(res))!=NULL){
      ret=0;
//      printf("====%s:%s",row[0],row[11]);      //sprintf(equipments[NUM].m_id,"%d",row[0]);
      if(strcmp(AnalyserName,row[10]) ==0) ret = 1;
      if(strcmp(AnalyserIP,row[1]) ==0) ret =ret+1;
      if(strcmp(AnalyserPort,row[2]) ==0) ret =ret+1;
      if(strcmp(ServerIP,row[3]) ==0) ret =ret+1;
      if(strcmp(ServerPort,row[4]) ==0) ret =ret+1;
      if(strcmp(user,row[6]) ==0) ret =ret+1;
      if(strcmp(pass,row[5]) ==0) ret =ret+1;
      if(strcmp(resol,row[7]) ==0) ret =ret+1;
      if(strcmp(commType,row[8]) ==0) ret =ret+1;
      if(ret==9) break;
   }
   mysql_close(conn);
   return ret;
}
int InsertMysqlData(char *AnalyserName,char* AnalyserIP,char* AnalyserPort,char* ServerIP,char* ServerPort,char* username,char* pass,char* resol,char* commType)
{
   int ret=0;
   MYSQL *conn;
   char *server="localhost";
   char *user="root";
   char *password="123";
   char *database="opentutorials";
   char query[255];
   struct tm *t;
   char time_info[20]={0,};
   time_t timer;
   timer=time(NULL);
   t=localtime(&timer);
   sprintf(time_info, "%d-%d-%d %d:%d:%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
   if(!(conn=mysql_init((MYSQL*)NULL))){
      printf("init fail\n");
      return -1;
   }
   if(!mysql_real_connect(conn,server,user,password,NULL,3306,NULL,0)){
      printf("connect error.\n");
      return -1;
   }
   if(mysql_select_db(conn,database)!=0){
      mysql_close(conn);
      printf("select_db_fail.\n");
      return -1;
   }
   sprintf(query, "INSERT INTO tbl_deviceinfo(equipmentip,equipmentport,serverip,serverport,password,username,analysis,comtype,redate,comment,reboot)VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s','%s','%s',0);",AnalyserIP, AnalyserPort, ServerIP, ServerPort,pass,username, resol, commType,time_info,AnalyserName);//?????????????
   printf("query=%s",query);
   if(mysql_query(conn,query)){
      printf("query fail\n");
      return -1;
   }
   mysql_close(conn);
   return ret;
}
//=====================================MD5 Function Definition============================================
void MD5Init (MD5_CTX *context)    /* context */
{
  context->count[0] = context->count[1] = 0;
  context->state[0] = 0x67452301;    /* Load magic initialization constants.*/
  context->state[1] = 0xefcdab89;
  context->state[2] = 0x98badcfe;
  context->state[3] = 0x10325476;
}
/* -----------------------------------------------------------------------------------
   MD5 block update operation. Continues an MD5 message-digest
   operation, processing another message block, and updating the  context.
-------------------------------------------------------------------------------------*/
                /* context */     /* input block */  /* length of input block */
void MD5Update (MD5_CTX *context, unsigned char *input,unsigned int inputLen  )
{
  unsigned int i, index, partLen;
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);   /* Compute number of bytes mod 64 */
  if ( (context->count[0] += ( (UINT4)inputLen << 3) ) < ( (UINT4)inputLen << 3 ) )
      context->count[1]++;
  context->count[1] += ((UINT4)inputLen >> 29);
  partLen = 64 - index;
  /* Transform as many times as possible.*/
  if (inputLen >= partLen)
  {
   MD5_memcpy( (POINTER)&context->buffer[index], (POINTER)input, partLen);
   MD5Transform (context->state, context->buffer);
   for (i = partLen; i + 63 < inputLen; i += 64)
         MD5Transform (context->state, &input[i]);
   index = 0;
  }
  else
      i = 0;
  /* Buffer remaining input */
  MD5_memcpy( (POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i );
}
/*
  MD5 finalization. Ends an MD5 message-digest operation, writing the
  the message digest and zeroizing the context.
*/
void MD5Final (unsigned char digest[16], MD5_CTX *context)
                /* message digest */      /* context */
{
  unsigned char bits[8];
  unsigned int index, padLen;
  Encode (bits, context->count, 8); /* Save number of bits */
  /* Pad out to 56 mod 64.*/
  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  padLen = (index < 56) ? (56 - index) : (120 - index);
  MD5Update (context,(unsigned char*) PADDING, padLen);
  MD5Update (context, bits, 8);   /* Append length (before padding) */
  Encode (digest, context->state, 16); /* Store state in digest */
  /* Zeroize sensitive information.*/
  MD5_memset ((POINTER)context, 0, sizeof (*context));
}
/* MD5 basic transformation. Transforms state based on block.
 */
void MD5Transform (UINT4 state[4],unsigned char block[64])
{
   UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
   Decode (x, block, 64);
  /* Round 1 */
  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  /* Round 2 */
  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  /* Round 3 */
  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
  /* Round 4 */
  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;
  /* Zeroize sensitive information.*/
  MD5_memset ((POINTER)x, 0, sizeof (x));
}
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
  a multiple of 4.
 */
void Encode (unsigned char *output,UINT4 *input,unsigned int len)
{
  unsigned int i, j;
  for (i = 0, j = 0; j < len; i++, j += 4)
  {
   output[j] = (unsigned char)(input[i] & 0xff);
   output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
   output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
   output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  }
}
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
  a multiple of 4.
 */
void Decode (UINT4 *output,unsigned char *input,unsigned int len)
{
  unsigned int i, j;
  for (i = 0, j = 0; j < len; i++, j += 4)
   output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
}
/* Note: Replace "for loop" with standard memcpy if possible. */
void MD5_memcpy (POINTER output,POINTER input,unsigned int len)
{
  unsigned int i;
  for (i = 0; i < len; i++)
     output[i] = input[i];
}
/* Note: Replace "for loop" with standard memset if possible. */
void MD5_memset (POINTER output,int value,unsigned int len)
{
  unsigned int i;
  for (i = 0; i < len; i++)
    ((char *)output)[i] = (char)value;
}
/* Digests a string and prints the result. */
char* MDString (char *string)
{
  MD5_CTX context;
  unsigned char digest[16];
  char output1[33];
  static  char output[33]={"\0"};
  unsigned int len = strlen (string);
  int i;
  MD5Init (&context);
  MD5Update (&context, (unsigned char*)string, len);
  MD5Final (digest, &context);
  for (i = 0; i < 16; i++)
  {
     sprintf(&(output1[2*i]),"%02x",(unsigned char)digest[i]);
     //sprintf(&(output1[2*i+1]),"%02x",(unsigned char)(digest[i]<<4));
  }
  for(i=0;i<32;i++)
  output[i]=output1[i];
  return output;
}
void zclock_sleep (int msecs)
{
    struct timespec t;
    t.tv_sec  =  msecs / 1000;
    t.tv_nsec = (msecs % 1000) * 1000000;
    nanosleep (&t, NULL);
}