/*
|
* 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);
|
}
|