📄 rc_ctl_data.c
字号:
strcat(buf, tmp);
bzero(tmp, sizeof(tmp));
sprintf(tmp, "<address>%s</address>\r\n", msg.address);
len += strlen(tmp);
if(len > size)
return -1;
strcat(buf, tmp);
bzero(tmp, sizeof(tmp));
sprintf(tmp, "<camera ip=\"%s\" port=\"%u\" channel=\"%s\">%s</camera>\r\n", ip, port, msg.channel, msg.name_cam);
len += strlen(tmp);
if(len > size)
return -1;
strcat(buf, tmp);
bzero(tmp, sizeof(tmp));
sprintf(tmp, "</alarm>\r\n");
len += strlen(tmp);
if(len > size)
return -1;
strcat(buf, tmp);
return len;
}
/*
* 功 能:根据报警主机发送信息报警
* 参 数:id:报警主机发送的id号码
* ctlinfo:链接相关信息
* 返回值:成功返回值大于或者等于0,否则返回-1
*/
int rc_snd_alarm(unsigned short int id, struct_msg_con *ctlinfo)
{
int size = 1024;
int i;
int res;
int offset;
int len = 0;
#ifndef XML_USED
unsigned short int len_s;//子包的长度
#endif
#ifndef XML_LEN_TYPE_USED_NO
unsigned int len_f;//总包的长度
unsigned short int type;
#endif
char *buf;//要发送的信息缓冲区
struct_msg_con msg_cam;//摄像机的所有链接信息
struct_msg_con msg_cli;//报警客户端的所有链接信息
struct_msg_alarm alarm;//要报警的信息
struct_task_net_w *newsnd = NULL;
/* 获取要报警的相关信息 */
bzero(&alarm, sizeof(struct_msg_alarm));
res = rc_msg_alarm(id, ctlinfo->serial, &alarm);
if(res < 0)
{
// printf("\t\t\t ~~~~~~ %s %d ~~~~~~\n", __FILE__, __LINE__);
return -1;
}
/* 获取报警客户端的所有链接信息 */
bzero(&msg_cli, sizeof(struct_msg_con));
pthread_mutex_lock(&mutex_con_t);
res = rc_get_msg_all(alarm.ser_cli, head_con, TYPE_CONNECT_ALARM_CLIENT, &msg_cli);
pthread_mutex_unlock(&mutex_con_t);
if(res < 0)//报警客户端不在线
{
// printf("\t\t\t ~~~~~~ %s %d serial : %s ~~~~~~\n", __FILE__, __LINE__, alarm.ser_cli);
return -1;
}
/* 获取摄像机的相关信息 */
bzero(&msg_cam, sizeof(struct_msg_con));
pthread_mutex_lock(&mutex_con_t);
res = rc_get_msg_all(alarm.ser_cam, head_con, TYPE_CONNECT_CAM, &msg_cam);
pthread_mutex_unlock(&mutex_con_t);
if(res < 0)//摄像机不在线
{
// printf("\t\t ++++++ %s %d ++++++\n", __FILE__, __LINE__);
// bzero(&msg_cam, sizeof(struct_msg_con));
}
buf = malloc(size);
if(buf == NULL)
{
return -1;
}
bzero(buf, size);
offset = 0;
#ifndef XML_LEN_TYPE_USED_NO
/* 总包类型 */
type = TYPE_P_F_MSG;
offset += LEN_LEN_PACKET_FATHER;
memcpy(buf + offset, &type, LEN_TYPE_PACKET_FATHER);
offset += LEN_TYPE_PACKET_FATHER;
#endif
#ifdef XML_USED
{
#ifndef MYSQL_USED_YES
msg_cam.local.ip.s_addr = inet_addr("169.254.2.114");
msg_cam.local.port_nat = 8080;
#endif
#ifndef XML_LEN_TYPE_USED_NO
len_f = rc_xml_alarm(alarm, inet_ntoa(msg_cam.local.ip), msg_cam.local.port_nat, buf + offset, size - offset);
len_f += LEN_TYPE_PACKET_FATHER;
memcpy(buf, &len_f, LEN_LEN_PACKET_FATHER);
#else
len = rc_xml_alarm(alarm, inet_ntoa(msg_cam.local.ip), msg_cam.local.port_nat, buf, size);
#endif
}
#else
{
/* 子包长度 */
// memcpy(buf + offset, &len_s, LEN_LEN_PACKET_CON);
offset += LEN_LEN_PACKET_CON;
/* 子包类型 */
buf[offset] = TYPE_P_M_ALARM;
offset += LEN_TYPE_PACKET_CON;
len_s = LEN_TYPE_PACKET_CON;
/* 填充ip */
memcpy(buf + offset, &(msg_cam.address.sin_addr.s_addr), LEN_TYPE_UINT32);
offset += LEN_TYPE_UINT32;
len_s += LEN_TYPE_UINT32;
/* 填充端口 */
memcpy(buf + offset, &(msg_cam.local.port_nat), LEN_TYPE_UINT16);
offset += LEN_TYPE_UINT16;
len_s += LEN_TYPE_UINT16;
/* 填充通道 */
memcpy(buf + offset, &channel, LEN_TYPE_UINT16);
offset += LEN_TYPE_UINT16;
len_s += LEN_TYPE_UINT16;
/* 填充地址 */
len = strlen(address);
memcpy(buf + offset, address, len);
offset += len;
len_s += len;
/* 总包长度 */
len_f = LEN_TYPE_PACKET_FATHER + LEN_TYPE_PACKET_FATHER + LEN_LEN_PACKET_CON + len_s;
memcpy(buf, &len_f, LEN_LEN_PACKET_FATHER);
offset = LEN_LEN_PACKET_FATHER + LEN_TYPE_PACKET_FATHER;
/* 子包长度 */
memcpy(buf + offset, &len_s, LEN_LEN_PACKET_CON);
len = len_f + LEN_LEN_PACKET_FATHER;//信息总长度
}
#endif
#ifndef XML_LEN_TYPE_USED_NO
len = len_f + LEN_LEN_PACKET_FATHER;
#endif
newsnd = rc_create_task_new_w(&msg_cli, TYPE_CONNECT_ALARM_CLIENT, NULL, buf, len);
if(newsnd != NULL)
{
pthread_mutex_lock(&mutex_w_cam);
for(i = 0; i < 10; i++)
{
res = rc_add_task_w(&task_w_cam, newsnd);
if(res >= 0)
break;
}
pthread_mutex_unlock(&mutex_w_cam);
pthread_cond_broadcast(&cond_w_cam);
if(i >= 10)
{
return -1;
}
}
else
{
return -1;
}
return 0;
}
/*
* 功 能:向摄像机发送要求延迟链接的命令
* 参 数:ctlinfo:链接相关信息
* 返回值:成功返回值大于或者等于0,否则返回-1
*/
int rc_reques_delay_cam(struct_msg_con *ctlinfo)
{
int res;
char type;
unsigned short int len_tmp;
unsigned short int len_con;
unsigned int len;
unsigned char temp[512];
unsigned char tmp_con[512];
unsigned char *buf = NULL;
struct_msg_web web;
struct_task_net_w *newsnd = NULL;
bzero(&web, sizeof(struct_msg_web));
web.action = TYPE_P_W_TOOL;
web.web.tool.action = EVENT_TOOL_WEB_REQUEST_ALL;
web.web.tool.space = space_delay;//要求space分钟后重新链接
bzero(temp, sizeof(temp));
len_tmp = 0;
len_tmp = rc_create_packet_web(web, temp, getpid());
if(len_tmp == 0)
{
return -1;
}
type = TYPE_P_C_WEB;
bzero(tmp_con, sizeof(tmp_con));
len_con = rc_create_packet_connect(temp, len_tmp, type, tmp_con);
if(len_con == 0)
{
return -1;
}
buf = malloc(LEN_DATA_1024);
if(buf == NULL)
return -1;
bzero(buf, LEN_DATA_1024);
len = rc_create_packet(tmp_con, len_con, TYPE_P_F_CTL_CON, buf);
if(len == 0)
{
free(buf);
buf = NULL;
return -1;
}
newsnd = rc_create_task_new_w(ctlinfo, TYPE_CONNECT_CAM, NULL, buf, len);
pthread_mutex_lock(&mutex_w_cam);
res = rc_add_task_w(&task_w_cam, newsnd);
pthread_mutex_unlock(&mutex_w_cam);
pthread_cond_broadcast(&cond_w_cam);
return res;
}
/*
* 功 能:创建网页相关的数据包
* 参 数:webmsg:网页相关信息
* output:要输出的数据缓冲区
* pid:cgi进程的pid
* 返回值:成功返回数据包的长度(包括包类型和长度),否则返回0
*/
unsigned short int rc_create_packet_web(struct_msg_web webmsg, unsigned char *output, pid_t pid)
{
int offset;
unsigned short int temp;
unsigned short int len;
unsigned char temp1[6];
offset = LEN_LEN_PACKET_WEB;
output[offset] = webmsg.action;//网页类型
offset += LEN_TYPE_PACKET_WEB;
memcpy(output + offset, &pid, LEN_PID);//进程pid号码
offset += LEN_PID;
memcpy(temp1, &pid, LEN_PID);
switch(webmsg.action)
{
case TYPE_P_W_INDEX://首页相关类型 1
len = sizeof(struct_web_index);
memcpy(output + offset, (unsigned char *)&webmsg.web.index, len);
break;
case TYPE_P_W_SYSTEM://系统相关类型 2
len = sizeof(struct_web_sys);
memcpy(output + offset, (unsigned char *)&webmsg.web.sys, len);
break;
case TYPE_P_W_SECURITY://安全相关类型 3
len = sizeof(struct_web_security);
memcpy(output + offset, (unsigned char *)&webmsg.web.security, len);
break;
case TYPE_P_W_NET://网络相关类型 4
len = sizeof(struct_web_net);
memcpy(output + offset, (unsigned char *)&webmsg.web.net, len);
break;
case TYPE_P_W_DDNS://DDNS相关类型 5
len = sizeof(struct_web_ddns);
memcpy(output + offset, (unsigned char *)&webmsg.web.ddns, len);
break;
case TYPE_P_W_MAILFTP://传输方式相关类型 6
len = sizeof(struct_web_mailftp);
memcpy(output + offset, (unsigned char *)&webmsg.web.mailftp, len);
break;
case TYPE_P_W_VIDEO://视音频相关类型 7
len = sizeof(struct_web_video);
memcpy(output + offset, (unsigned char *)&webmsg.web.application, len);
break;
case TYPE_P_W_TRIGGER://应用相关类型 8
len = sizeof(struct_web_application);
memcpy(output + offset, (unsigned char *)&webmsg.web.video, len);
break;
case TYPE_P_W_TOOL://工具相关类型 9
len = sizeof(struct_web_tool);
memcpy(output + offset, (unsigned char *)&webmsg.web.tool, len);
break;
case TYPE_P_W_UPDATE://软件更新相关类型 10
len = sizeof(struct_web_update);
memcpy(output + offset, (unsigned char *)&webmsg.web.update, len);
break;
default:
return 0;
break;
}
temp = len + LEN_TYPE_PACKET_WEB + LEN_PID;
memcpy(output, (unsigned char *)&temp, LEN_LEN_PACKET_WEB);
return (len + offset);//要加上数据包类型的长度和数据包的长度所占的长度
}
/*
* 功 能:创建链接控制的数据包
* 参 数:input:输入的数据
* len_input:输入的数据长度
* type:链接控制类型
* output:输出缓冲区
* 返回值:成功返回数据包的长度(包括包类型和长度),否则返回0
*/
unsigned short int rc_create_packet_connect(unsigned char *input, unsigned short int len_input, unsigned char type, unsigned char *output)
{
int offset;
unsigned short int temp;
unsigned short int len;
offset = LEN_LEN_PACKET_CON;
output[offset] = type;
offset += LEN_TYPE_PACKET_CON;
switch(type)
{
case TYPE_P_C_WEB://网页相关包类型
memcpy(output + offset, input, len_input);
len = len_input;
break;
case TYPE_P_C_LINK_ASK://链接请求包类型
memcpy(output + offset, input, len_input);
len = len_input;
break;
case TYPE_P_C_RETURN://返回结果包类型
return 0;
break;
case TYPE_P_C_HEART://心跳包类型
return 0;
break;
case TYPE_P_C_EVENT://事件包类型
return 0;
break;
default:
return 0;
break;
}
temp = len + LEN_TYPE_PACKET_CON;
memcpy(output, (unsigned char *)&temp, LEN_LEN_PACKET_CON);
return (len + offset);//要加上数据包类型的长度和数据包的长度所占的长度
}
/*
* 功 能:向摄像机请求所有相关信息
* 参 数:ctlinfo:链接相关信息
* 返回值:成功返回值大于或者等于0,否则返回-1
*/
int rc_reques_data_all_cam(struct_msg_con *ctlinfo)
{
int res = 0;
unsigned short int len_tmp;
unsigned short int len_con;
unsigned int len;
unsigned char temp[512];
unsigned char tmp_con[512];
unsigned char *buf = NULL;
char type;
struct_msg_web web;
struct_task_net_w *newsnd = NULL;
bzero(&web, sizeof(struct_msg_web));
web.action = TYPE_P_W_TOOL;
web.web.tool.action = EVENT_TOOL_WEB_REQUEST_ALL;
bzero(temp, sizeof(temp));
len_tmp = 0;
len_tmp = rc_create_packet_web(web, temp, getpid());
if(len_tmp == 0)
{
return -1;
}
type = TYPE_P_C_WEB;
bzero(tmp_con, sizeof(tmp_con));
len_con = rc_create_packet_connect(temp, len_tmp, type, tmp_con);
if(len_con == 0)
{
return -1;
}
buf = malloc(LEN_DATA_1024);
if(buf == NULL)
return -1;
bzero(buf, LEN_DATA_1024);
len = rc_create_packet(tmp_con, len_con, TYPE_P_F_CTL_CON, buf);
if(len == 0)
{
free(buf);
buf = NULL;
return -1;
}
newsnd = rc_create_task_new_w(ctlinfo, TYPE_CONNECT_CAM, NULL, buf, len);
pthread_mutex_lock(&mutex_w_cam);
res = rc_add_task_w(&task_w_cam, newsnd);
pthread_mutex_unlock(&mutex_w_cam);
return res;
}
/*
* 功 能:解析并处理网络部分的网页相关数据
* 参 数:data:数据
* len_d:数据长度
* serial:摄像机序列号
* 返回值:成功返回值大于或者等于0,否则返回值小于0
*/
int rc_deal_web_net(unsigned char *data, int len_d, const unsigned char *serial, struct_lab_mysql *mysql_lab)
{
int res;
unsigned short int len;
unsigned char type;
while(1)
{
len = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -