/* Includes ------------------------------------------------------------------*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef CFG_DEV_TYPE_LAND_CA /* 标准C库头文件. */ #include #include #include #include #include #include #include #include #include #include /* 用户代码头文件. */ #include "cmd.h" #include "fifo.h" #include "ca_main.h" #include "ca_csg.h" #include "debug.h" #include "ca_cau.h" #include "ca_dbg.h" #include "ca_param.h" #include "ca_network.h" /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ csg_t csg; int csg_reconn_times = 0; extern int cau_collect_flag; //extern int upg_state; //char csg_deliver_path[128] = {0}; /* Private function prototypes -----------------------------------------------*/ extern void _csg_server_set(int32_t ip, uint16_t port); /* Internal functions --------------------------------------------------------*/ CMD(csg_server_set, csg_server_set_cmd, "csg server A.B.C.D <1-65535>", "Csg\n" "Server\n" "IPv4 address\n" "UDP port\n") { _csg_server_set(inet_addr((char*)argv[0]), strtol((char*)argv[1], NULL, 10)); return CMD_SUCCESS; } CMD(socket_close, socket_close_cmd, "socket_close", "close socket fd\n") { //_csg_server_set(inet_addr((char*)argv[0]), strtol((char*)argv[1], NULL, 10)); printh("socket fd=%d closed\r\n", csg.fd); close(csg.fd); csg.fd = -1; return CMD_SUCCESS; } void _csg_server_set(int32_t ip, uint16_t port) { /* 比较配置 */ if (csg.server_ip != ip || csg.server_port != port) { csg.server_ip = ip; csg.server_port = port; /* 发送数据. */ bzero(&csg.server, sizeof(csg.server)); csg.server.sin_family = AF_INET; csg.server.sin_addr.s_addr = csg.server_ip; csg.server.sin_port = htons(csg.server_port); } } /* 配置保存函数. */ int _csg_config_save(vty_t* vty) { int16_t i = 0; struct in_addr addr; addr.s_addr = csg.server_ip; vty_out(vty, "csg server %s %d%s", inet_ntoa(addr), csg.server_port, VTY_NEWLINE); i++; return i; } #if 0 /* 校验收到包的包头, 长度, 校验码. */ int32_t _csg_pkt_check(char *pkt, int32_t len) { csg_pkt_head_t *head = (csg_pkt_head_t*)pkt; csg_pkt_tail_t *tail = (csg_pkt_tail_t*)(pkt + len - CSG_TAIL_LEN); uint16_t checksum = 0; uint16_t i = 0; if (head->head != 0x55aa) { DBG(DBG_M_PD_CSG_ERR, "Pkt head %x error!\r\n", head->head); return E_ERROR; } if( tail->tail != 0x5a5a) { DBG(DBG_M_PD_CSG_ERR, "Pkt tail %x error!\r\n", tail->tail); return E_ERROR; } if (head->len != (len - CSG_TOTLE_LEN)) { DBG(DBG_M_PD_CSG_ERR, "Pkt len %d(%d) error!\r\n", len - CSG_TOTLE_LEN, head->len); return E_ERROR; } for (i = CSG_HEAD_LEN; i < len - CSG_TAIL_LEN; i++) { checksum += (uint8_t)pkt[i]; } if (checksum != tail->checksum) { DBG(DBG_M_PD_CSG_ERR, "Pkt checksum %x(%x) error!\r\n", checksum, tail->checksum); return E_ERROR; } return E_NONE; } #endif /* 包头填充. */ void _csg_head_init(char *pkt, uint16_t cmd, uint16_t len) { LandPkHead *head = (LandPkHead *)pkt; memcpy(head, csg.buf_send, sizeof(LandPkHead)); head->Head = START_FLAG; head->Len = len + LandPackHeadTailLen; head->Type = cmd; head->ID = sysctrl.dev_hex_id; //head->LifeCnt = 1; head->gNum = 1; head->gNumIndex = 0; } void _csg_cheaksum(char *pkt, uint16_t len) { unsigned int checksum = 0; unsigned int *ptmp = (unsigned int *)(pkt + 4); int i; int tlen = (len + 16) >> 2; for (i = 0; i < tlen; i++) { checksum += *ptmp; ptmp++; } LandPkTail *tail = (LandPkTail *)(pkt + sizeof(LandPkHead) + len); tail->CheckSum = checksum; tail->EndFlag1 = END_FLAG; } int _csg_socket_open(unsigned int uiIp, unsigned short usPort) { int sock; int opt; struct timeval timeout; socklen_t optlen; int ret; /* 创建 socket. */ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { log_err(LOG_DEBUG, "ERROR at socket create return %s!", safe_strerror(errno)); return E_SYS_CALL; } LOG("sock=%d", sock); opt = 1024*500; optlen = sizeof(opt); setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &opt, optlen); //超时时间 timeout.tv_sec = 10; timeout.tv_usec = 0; optlen = sizeof(timeout); ret = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, optlen); if (ret == -1) { LOG("设置SOCKET选项: [%d]%s 失败",errno, strerror(errno)); close(sock); return -1; } //set_nonblock(sock); struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; #if 0 addr.sin_addr.s_addr = inet_addr("192.168.1.20"); #else addr.sin_addr.s_addr = uiIp;//inet_addr(ip); #endif addr.sin_port = htons(usPort); ret = connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); if (ret == 0) return sock; if (errno == EINPROGRESS || errno == EWOULDBLOCK) { fd_set wfds; FD_ZERO(&wfds); FD_SET(sock, &wfds); struct timeval tv = { 0 }; tv.tv_sec = 1; tv.tv_usec = 0; ret = select(sock + 1, NULL, &wfds, NULL, &tv); if (ret == 0) { LOG("connect timeout!\n"); } else if (ret > 0) { if (FD_ISSET(sock, &wfds)) { return sock; } } } LOG("errno[%d:%s]", errno, strerror(errno)); close(sock); sock = -1; return sock; } int _csg_connect() { if (csg.fd <= 0) { csg.fd = _csg_socket_open(csg.server_ip, csg.server_port); LOG("fd=%d", csg.fd); if (csg.fd <= 0) { csg.fd = -1; return -1; } } return 0; } int _csg_recv_packet(char *buf) { char *precvbuf = buf; int rd_size; rd_size = recv(csg.fd, precvbuf, sizeof(LandPkHead), 0); if (rd_size < 0) { LOG("recv faile.errno[%d]:%s", errno, strerror(errno)); return -1; } LandPkHead *head = (LandPkHead *)precvbuf; if(head->Head != 0x5555AAAA || (head->Len != 64 && head->Len != 1052)) { LOG("朗德协议客户端接收到错误数据包头, FD = %d",csg.fd); return -1; } int data_size = head->Len - sizeof(LandPkHead); precvbuf += sizeof(LandPkHead); rd_size = recv(csg.fd, precvbuf, data_size, 0); if (rd_size < 0) { LOG("recv faile.errno[%d]:%s", errno, strerror(errno)); return -1; } return rd_size + sizeof(LandPkHead); } int _csg_send_packet(uint16_t cmd, char *data, uint16_t len) { int32_t rv = 0; char pkt[2048] = {0}; _csg_head_init(pkt, cmd, len); memcpy(pkt + sizeof(LandPkHead), data, len); _csg_cheaksum(pkt, len); rv = send(csg.fd, pkt, len + LandPackHeadTailLen, 0); if (rv < 0) { DBG(DBG_M_CA_CSG_ERR, "Sendto return %s!\r\n", safe_strerror(errno)); close(csg.fd); csg.fd = -1; return E_SYS_CALL; } return E_NONE; } int _csg_response_force_id() { int len = 36; char data[36] = {0}; _csg_send_packet(Res_ForceReqID, data, len); return 0; } int _csg_response_realtime_data(int sendtype) { //1 填写8相电流 3相电压数据 float cauValues[11] = {0}; debug_pkt_realdata_t realdata = {0}; _cau_get_current_values(cauValues); realdata.proVer = 0x00000363; time_t t; time(&t); realdata.utc = t - SHIQUCHA; realdata.powertatus = 0; realdata.batteryStatus = 1; realdata.vbat = pwr.vbat; realdata.vsc = pwr.vsc; realdata.vout = pwr.vout; RtdPack_t *prtd = &realdata.rtd; prtd->StartFlag1 = sysctrl.dev_hex_id; prtd->FarmeType = sendtype; prtd->RunSecCnt = t - sysctrl.start_time; prtd->Local_Vbat = pwr.vbat; prtd->RMS_Ia = cauValues[0]; prtd->RMS_Ib = cauValues[1]; prtd->RMS_Ic = cauValues[2]; prtd->RMS_In = cauValues[3]; prtd->RMS_Ground = cauValues[4]; prtd->RMS_rIa = cauValues[5]; prtd->RMS_rIb = cauValues[6]; prtd->RMS_rIc = cauValues[7]; prtd->RMS_Va = cauValues[8]; prtd->RMS_Vb = cauValues[9]; prtd->RMS_Vc = cauValues[10]; prtd->endFlag = 0x0A0D; DBG(DBG_M_CA_CSG, "RMS_Ia=%f \n", prtd->RMS_Ia); DBG(DBG_M_CA_CSG, "RMS_Ib=%f \n", prtd->RMS_Ib); DBG(DBG_M_CA_CSG, "RMS_Ic=%f \n", prtd->RMS_Ic); DBG(DBG_M_CA_CSG, "RMS_In=%f \n", prtd->RMS_In); DBG(DBG_M_CA_CSG, "RMS_Ground=%f \n", prtd->RMS_Ground); DBG(DBG_M_CA_CSG, "RMS_rIa=%f \n", prtd->RMS_rIa); DBG(DBG_M_CA_CSG, "RMS_rIb=%f \n", prtd->RMS_rIb); DBG(DBG_M_CA_CSG, "RMS_rIc=%f \n", prtd->RMS_rIc); WarringPack_t *pwar = &realdata.war; pwar->StartFlag1 = sysctrl.dev_hex_id; pwar->endFlag = 0x0A0D; pwar->RunSecCnt = t - sysctrl.start_time; _csg_send_packet(Res_ReqRTD2, (char *)&realdata, sizeof(debug_pkt_realdata_t)); return 0; } void _csg_set_system_time(unsigned int time) { struct tm *p =localtime((time_t *)&time); char buf[128] = {0}; sprintf(buf,"date -s \"%d-%d-%d %d:%d:%d\"",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec); LOG("%s U32:0x%08x",buf,time); system(buf); system("hwclock -w"); } int _csg_set_utc_time(char *databuf, int datalen) { if (datalen != sizeof(csg_utc_t)) { int result = 0; DBG(DBG_M_CA_CSG_ERR, "msg reallen:%d,expect len:%d\n", datalen, sizeof(csg_utc_t)); return _csg_send_packet(Res_SetUTC, (char *)&result, sizeof(result)); } csg_utc_t *msg = (csg_utc_t *)databuf; unsigned int stime = msg->utc + SHIQUCHA; if (abs(stime - time(NULL)) > 60) { unsigned int tmp = time(NULL) - sysctrl.start_time; _csg_set_system_time(stime); sysctrl.start_time = time(NULL) - tmp; } csg_utc_t ack = {0}; ack.utc = time(NULL) - SHIQUCHA; _csg_send_packet(Res_SetUTC, (char *)&ack, sizeof(csg_utc_t)); return 0; } void _csg_reboot_system() { unsigned int ack[9] = {0}; _csg_send_packet(Res_Reboot, (char *)&ack, sizeof(ack)); reboot_system(LOG_CSG, BOOT_REMOTE_RESET); } int _csg_get_system_config() { struct in_addr addr; strncpy((char *)pparam_config->gateway.DeviceNum, host.name, 15); inet_pton(AF_INET, device_info.host_ip, &addr); memcpy(pparam_config->gateway.LocalIP1, &addr.s_addr, 4); memcpy(pparam_config->gateway.ServerIP1, &csg.server.sin_addr.s_addr, 4); pparam_config->gateway.ServerIP1_Port = csg.server_port; char buf[64] = {0}; sprintf(buf, "V%s", host.version); strcpy((char *)pparam_config->gateway.reserved, buf); _csg_send_packet(Res_ReqSysCfg, (char *)&pparam_config->gateway, sizeof(GateWay_t)); return 0; } int _csg_set_system_config(char *databuf, int datalen) { if (datalen != sizeof(GateWay_t)) { int result = 0; DBG(DBG_M_CA_CSG_ERR, "msg reallen:%d,expect len:%d\n", datalen, sizeof(GateWay_t)); return _csg_send_packet(Res_SetSysCfg, (char *)&result, sizeof(result)); } GateWay_t *pcfg = (GateWay_t *)databuf; if (strncmp((char *)pcfg->apn, (char *)pparam_config->gateway.apn, sizeof(pparam_config->gateway.apn)) != 0) { _network_change_apn((char *)pcfg->apn); } strncpy(host.name, (char *)pcfg->DeviceNum, 15); sysctrl.dev_hex_id = dev_id_2_hex(host.name); sprintf(device_info.host_ip, "%d.%d.%d.%d", pcfg->LocalIP1[0], pcfg->LocalIP1[1], pcfg->LocalIP1[2], pcfg->LocalIP1[3]); char serverip[16] = {0}; sprintf(serverip, "%d.%d.%d.%d", pcfg->ServerIP1[0], pcfg->ServerIP1[1], pcfg->ServerIP1[2], pcfg->ServerIP1[3]); csg.server_ip = inet_addr(serverip); LOG("serverip=0x%x", csg.server_ip); LOG("%d %d %d %d", csg.server_ip & 0xff, (csg.server_ip >> 8) & 0xff, (csg.server_ip >> 16) & 0xff, (csg.server_ip >> 24) & 0xff); csg.server_port = (uint16_t)pcfg->ServerIP1_Port; LOG("CommunicationMode=%d\n", pcfg->CommunicationMode); memcpy(&pparam_config->gateway, databuf, datalen); param_save(); vtysh_config_save(); uint8_t mac[MAC_ADDR_LEN] = {0}; mac_generate_from_ip(device_info.host_ip, mac); memcpy(device_info.mac, mac, MAC_ADDR_LEN); vtysh_eth0_save(); vtysh_device_save(); reboot_system(LOG_DEBUG, BOOT_REMOTE_IP_CHANGE); return 0; } int _csg_get_device_config() { _csg_send_packet(Res_ReqDevCfg, (char *)&pparam_config->landHexCfg, sizeof(LandDevCfg_t)); return 0; } int _csg_set_device_config(char *databuf, int datalen) { if (datalen != sizeof(LandDevCfg_t)) { int result = 0; DBG(DBG_M_CA_CSG_ERR, "msg reallen:%d,expect len:%d\n", datalen, sizeof(LandDevCfg_t)); return _csg_send_packet(Res_SetDevCfg, (char *)&result, sizeof(result)); } memcpy(&pparam_config->landHexCfg, databuf, sizeof(LandDevCfg_t)); param_save(); return 0; } int _csg_get_cau_cfg() { char buf[1024] = {0}; int i; int len; for (i = 0; i < 24; i++) { memcpy(buf + i * 32, &pparam_config->cauParam[i], 24); } len = 32 * 24; _csg_send_packet(Res_ReqCauCfg, buf, len); return 0; } int _csg_set_cau_cfg(char *databuf, int datalen) { int i; if (datalen != 1024) { DBG(DBG_M_CA_CSG_ERR, "msg reallen:%d,expect len:1024\n", datalen); int result = 0; return _csg_send_packet(Res_SetCauCfg, (char *)&result, sizeof(result)); } for (i = 0; i < 24; i++) { memcpy(&pparam_config->cauParam[i], databuf + i * 32, 24); } param_save(); int result = 1; return _csg_send_packet(Res_SetCauCfg, (char *)&result, sizeof(result)); } int _csg_upgrade_arm(char *databuf, int datalen, LandPkHead *head) { csg_upgrade_response_t ack = {0}; static FILE *upgradefp = NULL; static int file_len = 0; char upgrade_file[128] = {0}; if (datalen != sizeof(csg_upgrade_t)) { DBG(DBG_M_CA_CSG_ERR, "msg reallen:%d,expect len:%d\n", datalen, sizeof(csg_upgrade_t)); ack.status = 1; return _csg_send_packet(Res_AppUpdate, (char *)&ack, sizeof(ack)); } csg_upgrade_t *pmsg = (csg_upgrade_t *)databuf; LOG("len=%d gNum=%d gNumIndex=%d\n", pmsg->len, head->gNum, head->gNumIndex); if (head->gNumIndex == 0) { if (upgradefp) { fclose(upgradefp); upgradefp = NULL; } if (upgradefp == NULL) { sprintf(upgrade_file, "%s/%s", UPDATE_FILE_PATH, UPDATE_TMP_FILE_NAME); upgradefp = fopen(upgrade_file, "wb"); if (upgradefp == NULL) { printh("open file error[%d]:%s", errno, strerror(errno)); return -1; } } } int size = pmsg->len; int wrlen = fwrite(pmsg->data, 1, size, upgradefp); if (wrlen != size) { size = size - wrlen; wrlen = fwrite(pmsg->data+wrlen, 1, size, upgradefp); printh("write again:size=%d, wrlen=%d\n", size, wrlen); file_len += wrlen; } file_len += wrlen; if (head->gNum == head->gNumIndex + 1) { fclose(upgradefp); upgradefp = NULL; ack.status = 0; _csg_send_packet(Res_AppUpdate, (char *)&ack, sizeof(ack)); LOG("update success!!!"); char cmd[128] = {0}; snprintf(cmd, 127, "mv %s/%s %s/%s", UPDATE_FILE_PATH, UPDATE_TMP_FILE_NAME, UPDATE_FILE_PATH, UPDATE_FILE_NAME); system(cmd); system("sync"); printh("ls -l | grep update*\n"); system("ls -l | grep update*"); reboot_system(LOG_DEBUG, BOOT_LOCAL_ARM_UPGRADE); } ack.status = 0; _csg_send_packet(Res_AppUpdate, (char *)&ack, sizeof(ack)); return 0; } #if 0 int _csg_upload_realtime_data() { LOG("\n"); RtdPack_t rtd = {0}; //1 填写8相电流 3相电压数据 float cauValues[11] = {0}; _dbg_get_current_cau_values(cauValues); rtd.StartFlag1 = 601000001; rtd.FarmeType = 0; time_t t; time(&t); rtd.RunSecCnt = t - sysctrl.start_time; rtd.Local_Vbat = 0; rtd.RMS_Ia = cauValues[0]; rtd.RMS_Ib = cauValues[1]; rtd.RMS_Ic = cauValues[2]; rtd.RMS_In = cauValues[3]; rtd.RMS_Ground = cauValues[4]; rtd.RMS_rIa = cauValues[5]; rtd.RMS_rIb = cauValues[6]; rtd.RMS_rIc = cauValues[7]; rtd.RMS_Va = cauValues[8]; rtd.RMS_Vb = cauValues[9]; rtd.RMS_Vc = cauValues[10]; rtd.endFlag = 0x0A0D; _csg_send_packet(Res_ReqRTD2, NULL, (char *)&rtd, sizeof(RtdPack_t)); return 0; } #endif char *time2str(char *str) { time_t t; struct tm *ptm; time(&t); ptm = localtime(&t); sprintf(str, "%04d-%02d-%02d %02d:%02d:%02d",ptm ->tm_year+1900,ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); return str; } int _csg_recv_process(char *buf) { if (_csg_recv_packet(buf) < 0) { return -1; } LandPkHead *head = (LandPkHead *)buf; //---------------------------- char str[128] = {0}; time2str(str); int dataLen = head->Len - LandPackHeadTailLen; char *pdata = buf + sizeof(LandPkHead); DBG(DBG_M_CA_CSG, "%s cmd=0x%x len=%d\n", str, head->Type, dataLen); //---------------------------- switch (head->Type) { case Cmd_ForceReqID: _csg_response_force_id(); break; case Cmd_ReqRTD2: _csg_response_realtime_data(1); break; case Cmd_SetUTC: _csg_set_utc_time(pdata, dataLen); break; case Cmd_Reboot: _csg_reboot_system(); break; case Cmd_ReqSysCfg: _csg_get_system_config(); break; case Cmd_SetSysCfg: _csg_set_system_config(pdata, dataLen); break; case Cmd_ReqDevCfg: _csg_get_device_config(); break; case Cmd_SetDevCfg: _csg_set_device_config(pdata, dataLen); break; case Cmd_ReqCauCfg: _csg_get_cau_cfg(); break; case Cmd_SetCauCfg: _csg_set_cau_cfg(pdata, dataLen); break; case Cmd_AppUpdate: _csg_upgrade_arm(pdata, dataLen, head); break; default: break; } return 0; } void *_csg_recv_handle() { char *buf = csg.buf_send; while (1) { if (csg.fd > 0) { _csg_recv_process(buf); } usleep(100*1000); } } void *_csg_manage_handle(void *arg) { unsigned int cur_time, diff_time, last_time; cur_time = time(NULL); last_time = cur_time; while (1) { if (pparam_config->gateway.ServerIP1[0] == 0 || pparam_config->gateway.ServerIP1[1] == 0 || pparam_config->gateway.ServerIP1[2] == 0 || pparam_config->gateway.ServerIP1[3] == 0 || pparam_config->gateway.ServerIP1_Port == 0 || pparam_config->gateway.CommunicationMode != 1) { sleep(1); DBG(DBG_M_CA_CSG_ERR, "param error: ServerIP1:%d.%d.%d.%d ServerIP1_Port:%d CommunicationMode:%d\r\n", pparam_config->gateway.ServerIP1[0], pparam_config->gateway.ServerIP1[1], pparam_config->gateway.ServerIP1[2], pparam_config->gateway.ServerIP1[3], pparam_config->gateway.ServerIP1_Port, pparam_config->gateway.CommunicationMode); continue; } if (_csg_connect() < 0) { csg_reconn_times++; sleep(10); continue; } csg_reconn_times = 0; cur_time = time(NULL); diff_time = CPUMS_DIFF(last_time, cur_time); //LOG("diff_time=%d uploadSpace = %d", diff_time, pparam_config->gateway.uploadSpace); //if (diff_time >= pparam_config->gateway.uploadSpace) if (cau_collect_flag == 1) { cau_collect_flag = 0; last_time = cur_time; DBG(DBG_M_CA_CSG, "auto send:_csg_response_realtime_data"); _csg_response_realtime_data(0); } usleep(200*1000); } } /* 后台通讯公共部分初始化. */ int32_t _csg_handle_init_common(void) { //struct sockaddr_in server; struct sched_param param; pthread_attr_t attr; pthread_t pid; int32_t rv = 0; #if 0 /* 配置线程RR调度, 优先级70 */ pthread_attr_init(&attr); param.sched_priority = 70; pthread_attr_setschedpolicy(&attr, SCHED_RR); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); rv = pthread_create(&pid, &attr, _csg_send_handle, NULL); if (rv != 0) { log_err(LOG_CSG, "PD can't create pthread %d!", rv); return E_SYS_CALL; } else { thread_m_add("CSG_SEND", pid); } pthread_attr_destroy(&attr); #endif /* 配置线程RR调度, 优先级70 */ pthread_attr_init(&attr); param.sched_priority = 70; pthread_attr_setschedpolicy(&attr, SCHED_RR); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); rv = pthread_create(&pid, &attr, _csg_recv_handle, NULL); if (rv != 0) { log_err(LOG_CSG, "PD can't create recv pthread %d!", rv); return E_SYS_CALL; } else { thread_m_add("CSG_RCVE", pid); } pthread_attr_destroy(&attr); /* 配置线程RR调度, 优先级70 */ pthread_attr_init(&attr); param.sched_priority = 70; pthread_attr_setschedpolicy(&attr, SCHED_RR); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); rv = pthread_create(&pid, &attr, _csg_manage_handle, NULL); if (rv != 0) { log_err(LOG_CSG, "PD can't create manage pthread %d!", rv); return E_SYS_CALL; } else { thread_m_add("CSG_MANAGE", pid); } pthread_attr_destroy(&attr); return E_NONE; } /* Interface functions -------------------------------------------------------*/ /* 后台通讯模块初始化. */ int32_t csg_handle_init(void) { int32_t rv = 0; memset(&csg, 0, sizeof(csg_t)); csg.fd = -1; /* 初始化模块. */ LD_E_RETURN(DBG_M_CA_CSG_ERR, _csg_handle_init_common()); cmd_install_element(CONFIG_NODE, &csg_server_set_cmd); cmd_install_element(ENABLE_NODE, &socket_close_cmd); /* 注册配置保存函数 */ rv = cmd_config_node_config_register(CONFIG_PRI_CSG, _csg_config_save); if (rv != E_NONE) { log_err(LOG_CSG, "Command save register ERROR %d!", rv); return rv; } return E_NONE; } #endif