DLMS/COSEM 蓝皮书解读(三十四):SMTP setup(class_id = 46)------ 电表作为 SMTP 客户端发邮件的六参数配置
系列说明 :本系列基于 DLMS UA《Blue Book(蓝皮书)第 16 版 · 第 2 部分》,一个接口类一篇。第 33 篇讲了
GPRS modem setup(class_id = 45),它把蜂窝 Modem 的 APN/PIN/QoS 接入参数配好。本篇的SMTP setup(class_id = 46)再往上到应用层,回答"电表怎么作为 SMTP 客户端发邮件"------服务器、端口、账号、口令、发件人六个参数。
上篇回顾 :第 33 篇GPRS modem setup负责把蜂窝 Modem 的 APN/PIN/QoS 接入参数配好;本篇的SMTP setup只负责"发邮件这一应用层客户端"的服务器参数。它通常被第 28 篇的Push setup调用,把告警/数据通过邮件外发。
0. 为什么需要这个类 ------ 电表不实时连主站时,"出问题时自己发封邮件"怎么配置
有些场景下,电表不想(或不能)实时连主站,而是希望"出问题时自己发封邮件"。这需要一个 SMTP 客户端:知道邮件服务器在哪、用哪个账号登录、以谁的名义发。DLMS/COSEM 用 SMTP setup 建模这组客户端参数。
蓝皮书原文(Overview):
"This IC allows setting up data exchange using the SMTP protocol."
蓝皮书原文:"SMTP modem setup 0...n class_id = 46, version = 0"
即它是 0...n(每设备可多实例,比如一个业务邮箱 + 一个告警邮箱),class_id = 46,version = 0。
1. 类蓝图
1.1 属性表(version = 0)
| # | 属性名 | 读写 | 数据类型 | 默认值 | Short name | 说明 |
|---|---|---|---|---|---|---|
| 1 | logical_name |
static | octet-string | --- | x |
对象实例名(OBIS) |
| 2 | server_port |
static | long-unsigned | 25 | x + 0x08 |
SMTP 服务器端口 |
| 3 | user_name |
static | octet-string | --- | x + 0x10 |
登录用户名 |
| 4 | login_password |
static | octet-string | --- | x + 0x18 |
登录口令 |
| 5 | server_address |
static | octet-string | --- | x + 0x20 |
服务器地址(名字或点分 IP) |
| 6 | sender_address |
static | octet-string | --- | x + 0x28 |
发件人地址(名字或点分 IP) |
没有方法(Specific methods 栏为空)。
六个属性全部是
static------SMTP 客户端配置是"建链/发信前定好的",不是运行时变的。
2. 属性逐条拆解(严格按原文)
2.1 server_port
蓝皮书原文:
"Defines the value of the TCP-UDP port related to this protocol. By default, this value is the SMTP port numberID assigned by IANA: smtp 25/tcp, smtp 25/udp Simple Mail Transfer"
即默认 25(IANA 分配的标准 SMTP 端口,TCP/UDP 都是 25)。现在不少服务商用 465(SMTPS/SSL)或 587(STARTTLS 提交),但蓝皮书只认 25 为缺省------实际部署要按服务商填。
2.2 user_name
蓝皮书原文:"Defines the user name to be used for the login to the SMTP server."
登录账号,纯 octet-string(ASCII/UTF-8 文本)。
2.3 login_password
蓝皮书原文:"Password to be used for login. When the string is void, this means that there is no authentication."
关键:空字符串 = 不认证。匿名 SMTP 中继就靠这个。
2.4 server_address
蓝皮书原文:
"Defines the server address as an octet string. This server address can be a name, which shall be resolvable by the primary DNS or the secondary DNS. In the case when it is directly the IP address of the server, which is specified here, it shall be a string in dotted format. EXAMPLE: 163.187.45.87."
两种写法都合法:
- 域名 :如
"smtp.example.com",要靠第 30 篇IPv4 setup的primary_DNS_address/secondary_DNS_address解析。 - 点分 IP :直接写
"163.187.45.87"(蓝皮书原例)。
2.5 sender_address
蓝皮书原文:"Defines the sender address as an octet string. This sender address can be a name. In the case when it is directly the IP address of the sender, which is specified here, it will be a string in dotted format."
即"发件人",同样可以是名字或点分 IP。注意它和 server_address 语义不同:一个"邮件服务器在哪"、一个"以谁名义发"。
3. 方法
无(Specific methods 栏为空)。发信动作由上层(如 Push setup/脚本调度)触发,本类只存配置。
4. 实战举例(示例 / 非蓝皮书原文)
示例 1:一个标准 SMTP 外发配置
| 属性 | 值(示例) |
|---|---|
server_port |
25(默认)或 465(SSL,依服务商) |
user_name |
"meter_alarm@corp.com" |
login_password |
"******"(非空) |
server_address |
"smtp.corp.com" 或 "163.187.45.87" |
sender_address |
"meter01@corp.com" |
以上为工程示意,非蓝皮书原文;账号/密码/服务器以实际部署为准。
示例 2:与第 28 篇 Push setup 的"邮件推送"联动
第 28 篇 Push setup 的 push_object_list 若选"通过 SMTP 外发",就引用本 SMTP setup 实例作为发信客户端。典型链路:
Register monitor(21) 越限 → 触发 Script table(9) → 调 Push setup(40).push → 读本 SMTP setup(46) 配置 → 发告警邮件给运维
联动关系为工程示意,非蓝皮书原文;强调"SMTP setup 只提供发信参数,真正发信由 Push setup 编排"。
示例 3:SN 短名读取
base name x:server_port = x+0x08,user_name = x+0x10,login_password = x+0x18,server_address = x+0x20,sender_address = x+0x28。
工程示意。
示例 4:A-XDR 读 server_port
GET server_port 返回 long-unsigned:
long-unsigned (tag [18]=0x12) = 0x0019 // 25
A-XDR 字节为工程示意,非蓝皮书原文。
示例 5:server_address 为域名的 A-XDR
GET server_address 返回 octet-string:
octet-string (tag [9]=0x09):
长度 = 0x0E (14)
值 = "smtp.corp.com" 的 ASCII: 73 6D 74 70 2E 63 6F 72 70 2E 63 6F 6D
工程示意。
示例 6:匿名中继(空口令)
login_password = 空 octet-string(长度 0)。此时行为按原文"no authentication"。
依原文
login_password定义。
示例 7:多实例规划(业务邮箱 + 告警邮箱)
| 实例 OBIS(示例) | 用途 |
|---|---|
| 0.0.25.5.0.255 | 日数据邮件 |
| 0.1.25.5.0.255 | 越限告警邮件 |
OBIS 为示例,非蓝皮书原文;强调
0...n多实例。
示例 8:DNS 依赖链路
若 server_address 用域名,则必须保证第 30 篇 IPv4 setup 的 DNS 已配好,否则解析失败发不出信。
依原文"resolvable by the primary DNS or the secondary DNS"。
示例 9:明文 25 端口的安全提醒
标准 25 端口是明文 SMTP,口令会裸奔。生产环境若支持应改用 465/587 + TLS;但蓝皮书只定义到 25,TLS 能力取决于设备实现。
工程建议,非蓝皮书原文。
示例 10:完整发信流程(与 Push setup 联动)
以下为工程示意、非蓝皮书原文;展示"越限→发邮件"端到端链路。
[Register monitor 21] 电压越限
└─ 触发 [Script table 9] 脚本
└─ 调 [Push setup 40].push
├─ 取 push_object_list(要发的 OBIS 数据)
├─ 选传输方式 = SMTP
├─ 读本 [SMTP setup 46] 配置(server/port/账号/口令/发件人)
└─ 经 [IPv4 setup 42] 的 DNS 解析 server_address 域名
└─ 经 [PPP setup 44]/[TCP-UDP setup 41] 建链
└─ 向 SMTP 服务器 25 端口提交邮件 → 运维收信
示例 11:与 Push setup 邮件字段对照
| Push setup(40) 侧概念 | 由本 SMTP setup(46) 提供 |
|---|---|
| 传输方式选 SMTP | 指向本 46 实例 |
| 收件人 / 主题 / 正文 | 由 Push setup 组织,本类只给"发信客户端参数" |
| 服务器地址 | server_address + server_port |
| 登录凭据 | user_name + login_password |
对照为工程示意,非蓝皮书原文;强调"46 管配置、40 管编排"。
示例 12:部署核对清单
以下为工程示意、非蓝皮书原文。
- 确认设备支持 SMTP 客户端能力(并非所有表都实现);
- 填写
server_address:域名需第 30 篇 DNS 已配,或直接填点分 IP; - 填写
server_port:标准 25,SSL/TLS 依服务商填 465/587; - 填写
user_name+login_password:空口令 = 匿名(不推荐生产); - 填写
sender_address:与账号一致的发件人; - 多邮箱(业务/告警)建多个 46 实例,OBIS 区分;
- 由
Push setup(40) 引用本实例完成实际外发; - 生产优先 TLS 端口,避免 25 明文口令裸奔。
示例 13:完整 SMTP 交互骨架(示意)
客户端(表) → TCP 连 server_address:server_port
← 220 服务就绪
客户端 → EHLO meter01
← 250 支持
客户端 → AUTH LOGIN (user_name / login_password)
← 235 认证成功
客户端 → MAIL FROM:<sender_address>
← 250 OK
客户端 → RCPT TO:<运维邮箱>
← 250 OK
客户端 → DATA ... QUIT
交互为工程示意,非蓝皮书原文;展示本类六个属性如何映射到 SMTP 会话。
5. 工程上容易踩的坑
- 空口令 = 不认证 :
login_password写空串就是匿名,别误以为"没设密码=用默认密码"。 - 域名要靠 DNS :
server_address/sender_address用名字时,第 30 篇的 DNS 必须配对,否则解析失败。 server_address≠sender_address:前者是邮件服务器、后者是发件人,填反了发不出去或被拒。- 默认端口 25 是明文:生产注意传输安全,必要时走 TLS 端口(非蓝皮书定义,看设备能力)。
- 六个属性全是 static:运行时 SET 通常无效,要在配置阶段设好。
- 无方法 :发信动作不在本类,别找 SMTP setup 的 action;它由
Push setup/脚本触发。 0...n多实例:多邮箱场景分别建实例,主站枚举别只处理第一个。- 点分 IP 要字符串化 :蓝皮书明确
server_address直接写 IP 时是"dotted format 字符串",不是double-long-unsigned整数(不同于IPv4 setup的地址)------解析时注意类型差异。
6. 小结 & 下期预告
SMTP setup(class_id = 46)是个极简的应用层客户端配置类:6 个 static 属性(server_port 默认 25、user_name、login_password 空=不认证、server_address/sender_address 可为域名或点分 IP),无方法。它是"电表发邮件"能力的服务端参数,通常由 Push setup(40)编排调用,域名解析依赖 IPv4 setup(42)的 DNS。
下一篇(第 35 篇):GSM diagnostic(class_id = 47) ------ 回到通信"可观测性":监测 GSM/GPRS/UMTS/LTE 模组的注册状态、信号质量、小区信息、邻区,是排查"为什么这台表连不上网"的第一手数据。原文含 version 0 与 version 1,本篇合并讲解。