/*************************************************************** Copyright © huijue Network Co., Ltd. 1998-2129. All rights reserved. Copyright © 上海汇珏网络通信设备股份有限公司 1998-2129. All rights reserved. 文件名 : CjsonCreate_Init.c 作者 : kooloo 版本 : V1.0 描述 : 动环监控/边缘网关FSU Cjson文件创建及初始化 kooloo add 202310 硬件平台 : iMX6ULL 内核版本 : linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7 编译器版本 :gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf 日志 : 初版V1.0 2023/7/15 kooloo创建 ***************************************************************/ #include #include #include #include #include #include "public.h" //公共函数头文件 #include "mslog.h" #include "ProcessisRunning.h" #include #include //posix 内存共享 消息队列 #include #include #include //添加头文件 kooloo add 202311 #include "cJSON.h" //cjson 表 #include /* cJSON 填坑指南 * Cjson 使用注意事项 cJSON_Parse 、cJSON_Createxxx 后必须使用 cJSON_Delete 释放内存。 * 一定要确认不在使用,不在任何节点使用,否则容易异常 * cJSON_Print 后必须使用 cJSON_free 释放内存。不可以乱用,容易造成异常 kooloo add 202312 * cJSON_DeleteItemFromObject 删除 cJSON_Createxxx 创建的对象后,不能再使用 cJSON_Delete 删除其节点数据。 * * * * * * / //#include "sqlite3.h" /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: CjsonCreate_FSUSelf_Init ** 功能描述: 创建节点 初始化 FSU设备自身 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ cJSON* CjsonCreate_FSUSelf_Init(void) { //创建根节点JSON(最外面大括号的JSON对象) cJSON* jsonnode = cJSON_CreateObject(); //FSU编码 kooloo add 202312 cJSON_AddItemToObject(jsonnode, C_FSUCODENAME, cJSON_CreateString(g_DeviceCfg.devConf.DeviceNumber)); //"11010110001" //读写属性 后续根据需要 更新 kooloo add 202312 cJSON_AddItemToObject(jsonnode, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_DATA));//消息属性 //抓取有效数据组成cjson表 抓取设备本身数据表 cJSON* jsonContent; if (!strcmp(C_PROTOCOLSELECTION_OID, g_DeviceCfg.ProtocolSelection)) {//如果OID jsonContent = GetCjson_fromdb(C_SELECT_SQLSTR_OID); } else if (!strcmp(C_PROTOCOLSELECTION_SIGNALID, g_DeviceCfg.ProtocolSelection)) { jsonContent = GetCjson_fromdb(C_SELECT_SQLSTR_SIGNALID); } else //默认暂时为OID kooloo add 202312 { jsonContent = GetCjson_fromdb(C_SELECT_SQLSTR_OID); } cJSON_AddItemToObject(jsonnode, C_IDCODECONTENT, jsonContent); //获取时间戳 kooloo add 202312 char TempTimeBuf[20]; GetLocalTimeStr(TempTimeBuf); cJSON_AddItemToObject(jsonnode, C_TIMESTAMP, cJSON_CreateString(TempTimeBuf)); //时间戳,此时间戳无具体意义,仅加载在cjson文件中 cJSON* json_FSUSelf = cJSON_CreateObject(); cJSON_AddItemToObject(json_FSUSelf, g_DeviceCfg.FSUDeviceSelfTableName, jsonnode); return json_FSUSelf; } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: CjsonAppend_Table_Init ** 功能描述: json 追加表初始化 根据数据库情况添加表 公共发送表 ** 参数描述:cJSON * json 向其追加,返回指针 ** 日  期: 2023年12月20日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ cJSON* CjsonAppend_Table_Init(cJSON* json) { //创建根节点JSON(最外面大括号的JSON对象) cJSON* jsonsubnode = cJSON_CreateObject(); //FSU编码 kooloo add 202312 cJSON_AddItemToObject(jsonsubnode, C_FSUCODENAME, cJSON_CreateString(g_DeviceCfg.devConf.DeviceNumber)); //"11010110001" //读写属性 后续根据需要 更新 kooloo add 202312 cJSON_AddItemToObject(jsonsubnode, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_DATA));//消息属性 //抓取有效数据组成cjson表 抓取设备本身数据表 cJSON* jsonContent = cJSON_CreateArray(); cJSON_AddItemToObject(jsonsubnode, C_IDCODECONTENT, jsonContent); //获取时间戳 kooloo add 202312 char TempTimeBuf[20]; GetLocalTimeStr(TempTimeBuf); cJSON_AddItemToObject(jsonsubnode, C_TIMESTAMP, cJSON_CreateString(TempTimeBuf)); //时间戳,此时间戳无具体意义,仅加载在cjson文件中 cJSON_AddItemToObject(json, C_GATEWAY_DATAFORMATPUBLIC, jsonsubnode); return json; } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: printfJson ** 功能描述: 打印CJSON ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void printfJson(cJSON* json) { if (NULL == json) { return; } char* cjson = cJSON_Print(json);//深拷贝 ms_info1("json:%s le %d\n", cjson, strlen(cjson)); free(cjson); } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: writeJsonFile ** 功能描述: 将节点数据保存到文件中 保存JSON 默认放在执行文件的上层目录的tmp文件中 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void writeJsonFile(char* fileName, cJSON* json) { if (NULL == json || NULL == fileName) { return; } char* cjson = cJSON_Print(json); FILE* fp = NULL; //新建一个文本文件,已存在的文件将内容清空,允许读写 fp = fopen(fileName, "w+"); if (NULL != fp) { fwrite(cjson, strlen(cjson), 1, fp); fclose(fp); } if (NULL != cjson) { free(cjson); } } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: GetJson_FSUDevice_UpdateData ** 功能描述: 获取FSUDevice自身的json表,并更新相关数据的变量 kooloo add 202312 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ cJSON* GetJson_FSUDevice_UpdateData(cJSON* json) { int ret; cJSON* json_rt = cJSON_GetObjectItem(json, g_DeviceCfg.FSUDeviceSelfTableName); //获取表中数组; //指向根节点 //数据更新 /* 获取信息 */ ret = sysinfo(&pSysPara->sys_info); if (-1 == ret) //如果获取错误则 错误 暂时无法确定触发此条件要求 kooloo add 202312 暂时不跳出 kooloo add { ms_error1("sysinfo error!\n"); } /* 获取信息 */ ret = uname(&pSysPara->os_info); if (-1 == ret) { ms_error1("uname error!\n"); } //获取数组 并更新数组 cJSON* json_Arr = cJSON_GetObjectItem(json_rt, C_IDCODECONTENT); //获取表中数组 //数据替换 kooloo add 202312 char strbuf[20] = { 0 }; cJSON* json_arraydata; //系统信息 //eInfoSysname json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoSysname); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(pSysPara->os_info.sysname)); //eInfoNodename json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoNodename); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(pSysPara->os_info.nodename)); //eInfoRelease json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoRelease); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(pSysPara->os_info.release)); //eInfoVersion json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoVersion); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(pSysPara->os_info.version)); //eInfoMachine json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoMachine); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(pSysPara->os_info.machine)); //eInfoUptime json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoUptime); sprintf(strbuf, "%d", pSysPara->sys_info.uptime); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(strbuf)); //eInfoTotalram json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoTotalram); sprintf(strbuf, "%d", pSysPara->sys_info.totalram); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(strbuf)); //eInfoFreeram json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoFreeram); sprintf(strbuf, "%d", pSysPara->sys_info.freeram); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(strbuf)); //eInfoProcs json_arraydata = cJSON_GetArrayItem(json_Arr, eInfoProcs); sprintf(strbuf, "%d", pSysPara->sys_info.procs); cJSON_ReplaceItemInObject(json_arraydata, "Value", cJSON_CreateString(strbuf)); //获取时间戳 kooloo add 202312 更新时间戳 // char TempTimeBuf[20]; GetLocalTimeStr(strbuf); cJSON_ReplaceItemInObject(json_rt, C_TIMESTAMP, cJSON_CreateString(strbuf)); //消息属性 更换 kooloo add 202312 cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_DATA)); return json_rt; } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: mq_sendJson ** 功能描述: 发送json表 到队列中 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void mq_sendJson(cJSON* json) { if (NULL == json) { return; } #if 0 if (sendcounter < 100) { sendcounter++; ms_info1("sendcounter %d \n", sendcounter); } else { ms_info1("sendcounter %d \n", sendcounter); while (1) { sleep(1); } return; } #endif char* cjson = cJSON_Print(json);//深拷贝 int len = mq_send(MqdSrcToDst, cjson, strlen(cjson), 0); ms_info1("jsonlen %d json:%s,sendlen:%d\n", strlen(cjson), cjson, len); free(cjson); } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: mq_sendJson_subdevfromID ** 功能描述: 发送json表 从ID和轮询号中获取 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void mq_sendJson_subdevfromID(int tyid, int polli) { //获取 表 根据检索表 kooloo add 202312 char Temp_Str[200] = { 0 }; //临时变量 kooloo 直接往strSql尾部添加字符串会造成Segmentation fault cJSON* json_arraydata; //获取json 数组 kooloo add 202312 char strbuf[20] = { 0 }; //临时用变量 转换用 sprintf(strbuf, "%d", polli + 1); memset(Temp_Str, 0, 200); //将数组清空 strcpy(Temp_Str, g_CfgTab_Rs485_Gather.g_CfgTab_SmartDeviceType[tyid].Name); //将表名添加 kooloo add 20230928 strcat(Temp_Str, ":"); //将间隔符添加 kooloo add 20230928 strcat(Temp_Str, strbuf); //将序号添加 kooloo add 20230928 cJSON* json_rt = cJSON_GetObjectItem(json_roottable, Temp_Str); //获取表中数组; //指向根节点 cJSON* json_sub = cJSON_GetObjectItem(json_rt, "遥测"); //获取表中数组; //指向根节点 //消息属性 更换 kooloo add 202312 cJSON_ReplaceItemInObject(json_sub, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_DATA)); mq_sendJson(json_sub); //将遥测数据发送 kooloo add 202312 json_sub = cJSON_GetObjectItem(json_rt, "遥信"); //获取表中数组; //指向根节点 mq_sendJson(json_sub); //将遥测数据发送 kooloo add 202312 } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: mq_sendRemJson_subdevfromID ** 功能描述: 发送遥测json表 从ID和轮询号中获取 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void mq_sendRemJson_subdevfromID(int tyid, int polli) { //获取 表 根据检索表 kooloo add 202312 char Temp_Str[200] = { 0 }; //临时变量 kooloo 直接往strSql尾部添加字符串会造成Segmentation fault cJSON* json_arraydata; //获取json 数组 kooloo add 202312 char strbuf[20] = { 0 }; //临时用变量 转换用 sprintf(strbuf, "%d", polli + 1); memset(Temp_Str, 0, 200); //将数组清空 strcpy(Temp_Str, g_CfgTab_Rs485_Gather.g_CfgTab_SmartDeviceType[tyid].Name); //将表名添加 kooloo add 20230928 strcat(Temp_Str, ":"); //将间隔符添加 kooloo add 20230928 strcat(Temp_Str, strbuf); //将序号添加 kooloo add 20230928 cJSON* json_rt = cJSON_GetObjectItem(json_roottable, Temp_Str); //获取表中数组; //指向根节点 cJSON* json_sub = cJSON_GetObjectItem(json_rt, "遥测"); //获取表中数组; //指向根节点 //消息属性 更换 kooloo add 202312 cJSON_ReplaceItemInObject(json_sub, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_READDATA)); mq_sendJson(json_sub); //将遥测数据发送 kooloo add 202312 } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: mq_sendResJson_subdevfromID ** 功能描述: 发送遥信json表 从ID和轮询号中获取 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void mq_sendResJson_subdevfromID(int tyid, int polli) { //获取 表 根据检索表 kooloo add 202312 char Temp_Str[200] = { 0 }; //临时变量 kooloo 直接往strSql尾部添加字符串会造成Segmentation fault cJSON* json_arraydata; //获取json 数组 kooloo add 202312 char strbuf[20] = { 0 }; //临时用变量 转换用 sprintf(strbuf, "%d", polli + 1); memset(Temp_Str, 0, 200); //将数组清空 strcpy(Temp_Str, g_CfgTab_Rs485_Gather.g_CfgTab_SmartDeviceType[tyid].Name); //将表名添加 kooloo add 20230928 strcat(Temp_Str, ":"); //将间隔符添加 kooloo add 20230928 strcat(Temp_Str, strbuf); //将序号添加 kooloo add 20230928 cJSON* json_rt = cJSON_GetObjectItem(json_roottable, Temp_Str); //获取表中数组; //指向根节点 cJSON* json_sub = cJSON_GetObjectItem(json_rt, "遥信"); //获取表中数组; //指向根节点 mq_sendJson(json_sub); //将遥测数据发送 kooloo add 202312 } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: mq_sendRecJson_subdevfromID ** 功能描述: 发送遥控json表 从ID和轮询号中获取 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void mq_sendRecJson_subdevfromID(int tyid, int polli) { //获取 表 根据检索表 kooloo add 202312 char Temp_Str[200] = { 0 }; //临时变量 kooloo 直接往strSql尾部添加字符串会造成Segmentation fault cJSON* json_arraydata; //获取json 数组 kooloo add 202312 char strbuf[20] = { 0 }; //临时用变量 转换用 sprintf(strbuf, "%d", polli + 1); memset(Temp_Str, 0, 200); //将数组清空 strcpy(Temp_Str, g_CfgTab_Rs485_Gather.g_CfgTab_SmartDeviceType[tyid].Name); //将表名添加 kooloo add 20230928 strcat(Temp_Str, ":"); //将间隔符添加 kooloo add 20230928 strcat(Temp_Str, strbuf); //将序号添加 kooloo add 20230928 cJSON* json_rt = cJSON_GetObjectItem(json_roottable, Temp_Str); //获取表中数组; //指向根节点 cJSON* json_sub = cJSON_GetObjectItem(json_rt, "遥控"); //获取表中数组; //指向根节点 mq_sendJson(json_sub); //将遥测数据发送 kooloo add 202312 } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: mq_sendRerJson_subdevfromID ** 功能描述: 发送遥调json表 从ID和轮询号中获取 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void mq_sendRerJson_subdevfromID(int tyid, int polli) { //获取 表 根据检索表 kooloo add 202312 char Temp_Str[200] = { 0 }; //临时变量 kooloo 直接往strSql尾部添加字符串会造成Segmentation fault cJSON* json_arraydata; //获取json 数组 kooloo add 202312 char strbuf[20] = { 0 }; //临时用变量 转换用 sprintf(strbuf, "%d", polli + 1); memset(Temp_Str, 0, 200); //将数组清空 strcpy(Temp_Str, g_CfgTab_Rs485_Gather.g_CfgTab_SmartDeviceType[tyid].Name); //将表名添加 kooloo add 20230928 strcat(Temp_Str, ":"); //将间隔符添加 kooloo add 20230928 strcat(Temp_Str, strbuf); //将序号添加 kooloo add 20230928 cJSON* json_rt = cJSON_GetObjectItem(json_roottable, Temp_Str); //获取表中数组; //指向根节点 cJSON* json_sub = cJSON_GetObjectItem(json_rt, "遥调"); //获取表中数组; //指向根节点 mq_sendJson(json_sub); //将遥测数据发送 kooloo add 202312 } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: Mq_ReceiveJson_Handle ** 功能描述: 处理 接收到的json 数据 kooloo add 202412 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void Mq_ReceiveJson_Handle(char* msgbuf, int msgsize) { char* tmsgbuf = (char*)malloc(msgsize); memset(tmsgbuf, 0, msgsize); strncpy(tmsgbuf, msgbuf, msgsize); //将数据拷贝 kooloo add 202401 cJSON* json_rt = cJSON_Parse(tmsgbuf); int len; if (NULL == json_rt) // 接收到其它数据 不做处理 { ms_info1("非json:%s\n", tmsgbuf); } else //json 解析正常 判断 { //获取数组 并更新数组 cJSON* json_Arr = cJSON_GetObjectItem(json_rt, C_IDCODECONTENT); //获取表中数组 if (json_Arr == NULL) { return; } cJSON* json_arraydata; //获取json 数组 kooloo add 202312 json_arraydata = cJSON_GetArrayItem(json_Arr, 0); if (json_arraydata == NULL) { return; } cJSON* json_arraydata_Oid = cJSON_GetObjectItem(json_arraydata, C_PROTOCOLSELECTION_OID); if (json_arraydata_Oid == NULL) { return; } OID_Content_t oid; OidAnalysis_fromoidstr(json_arraydata_Oid->valuestring, &oid); ms_info1("DevType %d SignalSN %d SignalType %d SimilarDevSN %d StationType %d \n", oid.DevType, oid.SignalSN, oid.SignalType, oid.SimilarDevSN, oid.StationType); int tyid = GetTyid_fromDevCod(oid.DevType); //获取tyid kooloo add 202401 将设备编码里的设备类型对应成程序的序号 cJSON* json_FsuID = cJSON_GetObjectItem(json_rt, C_FSUCODENAME); //获取表中ID 并做判断 if (json_FsuID == NULL) { return; } if (!strcmp(g_DeviceCfg.devConf.DeviceNumber, json_FsuID->valuestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 { cJSON* json_Type = cJSON_GetObjectItem(json_rt, C_GATEWAY_DATATYPE); //获取表中ID 并做判断 if (!strcmp(C_SERVER_READDATA, json_Type->valuestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 遥测 { if(oid.SignalType==C_SIGNALTYPE_YX_TELESIGNAL) //遥信 { mq_sendResJson_subdevfromID(tyid, oid.SimilarDevSN - 1); //遥信直接获取 } else if(oid.SignalType==C_SIGNALTYPE_YC_TELEMETERING) //遥测 { mq_sendRemJson_subdevfromID(tyid, oid.SimilarDevSN - 1); //遥测直接获取 } else if(oid.SignalType==C_SIGNALTYPE_YK_TELECONTROL) //获取遥控 { mq_sendRecJson_subdevfromID(tyid, oid.SimilarDevSN - 1); } else if(oid.SignalType==C_SIGNALTYPE_YT_TELEADJUSTING) //获取遥调 设置 { mq_sendRerJson_subdevfromID(tyid, oid.SimilarDevSN - 1); } ms_info1("type :%d cjson:%s,Rxlen:%d\n",oid.SignalType,tmsgbuf, strlen(tmsgbuf)); } else if (!strcmp(C_SERVER_WRITEDATA, json_Type->valuestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 遥调 更新数据 { //cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_WRITEDATA)); //mq_sendJson(json_rt); //将遥*数据发送 kooloo add 202312 char* tmsgbuf_spvp = (char*)malloc(C_SERIALPORT_MQ_MSGSIZE); memset(tmsgbuf_spvp, 0, C_SERIALPORT_MQ_MSGSIZE); strncpy(tmsgbuf_spvp, msgbuf, C_SERIALPORT_MQ_MSGSIZE); //将数据拷贝 kooloo add 202401 if(tFunTyID_DevCod_buf[tyid].PortIDvaluestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 遥信 不需要调整 { mq_sendResJson_subdevfromID(tyid, oid.SimilarDevSN - 1); ms_info1("type :%d cjson:%s,Rxlen:%d\n",oid.SignalType,tmsgbuf, strlen(tmsgbuf)); } else if (!strcmp(C_SERVER_CRTLDATA, json_Type->valuestring)) //如果接收到的消息是FSUCODE 正确 则将消息转发 否则忽略 遥控 更新数据 { //cJSON_ReplaceItemInObject(json_rt, C_GATEWAY_DATATYPE, cJSON_CreateString(C_GATEWAY_CTRLDATA)); //mq_sendJson(json_rt); //将遥*数据发送 kooloo add 202312 char* tmsgbuf_spvp = (char*)malloc(C_SERIALPORT_MQ_MSGSIZE); memset(tmsgbuf_spvp, 0, C_SERIALPORT_MQ_MSGSIZE); strncpy(tmsgbuf_spvp, msgbuf, C_SERIALPORT_MQ_MSGSIZE); //将数据拷贝 kooloo add 202401 if(tFunTyID_DevCod_buf[tyid].PortIDvaluestring, &oid); tyid = GetTyid_fromDevCod(oid.DevType); //获取tyid kooloo add 202401 将设备编码里的设备类型对应成程序的序号 } free(tmsgbuf); //用完释放 kooloo add 202401 if (json_rt != NULL) {//释放 cJSON_Delete(json_rt); } return tyid; } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: FsuDeviceSelfThread ** 功能描述: FSU自身线程 主要更新自身数据 ** 参数描述: 无 ** 作  者: kooloo ** 日  期: 2022年03月21 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void* FsuDeviceSelfThread(void* arg) { ms_info1("FsuDeviceSelfThread\n"); //创建轮询主线程 kooloo add 202309 int portnum = 1; int i_dex; int i_id; //uint8_t Mqmsgbuf[C_SRCToDST_MQ_MSGSIZE]; char* Mqmsgbuf = (char*)malloc(C_SRCToDST_MQ_MSGSIZE); memset(Mqmsgbuf, 0, C_SRCToDST_MQ_MSGSIZE); int Mqmsglen; while (1) { Mqmsglen = mq_receive(MqdDstToSrc, Mqmsgbuf, C_SRCToDST_MQ_MSGSIZE, NULL); if (Mqmsglen > 0) { Mq_ReceiveJson_Handle(Mqmsgbuf, Mqmsglen); ms_info1("Get Reqdata %s len:%d\n", Mqmsgbuf, Mqmsglen); } #if 0 //方便测试 //判断子进程是否运行 间隔判断 if (Timer_getDiffValueTicks(pSysPara->g_GetApp_TimeCounter) > C_FSUDEVICE_UPDATE_PERIOD) { cJSON* json_FsuDevice = GetJson_FSUDevice_UpdateData(json_roottable); mq_sendJson(json_FsuDevice); //将数据发送到队列中,等带mqtt 进程或者b接口进程处理 pSysPara->g_GetApp_TimeCounter = Timer_getNowTicks(); #if (C_CJSONFILE_SAVE_FALG==1) //printfJson(json_roottable); writeJsonFile(C_CJSONROOTTABLE_FILENAME, json_roottable); //保存 方便查看 kooloo add 202312 #endif } else //否则判断是否满足发送子设备数据 kooloo add 202312 { if (Timer_getDiffValueTicks(pSysPara->g_SendSubDevData_TimeCnt) > C_SUBDEV_UPDATE_PERIOD) { //获取ID i_id = g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].FunctionConfigTypeID; ////printf("SendData portnum %d Tnum %d\n", portnum, g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeNumber); if (g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send < g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrNumber) //如果小于 { if (i_id && (i_id != C_HJWL_SERIALPORT_VPORT_TYID)) { ms_info1("SendData PortID %d TypeID %d, Index %d\n", portnum, i_id, g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send); mq_sendJson_subdevfromID(i_id, i_dex); //根据ID和轮询号发送数据 kooloo add 202312 pSysPara->g_SendSubDevData_TimeCnt = Timer_getNowTicks(); g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send++; } else { g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send = 0; if ((g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send + 1) < g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeNumber) { g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send++; } else { g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send = 0; if (portnum < (eSDPort_Number_Max + eVirtuallyPort_Number_Max - 1)) //根据端口数量 { portnum++; } else { portnum = 1; } } g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send = 0; } } else { g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send = 0; if ((g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send + 1) < g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeNumber) { g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send++; } else { g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send = 0; if (portnum < (eSDPort_Number_Max + eVirtuallyPort_Number_Max - 1)) //根据端口数量 { portnum++; } else { portnum = 1; } } g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].g_DeviceFuncDef[g_CfgTab_Rs485_Gather.g_SDPortFuncDef[portnum].TypeIndex_Send].PollArrIndexNow_Send = 0; } } } #endif sleep(1); } return 0; }