文章

DLMS/COSEM Blue Book学习笔记

DLMS/COSEM Blue Book学习笔记

s4.1 基本概念

s4.1.2 Referencing methods

logical names (LN referencing):The reference for an attribute is: class_id, value of the logical_name attribute, attribute_index.The reference for a method is: class_id, value of the logical_name attribute, method_index

关于index,规范内的属性或方法为1开始正数专有的属性或方法应该设置为负数

logical names中的OBIS的每个字段,A,B,C,D,E,F都有各自含义,在blue book1中给出

Short names(SN referencing):COSEM对象的每个属性和方法都用一个13位整数标识。短名称的语法与DLMS命名变量名称的语法相同。为了方便使用SN引用访问设备,一些short_name被保留为特殊COSEM对象的base_name(objectName)。保留base_names的范围是0xFA00到0xFFF8。这里的base_name就是cosem类的不包含偏移的短名,相当于每个类表格中的x,对应每个属性的短名叫short_name,是包含偏移的

s4.1.4.6 Attributes

(dyn.) :对带有流程值的属性进行分类,流程值由仪表本身更新

(static) :对一个属性进行分类,该属性不会由仪表本身更新(例如配置数据但可通过外部通信方式修改)。

s4.1.4.14 m/o

m (mandatory) :The method is mandatory强制的.

o (optional) :The method is optional可选的.

s4.1.4.17 Selective access

部分属性支持选择性访问

  • Profile generic” objects, buffer attribute;
  • Association SN” objects, object_list and access_rights_list attribute;
  • Association LN” objects, object_list attribute;
  • Compact data”, objects, compact_buffer attribute;
  • Push” objects, push_object_list attribute;
  • Data protection” objects, protection_object_list attribute get_protected_attributes method and set_protected_attributes method.

s4.1.6 Data formats

s4.1.6.1 Date and time formats

DLMS 使用公历(Gregorian calendar)

date 结构和 time 结构都支持通配(wildcards),当没有通配时其表示明确的日期时间,当使用通配时其可以表示多个日期时间。

可选的值分为三种类型:正常值,通配值,特殊值

二进制为全 1 表示通配(0xFF,0xFFFF)

特殊值:

  • month: 0xFD 表示该 date 用于表示夏令时结束,0xFE 表示夏令时开始
  • dayOfMonth: 0xFD 表示该月倒数第二天,0xFE 表示该月倒数第一天(如果 dayOfWeek 并非通配,则产生冲突,此时表示当月最后一个周 X,X 为 dayOfWeek。比如 dayOfMonth 为 0xFE,dayOfWeek 为 2,表示当月的最后一个周二)
  • 如果 dayOfMonth 和 dayOfWeek 都指定为正常值:
    • 如果年非通配,且月也非通配,也就是日历中的一个明确的月份,此时可以判断 dayOfMonth 和 dayOfWeek 是否匹配,如果不匹配视为不合法。
    • 如果年为通配,此时无法检验 dayOfMonth 和 dayOfWeek 是否匹配,此时规则为等于或大于 dayOfMonth 的第一个 dayOfWeek,比如 dayOfMonth 为 22,dayOfWeek 为 5,表示当月大于等于 22 号的第一个周五(这个例子中,22 是个比较特殊的值,因为每周是 7 天,22 天正好是比完整的 3 周多的那一天,也就是说这个周五必定是当月第四个周五)。
    • 年非通配,月通配的情况未定义

除了正常值、通配和特殊值外的都不合法

date-time 结构是用来表示绝对时间的结构,包含当地时间与UTC的偏差(分钟)时钟状态三个信息

其中时钟状态如下:

  • bit 0 (LSB): invalid value(该时钟非法,比如掉电时间过长,RTC失效,时钟无法恢复)
  • bit 1: doubtful value(该时钟非法,后续可以修正,但有效性无法保证)
  • bit 2: different clock base(该时钟的时钟源与Clock对象定义的标准时钟源不同)
  • bit 3: invalid clock status(本时钟状态失效)
  • bit 4: reserved
  • bit 5: reserved
  • bit 6: reserved
  • bit 7 (MSB): daylight saving active(该时间处于夏令时中,比如因为夏令时结束回调时间,同一个时间会出现两次,使用该标志区分是哪个)

s4.1.6.3 Null-data and delta-value encoding

用于 array 内数据压缩

空值表示该值可以从前一条记录中恢复,比如和上一条值相同

增量值表示该值可以从前一条记录中通过递增方式恢复,第一条值必须是 integer 或 unsigned 类型,后面就可以一条条递增了

s4.1.8 The COSEM logical device

s4.1.8.2 COSEM logical device name (LDN)

每个COSEM逻辑设备都可以由其唯一的COSEM LDN来标识。LDN定义为最多16个字节的字符串。前三个字节应携带制造商标识符。制造商应确保LDN,从标识制造商的3个字节开始后面是最多13个字节,对每个制造的逻辑设备是唯一的。

s4.1.8.3 The “association view” of the logical device

为了访问服务器中的COSEM对象,首先要与客户端建立应用关联(AA,application association)。AAs标识partners,并描述AA将在其中通信的上下文。上下文主要内容是:

  • the application context;
  • the authentication mechanism;认证机制
  • the xDLMS context.

根据客户端和服务器之间建立的AA关系,服务器可能会授予不同的访问权限。访问权限涉及一组COSEM对象(可见对象),这些对象可以在给定的AA中被访问(“可见”)。此外,对这些COSEM对象的属性和方法的访问也可能在AA中受到限制(例如,某种类型的客户端只能读取COSEM对象的特定属性,但不能写入它)。访问权也可以规定所需的密码保护。

s4.1.8.4 Mandatory contents of a COSEM logical device

每个逻辑设备都应有:

  • COSEM LDN对象
  • “Association” (LN or SN)对象

如果SAP Assignment对象存在,“Association” (LN or SN)对象非必选

识别固件必选对象:

  • active firmware identifier
  • active firmware signature

每个固件对应以上两个对象各一个

s4.1.8.5 Management logical device

用于管理的逻辑设备,每个物理设备必须要有一个。

可以通过public client使用lowest level securty访问,作用是揭示物理设备内部结构以及上报事件

需要包含一个“SAP assignment” object,可以被public client读取,包含物理设备内所有的逻辑设备对应的SAP信息,如果物理设备只有一个逻辑设备,则可以省略

s4.3 参数和测量数据的接口类Interface classes for parameters and measurement data

4.3.1 Data (class_id = 1, version = 0)

value 可以使用任何 Choice 中可选类型,和 DLMS green book 中定义的 Data 相同,但具体类型在实例化后就确定下来,与对象的逻辑设备名绑定,不允许动态改变。

s4.3.2 Register (class_id = 3, version = 0)

包含(value)和量纲(scaler_unit,包括精度(scaler)、单位(unit))

清除方法

s4.3.3 Extended register (class_id = 4, version = 0)

包含量纲状态(厂家自定义)、寄存器捕获时间

清除方法

s4.3.4 Demand register (class_id = 5, version = 0)

需量寄存器

周期性测量某个值得到当前平均值与上次平均值,滑差式统计,统计窗口可以是1个或多个周期

alt text

如果每个周期独立计算,也就是每个周期从 0 开始,纵坐标为该周期内使用的总电量除以整个周期,所以会随着时间慢慢增加,当周期结束时得到的结果就是该周期内单位时间的平均电量消耗,也就是需量。

alt text

如果每次都计算三个周期的电量,当前周期开始时其实是包含前两个周期的的累计电量的,所以不是从 0 开始。但也会出现周期开始时的跳变。

demand

E3表示第三个周期内的电量增量,假设当前时间大于E3统计结束时间(第三周期结束时间),小于E4统计结束时间,电量记录值比E3统计结束时大Δe

  • current_average_value 当前平均值,energy/3t,energy=E2+E3+Δe,t=period,3=周期个数(可以注意到此时实际的统计周期不到3t,应该是 2t 加上 Δe 关联的时间,但还是除以 3t,所以每次周期切换时的平均值会突然比上一平均值小很多)
  • last_average_value 上一平均值,energy/3t,energy=E1+E2+E3,t=period,3=周期个数
  • scaler_unit 量纲
  • status 状态
  • capture_time last_average_value计算时间
  • start_time_current current_average_value统计开始时间, TODO:这个start_time必须是周期开始时间吗?图里显示这个值会跳变,说明start_time在跳变,结合next_period好像说得通,每到新的周期开始点执行next_period,start_time加一个周期的时间,导致分子急剧变小
  • period 周期,两次统计的间隔(记录 last_average_value 的间隔)
  • number_of_periods 周期个数,用于last_average_value计算,为1表示区间式(block),大于1表示滑差式(sliding)

方法:

  • reset (data) 清除
  • next_period (data) 该方法用于触发一个时间段的正常终止(和重新启动)。关闭(终止)当前测量周期。更新capture_time和start_time,拷贝current_average_value到last_average_value,设置current_average_value为默认值。开始下一个测量周期。

s4.3.5 Register activation (class_id = 6, version = 0)

该 IC 允许对不同费率(tariff)策略的处理进行建模。为每个“Register activation”对象分配“Register”, “Extended register”或“Demand register”对象组(register_assignment),对不同类型的量(例如有功电量有功需量无功电量等)进行费率设置。mask_list 定义了不同的费率策略(例如,尖、峰、平、谷)。由 active_mask 定义当前激活的费率策略(比如8点到18点激活费率,此时有功电量寄存器和无功电量寄存器激活,计量芯片产生的电量消耗脉冲都附加到这两个寄存器,其他未启用寄存器值不会改变)。默认情况下,未包含在任何“Register activation”对象的 register_assignment 属性中的寄存器始终处于启用状态。

  • register_assignment 寄存器列表,包括Register”,“Extended register” or “Demand register”等的类id和OBIS
  • mask_list 标记列表,有多个register_act_mask,每个register_act_mask包含唯一的mask_name,每个register_act_mask中的index_list中的值顺序与register_assignment中的对象顺序一一对应,TODO:示例
  • active_mask 激活的标记,mask_list中的某个标记,使用mask_name决定,用于表示当前启用的mask,进一步表示启用的register

方法:

  • add_register (data) 向register_assignment中添加一个项,添加在数组尾部
  • add_mask (data) 添加或更新mask_list
  • delete_mask (data) 从mask_list删除一个mask,使用mask_name

GCP 规定系统必须有 32 个分费率电量寄存器,其中 16 个必须是 4 种电能类型 (A+:正向有功电能(Active positive),A-:反向有功电能(Active negative),R+:正向无功电能(Reactive positive),R-:反向无功电能(Reactive negative)) 的 4 个时段费率(如尖、峰、平、谷四个时段) 的电量寄存器,这样就是 4x4=16。其余 16 个可以由厂家根据需求自定义特殊的费率,比如尖峰平谷 4 个段不够,再增加一个 更低谷 时间段。

必须有 10 个总电量寄存器,比如正向有功的 4 个费率合并后的总电量寄存器。另外还有总电压,总电流等。

必须有 20 个最大需量寄存器,比如需要保存 4 种类电能类型(A+A-R+R-)各 5 个时段(尖、峰、平、谷、自定义)的最大需量

必须有 4 个当前需量寄存器,仅需保存 A+A-R+R- 这 4 个

s4.3.6 Profile generic (class_id = 7, version = 1)

允许存储、排序和访问称为捕获对象的数据组或数据系列。捕获对象是几个COSEM对象的几个适当属性或几个属性的几个元素的组合。捕获对象定期或不定期收集

曲线包含捕获对象,可通过值的范围或输入范围检索范围内所有记录

捕获对象列表定义了要保存在buffer中的值,列表是静态的,保证每个记录都拥有相同的长度和结构

修改捕获列表必须清空buffer中所有记录,buffer被其他profile使用也必须清空buffer。以保证它们的缓冲区条目的同质性

记录可以按某个字段进行排序,如时间,或是按先进后出的栈的方式排序。例,按照Demand register中的last_average_value值来从小到大排序获得最大需量register

s曲线数据大小限制参数

  • 记录数entries_in_use
  • 最大保留条数。当记录数满时,新捕获数据会覆盖最不重要的一条数据,重要度根据排序方式获得,如根据时间排序,最不重要的数据就是时间最早的数据
  • 缓冲区物理限制

s选择性访问

  • 按照值的范围:

    值可以是时间,或是某个捕获对象的值,仅允许简单类型。

  • 按照排序后记录存储的顺序范围:

    如从第一条记录(重要性最高)到第三条

    如从某个值最大的记录到第三大的记录,需要重新临时排序

s属性

  • buffer 包含记录序列,每个记录包含若干捕获对象
  • capture_objects 捕获对象列表,数组形式
  • capture_period 自动捕获周期,以秒为单位,大于1表示达到周期捕获,等于0表示不自动捕获,需要手动触发
  • sort_method 排序方式,默认为先进先出排序。如果profile已经排序,插入新的记录时,将记录插入适当位置,移动该位置之后所有记录,最不重要记录可能在buffer满后丢失。如果新记录的重要度最低且buffer已满,则该记录不插入
  • sort_object 排序依据(对象),此属性指定排序所基于的寄存器或时钟
  • entries_in_use 当前记录总数
  • profile_entries 记录上限

s方法

  • reset (data) 清空buffer,entries_in_use清零,其他配置不变
  • capture (data) 手动触发捕获,读取每个捕获对象的生成记录插入buffer,同样不会改变捕获对象列表

s修改捕获对象列表后行为

调用使用了该捕获对象列表的profile的reset操作,需要清空buffer

s限制

定义捕获对象列表时,避免相互或循环引用。(实现时可以静态检查出来)

s4.3.7 Utility tables (class_id = 26, version = 0)

允许封装 ANSI C12.19:2012 table 数据

ANSI C12.19 是一个标准,它定义了用于电表和其他设备的数据传输的表格(tables)格式。这些表格格式允许电力公司和其他机构标准化设备之间的数据交换。ANSI C12.19 主要用于智能电表(smart meters)和先进的计量基础设施(Advanced Metering Infrastructure,AMI)系统中。

其实和 COSEM 非常像,不过它是根据表格来表示和传递数据。所以该类的功能就是提供两种数据格式标准之间的转换。

表格 0(Table 0):制造商信息表

