888888888888888888888

本文深入解析OMC920软件的组成结构,包括服务器软件、客户端软件及网元适配软件的功能模块。详细介绍了OMC920软件的三个核心子系统及其内部模块的通信方式与接口实现,同时阐述了报表工具的定制流程。
3.3 OMC920软件结构
介绍OMC920软件的组成及各组成部分的功能模块。
3.3.1 软件结构概述
OMC920软件由三个子系统组成:
 OMC920服务器软件
 OMC920客户端软件
 网元适配软件
每个具体网元的每个版本有一个对应的网元适配软件,主要完成该版本网元的接入适配功能。此外,OMC920还提供可选的报表工具,用户通过它定制报表。OMC920软件模块如图3-3所示。

图3-3 OMC920软件模块
3.3.2 OMC920服务器软件
OMC920服务器软件模块如图3-4所示。

图3-4 OMC920服务器软件模块
OMC920服务器软件由多个功能模块组成,这些模块通过CORBA软件总线通信,并通过该总线和OMC920客户端上的相应的模块通信。OMC920服务器软件通过网管接口模块提供和NMS的接口,通过适配公共模块提供和各网元适配软件的接口。
OMC920服务器软件各模块的简要介绍请参见表3-2。
void httpAlarmUpTask(ALARM_UP_CONNS *pAlarmUp, int port, int ip) { MTRULE_REGION_LIST mtRegionList = {0}; NETRET_ALARMINFO alarmInfo = {0}; struct linger tcpLinger; int connfd = -1; int timeout = 5*ONESECOND; struct timeval start, start0; gettimeofday(&start0, NULL); int respXmlLen = 0, respBufLen = 0; #ifdef ALZ_1 char *respXml = (char *)malloc(50*1024); char *respBuf1 = (char *)malloc(50*1024); #else char *respXml = (char *)malloc(3072); char *respBuf1 = (char *)malloc(3072); #endif int encoded_len; if (!respXml || !respBuf1) { NPRT(("Memory allocation failed\n")); return; } int i,rc; int flag1 = 0, flag2 = 0; UINT8 preId = 0; char serNo[48] = {0}; mkExternSN(serNo); char server_ip[16]; inet_ntop(AF_INET, &ip, server_ip, 16); printf("server_ip: %s, port = %d\n", server_ip, port); /* connect 接收推送信息的主机,推送报警信息 */ struct sockaddr_in saddr;//定义了一个以太网IPV4的网络地址结构体 memset(&saddr,0,sizeof(saddr));//初始化0 saddr.sin_family=AF_INET;//IPV4协议簇 saddr.sin_port=htons(port);//网络字节序 inet_pton(AF_INET, server_ip, &saddr.sin_addr);//IPV4地址 地址要转换 char ip_s[18] = {0}; get_ipaddr(LOCAL_INTERFACE,ip_s,sizeof(ip_s)); FOREVER { rc = msgQReceive(pAlarmUp->alarmInfoMsgQ, (char *)&alarmInfo, MAX_ALARMINFO_MSGQ_LEN, timeout); gettimeofday(&start, NULL); if(abs(start.tv_sec- start0.tv_sec) >= http_push_freq) { NPRT(("111111111111 start.tv_sec = %d, start0.tv_sec = %d\n", start.tv_sec, start0.tv_sec)); gettimeofday(&start0, NULL); } else { usleep(60*1000); continue; } printf("11111111111111111111111\n"); respXmlLen = 0; respBufLen = 0; flag1 = 0; flag2 = 0; #ifdef ALZ_1 memset(respXml, 0, 50*1024); memset(respBuf1, 0, 50*1024); #else memset(respXml, 0, 3072); memset(respBuf1, 0, 3072); #endif if(connfd < 0) { connfd=socket(AF_INET,SOCK_STREAM,0); if(connfd==-1) { perror("socket error"); sleep(1); continue; } int ret = connect(connfd, (struct sockaddr *)&saddr,sizeof(saddr)); if(ret==-1) { perror("connect error"); PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd)); close(connfd); connfd = -1; sleep(1); continue; } else { printf("Connected to server\n"); printf("connect fd = %d\n", connfd); } } if(rc==MAX_ALARMINFO_MSGQ_LEN) { NPRT(("alarmType = %x\n",alarmInfo.alarmType)); cJSON *cjson = cJSON_CreateObject(); #ifdef HTTP_NEWADD cJSON_AddStringToObject(cjson, "devIp", ip_s); #endif cJSON_AddNumberToObject(cjson, "Alarmtype", alarmInfo.alarmType); if((alarmInfo.alarmType != THML_MT_ALARMIN_TYPE) && (alarmInfo.alarmType != 0x0f)) { } else { #ifdef HTTP_NEWADD #ifdef SUPPORT_PTZ #ifdef PTZ_BIND_1 for(i=0; i<MAX_PRESET_NUM; i++) { if(pDevCfgParam->thmlMtRegionList[i].presetId >> 31 & 0x1) { if((pDevCfgParam->thmlMtRegionList[i].presetId >> 16 & 0x7fff) == currentPreset) { mtListNo = i; preId = i; break; } } } if(i == MAX_PRESET_NUM) { printf("%s[%d] preset no bind mt.\n", __FUNCTION__, __LINE__); cJSON_Delete(cjson); continue; } #else preId = 0xFF; for(i=0; i<MAX_PRESET_NUM; i++) { if(pDevCfgParam->thmlMtRegionList[i].presetId == currentPreset) { mtListNo = i; preId = i; break; } } if(preId == 0xFF) { printf("%s[%d] preset no bind mt.\n", __FUNCTION__, __LINE__); cJSON_Delete(cjson); continue; } #endif cJSON_AddNumberToObject(cjson, "preset", currentPreset+1); #else cJSON_AddNumberToObject(cjson, "preset", 0); #endif #endif semTake(globalMSem, WAIT_FOREVER); memcpy(&mtRegionList, &pDevCfgParam->thmlMtRegionList[preId], sizeof(MTRULE_REGION_LIST)); semGive(globalMSem); cJSON *alaInfo = cJSON_CreateArray(); if(mtRegionList.regionNum.total > 0) { i = 1; } else { i = 0; } for(; i<=mtRegionList.regionNum.total; i++) { cJSON *list = cJSON_CreateObject(); if(mtRegionList.regionInfo[i].alarmRuleParam.alarmkey) { #ifdef ALZ_1 encoded_len = HttpcaptureBase64(0, 0, respBuf1); // 抓图放在循环外 if (encoded_len < 0) { continue; } // printf("encoded_len size %d\n", encoded_len); #endif if(mtRegionList.regionInfo[i].alarmRuleParam.alarmLevel == MTRULE_ALARM_LEVEL_PRE_ALARM) { flag1++; cJSON_AddNumberToObject(list, "mtAlarmid", i); cJSON_AddNumberToObject(list, "mtAlarmlevel", 1); cJSON_AddNumberToObject(list, "mtAlarmType", mtRegionList.regionInfo[i].alarmRuleParam.alarmType); cJSON_AddNumberToObject(list, "maxtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[0]); cJSON_AddNumberToObject(list, "mintemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[1]); cJSON_AddNumberToObject(list, "avgtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[2]); cJSON_AddNumberToObject(list, "maxPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32X); cJSON_AddNumberToObject(list, "maxPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32Y); cJSON_AddNumberToObject(list, "minPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32X); cJSON_AddNumberToObject(list, "minPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32Y); #ifdef ALZ_1 cJSON_AddNumberToObject(list, "encoded_length", encoded_len); cJSON_AddStringToObject(list, "base64_data", respBuf1); printf("3333333333333333333333333\n"); #else #endif } else if(mtRegionList.regionInfo[i].alarmRuleParam.alarmLevel == MTRULE_ALARM_LEVEL_ALARM) { flag2++; cJSON_AddNumberToObject(list, "mtAlarmid", i); cJSON_AddNumberToObject(list, "mtAlarmlevel", 2); cJSON_AddNumberToObject(list, "mtAlarmType", mtRegionList.regionInfo[i].alarmRuleParam.alarmType); cJSON_AddNumberToObject(list, "maxtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[0]); cJSON_AddNumberToObject(list, "mintemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[1]); cJSON_AddNumberToObject(list, "avgtemp", mtRegionList.regionInfo[i].outputInfo.outputTemp[2]); cJSON_AddNumberToObject(list, "maxPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32X); cJSON_AddNumberToObject(list, "maxPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[0].s32Y); cJSON_AddNumberToObject(list, "minPointX", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32X); cJSON_AddNumberToObject(list, "minPointY", mtRegionList.regionInfo[i].outputInfo.outputPoint[1].s32Y); #ifdef ALZ_1 cJSON_AddNumberToObject(list, "encoded_length", encoded_len); cJSON_AddStringToObject(list, "base64_data", respBuf1); printf("444444444444444444444444444444444\n"); #else #endif } } cJSON_AddItemToArray(alaInfo, list); } cJSON_AddItemToObject(cjson, "mtAlarmInfo", alaInfo); if(flag1 == 0 && flag2 == 0) { cJSON_Delete(cjson); continue; } cJSON_AddNumberToObject(cjson, "preAlarmSum", flag1); cJSON_AddNumberToObject(cjson, "alarmSum", flag2); } char *json_data = cJSON_Print(cjson); respXmlLen += sprintf(respXml + respXmlLen, json_data); cJSON_Delete(cjson); #ifdef ALZ_1 memset(respBuf1, 0, 50*1024); #endif printf("55555555555555555555555555\n"); respBufLen = sprintf(respBuf1 + respBufLen, "POST %s HTTP/1.1\r\n", "/kehu-api/system/api/v1/alarm/Info"); respBufLen += sprintf(respBuf1 + respBufLen, "Content-Type: application/json\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "User-Agent: %s\r\n", serNo); respBufLen += sprintf(respBuf1 + respBufLen, "Accept: application/json\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "Token: %x:%x:%x:%x:%x:%x\r\n", DomeInfo.macAddr[0], DomeInfo.macAddr[1], DomeInfo.macAddr[2], DomeInfo.macAddr[3], DomeInfo.macAddr[4], DomeInfo.macAddr[5]); respBufLen += sprintf(respBuf1 + respBufLen, "Host: %s:%d\r\n", server_ip, port); //respBufLen += sprintf(respBuf1 + respBufLen, "Accept-Encoding: gzip, deflate, br\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "Connection: keep-alive\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "Content-Length: %d\r\n\r\n", respXmlLen); respBufLen += sprintf(respBuf1 + respBufLen, "%s\r\n", respXml); // printf(" %s ", respBuf); printf("666666666666666666666666666\n"); // ssize_t sent = safe_send(connfd, respBuf1, strlen(respBuf1), 0); ssize_t sent = writen(connfd, respBuf1, strlen(respBuf1)); printf("send size %d\n", sent); // if(sent != encoded_len + 680) if(sent <= 0) { PRT_ERR(("httpAlarmUpTask: writen failed.\n")); if (connfd != -1) { PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd)); close(connfd); connfd = -1; // 防止重复关闭 } sleep(1); continue; } } else if(rc==ERROR && errnoGet()==S_objLib_OBJ_TIMEOUT) { /* timeout, send exchange to client */ NPRT(("httpAlarmUpTask: send NETRET_EXCHANGE.\n")); respBufLen = sprintf(respBuf1 + respBufLen, "POST %s HTTP/1.1\r\n", "/kehu-api/system/api/v1/alarm/Info"); //respBufLen += sprintf(respBuf1 + respBufLen, "Content-Type: application/json\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "User-Agent: %s\r\n", serNo); respBufLen += sprintf(respBuf1 + respBufLen, "Accept: application/json\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "Token: %x:%x:%x:%x:%x:%x\r\n", DomeInfo.macAddr[0], DomeInfo.macAddr[1], DomeInfo.macAddr[2], DomeInfo.macAddr[3], DomeInfo.macAddr[4], DomeInfo.macAddr[5]); respBufLen += sprintf(respBuf1 + respBufLen, "Host: %s:%d\r\n", server_ip, port); //respBufLen += sprintf(respBuf1 + respBufLen, "Accept-Encoding: gzip, deflate, br\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "Connection: keep-alive\r\n"); respBufLen += sprintf(respBuf1 + respBufLen, "Content-Length: %d\r\n\r\n", 0); int sent = writen(connfd, respBuf1, strlen(respBuf1)); // ssize_t sent = safe_send(connfd, respBuf1, strlen(respBuf1), 0); printf("send size %d\n", sent); if(sent <= 0) { PRT_ERR(("httpAlarmUpTask: writen failed.\n")); if (connfd != -1) { PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd)); close(connfd); connfd = -1; // 防止重复关闭 } sleep(1); continue; } } printf("7777777777777777777777777777\n"); PRT_ERR(("httpAlarmUpTask: writen connfd = %d.\n", connfd)); close(connfd); connfd = -1; } printf("888888888888888888888\n"); free(respXml); free(respBuf1); semTake(globalMSem, WAIT_FOREVER); msgQDelete(pAlarmUp->alarmInfoMsgQ); lstDelete(&alarmUpList, &(pAlarmUp->node)); free((char *)pAlarmUp); semGive(globalMSem); return ; }
09-18
Nano-ESG数据资源库的构建基于2023年初至2024年秋季期间采集的逾84万条新闻文本,从中系统提炼出企业环境、社会及治理维度的信息。其构建流程首先依据特定术语在德语与英语新闻平台上检索,初步锁定与德国DAX 40成分股企业相关联的报道。随后借助嵌入技术对文本段落执行去重操作,以降低内容冗余。继而采用GLiNER这一跨语言零样本实体识别系统,排除与目标企业无关的文档。在此基础上,通过GPT-3.5与GPT-4o等大规模语言模型对文本进行双重筛选:一方面判定其与ESG议题的相关性,另一方面生成简明的内容概要。最终环节由GPT-4o模型完成,它对每篇文献进行ESG情感倾向(正面、中性或负面)的判定,并标注所涉及的ESG具体维度,从而形成具备时序特征的ESG情感与维度标注数据集。 该数据集适用于多类企业可持续性研究,例如ESG情感趋势分析、ESG维度细分类别研究,以及企业可持续性事件的时序演变追踪。研究者可利用数据集内提供的新闻摘要、情感标签与维度分类,深入考察企业在不同时期的环境、社会及治理表现。此外,借助Bertopic等主题建模方法,能够从数据中识别出与企业相关的核心ESG议题,并观察这些议题随时间的演进轨迹。该资源以其开放获取特性与连续的时间覆盖,为探究企业可持续性表现的动态变化提供了系统化的数据基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值