DLMS/COSEM 蓝皮书解读(三十六):IPv6 setup(class_id = 48)—— 把电表接入 IPv6 网络所需的“地址/前缀/网关/DNS/ND“建模

发布时间:2026/10/13 10:10:55

DLMS/COSEM 蓝皮书解读(三十六):IPv6 setup(class_id = 48)—— 把电表接入 IPv6 网络所需的“地址/前缀/网关/DNS/ND“建模 DLMS/COSEM 蓝皮书解读三十六IPv6 setupclass_id 48—— 把电表接入 IPv6 网络所需的地址/前缀/网关/DNS/ND建模系列说明本系列基于 DLMS UA《Blue Book蓝皮书第 16 版 · 第 2 部分》一个接口类一篇。第 35 篇讲了GSM diagnosticclass_id 47它是蜂窝模组的体检表。本篇的IPv6 setupclass_id 48回到网络层配置回答一块支持 IPv6 的电表它的 IPv6 地址、网关、DNS、邻居发现参数怎么建模——和第 30 篇IPv4 setupclass_id 42正好组成双栈的两半。上篇回顾第 34 篇SMTP setup解决电表怎么发邮件第 35 篇GSM diagnostic解决蜂窝模组状态怎么查本篇把视角拉回网络层补齐 IP 协议栈里的 IPv6 这一侧——MAC address setup(43) 在第 31 篇提到IPv6 的地址配置由 IPv6 setup 提供本篇就是那个对象。0. 为什么需要这个类 —— IPv4 地址不够用且一个网卡要挂多个地址IPv4 的 32 位地址早已枯竭而智能电表/集中器越来越多地跑在 IPv6 网络上4G/5G 模组、G3-PLC、PRIME、Wi-SUN 等几乎都默认 IPv6。更重要的是IPv6 允许一个物理接口同时挂多个地址链路本地、唯一本地、全局单播这和 IPv4 的一个接口一个地址思路完全不同因此 DLMS 专门为它建了一个接口类而不是复用IPv4 setup。蓝皮书对它的定位蓝皮书原文IPv6 setup, Overview“The IPv6 setup IC allows modelling the setup of the IPv6 layer, handling all information related to the IPv6 address settings associated to a given device and to a lower layer connection on which these settings are used.”蓝皮书原文IPv6 setup, Overview“There shall be an instance of this IC in a device for each different network interface implemented. For example, if a device has two interfaces (using the UDP/IP and/or TCP/IP profile on both of them), there shall be two instances of the IPv6 setup IC in that device: one for each of these interfaces.”一句话每个网络接口一个实例。双栈设备通常同时存在一个IPv4 setup(42) 和一个IPv6 setup(48)两者通过各自的DL_reference指到同一个数据链路层 setup 对象。1. 类蓝图IPv6 setup 0…n class_id 48, version 0属性静态/动态数据类型MinMaxDefShort namelogical_namestaticoctet-string———xDL_referencestaticoctet-string———x 0x08address_config_modestaticenum——0x 0x10unicast_IPv6_addresses—array———x 0x18multicast_IPv6_addressesstaticarray———x 0x20gateway_IPv6_addressesstaticarray0——x 0x28primary_DNS_addressstaticoctet-string0——x 0x30secondary_DNS_addressstaticoctet-string0——x 0x38traffic_classstaticunsigned0630x 0x40neighbor_discovery_setupstaticarray———x 0x48注原文属性表中unicast_IPv6_addresses未标注 static/dyn其余地址数组与neighbor_discovery_setup也未标注其余 5 个显式标 (static)。logical_name不计入 Short name 偏移序列。Specific methodsm/o方法必选/可选(m/o)Short nameadd_IPv6_address (data)optionalx 0x60remove_IPv6_address (data)optionalx 0x682. 属性逐条解读2.1 logical_name蓝皮书原文Identifies the ‘IPv6 setup’ object instance.就是该对象的 OBIS6 字节。示例0.0.25.7.0.255非蓝皮书原文实际以设备对象列表为准。2.2 DL_reference蓝皮书原文References a Data link layer setup object by its logical name. The referenced object contains information about the specific settings of the data link layer supporting the IPv6 layer.通过logical_name指回底层数据链路层 setup 对象如G3-PLC MAC setup(54) 或MAC address setup(43) 等。这一项把 IP 层绑到具体链路——读 IPv6 配置前必须知道它底下跑的是哪条介质。2.3 address_config_mode蓝皮书原文Defines the IPv6 address configuration modeenum: (0) Auto-configuration (default), (1) DHCPv6, (2) Manual, (3) ND (Neighbour Discovery)蓝皮书原文NOTE“The address_config_mode is common for all IPv6 addresses managed by an instance of the IPv6 setup class.”关键点这一个模式对实例管理的所有IPv6 地址单播/组播/网关/DNS同时生效不能单播走自动、网关走手动。2.4 unicast_IPv6_addresses蓝皮书原文Carries unicast IPv6 address(es) assigned to the related interface of the physical device on the network (unique local unicast, link local unicast and / or global unicast addresses). An IPv6 address can be either (static) or (dynamic) or both.unicast_IPv6_addresses :: array of octet-string蓝皮书原文The format of each unicast IPv6 address shall be as specified in RFC 3513.蓝皮书原文If no unicast IPv6 address is assigned to the interface, an array of zero elements is present (default)./To reset all unicast IPv6 address(es) configured, an array of zero elements shall be written.也就是说IPv6 地址在 DLMS 里就是一个 16 字节的 octet-stringaddress :: array octet-string每个元素 16 字节符合 RFC 3513 / RFC 4291 的 128 位格式。默认是空数组要清空全部地址就写回一个空数组。2.5 multicast_IPv6_addressesmulticast_IPv6_addresses :: array of octet-string蓝皮书原文Contains an array of IPv6 addresses used for multicast.同样 16 字节/地址RFC 3513 格式空数组为默认写空数组即重置。2.6 gateway_IPv6_addressesgateway_IPv6_addresses :: array of octet-string蓝皮书原文Contains the IPv6 addresses of the IPv6 gateway device.网关也允许多个多出口路由空数组为默认。2.7 primary_DNS_address / secondary_DNS_address蓝皮书原文Contains the IPv6 address of the primary / secondary Domain Name Server (DNS)./If no IPv6 address is assigned, the length of the octet-string shall be 0.注意这里 DNS 是单个 octet-string长度 0 表示未配置而不是IPv4 setup里的 double-long-unsigned——因为 IPv6 地址没有整数表示只能用 16 字节串。2.8 traffic_class蓝皮书原文Contains the traffic class element of the IPv6 header. The 6 most-significant bits are used for DSCP (Differentiated Services Codepoint), which is used to classify packets as specified in RFC 2474:1998, Clause 3.traffic_class :: unsigned, range 0…63, default 0只管 8 位中的高 6 位 DSCP低 2 位 CU 当前未用。这是一个尽力而为的优先级标记并不保证传输原文“do not secure the transmission (the philosophy of the IP network is to do its best)”。2.9 neighbor_discovery_setup蓝皮书原文Contains the configuration to be used for both routers and hosts to support the Neighbor Discovery protocol for IPv6 (RFC 4861).neighbor_discovery_setup :: array of structure structure { RS_max_retry: unsigned, // 1…255, default 3 RS_retry_wait_time: long-unsigned, // 0…65535 ms, default 10000 RA_send_period: double-long-unsigned // 0…4294967295 s }字段含义范围缺省RS_max_retry收不到 RA 时节点最多重发几次路由器请求Router Solicitation1–2553RS_retry_wait_time两次 RS 重试之间的等待时间毫秒0–6553510000RA_send_period路由器通告Router Advertisement发送周期秒0–4294967295—3. 方法add_IPv6_address / remove_IPv6_address两个方法都是 optional结构完全一样data :: structure { IPv6_address_type: enum, // (0) unicast, (1) multicast, (2) gateway IPv6_address: octet-string }蓝皮书原文add“Adds one IPv6 address for the physical interface to the IPv6 address array.”/“The new address will be automatically added at the end of the list. If an address has to be added to a specific position, this can be done by writing the whole array.”蓝皮书原文remove“Removes one IPv6 address for the physical interface to the IPv6 address array.”要点IPv6_address_type决定这条地址加到/从哪个数组单播/组播/网关里增删新地址自动追加到末尾要插到特定位置只能整个数组写回SET unicast_IPv6_addresses方法用xDLMS ACTION调用参数data为上面这个 structure。4. 【实战举例】示例 1双栈集中器的两个 setup 实例一台集中器同时跑 IPv4/IPv6底层是 G3-PLC 链路。它应有两个网络层实例示例 OBIS非蓝皮书原文对象logical_name示例DL_reference作用IPv4 setup0.0.25.1.0.2550.0.25.2.0.255G3-PLC MAC setup 的 LNIPv4 地址/网关/DNSIPv6 setup0.0.25.7.0.255同上IPv6 地址/网关/DNS/ND两者DL_reference指向同一个链路层对象——这就是蓝皮书每个接口一个实例要求落地后的样子。示例 2单播地址数组的 A-XDR 编码假设给接口配两个单播地址链路本地fe80::1和全局2001:db8::2。说明下面字节为示意非蓝皮书原文按 A-XDR/COSEM 结构编码习惯写出帮助理解。array (tag 0x01) 长度2 ├─ octet-string (tag 0x09) 长度16 : FE 80 00 00 00 00 00 00 00 00 00 00 00 00 00 01 // fe80::1 └─ octet-string (tag 0x09) 长度16 : 20 01 0D B8 00 00 00 00 00 00 00 00 00 00 00 02 // 2001:db8::22001:db8::2展开为 16 字节20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 02——2001→20 010db8→0d b8后面补 0。示例 3address_config_mode 怎么选现场手动规划地址无 DHCPv6 服务器→ 选(2) Manual并手动填unicast_IPv6_addresses/gateway_IPv6_addresses网络里有 DHCPv6 服务器如 4G 核心网 / 企业网→ 选(1) DHCPv6地址由服务器分配纯链路本地、靠路由器通告自学 → 选(3) ND并配好neighbor_discovery_setup想能自动就自动 → 选(0) Auto-configuration缺省。注意选了某个模式单播/组播/网关/DNS 全跟着同一个模式走不能拆分。示例 4neighbor_discovery_setup 默认值array (长度1) structure { RS_max_retry: unsigned 3, RS_retry_wait_time: long-unsigned 10000, // 10 秒 RA_send_period: double-long-unsigned 600 // 600 秒示意非蓝皮书原文 }示例 5调用 add_IPv6_address 增加一个网关ACTION add_IPv6_address的参数datastructure { IPv6_address_type: enum 2, // (2) gateway IPv6_address: octet-string 16B 20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 0a // 2001:db8::a }调用后gateway_IPv6_addresses数组末尾追加2001:db8::a。如果想删它调remove_IPv6_address传同样的结构。示例 6traffic_class 与 DSCP 的位关系traffic_class是一个 0–63 的整数存的是 IPv6 头 8 位 Traffic Class 的高 6 位DSCP。例如要把某类报文标成 EF加速转发DSCP46DSCP 46 (0b101110) → traffic_class 46低 2 位 CU 永远为 0所以 DLMS 里traffic_class的可写范围就是 0–63即 DSCP 0–63。这不是优先级数值越大越优先的线性概念而是按 RFC 2474 的 DSCP 分类。示例 7IPv6 setup 与 IPv4 setup 的差异对照维度IPv4 setup (42)IPv6 setup (48)地址类型double-long-unsigned4 字节octet-string16 字节配置模式use_DHCP_flag布尔address_config_mode0/1/2/3 枚举组播无专门属性multicast_IPv6_addresses数组邻居发现无neighbor_discovery_setup结构DNSprimary_DNS/secondary_DNS整数primary_DNS_address/secondary_DNS_address串流量类无traffic_classDSCP说明对照表基于两篇原文属性为工程视角的归纳非蓝皮书原文逐字句帮助主站统一处理双栈。示例 8IPv6 地址的三种作用域背景informative蓝皮书原文IPv6 addressinginformative“Global Unicast is a routable address in the whole internet… Unique Local Unicast is an address only applicable to local network… Link Local Unicast is a unicast address allowed for a link local (without router)… Multicast is an address assigned to different devices…”Global Unicast全球可路由组成 IANA 分配的全局前缀 网络管理员分配的 SID子网 ID 接口标识可由 MAC 经 modified EUI-64 生成、或 DHCPv6 分配、或手动Unique Local Unicast仅本地网络有效不可在外部路由Link Local Unicast仅链路本地无路由器有效不可路由出去Multicast按作用域Interface-local / Link-local / Admin-local / Site-local / Organization-local / global分组蓝皮书明确“there is no broadcast address defined in IPv6”。说明以上为原文 informative 附录的归纳帮助理解为什么unicast_IPv6_addresses里会同时出现链路本地和全局地址。示例 9traffic_class 在 IPv6 头里的位置背景informative蓝皮书原文IPv6 header formatinformative“Traffic class is used by originating nodes and/or forwarding routers to identify and distinguish between different classes or priorities of IPv6 packets… the traffic class value is only a notion of prioritization… do not secure the transmission.”IPv6 头 8 位 Traffic Class 高 6 位 DSCP 低 2 位 CU当前未用。本类只ManagedTraffic classVersion / Flow label / Payload length / Next header / Hop limit / 源目的地址均Not managed由设备协议栈处理。5. 工程上容易踩的坑IPv4 与 IPv6 地址数据类型完全不同IPv4 setup用double-long-unsigned4 字节整数IPv6 setup用octet-string16 字节。主站解析两套对象时必须分支别把 16 字节当 4 字节整数解。每个接口一个实例双栈设备不是一个 IPv6 setup 管所有而是每个网络接口各一个枚举对象列表时别漏掉第二个接口。address_config_mode对所有地址通用改一个模式单播/组播/网关/DNS 一起变——想网关手动、单播自动做不到要重新设计。写空数组 清空unicast_IPv6_addresses等写回array of 0 elements是重置全部地址的语义不是不动别误用。DNS 未配置 octet-string 长度 0primary_DNS_address长度为 0 表示没配不是0.0.0.0。traffic_class只管 DSCP 高 6 位其余 IPv6 头字段Version/Flow label/Payload length/Next header/Hop limit/源目的地址本类都不管见示例 9 的 informative 对照。ND 模式才需要配neighbor_discovery_setupManual/DHCPv6 下这组参数基本用不上但对象里它始终存在别以为没配 ND 就不用管这个属性。地址是 16 字节不是字符串设备对象列表里看到的是 16 字节 octet-string缺省值用::记法是人类可读形式链路层只认那 16 字节。IPv6 没有广播地址蓝皮书明确“there is no broadcast address defined in IPv6”。需要一对多只能用multicast_IPv6_addresses别去找 broadcast 概念。参考资料informative非类定义蓝皮书在IPv6 setup末尾附了IPv6 header vs IPv6 IC对照表——本类只管 Traffic classVersion / Flow label / Payload length / Next header / Hop limit / 源目的地址均 Not managed可选扩展头Hop-by-Hop / Destination / Routing / Fragment / Security/AHESP也均 Not managed。这些由设备 IPv6 协议栈自己处理COSEM 对象不碰。6. 小结 下期预告本篇要点IPv6 setup(48) 建模 IPv6 网络层每个接口一个实例与IPv4 setup(42) 组成双栈地址统一用16 字节 octet-stringRFC 3513/4291单播/组播/网关都是array of octet-stringaddress_config_mode0 自动/1 DHCPv6/2 手动/3 ND对所有地址通用traffic_class0–63只对应 IPv6 头 Traffic Class 的 DSCP 高 6 位neighbor_discovery_setup给出 ND 协议的 RS 重试/RA 周期参数两个 optional 方法add_IPv6_address/remove_IPv6_address用structure{type, address}增删新地址自动追加到末尾。下一篇第 37 篇S-FSK PhyMAC set-upclass_id 50—— 把视角从 IP 网络切到电力线载波PLC物理层S-FSKIEC 61334这种慢速、可靠的窄带 PLC 技术它的物理层MAC 层参数怎么建模频率、增益、MAC 地址、中继、同步。参考资料DLMS UA《Blue Book Ed.16 Part 2 – COSEM interface classes》IPv6 setup(class_id 48, version 0) 章节文中属性、数据类型、Short name 偏移、方法与引文均与原文一致示例中的 OBIS、地址字节、配置取值为帮助理解而构造标注示例/非蓝皮书原文实际以设备对象列表为准IPv6 头对照表等属原文 informative 附录。
延伸阅读

更多相关文章

2026/10/13 10:10:55

网信安考核实践:从央巡整改到数据安全风险闭环

一、背景在实际参与相关工作的过程中,我接触到的考核内容既包括用户个人信息保护、数据安全风险评估、数据全生命周期管理、数据对外提供等管理要求,也包括日志审计、风险监测、态势感知、API安全、个人信息违规收集检测等技术安全工作。同时&#xff0c…

2026/10/13 15:58:03

STM32电源闭环控制:ADC触发+双环PID+硬件保护实战

简介:本资源为电子设计大赛(电赛)电源类专项程序代码合集,面向高校电子类专业学生、电赛备赛团队及嵌入式电源系统开发者,聚焦电源管理、闭环控制与硬件协同等核心难点,助力快速构建稳定可靠的电源子系统。…

2026/10/13 15:58:03

Android无障碍服务实战:微信抢红包插件原理与鲁棒实现

简介:这是一份面向Android逆向与插件开发学习者的微信抢红包Xposed模块源码,适用于具备Java基础和Android开发经验的中高级开发者,帮助理解系统级Hook机制、第三方应用行为干预等核心场景。资源共33个文件,含10个Java核心逻辑类&a…

2026/10/13 15:58:03

多智能体协作工作台:开源MyCoWork让AI团队落地真实业务

这段时间跟很多团队聊下来,发现大家普遍卡在同一个地方:模型能力早就够用了,但真要让 AI 在业务里“干活”,总觉得差了点意思。要么是对话机器人只会聊不会做,要么是单点功能做出来了,却跟真实的工作流对不…

2026/10/13 15:58:03

Jetson+STM32双芯片架构:移动机器人实时控制源码包解析

简介:这份源码资源完整呈现了一台基于Jetson Orin NX(8GB)与STM32协同控制的移动机器人项目,面向正在入门ROS机器人开发、嵌入式运动控制或激光雷达与视觉融合应用的开发者。包内包含ROS工作空间、STM32控制逻辑、机械臂与车身运动控制相关代码&#xff…

2026/10/13 15:58:03

WebSocket实时推送实战:握手、心跳与断线重连的避坑指南

做过实时推送的同学,大概率都经历过这么一段:后端一把数据塞进数据库,前端为了拿到它,要么死循环轮询接口,要么用长轮询把请求挂着,延迟和服务器压力两头受罪。后来我把项目里的推送链路逐步迁到了 WebSock…

2026/10/13 15:53:02

Agent技能层设计:告别失控提示词,构建可插拔的LLM应用能力

说实话,LLM应用做到一定复杂度之后,你会发现真正卡住你的往往不是模型能力,而是"怎么让模型稳定地复用一套已有能力"。刚开始做Agent的时候,我也跟大家一样,什么逻辑都往System Prompt里堆,结果提…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