字段名称数据类型长度(字节)描述
Manufacturer IDString4制造商标识符
Model NumberString8型号编号
Firmware VersionString4固件版本

表格 1(Table 1):配置表

字段名称数据类型长度(字节)描述
Meter IDString8电表标识符
Installation DateDate4安装日期
Meter TypeString2电表类型

表格 2(Table 2):电能数据表

字段名称数据类型长度(字节)描述
Reading DateDate4读取日期
Energy ConsumedFloat4消耗电能(kWh)
Peak DemandFloat4最大需量(kW)

s4.3.8 Register table (class_id = 61, version = 0)

同构条目、多个对象的相同属性进行分组,这些对象都是相同IC的实例,并且在它们的logical_name (OBIS代码)中,值组A到DF中的值是相同的。

用处就是不需要定义一大堆的相似的 Register 对象。不过本类仅用于保存这些值,访问这些值依然是通过具体对象的 logical_name,一般不会直接读取本类对象。

属性:

  • logical_name 当逻辑名为A.B.C.D.255.F时,只能捕获一个属性,如value(见table_cell_definition,此时其中的logical_name就和本值相同)。当逻辑名为A.B.98.10.X.255时,可以捕获有关对象的不同属性
  • table_cell_values 保存捕获属性的值(可选CHOICE种类就是register对象的value属性的类型,因为保存的是多个对象,所以是一个数组),可压缩

    压缩条件:

    如果捕获的属性是attribute_0(index 0,表示捕获所有属性),如果它们的值是相同的(例如scaler_unit),则这些冗余值可以被“null-data”替换,后续可以无损恢复。

  • table_cell_definition
    • class_id定义捕获属性的对象的公共Class_id;
    • logical_name包含对象的通用逻辑名,E = 255(通配符);
    • group_E_values包含单元标识符列表,类型为unsigned,在DLMS UA 1000-1 Ed 15 Part 1:2021的相应表中定义;
    • attribute_index是指向对象内属性的指针。Attribute_index 0表示所有公共属性。(按照本类中的 logical_name 的描述,当格式为 A.B.C.D.255.F ,强制仅能捕获一个属性,也就是说此时不能为 0)

    特殊情况:当本类的 logical_name 格式为 A.B.C.D.255.F 时,本属性的值会被强制:

    • class_id 必须为 1 “Data”, 3 “Register” or 4 “Extended register”
    • logical_name 必须和本类的 logical_name 相同
    • attribute_index 必须为 2(仅捕获 value 属性)
  • scaler_unit 量纲,当“Register”或“Extended Register”对象的“value”属性被捕获时,scaler_unit应为所有对象的公共属性。如果是其他属性或是其他IC,则该属性无用且禁止访问

方法:

  • reset (data) 清空table_cell_values
  • capture (data) 捕获,将原IC对象中的值拷贝到table_cell_values中,如果table_cell_definition中的attribute_index为0,则捕获所有属性

table_cell_definition被写入时的动作:

自动调用reset方法清空原数据,如果需要捕获的属性的占用空间过大,table_cell_definition的写入会被拒绝

s4.3.9 Status mapping (class_id = 63, version = 0)

该IC允许将状态字(status_word)中的位映射到引用表中的

  • status_word 状态字,n*8比特,最大65536比特
  • mapping_table 包含status_word到引用表中位置的映射。
    • ref_table_id 表示引用表的id
    • ref_table_mapping(choice:long-unsigned或long-unsigned数组):该值对应引用表(reference table,见 6.2.46, 6.2.49, 6.2.50, 6.2.55 and 6.3.7)中的一条记录,该记录对应status_word中的第一位,该记录的下一条记录对应status_word中的第二位,直到status_word的最后一位

      • 如果该值选择long-unsigned,则表示对于引用表的引用起始索引(index)

        假设status_word为10000001,ref_table_mapping的long-unsigned值为3,对于引用表的第3条记录

        status_word位值引用表索引
        13
        04
        05
        110
      • 如果该值选择array:array中的每个值都是引用表的一个索引(index),对应引用表中的一条记录,如array第一个值为8,表示引用表的第9条记录对应status中的第1位。

s4.3.10 Compact data (class_id: 62, version = 1)

紧凑数据

Compact data IC 的实例允许捕获由capture_objects属性确定的COSEM对象属性值。捕获可以发生在:

  • 在外部触发器上(显式捕捉);
  • 在读取compact_buffer属性时(隐式捕获)。

由capture_method属性确定

值保存在compact_buffer attribute中,以octet-string形式

这组数据类型由template_id属性标识。捕获的每个属性的数据类型由template_description属性保存。

客户端可以用未压缩的形式重新构造数据(解压),即包括COSEM属性描述符、数据类型和使用capture_objects、template_id和template_description属性的数据值。

属性:

  • compact_buffer 捕获的属性的值,octet-string形式,当类型为octet-string, bit-string, visible-string, utf8-string or array时,长度也包含在内。(不同于profile,这个类中的compact_buffer就是个octet-string,不是array,也就是只有一条)
  • capture_objects 指定分配给“Compact data”对象实例的COSEM对象属性列表,两种选择性访问方式:
    • 相对选择性访问:相对当前的日期或当前的记录返回记录,由data_index元素控制
    • 绝对选择性访问:根据明确的时间范围或记录范围返回记录,由restriction_element控制,列(columns)是由data_index的MS byte(Most Significant byte,意为最高有效字节)的低半字节(右边4位)决定的

    • data_index:是一个指针,它选择具有复杂数据类型(结构或数组)的属性的一个或几个特定元素:
      • 如果属性的数据类型是简单类型,则该值无意义
      • 如果属性的数据类型是结构体或数组(非profile generic对象的buffer),则该值指向该结构体或数组中的一个或多个特定元素
      • 如果属性的数据类型是profile generic对象的buffer,该值包含相对选择性访问的参数,如当前日期或记录
      data-index:MS-ByteMS-ByteLS-Byte
       Upper nibbleLower nibble 
      例子:0000000000000000
      • 0x0000: 标识整个属性;
      • 0x0001到0x0FFF: 标识复杂属性中的一个元素。复杂属性中的第一个元素由data_index 1(0x0001)标识;
      • 0x1000到0xFFFF: 对保存Profile generic对象的buffer的数组进行相对选择性访问。数据索引选择最近(最近)时间段内的条目,或最近(最近)条目内的条目,以及数组中的列。
        • 参考Table 9 – Encoding of selective access parameters with data_index。例,0x830C,MS-Byte中的高4位为0x8,表示包括当前小时在内的最后一个完整小时数,低4位为0x3,表示前3列,LS-Byte为0x0C,表示12小时,综上,该值表示选择最后12个小时内的前3列数据
    • restriction_element:当属性的数据类型是profile generic对象时,该值用于表示绝对选择性访问的参数,时间范围,记录序号范围,
      • 此时的data_index条件:
        • MS Byte高4位为0(为1的话表示相对选择性访问)
        • MS Byte低4位为0x0到0xF
        • Lower byte为0
      • restriction_type表示选择性访问的方式
      • restriction_value表示选择性访问范围
  • template_id 包含模板的标识符。它应唯一标识“Compact data”IC的实例和 template_description。
  • template_description 每个被捕获的属性的数据类型,由服务端自动生成,是一个类似于 AXDR 编码后的 OCTET-STRING,根据capture_objects,包含以下内容:
    • 第一个字节是0x02结构体tag
    • 后面是数量,变长,和capture_objects数量相同
    • 后面是每个属性的数据类型,与capture_objects一一对应:
      • 对于具有简单数据类型的属性,该值一个字节,包含类型tag,如bit-string[4](不含长度,长度在 compact_buffer 中(本类的设计思路就是把变化的数据放在 compact_buffer 中,如长度、value;不变的数据,如类型等,放在 template_description 作为共享的常量))
      • 对于array[1],该值为0x01,后面是元素的类型(数组内所有元素都相同,所以就一个)。数组长度也是放在 compact_buffer 中
      • 对于structure[2],该值为0x02,后面是元素数目,后面是每个元素的类型
  • capture_method 定义compact_buffer更新的方式:
    • 0:在调用Capture (data)方法时捕获。这可能发生在远程或本地(显式捕获)
    • 1:读取compact_buffer属性时捕获(隐式捕获)

方法:

  • reset(data) 仅清空compact_buffer
  • capture(data) 将捕获对象的值填充至compact_buffer中,不会触发捕获对象内的任何其他操作,如capture()或reset()

对capture_objects的任何修改,必须重置compact_buffer以及自动更新template_description

s4.3.11 Measurement data monitoring objects (class_id = 66, version = 0) (新增)

本类中提到的触发(trigger)就是指调用本类的 trigger(data) 方法

用于采样数据,使用环形缓冲分别保存触发前的几次采样结果和触发后的几次采样结果,本类型的参数包含采样周期和采样保留条数。

  • waveform_data 保存的采样数据,使用 compact-array,数组元素类型为简单类型(只能采样简单类型)。一旦对象实例化,类型便确定,无法改变。保存了触发前和触发后的数据,所以总条数为这两者之和(属性7+属性8, number_of_samples_before_trigger+number_of_samples_after_trigger)。
  • trigger_time 调用触发方法的时间,单位为微秒。通过该属性就能区分保存在 waveform_data 内的数据哪些属于触发前,哪些属于触发后。
  • trigger_source 触发源和原因,触发源分为本地 script 和远程调用。仅为本地 script 时才需要触发原因。
  • status 提供有关波形测量状态的信息。它可指示以下情况:波形阵列中数据缺失、测量错误、测量进行中。
  • sampling_rate 采样频率(建议出厂就配置,之后不再修改)。值为一个周期内的采样次数。TODO:周期是什么
  • number_of_samples_before_trigger 触发前的采样数据的保留条数
  • number_of_samples_after_trigger 触发后的采样数据的保留条数
  • scaler_uint 量纲

方法:

  • reset(data) 终止采样过程
  • trigger(data) 将调用该方法的时间点前和后的对应条数的采样数据保存到 waveform_data 中,同时更新其他相关属性。为了保存调用该方法后一定条数的采样数据,该调用将会持续一定时间(方法应该是立即返回,执行会持续一段时间),直到达到所需的采样条数。当一个 trigger 在进行中时,本对象将会锁定(内部定时器),此时无法再次调用该方法。所以如果要强制开始新的采样,必须先调用 reset(data) 结束采样过程,再调用 trigger(data)

s4.4 用于访问控制和管理的接口类Interface classes for access control and management

按照 4.4.8.2 Push setup 所述,Push setup 对象和 Association 对象通过 client_sap 绑定,是否意味着 client_sap 是主键,一个逻辑设备中对于每个 client 只能同时存在一个 AA。

s4.4.3 Association SN (class_id = 12, version = 4)

COSEM logical devices能够在COSEM context中使用SN引用建立AAs,使用“Association SN”IC的实例建模AAs。一个COSEM logical devices可以对每个设备能够支持的AA拥有一个该IC的实例

属性:

  • object_list 对象列表,数组形式,包含base_name,class_id,version,logical_name,base_name定义见文章开头

    实际这里base_name和logical_name的含义重复了,不过base_name是是用来作为和access_rights_list关联的外键的

    TODO:logical_name和base_name重复了

  • access_rights_list 包含对属性和方法的权限,数组形式,和object_list间通过base_name管理,相当于外键,元素数量需要相同,元素顺序最好也相同。包含base_name,attribute_access(可选),method_access(可选)

    object_list支持以class_id,logical_name或base_name为条件选择性访问,access_rights_list支持以base_name为条件选择性访问

  • security_setup_reference 引用Security setup的logical_name,被引用的对象管理给定的”Association SN”对象实例的安全性
  • user_list 允许使用本对象管理的AA的用户列表
    • user_id表示user的id(AARQ中的calling-AE-invocation-id携带)
    • user_name是用户的名字

    如果数组为空,则任何用户都能使用AA;如果数组不为空,则仅有列表内用户可以建立AA,也就是AARQ中的calling-AE-invocation-id字段必须匹配列表中的user_id。

      array user_list_entry
      user_list_entry ::= structure
      {
          user_id:    unsigned,
          user_name   CHOICE {
                      visible-string  [10],
                      UTF-8-string    [12]
                      }
      }
    
  • current_user 当前用户,若user_list为空,该值的user_id和user_name都为0(空)

方法:

  • read_by_logicalname (data) 读取指定对象的属性值,对象由class_id和logical_name指定,attribute_index表示索引,0表示全部属性,1表示第一个属性。回复的数据由属性类型决定
  • change_secret (data) 修改LLS密码或HLS密钥(不包括认证),可能包含校验信息或本身被加密,HLS with GMAC认证的密钥由Security setup管理。
  • reply_to_HLS_authentication (data) 此方法的远程调用服务端对客户端质询(change) f(StoC) 的客户端secret 处理的结果传递回服务端,作为通过参数化访问调用的 Read.request 原语的数据服务参数

    服务端S客户端C
    StoC-> 
     <-f(StoC)加密处理后的结果

    参数:

    服务端对 f(StoC) 的处理结果

    返回值:

    如果认证被接受,则响应(Read.confirm 原语)包含 Result == OK 和服务器对客户端质询服务器的 secret 处理结果,在 Read 的数据服务参数中 f(CtoS) 响应服务。如果认证不被接受,则返回non-OK值,不再包含其他数据。

    G9.2.2.2 Identification and authentication

  • add_user (data) 向user_list添加一个用户
  • remove_user (data) 从user_list移除一个用户

s4.4.4 Association LN (class_id = 15, version = 3)

COSEM logical devices能够使用 LN 引用在 COSEM context中建立 AA,通过“Association LN”IC 的实例对 AA 建模。 一个 COSEM logical devices 对于其能够支持的每个 AA 都有一个该 IC 的实例。

