DLMS/COSEM 蓝皮书解读(三十):IPv4 setup(class_id = 42)—— 电表接入 IPv4 网络必需的"地址/子网/网关/DNS"四件套
系列说明:本系列基于 DLMS UA《Blue Book(蓝皮书)第 16 版 · 第 2 部分》,一个接口类一篇。第 29 篇讲了
TCP-UDP setup(class_id = 41),它决定"DLMS 应用监听哪个 TCP/UDP 端口、最大并发连接数、空闲超时多久断开"。本篇的IPv4 setup(class_id = 42)就是往下一层走,回答"这个接口的 IPv4 地址、子网掩码、网关、DNS 怎么配"——把电表从"端口"补到"网段"。
上篇回顾:第 29 篇
TCP-UDP setup的TCP-UDP_port负责监听 DLMS/COSEM 应用流量,但它不管 IP 地址本身。IP 地址、子网掩码、网关、DNS 这些"IP 层四件套"就由本篇的IPv4 setup负责;而且和TCP-UDP setup一样,每个网络接口一个实例。
0. 为什么需要这个类 —— 电表接入 IP 网络时,地址/子网/网关/DNS 缺一不可
在 TCP-UDP/IPv4 这个通信 profile(IEC 62056-47 Wrapper)下,一块电表要"上网",至少需要回答四个问题:
- 我的 IP 地址是多少?(
IP_address) - 我在哪个子网、怎么判断目标是"同网段"还是"要走网关"?(
subnet_mask) - 出网段的数据包该丢给谁?(
gateway_IP_address) - 域名怎么解析?(
primary_DNS_address/secondary_DNS_address)
IPv4 setup 就是把这一组"IP 层参数"建模成一个 COSEM 对象。蓝皮书对它的定位非常明确:
蓝皮书原文(Overview):
“This IC allows modelling the setup of the IPv4 layer, handling all information related to the IP Address settings associated to a given device and to a lower layer connection on which these settings are used.”
而且它按接口建实例,不是全局唯一的:
蓝皮书原文(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 TCP-UDP/IPv4 profile on both of them), there shall be two instances of the IPv4 setup IC in that device: one for each of these interfaces.”
也就是说:双网卡(比如一个以太网口 + 一个 PPP 拨号口)的电表,必须建两个 IPv4 setup 实例,各自挂在自己的下层链路对象上。这一点和第 29 篇 TCP-UDP setup 的"每接口一个实例"是一脉相承的。
1. 类蓝图
1.1 属性表(version = 0)
| # | 属性名 | 读写 | 数据类型 | Short name | 说明 |
|---|---|---|---|---|---|
| 1 | logical_name | static | octet-string | x | 对象实例名(OBIS) |
| 2 | DL_reference | static | octet-string | x + 0x08 | 指向底层数据链路层 setup 对象 |
| 3 | IP_address | — | double-long-unsigned | x + 0x10 | 本设备 IPv4 地址 |
| 4 | multicast_IP_address | — | array | x + 0x18 | 组播地址列表 |
| 5 | IP_options | — | array | x + 0x20 | IP 选项 |
| 6 | subnet_mask | — | double-long-unsigned | x + 0x28 | 子网掩码 |
| 7 | gateway_IP_address | — | double-long-unsigned | x + 0x30 | 网关地址 |
| 8 | use_DHCP_flag | static | boolean | x + 0x38 | 是否用 DHCP |
| 9 | primary_DNS_address | — | double-long-unsigned | x + 0x40 | 主 DNS |
| 10 | secondary_DNS_address | — | double-long-unsigned | x + 0x48 | 备 DNS |
注:原文属性表里
IP_address/multicast_IP_address/IP_options/subnet_mask/gateway_IP_address/primary_DNS_address/secondary_DNS_address未标注(static),即默认是可读写的(dynamic 或至少可变)。属性名与 Short name 偏移严格取自原文。
1.2 方法表(Specific methods,全部 o = 可选)
| 方法名 | 参数 | Short name | 说明 |
|---|---|---|---|
add_mc_IP_address (data) | IP_Address: double-long-unsigned | x + 0x60 | 向组播数组加一个地址 |
delete_mc_IP_address (data) | IP_Address: double-long-unsigned | x + 0x68 | 从组播数组删一个地址 |
get_nbof_mc_IP_addresses (data) | 返回 unsigned | x + 0x70 | 返回组播数组元素个数 |
蓝皮书原文(Specific methods 栏)这三类都是
o(optional),设备可以不实现。需要动态管理组播组的场景才用得上。
2. 属性逐条拆解
2.1 DL_reference:指向下层链路
蓝皮书原文:“References a Data link layer (e.g. Ethernet or PPP) setup object by its logical name. The referenced object contains information about the specific settings of the data link layer supporting the IP layer.”
这是一张引用,指向第 29 篇的 TCP-UDP setup(它上面还挂着 Ethernet / PPP 这类链路对象),或者直接指向 Ethernet / PPP setup 对象。它是"IP 层挂在哪条链路上"的绑定关系。
2.2 IP_address:地址的两种存法
蓝皮书原文:“It can be either (static) or (dynamic). In the latter case, dynamic IP address assignment (for example DHCP) is used. If no IP address is assigned, the value is 0.”
关键认知:IP_address 在对象里是个 double-long-unsigned 整数,不是点分十进制字符串。蓝皮书给了一个必须记住的换算例子:
蓝皮书原文(EXAMPLE):
“The IPv4 address 192.168.0.1 (in dotted decimal notation) corresponds to C0A80001 (hexa) which gives 3232235521 (double-long-unsigned).”
换算方法:把四个字节 192 168 0 1 拼成 32 位无符号整数 = 0xC0A80001 = 3 232 235 521。主站读出来是这个数字,要在界面上显示成"点分十进制"得自己拆字节。
2.3 multicast_IP_address:组播监听
蓝皮书原文:“IP addresses in this array shall fall into the multicast group address range (‘Class D’ addresses, including IP addresses in the range of 224.0.0.0 to 239.255.255.255). When a device receives an IP datagram with one of these IP addresses in the destination IP address field, it shall consider that this datagram is addressed to it.”
类型是数组,元素也是 double-long-unsigned(和 IP_address 同款编码):
multicast_IP_address ::= array double-long-unsigned
用途:比如电表要监听某个组播组(NTP、某广播校时、某主站群发),把自己的组播地址加进这个数组即可;三个方法就是增删查这个数组。
2.4 IP_options:可选 IP 选项
IP_options ::= array IP_options_element
IP_options_element ::= structure
{
IP_Option_Type: unsigned,
IP_Option_Length: unsigned,
IP_Option_Data: octet-string
}
蓝皮书原文(NOTE):“In all cases, as specified in RFC 791, the IP_Option_Length field includes the total length of all three fields: IP_Option_Type, IP_Option_Length and IP_Option_Data.”
允许的 IP_Option_Type 取值(原文列出):
| IP_Option_Type | 含义 |
|---|---|
0x82 | Security(IP_Option_Length = 11,含安全/隔离/处理限制/TCC 参数) |
0x83 | Loose Source and Record Route(宽松源路由并记录) |
0x89 | Strict Source and Record Route(严格源路由并记录) |
0x07 | Record Route(记录路由) |
0x44 | Internet Timestamp(互联网时间戳) |
工程现实:绝大多数电表根本用不到 IP 选项,这个属性通常是空数组。但做电力监控专网(带安全选项)时要填
0x82。
2.5 subnet_mask / gateway_IP_address:子网与网关
蓝皮书原文(subnet_mask):“the ‘0’ bits of the subnet_mask indicate the portion of the IP Address which is still used as Device_ID on a sub-networked IP Network.”
蓝皮书原文(gateway):“In order to be able to send non-local datagrams to the gateway, the device shall know the IP address of the gateway device assigned to the given network segment. If no IP address is assigned, the value is 0.”
subnet_mask 也是 double-long-unsigned(如 255.255.255.0 = 0xFFFFFF00 = 4 294 967 040)。gateway_IP_address 取 0 表示"没有网关/直连网络"。
2.6 use_DHCP_flag:静态还是动态
蓝皮书原文:
“TRUE: The device uses DHCP (Dynamic Host Configuration Protocol) to dynamically determine the IP_address, subnet_mask and gateway_IP_address parameters.”
“FALSE: The IP_address, subnet_mask and gateway_IP_address parameters shall be set locally.”
注意:一旦 use_DHCP_flag = TRUE,IP_address / subnet_mask / gateway_IP_address 三个属性就由 DHCP 覆盖,本地设的值只能当" fallback / 初始值"。这是很多现场"明明配了地址却不生效"的根源。
2.7 primary_DNS_address / secondary_DNS_address
蓝皮书原文:主 DNS “If no IP address is assigned, the value is 0.” 备 DNS 同理(原文
secondary_DNS_address写法有小空格笔误,语义相同)。
解析域名(比如第 33 篇 SMTP setup 的 server_address 填的是名字而不是 IP)就靠这俩。都是 double-long-unsigned,0 表示未配。
3. 方法逐条拆解
三个方法都是 optional,且只和组播数组有关:
add_mc_IP_address (IP_Address):往multicast_IP_address里加一个double-long-unsigned。蓝皮书原文:“Adds one multicast IP address to the multicast_IP_address array. IP_Address::= double-long-unsigned”
delete_mc_IP_address (IP_Address):按值删除一个。get_nbof_mc_IP_addresses (data):返回数组长度,data ::= unsigned。
实践判断:如果设备出厂就固定监听某个组播组(组播地址写死在
multicast_IP_address里),这三个方法完全可以不实现——它们是"运行时动态增删"才需要的。
4. 实战举例
示例 1:一个静态地址的 IPv4 setup 实例
某台区集中器通过以太网口接入局域网,IP 段 192.168.1.0/24,网关 192.168.1.1:
| 属性 | 值(点分) | 值(double-long-unsigned,十六进制) | 值(十进制) |
|---|---|---|---|
IP_address | 192.168.1.50 | 0xC0A80132 | 3 232 850 994 |
subnet_mask | 255.255.255.0 | 0xFFFFFF00 | 4 294 967 040 |
gateway_IP_address | 192.168.1.1 | 0xC0A80101 | 3 232 849 665 |
primary_DNS_address | 192.168.1.1 | 0xC0A80101 | 3 232 849 665 |
use_DHCP_flag | FALSE | — | — |
以上配置示例为工程示意、非蓝皮书原文;具体 OBIS 与地址需以设备对象列表为准。
示例 2:换算验证(蓝皮书原例)
192.168.0.1:
192 = 0xC0,168 = 0xA8,0 = 0x00,1 = 0x01- 拼成
0xC0A80001 - 十进制 =
192×2^24 + 168×2^16 + 0×2^8 + 1=3 221 225 472 + 11 010 048 + 0 + 1= 3 232 235 521 ✓ 与蓝皮书一致
示例 3:DHCP 场景下的 short name 读取
主站用 SN 访问(第 1 篇讲过 x 是 base name),读 IP_address 取 x + 0x10:
工程示意:若 base name
x = 0x1000,则IP_address的 short name =0x1010。DHCP 环境下读到的是"当前租约地址",不是出厂默认值。
示例 4:组播地址的 A-XDR 表示
组播地址 224.0.0.1(NTP 常用)编码为 double-long-unsigned = 0xE0000001 = 3 758 096 385。加入数组:
add_mc_IP_address:
结构(method 参数):
long-unsigned (tag [18]=0x12) = 0xE0000001
A-XDR 字节为工程示意,非蓝皮书原文。
示例 5:双接口实例的 OBIS 规划
| 接口 | logical_name(OBIS,示例) | DL_reference 指向 |
|---|---|---|
| 以太网 | 0.0.25.1.0.255 | TCP-UDP setup 实例 A |
| PPP 拨号 | 0.0.25.2.0.255 | PPP setup 实例(第 32 篇) |
OBIS 为示例,非蓝皮书原文;强调"每接口一个实例"。
示例 6:IP_options 安全选项的字节骨架
若启用 Security 选项(0x82,长度应含三字段共 11):
structure:
unsigned = 0x82 (IP_Option_Type)
unsigned = 0x0B (IP_Option_Length = 11)
octet-string = <11字节安全参数,依 RFC 791>
具体 11 字节内容依 RFC 791,非蓝皮书给出,工程示意。
4.7 与第 29 篇 TCP-UDP setup 的部署核对清单
以下为工程示意、非蓝皮书原文。
- 先建
TCP-UDP setup(41)实例,定好 IANA 端口 4059、MSS、连接数、超时; - 再建本
IPv4 setup(42)实例,用DL_reference指向上一步的 41; - 决定
use_DHCP_flag:固定 IP 设 FALSE 并填IP_address/subnet_mask/gateway;动态 IP 设 TRUE; - 若用域名访问(如 SMTP 服务器),务必填
primary_DNS_address(可经 DHCP 获得); - 需要组播监听,预置
multicast_IP_address或依赖三个 optional 方法运行时增删; - 多接口(以太网 + PPP)各自建 42 实例,OBIS 不冲突。
4.8 "IP 类属性"整数 vs 字符串对照表
| 类 | 属性 | 存法 | 示例值 |
|---|---|---|---|
IPv4 setup(42) | IP_address/subnet_mask/gateway/DNS | double-long-unsigned 整数 | 192.168.0.1 = 3232235521 |
SMTP setup(46) | server_address/sender_address | octet-string 点分/域名 | "163.187.45.87" |
MAC address setup(43) | MAC_address | octet-string 6 字节 | 00 1D 2C 3E 4F 50 |
关键:同样是"地址",42 用整数、46 用字符串、43 用字节串——主站解析时类型处理要分开,别混。
5. 工程上容易踩的坑
- 地址是数字不是字符串:所有 IP 类属性(
IP_address/subnet_mask/gateway/DNS)都是double-long-unsigned。主站/界面务必做"点分 ↔ 整数"双向转换,直接把3232235521当字符串显示就是 bug。 - DHCP 打开后本地地址被覆盖:
use_DHCP_flag = TRUE时别指望 SETIP_address生效;要静态必须用 FALSE。 - 网关为 0 不是"网关是 0.0.0.0":它语义上是"无网关/直连网段"。跨网段通信却填 0 会全部丢包。
DL_reference指错链路对象:它必须指向"真正承载这个 IP 接口"的链路 setup(Ethernet / PPP / 第 29 篇 TCP-UDP setup),指错会导致报文出口不对。multicast_IP_address必须落在 224.0.0.0–239.255.255.255:填非组播地址违反蓝皮书约束,行为未定义。- 组播方法是 optional:别假设设备一定实现了
add_mc_IP_address;动态加组播前先确认方法存在,否则用静态预置数组。 - IPv4 与 IPv6 是两个类:本篇只管 IPv4;双栈设备还要另建第 35 篇要讲的
IPv6 setup(class_id = 48)。 IP_options实际很少用:专网带安全选项才填0x82,普通场景空数组即可,别为了"齐全"硬填导致某些老协议栈解析异常。
6. 小结 & 下期预告
本篇把 IP 层的"身份证 + 路由 + 域名"配齐:IP_address/subnet_mask/gateway_IP_address/primary_DNS_address/secondary_DNS_address 五个地址类属性全是 double-long-unsigned,use_DHCP_flag 决定静态还是动态,DL_reference 把 IP 层绑到具体链路,multicast_IP_address 配合三个 optional 方法做组播管理,IP_options 是高级可选项。
下一篇(第 31 篇):MAC address setup(class_id = 43) —— 再往下到数据链路层,看 MAC 地址(EUI-48)是怎么建模的,以及 HDLC、S-FSK、G3-PLC 这些不同介质里"MAC 地址"分别存在哪个对象里。它和本篇的 DL_reference 链条正好接上。
:IPv4 setup(class_id 42)—— 电表接入 IPv4 网络必需的“地址子网网关DNS“四件套&spm=1001.2101.3001.5002&articleId=166789453&d=1&t=3&u=17f680f9231f43af94722b500898b819)
88

被折叠的 条评论
为什么被折叠?



