void httpAlarmUpTask(ALARM_UP_CONNS *pAlarmUp, int port, int ip)
{
MTRULE_REGION_LIST mtRegionList = {0};
NETRET_ALARMINFO alarmInfo = {0};
struct linger tcpLinger;
int connfd = -1;
int timeout = 5*ONESECOND;
struct timeval start, start0;
gettimeofday(&start0, NULL);
int respXmlLen = 0, respBufLen = 0;
#ifdef ALZ_1
char *respXml = (char *)malloc(50*1024);
char *respBuf1 = (char *)malloc(50*1024);
#else
char *respXml = (char *)malloc(3072);
char *respBuf1 = (char *)malloc(3072);
#endif
int encoded_len;
if (!respXml || !respBuf1) {
NPRT(("Memory allocation failed\n"));
return;
}
int i,rc;
int flag1 = 0, flag2 = 0;
UINT8 preId = 0;
char serNo[48] = {0};
mkExternSN(serNo);
char server_ip[16];
inet_ntop(AF_INET, &ip, server_ip, 16);
printf("server_ip: %s, port = %d\n", server_ip, port);
/* connect 接收推送信息的主机,推送报警信息 */
struct sockaddr_in saddr;//定义了一个以太网IPV4的网络地址结构体
memset(&saddr,0,sizeof(saddr));//初始化0
saddr.sin_family=AF_INET;//IPV4协议簇
saddr.sin_port=htons(port);//网络字节序
inet_pton(AF_INET, server_ip, &saddr.sin_addr);//IPV4地址 地址要转换
char ip_s[18] = {0};
get_ipaddr(LOCAL_INTERFACE,ip_s,sizeof(ip_s));
FOREVER
{
rc = msgQReceive(pAlarmUp->alarmInfoMsgQ, (char *)&alarmInfo, MAX_ALARMINFO_MSGQ_LEN, timeout);
gettimeofday(&start, NULL);
if(abs(start.tv_sec- start0.tv_sec) >= http_push_freq)
{
NPRT(("111111111111 start.tv_sec = %d, start0.tv_sec = %d\n", start.tv_sec, start0.tv_sec));
gettimeofday(&start0, NULL);
}
else
{
usleep(60*1000);
continue;
}
printf("11111111111111111111111\n");
respXmlLen = 0;
respBufLen = 0;
flag1 = 0;
flag2 = 0;
#ifdef ALZ_1
memset(respXml, 0, 50*1024);
memset(respBuf1, 0, 50*1024);
#else
memset(respXml, 0, 3072);
memset(respBuf1, 0, 3072);
#endif
if(connfd < 0) {
connfd=socket(AF_INET,SOCK_STREAM,0);
if(connfd==-1)
{
perror("socket error");
sleep(1);
continue;
}
int ret = connect(connfd, (struct sockaddr *)&saddr,sizeof(saddr));
if(ret==-1)
{
perror("connect error");
PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd));
close(connfd);
connfd = -1;
sleep(1);
continue;
} else {
printf("Connected to server\n");
printf("connect fd = %d\n", connfd);
}
}
if(rc==MAX_ALARMINFO_MSGQ_LEN)
{
NPRT(("alarmType = %x\n",alarmInfo.alarmType));
cJSON *cjson = cJSON_CreateObject();
#ifdef HTTP_NEWADD
cJSON_AddStringToObject(cjson, "devIp", ip_s);
#endif
cJSON_AddNumberToObject(cjson, "Alarmtype", alarmInfo.alarmType);
if((alarmInfo.alarmType != THML_MT_ALARMIN_TYPE) && (alarmInfo.alarmType != 0x0f))
{
}
else
{
#ifdef HTTP_NEWADD
#ifdef SUPPORT_PTZ
#ifdef PTZ_BIND_1
for(i=0; i<MAX_PRESET_NUM; i++)
{
if(pDevCfgParam->thmlMtRegionList[i].presetId >> 31 & 0x1)
{
if((pDevCfgParam->thmlMtRegionList[i].presetId >> 16 & 0x7fff) == currentPreset)
{
mtListNo = i;
preId = i;
break;
}
}
}
if(i == MAX_PRESET_NUM)
{
printf("%s[%d] preset no bind mt.\n", __FUNCTION__, __LINE__);
cJSON_Delete(cjson);
continue;
}
#else
preId = 0xFF;
for(i=0; i<MAX_PRESET_NUM; i++)
{
if(pDevCfgParam->thmlMtRegionList[i].presetId == currentPreset)
{
mtListNo = i;
preId = i;
break;
}
}
if(preId == 0xFF)
{
printf("%s[%d] preset no bind mt.\n", __FUNCTION__, __LINE__);
cJSON_Delete(cjson);
continue;
}
#endif
cJSON_AddNumberToObject(cjson, "preset", currentPreset+1);
#else
cJSON_AddNumberToObject(cjson, "preset", 0);
#endif
#endif
semTake(globalMSem, WAIT_FOREVER);
memcpy(&mtRegionList, &pDevCfgParam->thmlMtRegionList[preId], sizeof(MTRULE_REGION_LIST));
semGive(globalMSem);
cJSON *alaInfo = cJSON_CreateArray();
if(mtRegionList.regionNum.total > 0)
{
i = 1;
}
else
{
i = 0;
}
for(; i<=mtRegionList.regionNum.total; i++)
{
cJSON *list = cJSON_CreateObject();
if(mtRegionList.regionInfo[i].alarmRuleParam.alarmkey)
{
#ifdef ALZ_1
encoded_len = HttpcaptureBase64(0, 0, respBuf1); // 抓图放在循环外
if (encoded_len < 0) {
continue;
}
// printf("encoded_len size %d\n", encoded_len);
#endif
if(mtRegionList.regionInfo[i].alarmRuleParam.alarmLevel == MTRULE_ALARM_LEVEL_PRE_ALARM)
{
flag1++;
cJSON_AddNumberToObject(list, "mtAlarmid", i);
cJSON_AddNumberToObject(list, "mtAlarmlevel", 1);
cJSON_AddNumberToObject(list, "mtAlarmType", mtRegionList.regionInfo[i].alarmRuleParam.alarmType);
cJSON_AddNumberToObject(list, "maxtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[0]);
cJSON_AddNumberToObject(list, "mintemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[1]);
cJSON_AddNumberToObject(list, "avgtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[2]);
cJSON_AddNumberToObject(list, "maxPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32X);
cJSON_AddNumberToObject(list, "maxPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32Y);
cJSON_AddNumberToObject(list, "minPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32X);
cJSON_AddNumberToObject(list, "minPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32Y);
#ifdef ALZ_1
cJSON_AddNumberToObject(list, "encoded_length", encoded_len);
cJSON_AddStringToObject(list, "base64_data", respBuf1);
printf("3333333333333333333333333\n");
#else
#endif
}
else if(mtRegionList.regionInfo[i].alarmRuleParam.alarmLevel == MTRULE_ALARM_LEVEL_ALARM)
{
flag2++;
cJSON_AddNumberToObject(list, "mtAlarmid", i);
cJSON_AddNumberToObject(list, "mtAlarmlevel", 2);
cJSON_AddNumberToObject(list, "mtAlarmType", mtRegionList.regionInfo[i].alarmRuleParam.alarmType);
cJSON_AddNumberToObject(list, "maxtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[0]);
cJSON_AddNumberToObject(list, "mintemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[1]);
cJSON_AddNumberToObject(list, "avgtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[2]);
cJSON_AddNumberToObject(list, "maxPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32X);
cJSON_AddNumberToObject(list, "maxPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32Y);
cJSON_AddNumberToObject(list, "minPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32X);
cJSON_AddNumberToObject(list, "minPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32Y);
#ifdef ALZ_1
cJSON_AddNumberToObject(list, "encoded_length", encoded_len);
cJSON_AddStringToObject(list, "base64_data", respBuf1);
printf("444444444444444444444444444444444\n");
#else
#endif
}
}
cJSON_AddItemToArray(alaInfo, list);
}
cJSON_AddItemToObject(cjson, "mtAlarmInfo", alaInfo);
if(flag1 == 0 && flag2 == 0)
{
cJSON_Delete(cjson);
continue;
}
cJSON_AddNumberToObject(cjson, "preAlarmSum", flag1);
cJSON_AddNumberToObject(cjson, "alarmSum", flag2);
}
char *json_data = cJSON_Print(cjson);
respXmlLen += sprintf(respXml + respXmlLen, json_data);
cJSON_Delete(cjson);
#ifdef ALZ_1
memset(respBuf1, 0, 50*1024);
#endif
printf("55555555555555555555555555\n");
respBufLen = sprintf(respBuf1 + respBufLen, "POST %s HTTP/1.1\r\n", "/kehu-api/system/api/v1/alarm/Info");
respBufLen += sprintf(respBuf1 + respBufLen, "Content-Type: application/json\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "User-Agent: %s\r\n", serNo);
respBufLen += sprintf(respBuf1 + respBufLen, "Accept: application/json\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "Token: %x:%x:%x:%x:%x:%x\r\n", DomeInfo.macAddr[0], DomeInfo.macAddr[1], DomeInfo.macAddr[2], DomeInfo.macAddr[3], DomeInfo.macAddr[4], DomeInfo.macAddr[5]);
respBufLen += sprintf(respBuf1 + respBufLen, "Host: %s:%d\r\n", server_ip, port);
//respBufLen += sprintf(respBuf1 + respBufLen, "Accept-Encoding: gzip, deflate, br\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "Connection: keep-alive\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "Content-Length: %d\r\n\r\n", respXmlLen);
respBufLen += sprintf(respBuf1 + respBufLen, "%s\r\n", respXml);
// printf(" %s ", respBuf);
printf("666666666666666666666666666\n");
// ssize_t sent = safe_send(connfd, respBuf1, strlen(respBuf1), 0);
ssize_t sent = writen(connfd, respBuf1, strlen(respBuf1));
printf("send size %d\n", sent);
// if(sent != encoded_len + 680)
if(sent <= 0)
{
PRT_ERR(("httpAlarmUpTask: writen failed.\n"));
if (connfd != -1) {
PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd));
close(connfd);
connfd = -1; // 防止重复关闭
}
sleep(1);
continue;
}
}
else if(rc==ERROR && errnoGet()==S_objLib_OBJ_TIMEOUT)
{ /* timeout, send exchange to client */
NPRT(("httpAlarmUpTask: send NETRET_EXCHANGE.\n"));
respBufLen = sprintf(respBuf1 + respBufLen, "POST %s HTTP/1.1\r\n", "/kehu-api/system/api/v1/alarm/Info");
//respBufLen += sprintf(respBuf1 + respBufLen, "Content-Type: application/json\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "User-Agent: %s\r\n", serNo);
respBufLen += sprintf(respBuf1 + respBufLen, "Accept: application/json\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "Token: %x:%x:%x:%x:%x:%x\r\n", DomeInfo.macAddr[0], DomeInfo.macAddr[1], DomeInfo.macAddr[2], DomeInfo.macAddr[3], DomeInfo.macAddr[4], DomeInfo.macAddr[5]);
respBufLen += sprintf(respBuf1 + respBufLen, "Host: %s:%d\r\n", server_ip, port);
//respBufLen += sprintf(respBuf1 + respBufLen, "Accept-Encoding: gzip, deflate, br\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "Connection: keep-alive\r\n");
respBufLen += sprintf(respBuf1 + respBufLen, "Content-Length: %d\r\n\r\n", 0);
int sent = writen(connfd, respBuf1, strlen(respBuf1));
// ssize_t sent = safe_send(connfd, respBuf1, strlen(respBuf1), 0);
printf("send size %d\n", sent);
if(sent <= 0)
{
PRT_ERR(("httpAlarmUpTask: writen failed.\n"));
if (connfd != -1) {
PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd));
close(connfd);
connfd = -1; // 防止重复关闭
}
sleep(1);
continue;
}
}
printf("7777777777777777777777777777\n");
PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd));
close(connfd);
connfd = -1;
}
printf("888888888888888888888\n");
free(respXml);
free(respBuf1);
semTake(globalMSem, WAIT_FOREVER);
msgQDelete(pAlarmUp->alarmInfoMsgQ);
lstDelete(&alarmUpList, &(pAlarmUp->node));
free((char *)pAlarmUp);
semGive(globalMSem);
return ;
}