属性:

  • object_list 同Association SN中object_list和access_rights_list的整合

    选择性访问支持null(所有),class_list,object_id_list,object_id(class_id+logical_name)

  • associated_partners_id 包含COSEM客户端和服务端(逻辑设备,物理设备包含若干个逻辑设备),属于由Association LN对象建模的AA。客户端范围为0x0-0x7F,服务端范围为0x0-0x3FFF
  • application_context_name 在COSEM环境中,希望预先存在一个application context,并在AA建立期间通过其名称引用它。此属性包含该AA的application context的名称。见Green Book 4.5.2 application context9.4.2.2.2 The COSEM application context。TODO:查看文档
  • xDLMS_context_info 包含关于给定AA的xDLMS context的所有必要信息
    • conformance element: 包含服务器支持的xDLMS一致性块,TODO:一致性块是什么 更新:见Gp322 Table 85,表示双方支持的功能列表,用于协商。位串的长度为24位;
    • max_receive_pdu_size:包含xDLMS APDU的最大长度,客户端可以发送的字节数在AA过程中协商,受xDLMS initiateResponse APDU的server-max-receive-pdu-size参数的限制;
    • max_send_pdu_size:在这个AA中服务器可以发送的xDLMS APDU的最大长度,以字节表示。它受到xDLMS initiateRequest APDU的client-max-receive-pdu-size参数的限制;
    • dlms_version_number:包含服务端支持的DLMS版本
    • quality_of_service:未使用
    • cyphering_info:在一个活动的AA中,包含xDLMS initiateRequest APDU的专用关键参数,见GREEN BOOK 9.5
  • authentication_mechanism_name AA认证机构名称
  • secret LLS或HLS密钥,同上SN
  • association_status AA当前状态
  • security_setup_reference 引用Security setup对象的logical name.该对象用于表示本对象的高级加密(HLS)参数
  • user_list 同上SN
  • current_user 同上SN

方法:

  • reply_to_HLS_authentication (data) 同上SN
  • change_HLS_secret (data) 同上SN
  • add_object (data) 同上SN
  • remove_object (data) 同上SN
  • add_user (data) 同上SN
  • remove_user (data) 同上SN

In ACESM GCP there exists one current AA object representing the information on the currently open AA: Current Association (class_id 15) logical_name: 0-0:40.0.0.255.

通过 COSEM 接口只能访问到当前本连接对应的 AA 信息,不能获取到其他 AA 信息。比如通过 hdlc 信道使用 client sap 0x01 访问 0x01 服务端,通过该 AA 访问 Current Association 对象,访问到的就是当前 AA 信息。

s4.4.5 SAP assignment (class_id = 17, version = 0)

该 IC 允许通过提供有关将逻辑设备分配给其 SAP 的信息来对物理设备的逻辑结构进行建模。 参见 DLMS UA 1000-2 Ed.11:2021,第 10 条。

一般在一个物理设备内,仅有 Management logical device 拥有该对象实例,见 4.1.8.5 Management logical device。

属性:

  • SAP_assignment_list 包含物理设备上所有逻辑设备(的名称)和他们的sap
    • 逻辑设备(的名称)
    • sap

方法:

  • connect_logical_device (data) 将逻辑设备连接到SAP。连接到SAP 0表示断开设备连接。一个SAP不能连接多个设备(SAP 0除外)。

    逻辑设备:物理设备中的抽象实体,表示用COSEM对象建模的功能子集

s4.4.6 Image transfer (class_id = 18, version = 0)

Image 传输 IC 模型的实例是将二进制文件(称为image)传输到COSEM服务器的过程。

  1. 步骤1:(可选)获取ImageBlockSize
  2. 步骤2:客户端启动image传输
  3. 步骤3:客户端传输imageBlocks
  4. 步骤4:客户端检查确认传输完成
  5. 步骤5:服务端校验image完整性(客户端发起或服务端自行完成)
  6. 步骤6:(可选)客户端检查要激活的image上的信息
  7. 步骤7:服务端激活image(客户端发起或服务端自行完成)

属性:

  • image_block_size 保存ImageBlockSize,一个 Image 被分为若干块,这里是每个块大小,用八位字节表示,不能超过协商的ServerMaxReceivePduSize
  • image_transferred_blocks_status 位图,提供关于每个ImageBlock的传输状态的信息。bit-string中的每一位提供了一个单独的ImageBlock的信息,0为未传输,1为已传输。
  • image_first_not_transferred_block_number 第一个未传输的块的编号,如果传输全部完成,该编号应该等于或大于image_block_size
  • image_transfer_enabled 控制是否启用 Image 传输过程,只有置为true才能执行image transfer相关方法,为false是禁用所有方法的执行,返回错误
  • image_transfer_status 传输状态,表示传输过程所在的阶段和该阶段的执行结果(如,校验阶段校验失败 Image verification failed)
  • image_to_activate_info 提供有关准备激活的映像的信息。这是一个数组,每个待激活的 Image 都有独立信息,它是作为 Image 验证过程的结果生成的。客户端可以在激活映像之前检查这些信息(从服务端的这个属性中读出来后检查)。包括大小、标识(identification)和签名

方法:

  • image_transfer_initiate (data) 初始化传输过程,参数包括identifier和ImageSize(不是image block size)。在此之后,将image_transfer_status(传输状态)属性置为1,image_first_not_transferred_block_number置为0,对于该方法的调用会重置整个传输流程
  • image_block_transfer (data) 传输一个块到服务端,包括块序号和块内容,之后将image_transferred_blocks_status对应位置1,image_first_not_transferred_block_number更新
  • image_verify (data) 在激活之前验证映像的完整性(触发服务端自校验)。

    调用这个方法的结果可能是success、temporary_failureother_reason。如果不成功,则可以通过检索image_transfer_status属性的值来找到验证的结果。

    如果成功,image_to_activate_info属性将保存要激活的 Image 的信息。

  • image_activate (data) 激活 Image

    如果传输的Image之前没有经过验证(没执行image_verify),那么这将作为Image_activate的一部分完成。 调用此方法的结果可能是success、temporary_failureother_reason。如果不是成功,那么可以通过检索image_transfer_status属性的值来了解激活的结果。

如果客户端不知道 Image 传输目标服务器可以处理的 Image 块的大小,那么在开始处理之前,客户端需要读取 Image 传输到的每个服务器的相关“image transfer”对象的image_block_size属性。客户端可以传输合适大小的ImageBlocks。

如果 Image 块通过广播发送给一组COSEM服务端, Image 块大小在组中的每个成员中应该是相同的。

校验临时失败不是真正失败,可能是校验还未完成,客户端可以通过获取image_transfer_status属性的值来检查Image验证的结果。

服务端内可以保存多个待激活的 Image

sImage transfer for M-Bus devices

TODO

s4.4.7 Security setup (class_id = 64, version = 1)

“Security setup”IC的实例包含有关当前正在使用的安全套件(security suite)的必要信息,以及在客户机和服务器之间适用的安全策略(security policy)(由它们各自的系统标题标识)。它们还提供了提高安全性级别和管理对称密钥非对称密钥对证书的方法

属性:

  • security_policy 安全策略,标识是否使用安全套件中可用的安全算法执行身份验证(authenticate)和/或加密(encrypt)和/或数字签名(digitally sign)。它独立地应用于请求和响应。
  • security_suite 安全套件,明确安全算法(认证、加密、数字签名、密钥协商、哈希、压缩、key wrap),参考NSA Suite B 和 CNSA

    • (0) AES-GCM-128 authenticated encryption and AES-128 key wrap
    • (1) AES-GCM-128 authenticated encryption, ECDSA P-256 digital signature, ECDH P-256 key agreement, SHA-256 hash, V.44 compression and AES-128 key wrap
    • (2) AES-GCM-256 authenticated encryption, ECDSA P-384 digital signature, ECDH P-384 key agreement, SHA-384 hash, V.44 compression and AES-256 key wrap
    • (3) … (15) reserved
  • client_system_title 携带(当前)客户端system title,在已确认或未确认的AA建立过程中,由AARQ APDU的calling-AP-title字段承载;
  • server_system_title 携带服务端的system_title,在确认AA建立时,由AARE APDU的response-AP-title字段进行
  • certificates 携带可用的X.509 v3证书信息,并存储在服务器中。服务端可以保存服务端证书、每个客户端的证书、CA证书。

方法:

  • security_activate (data) 激活和加强安全策略security_policy,新的值安全性必须高于或等于原值,也就是只能加强,不能减弱
  • key_transfer (data) 用于传输一个或多个密钥(EK,AK,BK,MK),包括密钥标识和封装后的密钥(key wrapped)。可以是数组,一次多个密钥。key wrap算法由加密套件指定
  • key_agreement (data) 用于使用安全套件指定的密钥协商算法对一个或多个对称密钥达成一致。在套件1和套件2的情况下,ECDH密钥协商算法与临时统一模型(Ephemeral Unified Model) C(2e, 0s, ECC CDH)方案一起使用。
  • generate_key_pair (data) 根据安全套件的要求生成非对称密钥对。data参数标识要生成的密钥对的用法:
    • digital signature key pair 数字签名
    • key agreement key pair 密钥协商
    • TLS key pair TLS通信

    以上每个用法的密钥对最多同时只能有一个,也就是最多有三个密钥对

  • generate_certificate_request (data) 当调用此方法时,服务器发送证书签名请求(CSR)数据,这是CA为服务器公钥生成证书所必需的。data参数为请求证书的密钥对类型

    响应为CSR数据,PKCS #10格式DER编码的octet-string

  • import_certificate (data) 导入X.509 V3格式证书,DER编码octet-string,无需指定类型,TODO:如何区分证书类型,自动识别?
  • export_certificate (data) 导出证书,根据类型或序列号
  • remove_certificate (data) 移除证书,参数同上导出证书

    TODO: 新版本蓝皮书写了服务端的证书只能更新,不能删除。意思是不是不能在没有调用过 generate_certificate_request 或 import_certificate 生成或导入新证书的情况下直接调用 remove_certificate?

s4.4.8 Push interface class

DLMS消息可以在未经明确请求的部分情况下“推送”到目的地,例如:

  • 计划的时间到达
  • 本地监控的值超过阈值;
  • 本地事件触发(如开机/关机,按下按钮,表盖打开)。

DLMS/COSEM推送机制遵循发布/订阅(publish/subscribe)模式。

在DLMS/COSEM中,发布是由“Association”对象的object_list属性建模的,该属性提供了给定AA中可访问的COSEM对象列表和它们的属性。订阅是通过编写“Push setup”对象的适当属性来建模的。使用xDLMS DataNotification服务(在指定的触发器上)发送所需的数据。

push

s4.4.8.2 Push setup (class_id = 40, version = 3)

“Push setup”IC包含要推送的COSEM对象属性引用列表。它还包含推送目的地方法,以及通信时间窗口重试处理

Push在push方法被调用时启动,由push: Single action schedule对象alarm: Register monitor对象专用的内部事件外部事件触发。push操作被触发后,根据给定的push setup对象中的设置执行。根据通信窗口的设置,push会在随机延迟后立即执行,或者在通信窗口激活后立即执行。如果push不成功,则会重试。重试可能在提示支持协议层失败或缺少确认时发生。

属性:

  • push_object_list 定义要推送的属性列表,在调用push (data)方法时,内容被发送到send_destination_and_method属性中定义的目标。
    • class_id 类
    • logical_name 对象
    • attribute_index 属性序号,0表示全部,如果attribute_index是0,则下面的data_index为0且无意义,其他值也为空或null
    • data_index 当属性是数组或结构体时(除profile generic),0表示所有元素,0x0001-0x0FFF表示元素序号,其他值为空或null
    • restriction,columns 当属性是profile generic对象的时,和data_index一起表示选择性访问参数

    携带推送数据的DataNotification APDU受到安全套件suit安全策略policy安全材料material的保护,这些安全配置包含在”Security setup”对象中,由AA应用上下文中的Association SN/Association LN对象的security_setup_reference属性引用,”Association”对象和本对象通过push_client_SAP属性相关联;以及push_protection_parameters属性也是如此。对于在该AA中没有被授予读取访问权的属性,或者由于任何其他原因不能被访问的属性,应该返回空数据(如果客户端没有读取权限,服务端当然也不会把数据推送给它)。

  • send_destination_and_method 包含目标地址传输服务(例如电话号码,电子邮件地址,IP地址),用于发送push_object_list指定的数据
    • transport_service 传输服务类型,如TCP,HDLC,Gateway等
    • destination 目的地址,取决于transport_service,比如CoAP协议的目的地址时一个CoAP URI,
    • message APDU编码类型
      • (0) A-XDR encoded xDLMS APDU
      • (1) XML encoded xDLMS APDU
      • (128…255) manufacturer specific

    一个Push setup对象仅支持一个transport_service和destination,如果同一个内容需要上报给多个目的地,则需要多个不同对象

  • communication_window 通信窗口,包含开始时间和结束时间的区间,是个数组,每个元素为一个区间。如果没有元素,则不限制窗口,随时可以推送
  • randomisation_start_interval 发送第一包前的随机等待时间的最大值,为了防止大量位于同一个网络下的设备同时推送产生碰撞。
    • 随机等待时间从0到最大值随机
    • 仅在活动窗口内调用push生效,不在重试时生效(push失败后等待固定延迟时间重试,不应用随机等待时间)
    • 在活动窗口外时push,到达窗口开始时间时计算随机值
    • 随机延迟超出窗口结束时间,那要到下一个窗口才能push,见上一节的图片
    • 未定义窗口时,所有push和重试都会应用随机等待
  • number_of_retries 最大重试次数
  • repetition_delay 重发延迟
    • 最小时间
    • 指数,用于计算下次延迟
    • 最大时间

    𝑟𝑒𝑝𝑒𝑡𝑖𝑡𝑖𝑜𝑛_𝑑𝑒𝑙𝑎𝑦 = 𝑟𝑒𝑝𝑒𝑡𝑖𝑡𝑖𝑜𝑛_𝑑𝑒𝑙𝑎𝑦_𝑚𝑖𝑛 × (𝑟𝑒𝑝𝑒𝑡𝑖𝑡𝑖𝑜𝑛_𝑑𝑒𝑙𝑎𝑦_𝑒𝑥𝑝𝑜𝑛𝑒𝑛𝑡 × 0.01)^(𝑛−1)

    n表示第几次,n=1表示第一次重试

    push内容没有缓存,每次push重试,内容应该要重新组装,就可能和上次的不同

  • port_reference 通信端口引用,引用”communication port setup”对象,TODO:查看对应章节
  • push_client_SAP 客户端SAP,推送目标,绑定对应的AA。和 “Association”对象内的 client SAP 相关联。因为上报时不知道当前通信的 AA,所以必须通过这种方式绑定。
  • push_protection_parameters 数据保护参数,见Data Protection IC
  • push_operation_method 定义是否使用 Service_Class == UnconfirmedConfirmed 调用 DataNotification.request 服务原语以及推送重试的操作方式

    • (0) unconfirmed, retry on supporting protocol layer failure。AL层无需确认(发送结果不用给AL层),也不会超时重发,只在支持层回失败时重发,条件最宽松
    • (1) unconfirmed, retry on missing supporting protocol layer confirmation。AL层无需确认(发送结果不用给AL层),但会在支持层超时未回confirm原语时重发,包含0的情况,失败也重发
    • (2) confirmed, retry on missing confirmation。必须由AL层确认,否则都会超时重发(即使支持层回了成功也一样),包含0和1的情况
  • confirmation_parameters 当上报对象是一个数组时,本参数用于选择其中部分已经被上报并确认的条目,避免这些条目也被上报。相对选择性访问时(见本节push_object_list中的data_index和restriction),该值定义选择的条件(即已经被确认的条目,已经被确认的不再推送)。如果没有条目被本属性表示的范围包含则所有条目都会被选择,全部推送:
    • 开始时间:范围的起点
    • 偏移时间(秒)。TODO:按我理解这里的 “current date” 应该是指相较于开始时间的向后偏移(而不是当前时间的意思),这样才能表示一个范围。
  • last_confirmation_date_time 保存 AL 最近调用 DataNotification.confirm 服务原语并收到 Result == CONFIRMED 的日期和时间。当AL收到支持层发来的确认时,会将根据Service_Class以及本地还是远程确认来调用 DataNotification.confirm 通知 AP,Result == CONFIRMED 的情况为 (Service_Class == Unconfirmed 且本地确认) 以及 (Service_Class == Confirmed 且远程确认) 。见 Green Book 9.4.6.7 Protocol of the DataNotification service

