ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PON EMS北向接口I5查询与资源变化通知实战指南

PON EMS北向接口I5查询与资源变化通知实战指南 简介这份文档是中国电信PON EMS北向接口技术规范中的综合信息查询接口分册面向电信网络运维工程师、OSS系统对接开发人员及PON设备厂商技术人员。它系统规定了PON EMS与服务保障类系统间北向接口的功能、参数、协议与技术要求涵盖OLT与ONU设备信息查询、业务配置查询、资源变化通知及资源数据全量导出等核心模块并给出接口位置、功能定义与调用方式可帮助读者理解设备状态获取、故障排查与资源同步的实现路径。资源包为1个PDF文件约252KB内容完整、目录层级清晰便于按章节检索查阅。目前已有81人学习下载适合从事PON网络管理、北向接口开发与OSS系统集成的技术人员参考使用。1. 从一份 2012 年的 PDF 说起PON EMS 北向接口到底在管什么如果你手头正好有一份《中国电信 PON EMS 北向接口功能及技术规范——综合信息查询接口分册》翻到第 6 页看到那张 I5 接口架构图大概率会跟我第一次拿到它时一样知道它重要但不知道从哪下手。这份规范定义的是 PON EMS 与服务保障类系统之间的 I5 接口说白了就是 OSS 侧怎么通过一套标准命令把 PON 网络里的 OLT、ONU、机框、板卡、业务配置全部查出来。它解决的不是“怎么配 OLT”这种单点问题而是“资源管理系统怎么自动、批量、准确地拿到全网 PON 资源数据”这个系统级问题。适合谁看做电信 OSS 对接的集成工程师、PON EMS 北向接口的开发与测试人员以及需要从 EMS 拉资源数据做上层应用的人。如果你只是想在华为 OLT 上配个 Smart VLAN这份文档帮不上忙但如果你要写一个程序去查全网 ONU 的认证方式和 IP 地址它就是你的接口字典。2. 接口编号体系与查询模式先看懂 PON.RESPHY.I5.001 这类命名2.1 接口编号的命名逻辑规范里所有接口都长这样PON.RESPHY.I5.001。拆开看PON是网络类型RESPHY表示资源物理信息I5是接口位置标识001是序号。业务配置查询用RESSRV资源变化通知用RESCHG全量导出用RESDUMP。这套命名不是随便起的它直接对应了接口的功能域。你在写代码做接口路由时完全可以用前缀来分发请求——收到PON.RESPHY开头的命令就走设备信息查询的处理分支收到PON.RESCHG就走通知注册分支。规范第 6.2 节给了一张完整的接口编号与功能对照表我把它整理成更紧凑的版本接口编号功能所属域PON.RESPHY.I5.001查询 OLT 设备信息设备信息PON.RESPHY.I5.002查询 ONU 设备信息设备信息PON.RESPHY.I5.003查询机框信息设备信息PON.RESPHY.I5.004查询板卡信息设备信息PON.RESSRV.I5.001查询媒体网关信息业务配置PON.RESSRV.I5.002查询语音端口信息业务配置PON.RESSRV.I5.003查询组播业务信息业务配置PON.RESSRV.I5.004查询 DSL 端口信息业务配置PON.RESSRV.I5.005查询 LAN 端口信息业务配置PON.RESSRV.I5.006查询端口 VLAN 信息业务配置PON.RESCHG.I5.001注册资源变化通知变化通知PON.RESCHG.I5.002取消资源变化通知变化通知PON.RESCHG.I5.003查询资源变化通知变化通知PON.RESCHG.I5.004资源变化通知上报变化通知PON.RESDUMP.I5.001资源数据全量导出全量导出PON.RESDUMP.I5.002资源数据全量导出通知全量导出这张表建议直接存进你的接口文档里对接时按编号查功能比翻 PDF 快得多。2.2 查询模式的三种输入形态规范里反复出现“模式一、模式二、模式三、模式四”这种表述核心就一件事ONU 分“有 IP 地址”和“没有 IP 地址”两种情况查询入口完全不同。有 IP 的 ONU 可以直接用 ONU IP 作为入参没有 IP 的 ONU 必须通过 OLT ID PON 口 ONU 标识类型 ONU 标识值来定位。ONU 标识类型有四种ONU_NAME、MAC、LOID、ONU_NUMBER。这里有个容易翻车的点标识类型和标识值必须严格对应你传了MAC类型却给了一个 LOID 值接口不会帮你猜直接返回错误码。以查询 ONU 设备信息PON.RESPHY.I5.002为例三种模式的入参差异如下# 模式一查询某台 OLT 下所有 ONU OLT_ID10.1.1.1 # 模式二查询单个有 IP 的 ONU ONU_IP10.2.2.2 # 模式三查询单个无 IP 的 ONU OLT_ID10.1.1.1 OLT_PON_PORT0/1/0 # 机架-框-槽-端口 ONU_ID_TYPEMAC # 可选 ONU_NAME / MAC / LOID / ONU_NUMBER ONU_ID_VALUE00e0-fc12-3456 # 必须与类型对应模式三的OLT_PON_PORT格式是“机架-框-槽-端口”规范里写的是“机架-框-槽号-端口”实际对接时不同厂商 EMS 对分隔符的处理可能有差异有的用/有的用-这个要在联调时确认。ONU 标识值如果是 MAC注意大小写和分隔符格式有的 EMS 要求全小写无分隔符有的接受00:e0:fc:12:34:56这种带冒号的写法。2.3 返回参数的解读查询成功返回 0其他值都是失败具体错误码在规范第 8.2.6 节定义。返回信息里OLT 查询会给出设备名称、IP、类型、软件版本、内存利用率、CPU 利用率、温度、拓扑位置。ONU 查询返回的内容更多OLT ID、PON 端口号、ONU 授权号、ONU 名称、描述、类型、IP、MAC、认证方式、LOID、软件版本。认证方式字段的值是MAC、LOID、LOIDONCEON三种之一这个字段在做资源核对时特别有用——如果你发现某个 ONU 的认证方式是 LOID 但资源系统里记录的是 MAC说明数据不一致需要人工介入。3. 业务配置查询与资源变化通知从静态查询到动态感知3.1 业务配置查询的六个接口业务配置查询覆盖了媒体网关、语音端口、组播业务、DSL 端口、LAN 端口、端口 VLAN 六个方面。这些接口的入参模式跟设备查询类似也分有 IP 和无 IP 两种路径。以查询媒体网关信息PON.RESSRV.I5.001为例返回参数包括 MGID、语音协议类型H.248 或 SIP、H.248 网关域名、SIP 注册服务器、语音 VLAN、语音优先级、IP 获取方式DHCP/PPPOE/STATIC、IP 地址、掩码、网关地址、主备软交换 IP。这一组参数基本上就是排查语音业务故障时需要看的全部信息。查询语音端口信息PON.RESSRV.I5.002返回的内容更细ONU 端口号、MGID、电话号码、H.248 用户终端标识、SIP 用户名和密码、传真模式、控制模式。这里注意SIP 用户密码字段在返回时可能是加密的或者掩码的取决于 EMS 的实现不要指望能直接拿到明文密码去做自动化配置。查询端口 VLAN 信息PON.RESSRV.I5.006和查询 VLAN 接口PON.RESSRV.I5.007这两个接口容易混淆。前者查的是端口上的 VLAN 配置后者查的是 VLAN 接口本身的属性。实际对接时资源系统通常两个都要调先拿端口 VLAN 列表再逐个查 VLAN 接口详情。3.2 资源变化通知的注册与上报机制资源变化通知是这套接口里最体现实时性的部分。流程是这样的资源管理系统先调PON.RESCHG.I5.001注册通知告诉 EMS“我对哪些资源的变化感兴趣”当 OLT、MXU 的设备信息发生变化设备、框、板的增删EMS 通过PON.RESCHG.I5.004主动上报给资源管理系统资源管理系统如果不想继续接收调PON.RESCHG.I5.002取消注册PON.RESCHG.I5.003用来查询当前已注册的通知列表。这里的关键设计是通知是 EMS 主动推的不是资源系统轮询的。这意味着你的资源系统必须有一个常驻的监听端口来接收 EMS 的上报消息。规范第 8.2.5 节定义了资源变化通知的格式跟普通的查询响应格式不一样解析时要单独处理。# 资源变化通知消息的解析骨架伪代码具体字段按规范 8.2.5 节 def parse_resource_change_notification(raw_msg): raw_msg: EMS 上报的原始消息 返回: 变化类型、设备标识、变化详情 msg_type raw_msg.get(MsgType) if msg_type ! PON.RESCHG.I5.004: raise ValueError(f非资源变化通知消息: {msg_type}) change_type raw_msg.get(ChangeType) # ADD / DELETE device_type raw_msg.get(DeviceType) # OLT / MDU / MTU device_id raw_msg.get(DeviceId) # 根据 change_type 和 device_type 分发处理 # ADD 走新增资源入库DELETE 走资源删除或标记失效 return { change_type: change_type, device_type: device_type, device_id: device_id, detail: raw_msg.get(Detail, {}) }这段代码的核心逻辑是先校验消息类型再提取变化类型和设备标识最后按业务规则分发。参数说明ChangeType只有 ADD 和 DELETE 两种DeviceType决定了后续走哪张资源表。实际开发中建议把通知消息先落库再处理避免处理失败导致消息丢失。3.3 全量导出的触发与文件获取资源数据全量导出PON.RESDUMP.I5.001是一个异步过程。资源管理系统下发导出命令后EMS 在后台生成文件完成后通过PON.RESDUMP.I5.002通知资源管理系统。资源管理系统收到通知后通过 FTP 方式到指定位置获取文件然后解析、比较、更新自己的数据。这个接口的设计意图很明确避免资源管理系统跟 EMS 做大量多次交互。首次对接或者数据对不上时跑一次全量导出比逐条查询高效得多。但要注意全量导出文件可能很大FTP 获取和解析都要考虑超时和内存问题。我一般会建议在业务低峰期触发全量导出并且解析时用流式处理不要一次性加载到内存。4. 避坑与排查对接 I5 接口时最容易翻车的五个地方4.1 坑一ONU 标识类型与标识值不匹配现象调 PON.RESPHY.I5.002 查询单个 ONU返回错误码提示参数无效。原因传了ONU_ID_TYPEMAC但ONU_ID_VALUE填的是 LOID 字符串或者 MAC 地址格式跟 EMS 期望的不一致大小写、分隔符。解决先确认 EMS 侧对 MAC 格式的要求通常是小写无分隔符。如果不确定先用模式一查出该 OLT 下所有 ONU从返回结果里看 EMS 实际存储的 MAC 格式再按那个格式去查。4.2 坑二PON 口格式不统一现象模式三查询无 IP 的 ONU 时明明 OLT ID 和 ONU 标识都对就是查不到。原因OLT_PON_PORT的格式在不同厂商 EMS 上不一致。规范写的是“机架-框-槽号-端口”但有的 EMS 要求0/1/0有的要求0-1-0还有的要求补零成00/01/00。解决先用 PON.RESPHY.I5.001 查出 OLT 信息看返回的拓扑位置字段用的是什么格式照着那个格式传。如果还是不行直接抓 EMS 的接口日志看它实际收到了什么。4.3 坑三资源变化通知注册后收不到消息现象调了 PON.RESCHG.I5.001 注册通知返回成功但设备变化时资源系统没收到 PON.RESCHG.I5.004 上报。原因最常见的是资源系统侧的监听端口没开或者防火墙拦了 EMS 的主动连接。其次是注册时指定的通知条件太窄EMS 认为没有匹配的变化。解决先在资源系统侧确认监听端口正常用 telnet 从 EMS 侧测试连通性。然后检查注册参数把通知条件放宽再试。如果还不行调 PON.RESCHG.I5.003 查询当前注册状态确认注册确实生效了。4.4 坑四全量导出文件解析时字段缺失现象FTP 拿到全量导出文件后解析时发现某些字段为空或格式跟规范不一致。原因EMS 实现版本与规范版本有差异或者某些字段在特定设备类型上本来就不适用比如 OLT 没有语音端口对应字段自然为空。解决解析时对每个字段做空值判断不要假设所有字段都有值。对于关键字段如 ONU 标识、OLT ID如果为空要记录日志并跳过该条记录而不是让整个解析过程崩溃。4.5 坑五错误码只看数值不看上下文现象接口返回非零错误码但错误码定义表里查不到具体含义或者含义太笼统。原因规范第 8.2.6 节的错误码定义是通用定义不同 EMS 厂商可能在此基础上扩展了私有错误码。解决对接时先跟 EMS 厂商确认他们的错误码实现拿到完整的错误码对照表。如果没有就在联调阶段把每个错误码对应的实际场景记录下来形成自己的排查手册。5. 从接口文档到可运行代码一个最小查询链路的搭建5.1 会话控制登录、握手、退出规范第 8.3 节定义了会话控制命令LOGIN、LOGOUT、SHAKEHAND。任何查询之前必须先登录登录成功后 EMS 返回一个会话标识后续所有命令都要带上这个标识。握手命令用于保持会话活跃具体间隔看 EMS 配置一般建议在会话超时前主动发一次握手。import socket import json class PONEMSClient: def __init__(self, host, port): self.host host self.port port self.sock None self.session_id None def connect(self): self.sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(30) self.sock.connect((self.host, self.port)) def login(self, username, password): 登录 PON EMS获取会话标识 cmd { Command: LOGIN, Param: { UserName: username, Password: password } } self._send(cmd) resp self._recv() if resp.get(Result) 0: self.session_id resp.get(SessionId) return True raise RuntimeError(f登录失败: {resp.get(ErrorMsg)}) def shakehand(self): 发送握手命令保持会话 cmd { Command: SHAKEHAND, SessionId: self.session_id } self._send(cmd) return self._recv() def logout(self): 退出会话 cmd { Command: LOGOUT, SessionId: self.session_id } self._send(cmd) self.sock.close() def _send(self, cmd): data json.dumps(cmd).encode(utf-8) # 实际协议可能需要在前面加长度头按规范 8.2.1 节处理 self.sock.sendall(data) def _recv(self): data self.sock.recv(4096) return json.loads(data.decode(utf-8))这段代码搭了一个最小客户端骨架。connect建立 TCP 连接login发送登录命令并保存会话标识shakehand用于保活logout退出。参数说明host和port是 EMS 北向接口的地址和端口username和password由 EMS 侧分配。注意实际协议的消息格式可能不是纯 JSON规范第 8.2.1 节有格式说明可能需要加长度头或特定分隔符这里按最常见的 JSON 方式示意。5.2 查询 OLT 设备信息的完整调用登录成功后调 PON.RESPHY.I5.001 查询 OLT 信息。入参的 OLT ID 是可选的不传就查全网传了就查单台。def query_olt_info(self, olt_idNone): 查询 OLT 设备信息 olt_id: 可选IP 地址或名称不传则查询全网 cmd { Command: PON.RESPHY.I5.001, SessionId: self.session_id, Param: {} } if olt_id: cmd[Param][OLT_ID] olt_id self._send(cmd) resp self._recv() if resp.get(Result) ! 0: raise RuntimeError(f查询失败: {resp.get(ErrorMsg)}) # 返回信息包含设备名称、IP、类型、软件版本、内存利用率、CPU利用率、温度等 return resp.get(Data, [])调用方式client.query_olt_info(10.1.1.1)查单台client.query_olt_info()查全网。返回的Data是一个列表每个元素对应一台 OLT 的信息。实际使用时建议把返回结果直接映射到资源系统的 OLT 表字段一一对应入库。5.3 查询 ONU 设备信息的三种模式封装def query_onu_info(self, mode, **kwargs): 查询 ONU 设备信息 mode: all 查 OLT 下所有 ONU, by_ip 按 ONU IP 查, by_id 按标识查 cmd { Command: PON.RESPHY.I5.002, SessionId: self.session_id, Param: {} } if mode all: cmd[Param][OLT_ID] kwargs[olt_id] elif mode by_ip: cmd[Param][ONU_IP] kwargs[onu_ip] elif mode by_id: cmd[Param][OLT_ID] kwargs[olt_id] cmd[Param][OLT_PON_PORT] kwargs[pon_port] cmd[Param][ONU_ID_TYPE] kwargs[id_type] cmd[Param][ONU_ID_VALUE] kwargs[id_value] else: raise ValueError(f不支持的模式: {mode}) self._send(cmd) resp self._recv() if resp.get(Result) ! 0: raise RuntimeError(f查询失败: {resp.get(ErrorMsg)}) return resp.get(Data, [])三种模式的调用示例query_onu_info(all, olt_id10.1.1.1)、query_onu_info(by_ip, onu_ip10.2.2.2)、query_onu_info(by_id, olt_id10.1.1.1, pon_port0/1/0, id_typeMAC, id_value00e0-fc12-3456)。返回的 ONU 信息里认证方式字段MAC/LOID/LOIDONCEON是做资源核对的关键建议单独提取出来做一致性校验。5.4 验证方法用已知数据反向核对搭好客户端后怎么验证查询结果是对的我的习惯是先在一台 OLT 上手动配置一个已知的 ONU记录它的 MAC、LOID、IP、认证方式然后通过接口查出来逐字段比对。如果接口返回的认证方式是 LOID但你配置的是 MAC说明要么查询参数传错了要么 EMS 侧的数据有问题。这种反向核对比盲目跑全量查询有效得多。另外资源变化通知的验证可以这样做注册通知后手动在 OLT 上拔掉一块板卡看资源系统是否在预期时间内收到 DELETE 类型的通知。如果没收到先查注册状态再查网络连通性。全量导出的验证则是触发导出后等通知到达FTP 拉取文件解析后跟在线查询的结果做抽样比对确认数据一致。从那以后我每次对接新的 EMS 北向接口都强制走一遍“登录→握手→单条查询→反向核对→通知注册→全量导出”这个完整链路确认每个环节都通了再开始批量开发。希望帮到你。本文还有配套的精品资源点击获取
返回列表