void ifOptLaserTmpGet15minHistory(net_if *pNetIf,UINT8 portNum) { char objectName[MAX_IFNAME_LEN] = {0}; char pmParaName[MAX_COMMON_LEN] = {0}; char granularity[MAX_COMMON_LEN] = {0}; char startTime[MAX_ALARM_TIME_LENGTH] = {0}; char objectType[MAX_COMMON_LEN] = {0}; char maxValue[MAX_COMMON_LEN] = {0}; char minValue[MAX_COMMON_LEN] = {0}; char aveValue[MAX_COMMON_LEN] = {0}; char curValue[MAX_COMMON_LEN] = {0}; char *pTime = NULL; char *pStartTime = NULL; time_t etime; UINT32 length = 0; char timechange[32]={0}; etime = time(NULL); if (etime == -1) { ERROR("ifAnalogGet get start or end time failed (%s).", strerror(errno)); return; } if ((pTime = nc_time2datetime(etime, NULL)) == NULL) { ERROR("ifAnalogGet Internal error when converting time formats."); return; } pStartTime = pTime; timechange15Min(pStartTime,timechange); snprintf(objectName,MAX_IFNAME_LEN,"PTP=/shelf=1/slot=1/subslot=1/port=%u",portNum); snprintf(pmParaName,MAX_COMMON_LEN,"LASER_TMP"); snprintf(granularity,MAX_COMMON_LEN,"%s","15min"); snprintf(startTime,MAX_ALARM_TIME_LENGTH,"%s",timechange); snprintf(objectType,MAX_COMMON_LEN,"%s","PTP"); ncGetPerfInfo(portNum,NC_LASER_TMP,NC_MAX_VALUE,maxValue); ncGetPerfInfo(portNum,NC_LASER_TMP,NC_MIN_VALUE,minValue); ncGetPerfInfo(portNum,NC_LASER_TMP,NC_AVE_VALUE,aveValue); ifGetCurLaserTmp(pNetIf,curValue); //ncGetPerfInfo(portNum - 1,NC_CUR_VALUE,NC_LASER_TMP,curValue); memset(g_15minhistoryperf[portNum-1].parame[Opt_LASERTMP].pkg,0,HISTORY_PERF_PARAM_BUFF); length = snprintf(g_15minhistoryperf[portNum-1].parame[Opt_LASERTMP].pkg, HISTORY_PERF_PARAM_BUFF, PM_MODE_ANALOG_INIT_XML, objectName, pmParaName, granularity, startTime, objectType, maxValue, minValue, aveValue, curValue); DBG("%s/%d xml_send_buffer %s length %d",__func__,__LINE__,g_15minhistoryperf[portNum-1].parame[Opt_LASERTMP].pkg,length); // ncds_apply_pkg_info(pXmlSendBuf,NC_DATASTORE_RUNNING,"acc-performance"); }
时间: 2024-04-15 08:25:36 浏览: 96
这段代码的功能是获取光纤接口对应端口的过去15分钟的激光温度历史记录。
代码中定义了一系列char类型的变量来存储相关的参数和数值。
首先,通过调用time函数获取当前时间的时间戳,如果获取失败则打印错误信息并返回。
然后,通过调用nc_time2datetime函数将时间戳转换为可读的日期时间格式,并将结果赋给pTime。
接下来,调用timechange15Min函数将时间向前推15分钟,并将结果赋给timechange。
接下来,使用snprintf函数将相关参数的值格式化到对应的变量中,包括objectName(对象名)、pmParaName(性能参数名)、granularity(粒度)、startTime(开始时间)、objectType(对象类型)。
然后,通过调用ncGetPerfInfo函数分别获取端口对应的最大值、最小值和平均值,并将结果分别赋给maxValue、minValue和aveValue。
接下来,通过调用ifGetCurLaserTmp函数获取当前激光温度值,并将结果赋给curValue。
然后,使用memset函数将g_15minhistoryperf[portNum-1].parame[Opt_LASERTMP].pkg数组清零。
接下来,使用snprintf函数将各个参数的值格式化到g_15minhistoryperf[portNum-1].parame[Opt_LASERTMP].pkg数组中,并计算长度并将结果赋给length。
最后,打印调试信息,并注释掉了一个函数调用。
相关问题
一句句解释分析细致讲解一下这段代码void packageIfStatisInfo15Min() { UINT32 length = 0; UINT32 totalLength = 0; T_PMS_YANG_MODE pmInfo = {0}; net_if *pNetIf = NULL; UINT8 portNum = 0; if (pXmlSendBuf == NULL) { ERROR("packageIfStatisInfo pXmlSendBuf not init!!!"); return; } PmStateItemFlag *flag = NULL; for(pNetIf = ifGetFirst(); pNetIf != NULL; pNetIf = ifGetNext(pNetIf)) { if (!(ifIsPhyPort(pNetIf) && (0 == ifLocalChannelByNetif(pNetIf)))) { continue; } if (128 == ifGetCardType(pNetIf)) { continue; } portNum = ifLocalPortByNetif(pNetIf); flag = GetPmStateItemFlag(portNum, FIFTEEN_MINUTES); if (flag->rxPktSum) { ifStatisInPktsGet15minHistory(pNetIf,&pmInfo,portNum); } if (flag->rxBytes) { ifStatisInBytesGet15minHistory(pNetIf,&pmInfo,portNum); } if (flag->txPktSum) { ifStatisOutPktsGet15minHistory(pNetIf,&pmInfo,portNum); } if (flag->txBytes) { ifStatisOutBytesGet15minHistory(pNetIf,&pmInfo,portNum); } if (flag->rxCrcErrSum) { ifStatisErrPkgsGet15minHistory(pNetIf,&pmInfo,portNum); } } }
这段代码是一个函数`packageIfStatisInfo15Min()`,它的作用是收集网卡接口的统计信息,并封装为一个数据包。
代码的解析如下:
1. 声明了一些变量:`length`和`totalLength`都是`UINT32`类型,`pmInfo`是一个结构体类型`T_PMS_YANG_MODE`,`pNetIf`是一个指向`net_if`结构体的指针,`portNum`是一个`UINT8`类型。
2. 判断了变量`pXmlSendBuf`是否为NULL,如果为NULL,则输出错误信息并返回。
3. 声明了一个指针变量`flag`,初始值为NULL。
4. 进入一个循环,遍历所有的网卡接口。循环条件是从函数`ifGetFirst()`获取第一个网卡接口开始,当指针`pNetIf`不为NULL时继续循环,每次循环结束后通过函数`ifGetNext(pNetIf)`获取下一个网卡接口。
5. 在循环内部,首先判断当前网卡接口是否为物理端口且不是本地通道,如果不满足条件,则跳过当前循环,继续下一次循环。
6. 判断当前网卡接口的卡类型是否为128,如果是,则跳过当前循环,继续下一次循环。
7. 获取当前网卡接口对应的本地端口号,并将其赋值给变量`portNum`。
8. 调用函数`GetPmStateItemFlag(portNum, FIFTEEN_MINUTES)`获取指定端口号和时间间隔的统计信息标志,并将其赋值给指针变量`flag`。
9. 如果`flag->rxPktSum`为真,则调用函数`ifStatisInPktsGet15minHistory(pNetIf,&pmInfo,portNum)`获取接收数据包数的15分钟历史统计信息。
10. 如果`flag->rxBytes`为真,则调用函数`ifStatisInBytesGet15minHistory(pNetIf,&pmInfo,portNum)`获取接收字节数的15分钟历史统计信息。
11. 如果`flag->txPktSum`为真,则调用函数`ifStatisOutPktsGet15minHistory(pNetIf,&pmInfo,portNum)`获取发送数据包数的15分钟历史统计信息。
12. 如果`flag->txBytes`为真,则调用函数`ifStatisOutBytesGet15minHistory(pNetIf,&pmInfo,portNum)`获取发送字节数的15分钟历史统计信息。
13. 如果`flag->rxCrcErrSum`为真,则调用函数`ifStatisErrPkgsGet15minHistory(pNetIf,&pmInfo,portNum)`获取接收CRC错误包数的15分钟历史统计信息。
这段代码的作用是对每个网卡接口进行遍历,根据统计信息标志获取相应的统计数据,并将其封装为一个数据包。
阅读全文