方法:

  • push (data) 激活一次推送,发送携带推送数据的DataNotification APDU
  • reset (data) 重置为初始状态

s4.4.9 COSEM data protection (class_id = 30, version = 0)

该 IC 的实例允许对COSEM 数据,即属性值方法调用和返回参数应用加密保护。这是通过本接口类的实例间接访问(访问可以指读/写/捕获/推送以及对 method 的调用等)其他 COSEM 对象的属性和/或方法来实现的,本接口类提供必要的机制和参数来应用/验证/移除对COSEM数据的保护。

保护可包括认证、加密和数字签名的任何组合,并可以分层方式应用。应用和移除保护的双方是 DLMS 服务器和另一方(可以是 DLMS 客户端或第三方)。在 DLMS 服务器和第三方之间应用数据保护,可以对用于中继的客户端(第三方->客户端->服务器)保持关键/敏感数据的机密性。由第三方签名的 COSEM 数据可支持不可抵赖性(non-repudiation,该消息由私钥持有者签名,其不可否认,同时也保证未被其他人篡改)。

保护参数总是由客户端控制,一些元素由服务器适当地填充。安全套件由“Security setup”对象决定,该对象来自当前的“Association SN”/“Association LN”对象。

dataprotection

可能的使用场景:

  • 当 protection_buffer 属性被读取/捕获(Profile对象)/推送时:
    1. protection_object_list 内定义的内容被捕获(暂存在内存中)
    2. 根据 protection_parameters_get 属性描述的保护方式对上一步的内容进行保护,然后写入 protection_buffer 内。
    3. 将 protection_buffer 内的内容返回给需要的源(get调用者/profile对象/push setup对象) dataprotection2 图中应用了两层保护,加密和数字签名。
  • 当 protection_buffer 被写入时:
    1. 此时 protection_buffer 内的数据应该是被保护后的数据
    2. 根据 protection_parameters_set 属性描述的保护方式解除保护,然后将结果(结果应该在内存里)写入 protection_object_list 描述的位置。
  • 当 get_protected_attributes 方法被调用时:
    1. 参数 get_protected_attributes_request 内的 object_list 内描述的属性被捕获
    2. 参数 get_protected_attributes_request 内的 protection_parameters 描述的保护方式被应用到上一步捕获到的内容中(TODO: 原文写的是 response 的 protection_parameters,应该是错误的)。注意如果 protection_parameters 和本对象的 required_protection 属性描述不一致,本方法将调用失败。
    3. 返回被保护后的内容(注意整个过程都没有用到 protection_buffer)
  • 当 set_protected_attributes 方法被调用时:
    1. 参数 set_protected_attributes_request 中的 protected_attributes 所添加的保护将通过使用 protection_parameters 被验证并移除。注意也必须和本对象的 required_protection 属性描述一致,否则调用将失败。
    2. 将上一步内容写入 object_list 描述的对象中。
  • 当 invoke_protected_method 被调用时:
    1. 根据该方法的请求参数中的 protection_parameters 验证并移除要调用的方法的被保护的参数。注意也必须和本对象的 required_protection 属性描述一致,否则调用将失败。
    2. 请求参数中的 object_method 对应的方法将被调用,参数为上一步中解除保护后的参数。
    3. 根据 response protection parameters 保护返回值。注意也必须和本对象的 required_protection 属性描述一致,否则调用将失败。
    4. 将保护后的返回值返回。

属性:

  • protection_buffer 包含受保护的数据。读取时,捕获由protection_object_list指定的属性,然后根据protection_parameters_get应用保护。写入时,受保护的数据被放入protection_buffer中,然后根据protection_parameters_set验证/删除保护,并设置由protection_object_list指定的属性。
  • protection_object_list 定义在读取protection_buffer时要捕获的属性列表,或者在写入protection_buffer时要设置的属性列表。

    关于选择性访问的描述见Compact data

  • protection_parameters_get 包含所有必要的参数,用于指定读取protection_buffer时应用的保护。这个属性首先由客户端写入。服务器可能需要填写一些额外的元素,在这种情况下,客户端必须读回这个属性——如果需要的话,转发给第三方——以便他们可以使用这些参数来验证/删除保护。protection_parameters_get 属性是个 array,每个成员都是一层保护,比如加密后数字签名,array 里就会有两个成员
  • protection_parameters_set 包含所有必要的参数,用于在写入protection_buffer时验证/删除应用的保护。参数与get相同。此属性由客户端编写,并由服务器使用它来验证和删除保护。
  • required_protection 规定了通过“Data protection”对象访问的属性值/调用方法的返回参数所需的保护。

    对于request和response的保护方式

方法:

  • get_protected_attributes (data) 获取 protection_object_list 元素指定的属性的值,并应用get_protected_attributes_response中根据protection_parameters设置的保护

    get_protected_attributes_response中的protection_parameters值是根据请求参数get_protected_attributes_request中的同名元素得到的,服务端可能会有修改,所以不只是拷贝,可能会有不同

  • set_protected_attributes (data) 根据protection_parameters元素,在验证并移除protected_attributes元素上的保护之后,设置 protection_object_list 元素指定的属性值。
  • invoke_protected_method (data) 以保护方式执行特定方法,方法的参数和返回值被保护。在根据invoke_protected_method_request中的protection_parameters验证并移除protected_method_invocation_parameters上的保护后调用object_method元素指定的方法

    在调用由 object_method 元素指定的方法后,根据 invoke_protected_method_response 中的 protection_parameters 的保护(必须满足 required_protection)应用于返回参数,并且由 protection_parameters 和 protected_method_return_parameters 组成的 invoke_protected_method_response 返回。

    invoke_protected_method_request ::= structure {
        object_method: 要执行的方法
        protection_parameters: 保护参数
        object_method_definition: 被保护的参数
      }
    
    invoke_protected_method_response ::= structure {
        protection_parameters: 保护参数
        protected_method_return_parameters: 被保护的返回值(参数)
      }
    

注意:上面三个方法中的 protection_parameters 都必须满足 required_protection,否则视为调用失败。

s4.4.10 Function control (class_id = 122, version: 0)

IC“Function control”的实例允许启用和禁用服务端中的功能(Function)。每个可以启用/禁用的功能都由一个名称标识,并由引用的一组特定对象标识符定义。

可以借助“Single action schedule”和“Script table”对象来实现按时间控制功能的禁用和启用

属性:

  • activation_status 显示function_list属性中定义的每个功能块的当前状态(启用或禁用)
  • function_list 定义一个功能列表,可以通过调用set_function_status方法启用或禁用这些功能。通过class_id和logical_name指定,当功能不能对应特定的COSEM对象时,class_id为0,logical_name为特定描述文本。

    这里的功能包含了若干个具体的关联对象,也就是是个抽象的概念,由不同的对象的合作实现的一个功能

方法:

  • set_function_status (data) 启用或禁用一个或多个功能
  • add_function (data) 添加一个新功能,必须是服务端支持的
  • remove_function (data) 移除一个新功能

s4.4.11 Array manager (class_id = 123, version = 0)

“Array manager”IC的实例允许管理其他接口对象的具有数组类型属性

  • 检索条目的数量;
  • 选择性地读取一定范围内的条目;
  • 插入新条目或更新现有条目;
  • 删除一个范围的条目

每个实例允许管理分配给它的数组类型的几个属性

TODO:该对象有权限访问修改其他对象的属性?

属性:

  • array_object_list 定义可由该IC的实例管理的数组类型的属性列表

方法:

  • retrieve_number_of_entries(data) 返回一个数组中已标识的条目总数

  • retrieve_entries (data) 检索array_object_list数组中的一个数组项的范围数据。

    m表示记录总数,from_entry和to_entry表示数组序号,序号为1到m

    • from_entry < to_entry < m,返回from_entry 到 to_entry记录
    • from_entry < to_entry,to_entry > m,返回from_entry到m的记录
    • from_entry < to_entry,from_entry>m,返回元素个数为0的空数组
    • from_entry > to_entry,返回错误
  • insert_entry (data) 向一个数组插入一条新记录,插入到参数id标识的序号之后,之后所有记录顺位后延,如果已满则插入失败。其中:
    • id为0表示插入后变为第一个,其他所有记录顺位后延
    • id大于m表示在末尾追加
  • update_entry (data) 更新一个数组中的一条记录
  • remove_entries (data) 按范围删除数组,同retrieve_entries

当已存在的记录的顺位变化时,比如 insert 和 remove 都会可能导致部分条目的序号的变化,所有按序号对它们的引用都必须更新(比如有些对象属性通过 data_index 引用了某条记录)。

s4.4.12 Communication port protection (class_id = 124, version = 0)

保护通信端口,防止恶意通信,如暴力破解

属性:

  • protection_mode 保护模式

    • 锁定
    • 失败尝试后锁定
    • 无锁定
  • allowed_failed_attempts 触发锁定机制之前允许的失败通信尝试次数
  • initial_lockout_time 第一次触发锁定的锁定时间
  • steepness_factor 锁定时间递增步长

    NCA=failed_attempts-allowed_failed_attempts

    CLT=initial_lockout_time x (steepness_factor^(NCA-1))

  • max_lockout_time 最大锁定时间,避免拒绝服务攻击(DDoS)
  • port_reference 被保护端口对象的逻辑名
  • protection_status 当前保护状态,未锁定、临时锁定、已锁定
  • failed_attempts 失败总数,与保护机制触发无关,会被reset重置
  • cumulative_failed_attempts 失败总数,与保护机制触发无关,不会被重置

方法:

  • reset (data) 重置failed_attempts、current lockout time、protection_status

s4.5 时间和事件绑定控件的接口类Interface classes for time- and event bound control

s4.5.1 Clock (class_id = 8, version = 0)

该IC为设备时钟建模,管理所有与日期和时间相关的信息,包括由于时区和夏令时方案而导致的本地时间与通用时间参考(UTC)的偏差。IC还提供了各种调整时钟的方法

日期信息包括“年”、“月”、“日”、“周”。时间信息包括小时、分钟、秒、百分之一秒以及本地时间与UTC的偏差。夏令时功能根据属性修改本地时间与UTC的偏差;参见图20所示。该函数的起始点和结束点通常设置一次。内部算法根据这些设置计算出真正的开关点

属性:

  • time 包含仪表的本地日期和时间、与UTC的偏差(时区?)、状态。格式为date-time。可只修改部分字段,如只修改date相关字节。 如果只修改date,此时参数中保存time的字节需标记为”not specified”。比如 0x07DE081302FFFFFFFF 中表示 time 的后四个字节为 0xFF(not specified),这段数据写入本属性时就不会修改原来的 time 部分。
  • time_zone 时区
  • status 状态
  • daylight_savings_begin 夏令时开始日期时间
  • daylight_savings_end 夏令时结束日期时间
  • daylight_savings_deviation 夏令时偏移(分钟)
  • daylight_savings_enabled 夏令时功能是否启用(注意是该功能是否启用,不是表示是否处于夏令时)
  • clock_base 时钟信息依据
    • 内部晶振
    • 市电频率50Hz
    • 市电频率60Hz
    • GPS
    • 无线电控制

方法:

  • adjust_to_quarter (data) 将时间调整为最近(+/-)的整刻钟(*:00,*:15,*:30,*:45)
  • adjust_to_measuring_period (data) 将时间调整为最近(+/-)测量周期的起点(需量的测量周期?)
  • adjust_to_minute (data) 将时间调整为最近(+/-)整分钟
  • adjust_to_preset_time (data) 和preset_adjusting_time配合,激活preset_time,执行时的时间必须是时间范围内的
  • preset_adjusting_time (data) 定义一个预设时间preset_time和一个允许执行生效的时间范围
  • shift_time (data) 将时间移动 n (-900 <= n <= 900) 秒。n为long类型

s4.5.2 Script table (class_id = 9, version = 0)

通过脚本执行一系列动作

脚本可由同一个逻辑设备内其他COSEM对象或从外部激活

同时执行时索引小的优先执行

属性:

  • scripts 脚本,操作列表,是一个数组
    • action_specification指向引用对象的动作(限制为不产生响应的动作)
      • service_id,表示执行的动作的类型,目前有两种:
        • 写属性
        • 执行方法(仅限无需响应的方法,也就是服务端方法,这类方法都是被客户端调用,而不是主动发起(COSEM 中有些方法是需要返回值的,比如一些 get 方法 get_nbof_mc_IP_addresses))

方法:

  • execute (data) 执行对应的脚本,参数为 script_identifier

s4.5.3 Schedule (class_id = 10, version = 0)

