:Auto answer(class_id = 28)—— 自动应答:监听窗口、振铃次数与来电白名单)
DLMS/COSEM 蓝皮书解读二十五Auto answerclass_id 28—— 自动应答监听窗口、振铃次数与来电白名单系列说明本系列基于 DLMS UA《Blue Book蓝皮书第 16 版 · 第 2 部分》一个接口类一篇。第 24 篇讲了Modem configurationclass_id 27把 Modem “怎么初始化配好了。本篇的Auto answerclass_id 28紧接其后解决Modem 收到来电/短信唤醒时设备怎么决定接不接、几点接、只接谁的电话”。上篇回顾第 24 篇让设备知道怎么跟 Modem 说话。但 Modem 是被叫方时谁来接、何时接、接谁的需要一套入站管理规则。本篇Auto answer就是这块来电管家——监听窗口 振铃次数 允许来电白名单v2 还加了 wake-up来电/短信唤醒。0. 为什么需要这个类表计通常不能 7×24 占线电话线可能和住户共用或要省流量。于是需要回答三个问题何时接→listening_window监听窗口一天里哪些时段允许入站响几声接→number_of_rings窗口内/窗口外不同振铃次数接谁的→list_of_allowed_callers来电白名单靠 CLI 主叫号码识别。v2 在 v0 基础上加了wake-up 能力入站的不一定是来电还可以是唤醒呼叫/唤醒短信如空 SMS设备收到后主动连网而不是建立 Modem 连接。这是低功耗场景的关键。蓝皮书原文v2, Overview“In version 2, new capabilities are added to manage wake-up requests that may be in the form of a wake-up call or a wake-up message e.g. an (empty) SMS message. After a successful wake-up request, the device connects to the network.”蓝皮书原文v2, NOTE 2“The wake-up process is fully decoupled from AL services, i.e. a wake-up message cannot contain any xDLMS service requests. This is to avoid creating a backdoor.”—— 即 wake-up 消息严禁携带 xDLMS 服务请求防止开后门只有在 wake-up 完成后、建立好 AAxDLMS 才能走 SMS 通道。1. 类蓝图v2 比 v0多一个属性list_of_allowed_callersv0 没有白名单不限制来电。两版都有connect吗——没有方法Specific methods 一栏为空全部靠属性状态机驱动。Auto answer 0...n class_id 28, version 0 / 2版本 2推荐含 wake-up 与白名单属性静态/动态数据类型MinMaxDefShort namelogical_namestaticoctet-stringxmodestaticenumx 0x08listening_windowstaticarrayx 0x10statusdyn.enumx 0x18number_of_callsstaticunsignedx 0x20number_of_ringsstaticnr_rings_typex 0x28list_of_allowed_callersstaticarrayx 0x30版本 0无白名单无 wake-up属性静态/动态数据类型Short namelogical_namestaticoctet-stringxmodestaticenumx 0x08listening_windowstaticarrayx 0x10statusdyn.enumx 0x18number_of_callsstaticunsignedx 0x20number_of_ringsstaticnr_rings_typex 0x28注v1 是 interim过渡版本原文 NOTE 明确“Version 1 of the Auto answer class was an interim version.”故生产实现直接用 v0 或 v2。2. 属性逐条解读2.1 logical_name标识实例static基址x。2.2 mode两版相同线路工作模式。staticenum短名x 0x08enum 值含义(0)line dedicated to the device专线全时段归设备(1)shared line允许有限次呼叫次数用尽后窗口变 inactive 直到下个开始时间不论呼叫成败(2)shared line允许有限次成功呼叫成功次数用尽后窗口变 inactive 直到下个开始时间(3)currently no modem connected当前无 Modem 连接(200)–(255)manufacturer specific modes厂商自定义注属性表未给 mode 的 Min/Maxenum 定义本身列出 0–3 200–255。按原文如实呈现。2.3 listening_window两版相同监听窗口窗口何时 activestart_time、何时 inactiveend_timestart_time 隐式定义了周期。蓝皮书原文v2, listening_window“Defines the time points when the communication window(s) become active (start_time) and inactive (end_time). The start_time implicitly defines the period.”staticarray元素window_element :: structure { start_time: octet-string, end_time: octet-string }短名x 0x10。start/end 按 date-time 格式编码。蓝皮书原文 EXAMPLEv2“When the day of month is not specified (equal to 0xFF) this means that we have a daily listening window management. Daily, monthly window management can be defined.”即日字段填0xFF 每日窗口可定义每日/每月窗口。2.4 status两版相同dyn.窗口当前状态。dyn.enum短名x 0x18enum 值含义(0)Inactive不处理新入站呼叫下一个监听窗口开始自动复位为 Active(1)Active可应答下一个入站呼叫(2)Locked设备自动或由某客户端置位该客户端读完、想把线还给用户早于窗口结束下一个监听窗口开始自动复位为 Active2.5 number_of_calls两版相同mode 1/2 的参照计数。staticunsigned短名x 0x20。设为 0 不限制。蓝皮书原文“When set to 0, this means there is no limit.”2.6 number_of_rings两版相同振铃几次后 Modem 才连接区分窗口内/窗口外两种情形。staticnr_rings_type短名x 0x28nr_rings_type :: structure { nr_rings_in_window: unsigned (0 窗口内不连接), nr_rings_out_of_window: unsigned (0 窗口外不连接) }蓝皮书原文“If the number of rings inside and outside the window is the same, the modem always connects regardless of the settings of the listening_window.”2.7 list_of_allowed_callers仅 v2来电白名单用 CLI主叫线路识别限制可接入的号码也控制 wake-up 呼叫/短信的接受。staticarray短名x 0x30list_of_allowed_callers_element :: structure { caller_id: octet-string, // 主叫号码支持通配符 ? 和 * call_type: enum // (0) 普通 CSD 呼叫(1) wake-up 请求 }蓝皮书原文v2, list_of_allowed_callers“Contains an optional list of calling numbers which further limits the connectivity of the modem based on the calling number. It also controls the acceptance of wake-up calls or wake-up messages (e.g. SMS) from a calling number. This requires the presence of a calling line identification (CLI) service.”通配符规则原文 EXAMPLE994193500→ 只接这个号9941935????→ 接99419350000~99419359999整个号段7777*→ 接所有以7777开头的号*9000→ 接所有以9000结尾的号*只能出现在开头或结尾不能在中间、也不能单独用。call_type 语义(0)普通 CSD 呼叫仅当主叫号在白名单内才连接且是叠加在所有其他属性检查之上的(1)wake-up 请求该号的呼叫/短信当 wake-up 处理立即处理、不受number_of_rings/listening_window限制除非该号同时也在普通 CSD 白名单里。蓝皮书原文v2, NOTE“If the list_of_allowed_callers is empty ( array [0]) the auto answer function operates in type (0) normal CSD call and the modem connects independently of the calling number.”—— 白名单为空时退化为不验号、普通 CSD 连接。3. 没有方法靠状态机 白名单驱动本类无 ACTION 方法。入站处理完全由mode/listening_window/status/number_of_rings/list_of_allowed_callers这组属性协同的状态机完成设备底层在收到来电/短信时按这些属性决策。注意它和Modem configuration(27) 的分工27 管Modem 初始化/翻译28 管接不接/何时接/接谁的。4. 【实战举例】示例 1一块每天 02:00–04:00 允许主站呼入的表以下取值为示例非蓝皮书原文实际以设备对象列表为准属性取值logical_name0-0:2.1.0.255mode(1) 共享线、限次listening_window[{start每日 02:00, end每日 04:00}]日字段 0xFFstatus(1) Active窗口内number_of_calls5本窗口最多 5 次呼叫number_of_rings{in_window3, out_of_window0}窗口内响 3 声接窗口外不接list_of_allowed_callers[{caller_id9941935????, call_type0}]含义每天 02:00–04:00 窗口内主站号段99419350000~9999响 3 声后表建立连接窗口外out_of_window0不接本窗口累计 5 次呼叫后status自动变 Inactive 直到次日窗口。示例 2wake-up 短信唤醒v2 特有主站发一条空 SMS到表caller_id 在白名单且call_type1。设备收到后识别为 wake-up 请求立即处理不受 listening_window 限制完成后主动connect到网络如 GPRS之后主站再走正常 xDLMSAA 建立后 SMS 里可带 APDU。注意若 SMS非空且不含有效 xDLMS APDU设备不反应若含预建 AA 下的有效 xDLMS APDU则执行对应服务而非 wake-up。这避免了空 SMS 触发服务的后门。示例 3SN 短名访问base namexmodex0x08listening_windowx0x10statusx0x18number_of_callsx0x20number_of_ringsx0x28list_of_allowed_callersx0x30v2。status的 GET 响应enum(1)Active标签1616 01 01 示例A-XDR 编码示意示例 4v0 → v2 迁移若旧设备用 v0升级到 v2 要补新增list_of_allowed_callers短名 x0x30——决定是否验号、是否支持 wake-up想用 wake-up必须把对应主叫号加入白名单且call_type1mode/status/number_of_rings 语义两版一致可沿用v0 无白名单不验号直接 CSD 连接的行为在 v2 下要显式把白名单置空才会保持。示例 5listening_window 与 nr_rings_type 的完整 A-XDR把示例 1 的窗口与振铃编码以下字节为示例date-time 标签以 0x13/19、unsigned 以 0x0F/15 为例实际以设备为准listening_windowarray of window_element每日 02:00–04:00 01 01 array1 个窗口 02 12 structure18 字节 13 07 ?? ?? ?? ?? ?? ?? ?? start_time date-time日 0xFF 每日 13 07 ?? ?? ?? ?? ?? ?? ?? end_time date-time number_of_ringsnr_rings_type 02 06 structure6 字节 0F 01 03 nr_rings_in_window unsigned 3 0F 01 00 nr_rings_out_of_window unsigned 0窗口外不接示例 6wake-up 决策树v2入站事件到达时设备大致这样判定以下为原文语义归纳的决策流程非蓝皮书原文步骤收到来电/短信 ├─ 主叫号是否在 list_of_allowed_callers │ ├─ 不在 → 若白名单非空拒绝若白名单空按 type(0) 普通 CSD 接 │ └─ 在且 call_type(1) wake-up │ ├─ 是空 SMS / 唤醒呼叫 → 立即 wake-up不受 listening_window/rings 限制→ 连网 │ ├─ 非空但含预建 AA 的有效 xDLMS APDU → 执行该服务不 wake-up │ └─ 非空且无有效 APDU → 不反应 │ └─ 在且 call_type(0) 普通 CSD │ └─ 受 mode/listening_window/number_of_rings/number_of_calls 约束后接听 └─ 同号既是 (0) 又是 (1)主叫在 rings 判据前挂断wake-up达到判据建连接5. 工程上容易踩的坑status 的自动复位时机Inactive / Locked 都会在下一个监听窗口开始自动复位为 Active。别把一次性的 Locked 当成永久封锁去排错想长期封闭要靠listening_window或mode。number_of_rings 窗口内外要分别设in_window和out_of_window是两个独立 unsigned两者相等时无视窗口、总是接原文明确。想窗口外绝不接必须out_of_window0。白名单为空 不验号v2 下若list_of_allowed_callers为空退化为普通 CSD 连接、对任何号都接。要安全就得填白名单否则等于没防护。wake-up 与 CSD 同号的特殊规则同一号码同时是普通 CSD(0) 和 wake-up(1) 时规则是——主叫在number_of_rings判据达到前挂断才当 wake-up达到判据则建 Modem 连接。排错为啥短信没唤醒要先看振铃判据。wake-up 消息必须为空非空 SMS 且不含有效 xDLMS APDU设备不反应含预建 AA 的有效 APDU 才执行服务。别指望带数据的短信既能唤醒又触发业务。CLI 依赖网络支持白名单与 wake-up 都要求通信网络提供 CLI主叫号码识别。网络不送 CLI 时按号过滤/识别 wake-up 全部失效——部署前确认运营商提供 CLI。通配符*位置限制*只能在开头或结尾不能在中间、也不能单独用。写9941935*9000这类中间通配是非法的。v1 是过渡版别用原文 NOTE 说 v1 是 interim。新实现直接 v0 或 v2别落到 v1。status 是 dyn.、可被客户端置 Lockedstatus标为(dyn.)除设备自动复位外某客户端读完会话后可主动置Locked把线还给用户早于窗口结束。排错为啥提前不接要查是否有客户端置了 Locked。6. 小结 下期预告本篇要点Auto answerclass_id 28, v0/v2是 Modem 的入站来电管家无方法、靠属性状态机核心属性listening_window时段、number_of_rings窗口内/外振铃、status0 Inactive/1 Active/2 Locked窗口开始自动复位、number_of_calls0不限v2 新增list_of_allowed_callers白名单CLI 验号 wake-up来电/空 SMS 唤醒wake-up 严禁带 xDLMS、与 CSD 同号有特殊判定v1 是过渡版生产用 v0/v2。下一篇第 26 篇Auto connectclass_id 29—— 自动拨号/主动连接。本篇管入站谁来叫我“下一篇管出站我去连谁”设备何时主动拨号/发短信/邮件、重试几次、在哪些时间窗口、拨哪些目的号码——Auto connect与Auto answer正好是一对入站/出站的对称设计也共用calling_window与destination_list的思路。参考资料DLMS UA《Blue Book Ed.16 Part 2 – COSEM interface classes》Auto answer(class_id 28, version 0/2) 章节。文中属性名、数据类型、Short name 偏移、mode/status enum、nr_rings_type、list_of_allowed_callers 通配符与引文均与原文一致示例中的 OBIS、窗口、号码、A-XDR 字节为帮助理解而构造实际以设备对象列表为准。