/************************************************************************************************ 组包发送抄表指令,地址在每次开机时从bak区取回赋值,所以组包时不用赋值 参数1:要组包的存储区域指针 返回 CONTROL_RET_FAIL 发送失败, CONTROL_RET_SUC 发送成功 ************************************************************************************************/ int CreatFrame_heatmeter(UINT8 * pCommd, DELU_HEAT_METER_CMD_T *pmeter, UINT8 *pucOutLen) { UINT8 i = 0; UINT8 *pTemp = pCommd; UINT8 *pCheck = pTemp + DELU_HEAT_METER_COMMOND_FE_NUMBER; if (pCommd == NULL) { debug_info(gDebugModule[TIMING_METER], "[%s][%s][%d] ERROR! piont is NULL!\n", FILE_LINE); return CONTROL_RET_FAIL; } memset(pTemp, 0xFE, DELU_HEAT_METER_COMMOND_FE_NUMBER); //前导符 pTemp += DELU_HEAT_METER_COMMOND_FE_NUMBER; pCheck = pTemp; *pTemp++ = 0x68; // 数据帧头 *pTemp++ = 0x20; for (i = 0; i < 7; i++) // 仪表地址 做逆序 { *pTemp++ = pmeter->ucAddr[i]; } *pTemp++ = pmeter->ucControlCode; // 控制码 *pTemp++ = pmeter->ucDataLen; // 数据域长度 *pTemp++ = pmeter->ucDILow; *pTemp++ = pmeter->ucDIHigh; *pTemp++ = gHeatMeterSer; memcpy(pTemp, pmeter->aucData, pmeter->ucDataLen - 3); pTemp += pmeter->ucDataLen - 3; *pTemp++ = Calc_CS_heat(pCheck, DELU_HEAT_METER_COMMOND_BASE_LEN + pmeter->ucDataLen); *pTemp = 0x16; *pucOutLen = DELU_HEAT_METER_COMMOND_BASE_LEN + pmeter->ucDataLen + DELU_HEAT_METER_COMMOND_FE_NUMBER + 2; debug_notice(gDebugModule[METER], "the frame is "); for (i = 0; i < *pucOutLen; i++) { debug_notice(gDebugModule[METER], " %2x", pCommd[i]); } debug_notice(gDebugModule[METER], "\n"); return CONTROL_RET_SUC; }
/************************************************************************************************ 德鲁热表的接受函数 参数1:设备的描述符,在主线程中准备好,在此使用 返回 CONTROL_RET_FAIL 发送失败, CONTROL_RET_SUC 发送成功 ************************************************************************************************/ INT32 heat_meter_com_rev(INT32 u32DeviceFd) { uint8 ret = 0, c; INT8 cLoopFlag = 1; fd_set ReadSetFD; struct timeval stTimeVal; while (cLoopFlag) { FD_ZERO(&ReadSetFD); FD_SET(u32DeviceFd, &ReadSetFD); /* 设置等待的超时时间 */ stTimeVal.tv_sec = DELU_SEC_TIME_OUT; stTimeVal.tv_usec = DELU_USEC_TIME_OUT; if (select(u32DeviceFd + 1, &ReadSetFD, NULL, NULL, &stTimeVal) <= 0) { debug_notice(gDebugModule[METER], "heat_meter REV is time out .....(%d)\n", errno); cLoopFlag--; /* 超时处理*/ } if (FD_ISSET(u32DeviceFd, &ReadSetFD)) { if (read(u32DeviceFd, &c, 1) == 1) { ret = Heat_ReceiveFrameAnalyse(c); if (ret != 9) gHeat_RecState = FRAME_START; if (ret == 0) { return (CONTROL_RET_SUC); } else { //printf("Heat meter rev return value is %d\n", ret); } } } //printf("\n"); } return (CONTROL_RET_FAIL); }
/************************************************************************************************ 发送抄表热表通过Mbus 参数1:设备的描述符,在主线程中准备好,在此使用 返回 CONTROL_RET_FAIL 发送失败, CONTROL_RET_SUC 发送成功 ************************************************************************************************/ INT32 heat_meter_com_send(INT32 u32DeviceFd, DELU_HEAT_METER_CMD_T *pmeter) { int i = 0; UINT8 ucCommdLen = 0; UINT8 CJ188Frame[256] = { 0x00 }; CreatFrame_heatmeter(CJ188Frame, pmeter, &ucCommdLen); debug_notice(gDebugModule[METER], "The Frame is "); for (i = 0; i < ucCommdLen; i++) { debug_notice(gDebugModule[METER], " %2x", CJ188Frame[i]); } debug_notice(gDebugModule[METER], "\n"); if (write(u32DeviceFd, (UINT8 *) &CJ188Frame, ucCommdLen) != ucCommdLen) { printf("heat_meter_com_send write error(%d)\n", errno); } return CONTROL_RET_SUC; }
int load_avatar(uint32_t friend_number, uint8_t **dest, size_t *size_out) { size_t size = 0; uint8_t *img = utox_load_data_avatar(friend_number, &size); if (!img) { debug_notice("Avatars:\tUnable to get saved avatar from disk for friend %u\n", friend_number); return 0; } if (size > UTOX_AVATAR_MAX_DATA_LENGTH) { free(img); debug_error("Avatars:\tSaved avatar file for friend (%u) too large for tox\n", friend_number); return 0; } *dest = img; // free(avatar_data); if (size_out) { *size_out = size; } return 1; }
UINT8 Heat_meter_com(INT32 u32DeviceFd, MeterFileType *pmf) { INT32 ret = 0; UINT8 datatemp[50] = { 0x00 }; INT8 Retry = 1; int i = 0; char datatempString[100] = { 0x00 }; char Sq_DataString[200] = { 0x00 }; //ELECT_DataType elect_data; //此处可扩展做多数据项读 DELU_HEAT_METER_CMD_T heat_meter; for (i = 0; i < 7; i++) { debug_notice(gDebugModule[METER], " %x", pmf->Meter_addr[i]); } debug_notice(gDebugModule[METER], "\n"); memcpy(heat_meter.ucAddr, pmf->Meter_addr, 7); memcpy(gHeatMeterAddrArray_Back, heat_meter.ucAddr, 7); //此处可做循环,来抄读多个数据项,通过传递参数多个标识符的宏定义来 // 统一判断不同协议下读取相同数据项 while (Retry-- > 0) { debug_notice(gDebugModule[METER], "Protocol_type is %d\n", pmf->Protocol_type); if (pmf->Protocol_type == 1) { heat_meter.ucControlCode = 0x01; heat_meter.ucDataLen = 0x03; heat_meter.ucDILow = 0x1F; heat_meter.ucDIHigh = 0x90; gheatmeterDI_Back = (heat_meter.ucDIHigh << 8) | heat_meter.ucDILow; } else if (pmf->Protocol_type == 2) { heat_meter.ucControlCode = 0x01; heat_meter.ucDataLen = 0x03; heat_meter.ucDILow = 0x1f; heat_meter.ucDIHigh = 0x90; gheatmeterDI_Back = (heat_meter.ucDIHigh << 8) | heat_meter.ucDILow; } else { debug_err(gDebugModule[METER], "Protocol type is not right!\n"); ret = CONTROL_RET_FAIL; goto RealtimeRead; } debug_debug(gDebugModule[METER], "start com with heat meter!\n"); heat_meter_com_send(u32DeviceFd, &heat_meter); ret = heat_meter_com_rev(u32DeviceFd); if (ret) { memset(datatemp, 0x00, 3); debug_info(gDebugModule[TIMING_METER], "[%s][%s][%d] Analysis HeatMeter Data Error! This Error is %d\n", FILE_LINE, ret); } else { memcpy(datatemp, g_stDELU_Heat_Meter_Commd.aucData, g_stDELU_Heat_Meter_Commd.ucDataLen - 3); debug_info(gDebugModule[TIMING_METER], "Revcie successful !\n"); break; } } if (ret) strcpy((char *) Sq_DataString, "timout','"); else strcpy((char *) Sq_DataString, "ok','"); //根据读取的标识符不同来做不同的数据处理,将其转换为字符串格式 if (datatemp[9] == 0x05) { Bcd645DataToAscii((uint8 *) datatempString, (uint8 *) &datatemp[5], 6, 2); } else if (datatemp[9] == 0x08) { Bcd645DataToAscii((uint8 *) datatempString, (uint8 *) &datatemp[5], 8, 0); strcat((char *) datatempString, "0"); } else if (datatemp[9] == 0x0A) { Bcd645DataToAscii((uint8 *) datatempString, (uint8 *) &datatemp[5], 8, 0); strcat((char *) datatempString, "000"); } strcat((char *) Sq_DataString, datatempString); //多个数据项抄读完成后在此处进行数据库数据的统一插入 debug_info(gDebugModule[TIMING_METER], "Rcv Heat Data is %s\n", Sq_DataString); if (pmf->ReadMeter_type == PeriodReadMeter) heat_write_date_into_sqlite(pmf, Sq_DataString); RealtimeRead: if (pmf->ReadMeter_type == RealtimeReadMeter) { if (ret == CONTROL_RET_SUC) sprintf(gxml_realtime_rsp_t.error, "success"); else sprintf(gxml_realtime_rsp_t.error, "fail"); stringCopy((char *) gxml_realtime_rsp_t.result, (char *) Sq_DataString, '\''); } else debug_info(gDebugModule[TIMING_METER], "the ReadMeter_type = %d error!\n", pmf->ReadMeter_type); return ret; }