该类设计非常不合理,且没有找到实际应用范例,实际使用中更多会使用 22 类 single action schedule

计划时间表,可以配合 Special days 和 Script table 对象,实现日期驱动的定时任务执行,类似于 Linux 中的 crontab

属性:

  • entries 给定时间执行的脚本
    • schedule_table_entry
      • index:本条目的索引
      • enable:本条目是否启用
      • script_logical_name Script table对象的逻辑名
      • script_selector 选择Script table对象中的script_identifier,表示要执行的脚本
      • switch_time 执行时间,支持通配符,time格式,不含 date 信息
      • validity_window 有效窗口(执行宽容时间),一个以分钟为单位的时间段,用于执行时间在掉电期间无法执行时,允许的延后执行时间,如果在这个时间内上电,就依然允许执行。(触发时间switch_time到达后在这个时间范围内必须执行,如果未及时上电导致执行不了,则不执行)。0xFFFF:无限宽容时间,脚本无论被延后多长时间,都必须被处理;
      • exec_weekdays 定义每周中哪些天有效(比如仅定义周四有效,脚本就只能在周四执行)
      • exec_specdays 见节日表“Special days table”, day_id
      • begin_date和end_date 定义了条目有效的日期范围(允许通配符)。TODO:这里允许通配的意思应该是 begin 和 end 的通配规则是一样的,比如 begin 年通配,end 的年也要通配,表示每年的开始和结束日期。只有一个周表,没有日表,按照这个设计,想定个每月一号的任务也挺麻烦的

方法:

  • enable/disable (data) 参数有A和B两个范围,A范围内的条目禁用,B范围内的启用
  • insert (data) 插入一条新记录,已存在时覆盖
  • delete (data) 按索引范围删除记录

相同的脚本同时执行时,规则为仅执行其中一条。

系统时间调整处理:

  • Time setting forward:向后调整系统时间,调整至更晚的时间,此时操作和掉电相同,根据validity_window补执行
  • Time setting backward:向前调整系统时间,调整至更早时间,会出现重复执行的情况
  • Time synchronization:时间校准操作是对时间的一种自动微调(向前或向后调整一个很短的时间),它因保证所有应该执行一次的脚本都仅执行一次,不会出现遗漏或重复执行。和上面两种情况相比更加严格。
  • 夏令时向后调整时间则执行所有因此错过的脚本(无视 validity_window),向前则不执行重复的脚本

s4.5.4 Special days table (class_id = 11, version = 0)

定义特殊日期,特殊日期行为会覆盖通常的,与“Schedule” 或 “Activity calendar”(通常日历表) 同时执行

为给定日期指定特殊的日期标识符。日期可能具有重复特殊日子的通配符,如圣诞节(圣诞节每年都有,所以年份就是通配符)。

属性:

  • entries 数组,每个条目表示一个特殊日期,如圣诞节
    • spec_day_entry
      • index 条目序号
      • specialday_date 节日的日期
      • day_id 标识节日(比如有的节日每年的时间不同,又不能用通配符表示,就会出现多条spec_day_entry的day_id相同的情况,每年都有一条),用来和 Schedule 类的 exec_specdays 关联。TODO:实际上是不是还会和 Activity calendar 进行关联,因为 Activity calendar 并没有绑定 script table,需要与 Schedule 或 Activity calendar 这种可以绑定 script table 的类进行合作。

方法:

  • insert (data) 向entires插入一条记录,index 和 specialday_date 都是唯一键,任意一个重复都会覆盖
  • delete (data) 删除一条,用 index 索引

s4.5.5 Activity calendar (class_id = 20, version = 0)

按计划执行脚本,遵循日历时间表方式,(和费率相关?)TODO:和Schedule的区别

可与Schedule对象共存,重叠时Schedule对象优先执行。上电时,和 Schedule 操作不太一样,仅执行错过的最后一个动作(Schedule的话只要在窗口时间内全部都要恢复执行),同时本次执行时要和 Schedule 的执行序列配合(按期望触发时间排序)。

被Special days table覆盖

属性:

  • calendar_name_active 标识符,表示当前日历表方案的名称,_active 后缀表示当前启用的方案。
  • season_profile_active 季节方案,包含季节开始时间和对应的 week 方案(week_name 选择 week_profile_table 数组中的条目)
  • week_profile_table_active 周方案,包括一周中每天(星期一到星期七)的方案(day_id 选择 day_profile_table 数组中的条目)
  • day_profile_table_active 日方案,包含一天内所有脚本的执行时间、Script table 对象内脚本的引用
  • calendar_name_passive 备用方案,_passive 后缀表示备用的方案。
  • season_profile_passive 备用方案
  • week_profile_table_passive 备用方案
  • day_profile_table_passive 备用方案
  • activate_passive_calendar_time 调用activate_passive_calendar的时间

TODO:一个季节只能启用一个周表?是不是意味着一个季节内,每周的动作都是相同的。

方法:

  • activate_passive_calendar (data) 激活备用方案,将passive属性复制到active中

s4.5.6 Register monitor (class_id = 21, version = 0)

这个IC允许对 “Data” , “Register”, “Extended register” or “Demand register”对象的值进行建模监控

它允许指定阈值、被监测的值和一组脚本,当监测的值超过阈值时,这些脚本将被执行。

依赖于同一逻辑设备内的 Script table 对象

属性:

  • thresholds 提供将引用寄存器的属性与之比较的阈值
  • monitored_value 定义监视对象的哪个属性。只允许具有简单数据类型的值
  • actions 定义被引用对象的监视属性超过低于相应阈值时要执行的脚本。属性操作具有与 thresholds 属性完全相同元素数量。action_items的顺序与阈值的顺序对应

s4.5.7 Single action schedule (class_id = 22, version = 0)

执行周期性的单个定时任务。和 schedule 的区别是一个对象仅对应一个脚本。

  • executed_script Script table对象的引用
  • type execution_time 的类型。定义时间是否相同,是否允许通配符
  • execution_time 脚本执行日期和时间

s4.5.8 Disconnect control (class_id = 70, version = 1)

拉合闸控制,管理电表的内部或外部断开装置(例如继电器、燃气阀门),以便部分或全部地连接或断开用户的电源。

三种控制方式:

  1. 远程Remotely,通过通信端口
  2. 手动Manually,如按按钮
  3. 本地Locally,电表内部功能触发,如limiter对象

属性:

  • output_state 设备supply(供给开关)实际的物理连接状态:Connected 和 Disconnected
  • control_state 内部控制连接状态
    • (0) Disconnected
    • (1) Connected
    • (2) Ready_for_reconnection
  • control_mode 控制模式,每一条对应3种控制方式的控制权限

方法:

  • remote_disconnect (data) 远程断开连接,需要有权限
  • remote_reconnect (data) 远程恢复连接,需要有权限

s4.5.9 Limiter (class_id = 71, version = 0)

限制器,当“Data”, “Register”, “Extended Register”,“Demand Register”对象超过阈值一定时间时执行动作

TODO:和4.5.6 Register monitor的区别,应该是比后者更加详细,这个是超过一定时间加上更多种阈值。

阈值包括正常阈值紧急阈值紧急阈值通过emergency profile id, emergency activation time, and emergency duration定义的emergency_profile激活。emergency profile id元素与emergency profile group id匹配:这种机制只允许针对特定的emergency group激活紧急阈值。

  • monitored_value 定义要监控的对象的属性。只允许具有简单数据类型的属性。
  • threshold_active 当前使用的活动阈值(可能是正常阈值或紧急阈值)
  • threshold_normal 正常阈值,和被监控的属性的类型相同
  • threshold_emergency 紧急阈值
  • min_over_threshold_duration 超过阈值最小持续时间,秒
  • min_under_threshold_duration 低于阈值的最小持续时间
  • emergency_profile 紧急配置,用于紧急阈值激活,当emergency_profile_id和emergency_profile_group_id_list中的匹配,且当前时间在从emergency_activation_time开始emergency_duration范围内时激活
  • emergency_profile_group_id_list emergency_profile_id列表
  • emergency_profile_active emergency_profile激活状态
  • actions 超过或低于阈值超过最小持续时间时的动作(script)

s4.5.10 Parameter monitor (class_id = 65, version = 1)

本 IC 用于监控参数修改(某些COSEM对象的属性用于表示配置参数)

每个可以访问服务器的客户端都必须知道当前的参数设置,以便能够正确地与服务器交换数据。参数可以分组,每个组可以有一个名称。

尽管最初的参数可能是已知的,但在电表的生命周期内可能会发生变化,例如它可能被另一个客户端(如现场服务设备)改变。

当前的配置可能总是通过在交换开始时读取所有需要的配置参数来检索,这并不高效。也可以通过推送操作,但这也不是一个好的方式。

需要一个解决方案,允许客户验证服务器的配置是否符合预期,或检测是否发生了任何变化: 客户端配置服务器时,可以检索本类这些属性并与其他客户端共享。当客户端开始与服务器进行数据交换时,它可以读取 parameter_value_digest 属性,并将其与自己存储的值进行比较。如果两者匹配,则说明配置符合预期;如果不匹配,客户端可以读取 parameter_values 属性,以确定哪个属性发生了变化。这些属性(parameter_values)也可以捕获到 Profile generic 对象缓冲区属性中,以确保捕获数据的有效性。使用空数据编码可最大限度地减少由此产生的开销

属性:

  • changed_parameter 保存最近更新的参数及其值(一个属性和一个值)
  • capture_time 捕获时间,记录何时捕获
  • parameter_list 本对象管理的参数列表
  • parameter_list_name 参数列表名
  • hash_algorithm_id 摘要算法
  • parameter_value_digest 参数摘要(整个parameter_list内属性的值需要先转octet-string(如果不是octet-string),使用 Green Book Data conversion一节方法)。可能的方式:本hash通过parameter_values参数计算
  • parameter_values parameter_list内属性的值,一个结构体,包含A-XDR编码的每个属性值

方法:

  • add_parameter (data) 向parameter_list添加一个
  • delete_parameter (data) 从parameter_list删除一个

s4.5.11 Sensor manager (class_id = 67, version = 0)

传感器和测量值监控(除了电表之外的其他计量设备用得比较多)

  • 传感器装置的识别
  • 传感器的连接和密封状态
  • 传感器的配置
  • 监测传感器的运行情况
  • 对处理后的结果的监控

本 IC 的实例管理与传感器相关的复杂信息。它们还可以监控原始数据和处理后的值,这些值是根据特定应用的要求使用适当算法处理原始数据后得出的。该集成电路具有以下功能:

  • 传感器的铭牌数据(传感器上铭牌所列出的数据和信息。这些通常包括制造商、型号、序列号、工作范围、额定电压、电流等技术规格和识别信息)和现场信息(这是指传感器所在位置的相关信息。这可能包括地理位置、安装环境、使用条件、设备配置等。)(属性 2 至 6);
  • 对于原始值(直接采样值)的”Extened register”中的功能(属性 7 至 10);
  • 对于原始值(直接采样值)的”Register monitor”中的功能(属性 11 至 12);

    注 1 并非每个原始数据(如压力传感器的电压输出)都有自己的 OBIS 代码/对象。这就是在传感器管理器类中包含原始数据的原因。

  • 对于处理值(原始值处理后的值)的”Register monitor”中的功能(属性 13 至 15)

属性:

  • serial_number 序列号,标识传感器设备
  • metrological_identification 描述传感器的计量相关信息,如计量标识符、校准日期。
  • output_type 输出类型
  • adjustment_method 调整方法
  • sealing_method 密封(保护)方式
    • 物理方式(铅封、密封贴纸等)
    • 电气方式(电子检测装置,比如开盖检测用的按钮)
    • 软件方式(密码)
  • raw_value 原始记录值
  • scaler_unit 原始记录值的单位
  • status 状态(失败/启用/禁用)
  • capture_time raw_value捕获时间
  • raw_value_thresholds raw_value阈值
  • raw_value_actions 超过阈值执行的脚本,参考Register monitor类
  • processed_value raw_value处理后的值
  • processed_value_thresholds processed_value阈值
  • processed_value_actions 超过阈值执行的脚本(如告警位置位)

方法:

  • reset (data) 重置raw_value

s4.5.12 Arbitrator (class_id = 68, version = 0)

仲裁者,允许根据由权限权重组成的预先配置的规则,在多个参与者可能请求可能相互冲突的操作来控制同一资源时,执行特定操作

  • 配置可能被请求的、潜在冲突的动作;
  • 配置每个参与者请求可能操作的权限;
  • 为每个可能的请求配置每个参与者的权重

资源例子供应(supply)控制开关或仪表的气体阀门。可能的动作包括断开电源使能重新连接、重新连接电源、防止断开连接、防止重新连接。

每个需要处理竞争操作请求的资源都应该有一个 “Arbitrator” 对象实例。

TODO: actor到底是什么,是客户端吗?答:包括外部的客户端、内部的 schedule 等可以执行 script 对象的都算

属性:

  • actions 动作,是个数组,一个元素是对script table对象的某一个条的引用
  • permissions_table 每个参与者权限,数组每个元素对应每个用户的权限,用户的权限是个位串,其中的位串中每一位对应每个动作权限(与actions对应)
  • weightings_table 每个参与者权重,和permissions_table结构顺序一样,不过把位串换成了数组,元素是long-unsigned(最好使用2的幂作为权重值,而且要保证对于同一个action没有多个用户的权重是相同的,不然两个用户同时触发执行时就不知道该谁执行了(此时按规定大家都不执行))
  • most_recent_requests_table 记录每个用户的最近请求,与permissions_table结构相同,位串中已执行的置位,不一定只有一个(应该是一次request_action时同时触发两个以上动作)。位的清除在下一次的request_action发生
  • last_outcome 最近一次请求结果,标识actions中的元素的序号,只针对actions,不针对用户。这意味着一次 request_action 只能执行一个 action

方法:

  • request_action (data) 封装动作执行请求,request_actor表示请求用户(上述数组的序号,1表示第一个用户),request_action_list表示请求动作列表,一次可请求多个,但最终一次请求只能有一个 action(最高权重) 执行。

    TODO: 为什么可以一次请求多个操作

  • reset (data) 重置位(权限位,权重元素,最近执行位,最近请求结果)

    当权限位都是0时,request_action调用总是不会成功,因为都没权限

request_action方法被actor调用时,AP执行以下活动:

  1. 它检查给定actor的permissions_table属性条目,以确定请求的动作是否允许;
  2. 更新most_recent_requests_table属性,通过设置或清除该actor的每个动作的位串中被允许的(位设置);或者没有请求/不允许(位被清除);相当于request_action请求参数和permissions_table的交集,有请求且允许才置位
  3. 它为most_recent_requests_table应用weightings_table:对于most_recent_requests_table中设置的每个位,每个actor的相应权重被应用;
  4. 对于每个 action,各个用户的权重相加。
  5. 如果某个动作拥有一个唯一最高权重值,这个值会被写入last_outcome属性并执行相应的脚本。如果没有最高的唯一权重,那么什么也不会发生(最高权重不唯一,就全部不执行)。

s4.6.2 Account (class_id = 111, version = 0)

用于计费,每个Account可以关联数个“Credit”,“Charge” and the “Token gateway”对象

比如入口消耗电网的电用一个账户Account,家里有发电出口给电网是第二个账户Account,单独计费

Credit: 信用额度,比如一个对象用来做token额度,一个用于紧急额度

Charge费用统计,比如一个用于能源使用,一个用于固定收费(月费),一个用于安装费用。

统计方式:

  1. 基于能量消耗量和费率的
  2. 基于时间的,如月固定费用
  3. 手续费,每次充值时收取

属性:

  • account_mode_and_status 付费模式后付费credit和预付费prepayment)和账户状态(未激活、已激活、已关闭),只有账户状态为已激活时,关联的 credit 和 charge 对象才会运行。
  • current_credit_in_use 正在使用的 credit 对象的引用
  • current_credit_status 当前整体状态(所有额度的总体使用情况),是个 bitmap 每一位表示一类状态
    • Bit 0 = in_credit, set when the available_credit is above zero。总可用额度大于0。
    • Bit 1 = low_credit, set when the “Account” object’s available_credit level has passed below the “Account” object low_credit_threshold。总可用额度大于较低。

      NOTE 1 The low_credit_theshold attribute of the associated “Credit” object In use is echoed in that attribute.

    • Bit 2 = next_credit_enabled, set when the “Account” object credit_reference_list contains at least one other “Credit” object with non-zero priority, regardless of credit level。除了当前 credit 对象外还有其他 credit 对象(无论其是否耗尽、是否可用)。
    • Bit 3 = next_credit_selectable, set when the next item in the “Account” object credit_reference_list contains a lower priority “Credit” object with non-zero priority with a credit_configuration bit 1 (Requires confirmation) set such that it requires confirmation (for example “Emergency Credit” that is selectable but has not yet been selected)。除了当前 credit 对象外还有其他优先级更低且状态为 Requires confirmation 的 credit 对象。

      NOTE 2 The next “Credit” object becomes selectable when the immediately higher priority “Credit” object has reached the “Account” object’s next_credit_available_threshold.

    • Bit 4 = next_credit_selected, set when the ”Account” object credit_reference_list contains a “Credit” object of lower priority than the current “Credit” object In use, and that lower priority credit object is in the Selected/Invoked state,除了当前 credit 对象外还有其他优先级更低且状态为 Selected/Invoked 的 credit 对象。

      NOTE 3 This is, for example, an “Emergency Credit” which has been selected but is not yet In use.

    • Bit 5 = selectable_credit_in_use, set when the previously selected credit in the “Account” object credit_reference_list is now In use。当前正在使用的 credit 对象是之前被选中的。
    • Bit 6 = out_of_credit, set when the “Credit” object that was In use has been exhausted and no further credit is available without an action on the part of the consumer or other actor。当前 credit 对象已经耗尽,且没有其他 credit 对象可用,等待用户额外的操作。
    • Bit 7 = RESERVED
  • available_credit 总可用额度,本对象的 credit_reference_list 属性关联的且状态为可用的 Credit 对象(属性credit_status为Selected/Invoked(2)或In use(3))中属性current_credit_amount(可用额度)的总和(只计算正值
  • amount_to_clear 和available_credit类似,是负值的总和(表示需要补缴的 credit 总和)

    • 正常耗尽的 Credit 对象:所有current_credit_amount负值(credit_status = (4) Exhausted且credit_configuration bit 2(标志 credit 是否需要偿还)未置位)
    • 需要偿还的 Credit 对象(replayable credits):credit_configuration bit 2置位(credit 需要偿还),其额度的差值(current_credit_amount - preset_credit_amount)
    • 保留额度:clearance_threshold的负值(value * -1)
  • clearance_threshold 当额度耗尽后,仅当 available_credit 达到本属性时才能重新启用那些 replayable credits(credit_configuration bit 2置位)(TODO: 也许功能类似防抖)
  • aggregated_debt 合计欠款,Charge对象的total_amount_remaining的简单合计
  • credit_reference_list credit对象关联列表,优先级根据 credit 对象的 priority 属性从大到小排序,比如数组第一个元素对应优先级 1,后面是 4、6、11…
  • charge_reference_list charge对象关联列表
  • credit_charge_configuration 这个属性映射出哪些Charge从哪些Credits中收取。

    无条目表示无限制

    Credit必须搭配一个或多个Charge采集使用,否则不会被消耗

    包含credit和charge对象的引用

    collection_configuration 规定了特殊情况下的行为:

    • Bit 0 允许电源断开时采集
    • Bit 1 允许在负载限制期间采集
    • Bit 2 允许在友好信用期内采集
  • token_gateway_configuration 此属性用于配置如何分配来自“token_gateway”的新的充值token,以便将token数量的可配置百分比分配给每个“Credit”对象。
  • account_activation_time 调用activate_account的时间
  • account_closure_time 调用close_account的时间
  • currency 本对象的所有方法使用的单位,可以为货币单位、时间、计量单位等
  • low_credit_threshold 低额度阈值,映射当前 credit 的 warning_threshold 属性,可以用于低额度时告警。没有其他作用。
  • next_credit_available_threshold 映射下一个优先级credit 对象(credit_reference_list的下一个)的 credit_available_threshold 属性,当没有下一个 credit 对象时,默认为最大负数(永远不能切换)

    available_credit 仅统计 credit_reference_list 中状态为 Selected/Invoked(2) 或 In use(3) 的

    当 available_credit 小于本值时,说明可用的 credit 即将不足,此时期望能激活下一个 credit 进入 Selected/Invoked(2) 状态等待被使用(不是立即使用,依然优先消耗完当前的 credit),将下一个 credit 对象的 credit_status 置为

    • Selectable: 当 credit_configuration 的 bit 1 (Requires confirmation) 置位(该 bit 表示 credit 切换到 Selected/Invoked 状态前需要外部操作(按键、执行方法等),所以这里不能直接切到 Selected/Invoked。对于这类 credit_available_threshold 要配置的大点,留出充足余量以便用户操作)
    • Selected/Invoked: 当 credit_configuration 的 bit 1 (Requires confirmation) 未置位,且本值大于 0(说明当前的 credit 还没用完,无需切换,只要置为就绪状态就行)
    • In use: 当 credit_configuration 的 bit 1 (Requires confirmation) 未置位,且本值等于 0(本值为 0,还要求available_credit 小于本值,说明 available_credit 已经用完了,立刻切换到下一个 credit。此时就是无缝切换,当前耗尽,立刻切换到下一个 credit。)
  • max_provision 单位周期内最大收费数量,当Charge为(2) payment_event_based_collection时,规定 charge 在一个周期内能收取的最大费用
  • max_provision_period max_provision 的周期

方法:

  • activate_account (data) 激活账户,本对象的account_mode_and_status和account_activation_time修改
  • close_account (data) 本对象的account_mode_and_status和account_closure_time修改
  • reset_account (data) account_status为close状态下重置所有属性,为1或2时不操作

alt text

s4.6.3 Credit (class_id = 112, version = 0)

可用额度,激活时用于抵扣Charge。

额度相关的属性都允许为负值

属性:

  • current_credit_amount 本对象当前可用额度
  • credit_type 类型
    • (0) token_credit 预付费方式充值的余额,一般是token方式
    • (1) reserved_credit 特定情况可使用的信用额度
    • (2) emergency_credit 紧急额度,紧急额度使用后在下次重置的时候抵扣补充
    • (3) time_based_credit 按照时间产生的额度
    • (4) consumption_based_credit 预定义信用额度
  • priority 激活优先级,1为最高,255最低,1-255不允许重复,0表示永不激活,可重复。优先级为0的不会出现在Account对象的credit_reference_list中
  • warning_threshold 警告阈值,监控current_credit_amount,与Account对象中的low_credit_theshold关联
  • limit 透支耗尽阈值,当current_credit_amount小于阈值时 credit_status 变为耗尽Exhausted

    • 在 prepayment 模式下,该值通常设置为零。(通过为 Account 分配一个紧急 credit 对象来避免欠费直接断电)
    • 在 credit 模式下,优先级最高的 credit 对象的 limit 通常等于最大可能的负数(无限透支,但受到 max_provision 限制)。
  • credit_configuration 配置本对象行为
    • Bit0 需要视觉指示(如液晶屏)
    • Bit1 在credit_status切换到Selected/Invoked之前需要确认(如按键)
    • Bit2 需要偿还的信用额度(不足 preset_credit_amount 的部分会被计入 Account 的 amount_to_clear,必须全部偿还才能重新启用该 credit)

      示例:预设 preset_credit_amount = 100,使用后 current_credit_amount = -20。已使用金额 = 100 - (-20) = 120,此 120 会加入 amount_to_clear。需充值 120 单位,使 current_credit_amount = 100,才能清除债务。

    • Bit3 可重置
    • Bit4 能够从token接收信用额度
  • credit_status 预付费应用使用,指示当前状态
    • Enabled: 启用,但还不能使用,会在credit_reference_list中
    • Selectable: 可选择的,需要其他命令才能激活,还不能使用。只有 credit_reference_list 中的下一个 credit 才能被设置为该状态。
    • Selected/Invoked:已选择已激活,处于排队状态
    • In use:正在使用中
    • Exhausted:额度已耗尽(只能等待重新激活变为 Enabled 状态)

    creditstate

    类比于进程的状态: Selected/Invoked 就是就绪态,随时可调度。In use 就是运行态,只能有一个进程处于该状态。Selectable 就是阻塞态,等待信号(激活命令)才能变成就绪态。Enable 就是新建态。Exhausted 就是终止态。

  • preset_credit_amount 初始额度

    累加current_credit_amount属性的情况:

    • 当 credit_configuration bit 1(切换需确认)置位时,用户执行了确认操作,credit_status转换为(2)Selected/Invoked
    • credit_configuration bit 1置位未置位时,credit_status从不为(4)Exhausted状态转换为(3)In use
    • 当调用invoke_credit方法时,且credit_configuration bit 2置位
    • period 里date_time发生时,这是隐式的

    如果不需要初始额度就设置为0,这种情况下可以通过token充值调用方法方式增加current_credit_amount

    如果credit_type是emergency_credit

    • 该值preset_credit_amount需要被使用
    • 只在以下情况可用token充值

      • status为(3) In use or (4) Exhausted
      • 且部分或全部额度被使用
      • 且credit_configuration bit 2(需要偿还)置位

    current_credit_amount达到limit时,credit_status属性将变成(4)Exhausted。如果credit_configuration bit 2(需要偿还)被设置,那么实际已经使用了的信用额度是preset_credit_amountcurrent_credit_amount之间的差值(我们可以假设电表初始preset_credit_amount是10块钱,如果此时current_credit_amount是6块钱,说明已经使用了4块钱,需要还4块钱,意思应该就是保证金是10块钱,如果preset_credit_amount被设置为0块钱,说明没有保证金),通常是通过增加一个token充值或通过调用一个方法来偿还。在偿还所有欠款后,current_credit_amount将变0,下次激活时会在0的基础上加上preset_credit_amount。当与之关联的 Account 对象的 amount_to_clear=0时credit_status将变(0)Enabled(还清了)

  • credit_available_threshold 被“Account”对象的 next_credit_available_threshold 映射,与“Account”对象available_credit相关联

    当“Account”对象的available_credit缩减到下一个优先级的Credit对象的credit_available_threshold时(此时该对象还是enable状态,不在credit_reference_list属性里,不计入available_credit)

  • period 在credit_type = 3 (time_based_credit)或credit_type = 4 (consumption_based_credit)时,该属性保存current_credit_amount自动设置为preset_credit_amount时间。比如包月模式每月1号自动获得200元余额。

方法:

  • update_amount (data) 调整current_credit_amount属性的值(增量),主要是正值(充值),负值也允许
  • set_amount_to_value (data) 设置current_credit_amount属性的值,返回值为配置前的值
  • invoke_credit (data) 将“Credit”对象的credit_status改为(2)Selected/Invoked或(1) Selectable(取决于credit_configuration bit 1)

s4.6.4 Charge (class_id = 113, version = 0)

  • total_amount_paid 本对象总金额,一般不重置
  • charge_type 收费类型

    • (0) consumption_based_collection 按量计费
    • (1) time_based_collection 时间计费(类似手机卡基本月租费)
    • (2) payment_event_based_collection 支付事件计费手续费,比如用新的token充值需要手续费)
  • priority 优先级和Credit类相同,大于0的必须出现在“Account”对象charge_reference_list中
  • unit_charge_active 根据相关的“Account”实例的货币属性,以及相关的由commodities _reference结构标识的对象的scaler_unit属性,定义有效价格,即每消耗量、每时间或每收到的付款所收取的金额。

    • charge_per_unit_scaling_type 每单位收费缩放,包含消耗量单位缩放(10的指数,如10^3kWh为一单位),单位价格缩放(关联Account中的currency_scale属性中currency元素,10的指数)
    • commodity_reference_type 消耗量依据,只在charge_type = (0) consumption_based_collection时生效,标识一个Register对象的scaler_unit(量纲)属性的引用,如电量
    • charge_table charge_per_unit是基于charge_per_unit_scaling_type的缩放生成的每单位价格值,index表示在按量计费模式下不同的费率模式,其他模式为0
  • unit_charge_passive unit_charge的备用方案,和unit_charge_active结构相同,激活时拷贝到unit_charge_active中
  • unit_charge_activation_time 调用激活方法时间
  • period 表示Charge采集周期,仅当charge_type = (0) consumption_based_collection 或 (1) time_based_collection
  • charge_configuration 采集方式

    • bit 0: 比例方式,用于charge_type = (2) payment_event_based_collection
    • bit 1: 不间断采集方式,置位后total_amount_remaining为0时依旧采集,否则不采集
  • last_collection_time 上次采集时间
  • last_collection_amount 上次收集金额
  • total_amount_remaining 总剩余金额 TODO:什么意思
  • proportion 手续费比例,仅当charge_type = (2) payment_event_based_collection有效

方法:

  • update_unit_charge (data) 更新 unit_charge_passive,TODO:为什么不直接SET该属性,而要通过方法。
  • activate_passive_unit_charge (data) 启用备用方案 unit_charge_passive
  • collect (data) charge_type 不为 (0) consumption_based_collection 时生效,采集在 unit_charge_active 定义的数据
  • update_total_amount_remaining (data) 更新 total_amount_remaining
  • set_total_amount_remaining (data) 设置 total_amount_remaining

s4.6.5 Token gateway (class_id = 115, version = 0)

属性:

  • token 包含最近接收或标记的未处理的 token, 格式为 octet string,以便在历史 profile 中捕获
  • token_time 最近接收和处理token的时间
  • token_description 最近接收和处理的token的描述
  • token_delivery_method 最近接收的token的接收方式

    • 远程通信
    • 本地通信
    • 手动输入
  • token_status token状态(接收,处理,校验,认证)

方法:

  • enter (data) 以octet-string格式传入token

需要配合两个 Data 类型(Class_id 为 1)的对象表示相关的参数,另见 6.2.17 Payment metering related objects:

  • Max credit limit: 达到可用额度上限,不能充值token
  • Max vend limit: 达到单次充值上限,不能充值token

s4.6.6 IEC 62055-41 Attributes (class_id = 116, version =0)

IEC 62055-41数据元素的选择,这些元素是管理在DLMS服务器中实现的STS功能所必需的。

  • meter_pan MeterPrimaryAccountNumber
  • commodity 计量用途名称,“ELECTRICITY”, “WATER”, “GAS”, or “TIME”
  • token_carrier_types
  • encryption_algorithm
  • supply_group_code
  • tariff_index
  • key_revision_number
  • key_type
  • key_expiry_number
  • no_of_kct_supported
  • sts_certificate_no

s4.7 通过本地端口和调制解调器建立数据交换的接口类Interface classes for setting up data exchange via local ports and modems

s4.7.1 IEC local port setup (class_id = 19, version = 1)

  • default_mode 定义端口上仪表使用的协议

    • IEC 62056-21:2002 (modes A…E)
    • IEC 62056-46:2002/AMD1:2006
    • 协议未指定
  • default_baud 起始波特率
  • prop_baud 建议波特率
  • response_time 接收到请求到发送回复的最小时间
  • device_addr IEC 62056-21:2002定义
  • pass_p1 IEC 62056-21:2002定义
  • pass_p2 IEC 62056-21:2002定义
  • pass_w5 IEC 62056-21:2002定义

s4.7.2 IEC HDLC setup (class_id = 23, version = 1)

  • comm_speed 对应端口支持的通信速度

    (0) 300 baud, (1) 600 baud, (2) 1 200 baud, (3) 2 400 baud, (4) 4 800 baud, (5) 9 600 baud, (6) 19 200 baud, (7) 38 400 baud, (8) 57 600 baud, (9) 115 200 baud

  • window_size_transmit 发送窗口大小
  • window_size_receive 接收窗口大小
  • max_info_field_length_transmit 最大发送长度
  • max_info_field_length_receive 最大接受长度
  • inter_octet_time_out 接收超时,超时未接收到新字符时视为完整报文
  • inactivity_time_out 超时断开
  • device_address 物理设备地址

s4.7.3 IEC twisted pair (1) setup (class_id = 24, version = 1)

允许通过IEC 62056-3-1:2021中规定的带有载波信号的中绞线对建立数据交换。可配置多个通信通道

s4.7.4 Modem configuration (class_id = 27, version = 1)

和模块间的数据传输配置

  • comm_speed 通信速度,波特率
  • initialization_string 初始化命令
  • modem_profile 海斯命令集(Hayes standard commands,AT命令)映射

s4.7.5 Auto answer (class_id = 28, version = 2)

自动接听

  • mode 自动接听工作模式

    • (0) 设备专用线路
    • (1) 共享线路管理,允许有限数量的呼叫。一旦达到了调用的数量,窗口状态就变成不活动,直到下一个开始日期,无论调用的结果是什么
    • (2) 共享线路管理,允许有限数量的成功呼叫。一旦达到了成功通信的数量,窗口状态就会变得不活动,直到下一个开始日期
    • (3) 目前没有连接调制解调器
    • (200…255) 制造商特定的模式
  • listening_window 定义通信窗口活跃(start_time)和不活跃(end_time)的时间点。start_time隐式地定义周期。

    允许not specified(0xFF)表示每月每日重复

  • status 通信窗口状态

    • (0)未激活:设备将不会管理新的来电。当下一次监听窗口启动时,该状态将自动重置为Active
    • (1)主动:设备可以接听下一个来电
    • (2)锁定:该值可以由设备或特定的客户端自动设置,当该客户端完成其读取会话,并希望在窗口持续时间结束前将行返回给客户。当下一次监听窗口启动时,该状态将自动重置为Active
  • number_of_calls mode为1或2时,最大呼叫数量
  • number_of_rings TODO:ring是什么意思?环数?响声?
  • list_of_allowed_callers 一个可选的主叫号码列表,包括呼叫和SMS短信

    • caller_id 号码,允许通配符
    • call_type 定义了调用的目的,例如,它是一个标准的CSD调用还是一个唤醒呼叫/唤醒消息

      • (0) = normal CSD call:modem只有在主叫号码与列表中的条目匹配时连接。这是在测试所有其他属性的同时进行的,例如number_of_rings, listening_windows等

        电路交换数据(CSD):属于2G技术,用于传输数据,类似GPRS,但更加老旧

      • (1) = wake-up request:来自该主叫号码的呼叫或消息将作为唤醒请求处理。唤醒请求将立即处理,而不考虑number_of_rings和listening_window等所有其他属性(除非主叫号码也出现在普通CSD调用列表中,请参见下面)。

        需要为空,否则不被是为唤醒请求

        如果不为空,且包含预连接AA客户端的可用xDLMS APDU消息,则视为xDLMS服务消息而非唤醒请求,否则不做任何反应

        TODO:需要补充

s4.7.6 Auto connect (class_id = 29, version = 2)

自动连接,自动拨号、发送消息等

属性:

  • mode 自动连接模式,根据时间、消息类型和要使用的基础设施来控制自动连接功能。
  • repetitions 连接失败最大尝试次数
  • repetition_delay 重试间隔,秒
  • calling_window 活动窗口,在窗口时间内允许自动连接,看mode的配置
  • destination_list 包含在特定条件下必须发送消息的目的地列表(例如电话号码、电子邮件地址或它们的组合)。这里没有定义数组元素的条件及其链接

方法:

  • connect (data) 根据mode属性定义的规则向通信网络发起连接进程。

s4.7.7 GPRS modem setup (class_id = 45, version = 0)

GPRS参数

  • APN APN名称
  • PIN_code 个人识别码(personal identification number)
  • quality_of_service 指定服务质量参数(QoS)。它是一个由两个元素组成的结构:

    • 默认值
    • 请求值

s4.7.8 GSM diagnostic (class_id: 47, version: 2)

“GSM diagnostic”类的一个实例存储了分析网络运行所必需的GSM/GPRS、UMTS、CDMA或LTE网络参数

蜂窝网络在注册状态信号质量等方面都在不断变化。监控和记录相关参数是必要的,以便获得诊断信息,以便识别网络中的通信问题。

可用“Profile generic”捕获

  • operator 运营商名称
  • status modem注册状态
  • cs_attachment 当前电路切换(CS,Circuit Switch)状态,见电路交换
  • ps_status 报文分组交换技术(PS,packet switch)状态,见报文分组交换
  • cell_info 蜂窝网络状态
  • adjacent_cells 临近节点状态
  • capture_time 最近被捕获的时间

s4.7.9 LTE monitoring (class_id: 151, version = 1)

允许通过处理所有必要的数据来监控LTE调制解调器

  • LTE_network_parameters 网络参数
  • LTE_quality_of_service 服务质量

s4.8 通过M-Bus建立数据交换的接口类Interface classes for setting up data exchange via M-Bus

s4.8.2 M-Bus slave port setup (class_id = 25, version = 0)

M-Bus从设备端口设置

  • default_baud 起始波特率
  • avail_baud 协商波特率
  • addr_state 设备是否分配了地址
  • bus_address 总线上当前为设备分配的地址

s4.8.3 M-Bus client (class_id = 72, version = 2)

每个“M-Bus client”对象控制一个M-Bus从设备

方法可以实现M-Bus从设备的安装和卸载

本对象可以向从设备采集数据,也可以发送数据(配置,动作,传密钥等)

属性:

  • mbus_port_reference “M-Bus master port setup”对象引用,每个接口允许与一个或多个M-Bus从设备交换数据。
  • capture_definition 捕获定义,TODO:需要看引用文档
  • capture_period 捕获周期

    • >=1: 自动捕获,秒
    • 0:不自动捕获,需手动触发
  • primary_address M-Bus从设备的主地址(primary address),范围是0-250

    有该值,表示可以立即通信,不允许还未准备就绪(安装)时写该值

  • identification_number 标识号,第一次通信时写入
  • manufacturer_id EN 137577:2018
  • version EN 137577:2018
  • device_type EN 137577:2018
  • access_number EN 137577:2018
  • status EN 137577:2018
  • alarm EN 137577:2018
  • configuration EN 137577:2018
  • encryption_key_status 加密密钥状态,设置、传输、使用
  • configuration_extension EN 137577:2018
  • invocation_status 携带未决(pending)M-Bus方法调用的调用状态。当invocation_status表示(1)成功时,结果携带在invocation_status的return-data中。如果没有返回数据可用,则return_data octet-string为空,即长度为0。当没有挂起的调用时,数组为空。

方法:

  • slave_install (data) 安装一个未配置的从设备(primary address 是 0)

    • 检查M-Bus地址0上是否有新设备
    • 没找到调用失败
    • 方法参数表示primary address,如果不带参数调用,则自动取未使用的primary address,分配并传输给从设备
  • slave_deinstall (data) 卸载从设备。此服务的主要目的是卸载M-Bus从设备,并让主设备为安装新设备做好准备。执行以下操作:

    • 从设备M-Bus地址设置为0
    • 销毁之前传输的密钥,不影响默认密钥
    • encryption_key_status设为(0): no encryption_key
    • primary address设为0
    • 全部属性设置为默认值
  • capture (data) 捕获,和capture_definition属性关联
  • reset_alarm (data) 复位M-Bus从设备告警状态
  • synchronize_clock (data) 同步从设备时钟
  • data_send (data) 向从设备发送数据
  • set_encryption_key (data) 设置M-Bus客户端设备的加密密钥从设备刚安装时客户端设备有个空密钥,且加密传输禁用,可以通过配置空密钥禁用加密传输
  • transfer_key (data) 传输加密密钥给从设备

    在加密传输启用前,加密密钥通过从设备默认密钥(密钥加密密钥,MK)加密,传输给从设备,本次传输通道不加密,之后才开始加密传输。之后可以重复调用该方法更新密钥,同样使用默认密钥加密密钥,但这次传输通道为加密的

    被卸载后,从设备内密钥销毁,但默认密钥不受影响,禁用加密传输

  • transfer_security_information (data) 向M-Bus从设备传输安全信息(security_information)
  • invocations_reset(data) 将M-Bus从设备的方法调用重置为初始状态

s4.8.4 Wireless Mode Q channel (class_id = 73, version = 1)

使用模式Q接口进行通信的操作参数。参见EN 13757-5:2015

s4.8.5 M-Bus master port setup (class_id = 74, version = 0)

如果设备作为M-bus master,该IC的实例定义了使用EN 13757-2接口进行通信的操作参数。

s4.8.6 DLMS server M-Bus port setup (class_id = 76, version = 0)

在M-Bus从设备托管的DLMS服务器中使用,使用DLMS/COSEM有线或无线M-Bus (wM-Bus)通信配置文件

  • M-Bus_profile_selection 引用M-Bus通信端口设置对象,“M-Bus slave port setup” object (class_id = 25)或 “Wireless Mode Q channel” object (class_id = 73).
  • M-Bus_port_communication_state M-Bus node通信状态

    • (0)无接入:仪表无接入窗口(单向仪表),
    • (1)暂无接入:仪表一般支持双向接入,但本次传输后没有接入窗口(如为了保持占空比限制或限制能耗,暂无接入),
    • (2)有限的访问:仪表仅在传输后提供一个短的访问窗口(如电池供电仪表),
    • (3)无限接入:至少在下次传输(如市电供电设备)之前,仪表提供无限接入。
    • (4)此属性仅在wM-Bus中相关。

    TODO:node是什么意思?

  • M-Bus_Data_Header_Type 报文头类型,派生自当前通信的CITL值。
  • primary_address EN 137577:2018
  • identification_number EN 137577:2018
  • manufacturer_id EN 137577:2018
  • version EN 137577:2018
  • device_type EN 137577:2018
  • max_pdu_size M-Bus低层pdu长度上限,对于长消息,可以使用DLMS/COSEM应用层提供的块传输传输层提供的分段传输,也可以同时使用这两种机制。
  • listening_window 此属性仅在wM-Bus中相关,定义点对点通信窗口活动(start_time)和不活动(end_time)的时间点。start_time隐式地定义周期

s4.8.7 M-Bus diagnostic (class_id = 77, version = 0)

包含与M-Bus网络运行相关的信息,如当前信号强度通道标识符、到M-Bus网络的链路状态以及与帧交换传输帧接收质量相关的计数器

  • received-signal-strength 此属性仅与无线双向M-Bus(wM-Bus,wireless M-Bus)通信相关。

    当使用wM-Bus配置文件时,这个属性保存了接收到的最后一个wM-Bus帧的信号强度值,用dBm表示。

  • channel_Id 此属性仅与wM-Bus通信相关。当使用wM-Bus配置文件时,此属性保存当前使用的通道的标识。缺省值为0。
  • link_status 此属性仅与wM-Bus通信相关。当使用wM-Bus配置文件时,此属性保存到M-Bus网络的链接当前状态

    • (0)缺省值(未接收到数据)
    • (1)链路正常运行
    • (2)链路暂时中断
  • broadcast_frames_counter 持有广播帧计数器的值,时间戳为接收到的最后一帧,并由客户端标识符区分
  • transmissions_counter 统计相关M-Bus端口传输帧数。到达最大值归0。
  • FCS_OK_frames_counter 以正确的校验和计算接收到的帧数。到达最大值归0。
  • FCS_NOK_frames_counter 统计接收到的校验和(checksum)错误帧数
  • capture_time 保存属性received-signal-strength、link_status、transmissions_counter、FCS_OK_frames_counter或FCS_NOK_frames_counter的值最近变化时间戳

方法:

  • reset (data) 清除所有计数器(counters),received_signal_strength, link_status和capture_time

s4.9 用于在Internet上建立数据交换的接口类Interface classes for setting up data exchange over the Internet

s4.9.1 TCP-UDP setup (class_id = 41, version = 0)

允许对基于TCP-UDP/IP的通信配置文件的TCP或UDP传输层的设置建模

或基于DLMS/COSEM CoAPDLMS/COSEM CoAP传输层UDP子层的设置建模

在基于TCP-UDP/IP的通信配置文件中,承载一个或多个COSEM客户端应用程序进程的物理设备和承载一个或多个COSEM服务器ap的物理设备之间的所有AAs都依赖于单个TCP或UDP连接。TCP或UDP实体封装在基于COSEM TCP-UDP的传输层中。在物理设备中,每个AP(客户端AP或服务器逻辑设备)都绑定到一个包装器端口(WPort)

一个基于COSEM TCP或UDP的传输层可能能够支持一个物理设备和多个承载COSEM ap的对等物理设备之间的多个TCP或UDP连接。

一个DLMS/COSEM CoAP传输层可以支持多个UDP连接,用于一个物理设备和一个或多个承载COSEM ap的对等物理设备之间的通信。

当一个COSEM物理设备支持各种数据链路层时——例如以太网和PPP——每一个都需要一个TCP-UDP setup对象的实例

  • TCP-UDP_port 监听端口号,4059 TCP/UDP
  • IP_reference 引用“IP setup”对象
  • MSS 在最大段大小(MSS,Maximum Segment Size)选项的帮助下,TCP实体可以向它的对端指示最大的接收段大小。注意:

    • 这个选项只能在初始连接请求中发送(即发送SYN控制位的分段);
    • 如果这个选项不存在,通常MSS被认为是它的默认值,576;
    • MSS是不可协商的;它的值由这个属性指示。
  • nb_of_sim_conn 基于COSEM TCP-UDP的传输层能够支持的最大同时连接数(maximum number of simultaneous connections)
  • inactivity_time_out 接收超时释放,定义时间,以秒表示,如果没有从COSEM客户端收到帧,不活动的TCP连接将被中止

0表示永不中止

注意,所有与管理非活动超时函数相关的操作,如测量非活动时间、在超时结束时终止TCP连接等,都在TCP-UDP层实现中进行管理。

s4.9.2 IPv4 setup (class_id = 42, version = 0)

IPv4信息,每个网口对应一个

属性:

  • DL_reference 引用数据链路层(如以太网或PPP)设置对象
  • IP_address 静态或动态的ip地址

    IPv4地址192.168.0.1(点分十进制)对应C0A80001 (hexa),得到3232235521 (double-long-unsigned)。

  • multicast_IP_address 组播地址,该数组中的IP地址应属于组播组地址范围(“D类”地址,包括224.0.0.0 - 239.255.255.255范围内的IP地址)。当设备接收到IP数据报时,如果目的IP地址字段属于数组中IP地址之一,它应该认为该数据报是给它自己的。
  • IP_options 包含支持所选IP选项的必要参数——例如数据报时间戳安全服务(IPSec)。

    标准的IP option RFC 791中的部分

    • Security: IP_Option_Type = 0x82, IP_Option_Length = 11
    • Loose Source and Record Route: IP_Option_Type = 0x83 宽松的源站选路(为数据报指定一系列必须经过的IP地址)
    • Strict Source and Record Route: IP_Option_Type = 0x89 严格的源站选路选项。与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址。
    • Record Route: IP_Option_Type = 0x07 记录路径(让每个路由器都记下它的IP地址)
    • Internet Timestamp: IP_Option_Type = 0x44 时间戳选项
  • subnet_mask 子网掩码
  • gateway_IP_address 网关IP
  • use_DHCP_flag 是否启用dhcp,启用后IP_address, subnet_mask and gateway_IP_address变为动态
  • primary_DNS_address 主DNS
  • secondary_DNS_address 备用DNS

方法:

  • add_mc_IP_address (data) 向multicast_IP_address数组添加一个新的ip
  • delete_mc_IP_address (data) 从multicast_IP_address数组删除一个ip
  • get_nbof_mc_IP_addresses (data) 获取multicast_IP_address数组元素数量

s4.9.3 IPv6 setup (class_id = 48, version = 0)

属性:

  • DL_reference 同IPv4
  • address_config_mode IPv6地址配置模式

    • (0) Auto-configuration (default)
    • (1) DHCPv6
    • (2) Manual
    • (3) ND (Neighbour Discovery)
  • unicast_IPv6_addresses 单播地址(唯一本地单播,链接本地单播 和/或 全球单播地址),是数组
  • multicast_IPv6_addresses 组播地址, 数组
  • gateway_IPv6_addresses 网关IP数组
  • primary_DNS_address 同IPv4
  • secondary_DNS_address 同IPv4
  • traffic_class 包含IPv6头的traffic class元素。RFC 2474:1998第3条规定,使用DSCP (Differentiated Services Codepoint)对报文进行分类,根据类型的不同QoS可以指定不同动作,如有些需要低延迟,有些需要大流量。
  • neighbor_discovery_setup 包含用于支持IPv6邻居发现协议NDP(rfc4861)的路由器和主机的配置。

    • RS_max_retry 给出一个节点在没有收到预期的路由器通告时执行的最大路由器请求重试次数
    • RS_retry_wait_time 给出两个连续路由器请求重试之间的等待时间(以毫秒为单位)。
    • RA_send_period 给出路由器通告传输的周期,单位为秒

方法:

  • add_IPv6_address (data) 添加IPv6地址,参数包括类型:单播、组播、网关
  • remove_IPv6_address (data) 移除IPv6地址,参数包括类型:单播、组播、网关

s4.9.4 MAC address setup (class_id = 43, version = 0)

从原来的“Ethernet setup”更名而来,说明这个类原来仅用于以太网。现在可以用于更广泛的用途,如PLC网络的MAC

保存MAC地址

属性:

  • MAC_address MAC地址

s4.9.5 PPP setup (class_id = 44, version = 0)

通过处理与给定物理设备相关的PPP设置所有信息,以及与使用这些设置的低层连接,该IC允许使用PPP协议模拟接口的设置。一个物理设备的每个网络接口都应该有一个该IC的实例。

  • PHY_reference 通过它的logical_name引用另一个对象。引用的对象包含具体物理层接口的信息,支持PPP层。 TODO:引用什么对象?
  • LCP_options LCP配置参数

    • Maximum-Receive-Unit (MRU), LCP_Option_Type = 1. See RFC 1661. 最大接收单元。用于通知peer可以接收更大的包(如对方发的包比较小,可以告诉他自己最大能接收多少),也能通知peer发更小的包,太大处理不了
    • Async-Control-Character-Map (ACCM), LCP_Option_Type = 2. See RFC 1662. 异步控制字符映像
    • Authentication-Protocol, LCP_Option_Type = 3. See RFC 1661. 认证协议,PAP、CHAP、EAP。
    • Magic-Number, LCP_Option_Type = 5. See RFC 1661. 该配置选项提供了一种检测回环链路和其他数据链路层异常的方法;
    • Protocol-Field-Compression (PFC), LCP_Option_Type = 7. See RFC 1661. 协议域压缩,这个配置选项提供了一种协商PPP协议字段压缩的方法
    • Address-and-Control-Field-Compression (ACFC), LCP_Option_Type = 8. See RFC 1661. 地址和控制字段压缩,这个配置选项提供了一种方法来协商数据链路层地址和控制字段的压缩;
    • FCS-Alternatives, LCP_Option_Type = 9. See RFC 1570. FCS替换,可以指定对等端发送的另一种FCS格式,或者协商完全放弃FCS
    • Callback, LCP_Option_Type = 13. See RFC 1570. 回拨,是指当通信一方拨号到另一方后,由另一方断开拨号连接并进行反向的拨号。更加安全,另一方可以在回叫前验证对方是否合法,如查数据库或查对方号码
  • IPCP_options 包含网际协议控制协议(IPCP)(PPP的网络控制协议模块)的必要参数,允许协商理想的互联网协议参数。有关IPCP的详情,请参阅RFC 1332
  • PPP_authentication PPP认证参数,PAP、CHAP、EAP,见本文

    • PAP: 明文密码传输,客户端发送明文用户名密码
    • CHAP:服务端发个OTP(相当于盐),客户端用OTP和密码计算哈希值,把明文的用户名和哈希值发送服务端,服务端用相同的OTP和密码计算哈希值,并比对。过程中密码没有明文传输
    • EAP: 服务器向客户端发送身份验证请求,包括它应使用的 40 种身份验证方法中的哪一种。客户端根据该方法加密用户名密码,发送给服务端

s4.9.6 SMTP setup (class_id = 46, version = 0)

允许使用简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)协议与远程服务器建立数据交换

  • server_port 服务器端口,25/TCP,UDP
  • user_name 用户名,登录用
  • login_password 密码,登陆用
  • server_address 服务器ip
  • sender_address 发送者ip地址

s4.9.7 NTP setup (class_id = 100, version = 0)

NTP协议时间同步

属性:

  • activated NTP时间同步是否激活
  • server_address NTP服务器地址
  • server_port 端口
  • authentication_method 认证方式
  • authentication_keys 认证密钥数组
  • client_key 客户端密钥,NTP服务端公钥,IFF方式

方法:

  • synchronize (data) 同步时间
  • add_authentication_key (data) 添加authentication_key
  • delete_authentication_key (data) 删除authentication_key

s4.9.8 CoAP setup (class_id = 152 version = 0)

属性:

  • UDP_reference 指向TCP-UDP setup对象,和UDP层相关
  • ack_timeout confirmable消息的最小初始ACK超时时间
  • ack_random_factor 初始ACK超时时间生成随机因子,初始ACK超时时间在ack_timeout - ack_timeout x ack_random_factor x 0.01之间
  • max_retransmit confirmable消息的最大重传次数
  • nstart 同时未完成的下列形式的CoAP请求消息的数量:未收到CoAP确认的CON CoAP消息或未收到CoAP响应消息的NON CoAP消息。
  • delay_ack_timeout CoAP消息传递层等待应用层返回响应的时间(单位为ms),然后它将返回确认以防止来自对等体的虚假重传。
  • exponential_back_off

    重发延迟因子

    n表示第几次重发

    retransmission_delay = initial_ack_timeout x (exponential_back_off x 0.01) ^ (n -1)

  • probing_rate 定义一个端点在发送到另一个没有响应的端点时不应超过的平均数据速率(字节/秒)。
  • CoAP_uri_path uri-path
  • transport_mode 传输方式

    • 仅可靠
    • 仅不可靠
    • 同时支持
  • version DLMS/COSEM CoAP wrapper的版本
  • token_length token长度(CoAP协议中的token)

s4.9.9 CoAP diagnostic (class_id = 153, version = 0)

CoAP诊断

属性:

  • messages_counter 报文计数
  • request_response_counter CoAP请求响应的报文计数
  • coap_bt_counter CoAP Block-Wise transfer layer(块传输),发起总数,完成总数,超时总数
  • capture_time 捕获时间(最近更新本对象相关属性的时间)

方法:

  • reset (data) 全部清空

s6.2.5 Clock objects (class_id = 8)

TODO:对图的疑问。表内时间实际上只有一份,通过D的不同区分不同的表现形式。而且可以用不同的类表示。说明obis和class间没有太大的联系

C决定了大的功能模块,D区分这个功能模块需要用到的数据,可以是隶属于不同class的。

如图,C=19表示payment相关功能,需要用到来自111、112、113、115、01、116类的数据

6.2.28 Objects for data exchange using narrow-band OFDM PLC for G3-PLC networks 和 6.2.42 Device ID objects

给出了相同的obis对应不同的类的情况

6.2.64 Alarm register, Alarm filter and Alarm descriptor objects

部分事件的产生会触发 Alarm(告警),此时除了将该事件记录在 Event log profile 之外,还会向主站直接 push。

事件发生时,首先记录到 event register,然后由相应的 event log profile 捕获该 register,所以 event register 总是保存着最后一次发生的事件。电表出厂第一次上电后还没事件发生时该值的默认值为 255。

alt text

会用到 3 个 register:

Alarm Filters

是个位图,每一位对应一个事件

置位表示允许对应的事件触发 Alarm,也就是事件发生会将 Alarm registers 对应位置位

清位表示禁止对应事件触发 Alarm

Alarm registers(AR)

结构和 Alarm Filters 相同

置位:

  • 当事件发生时对应位置位(未被 Alarm Filters 过滤的情况下)

清位:

  • 事件结束(比如盖子打开后关上了)时内部可自动清位。
  • 客户端可以通过 SET 服务将所有位全清 0(只能全清,参数为 0,不能单个清)

Alarm descriptors (AD)

结构和 Alarm registers 相同

置位:

  • 当 Alarm registers 对应位从 0 变 1 时,对应位变为 1(Alarm registers 清位,或从 1 变为 1 都不会触发本寄存器改变),且本寄存器的位由 0 变 1 时启动上报(原来就是 1,则不启动上报)。

清位:

  • 客户端可以通过 SET 服务独立清除每个位(参数取反后和本寄存器进行与操作,比如参数为 0110,表示清中间两位)

本寄存器可以理解为主站控制电表允许上报的开关,当上报已经发送时,直到主站清除该位为止,该事件不再被允许上报。

本文由作者按照 CC BY-SA 4.0 进行授权