目录
前言
一、命令类型和命令ID
1、CC(命令类型)
2、DISC(发现命令)
3、GET&SET(获取和设置命令)
(1)获取代理设备UID&获取代理设备总数
(2)获取错误数据包计数值
(3)获取数据包队列信息
(4)获取设备状态信息
(5)获取设备状态信息描述
(6)清除设备状态信息队列
(7)获取/设置子设备状态报告阈值
(8)获取设备支持的命令类型
(9)获取设备命令类型定义
(10)获取设备信息
(11)获取产品类别细节
(12)获取DEVICE_MODE_ID的文本描述
(13)获取制造商文本描述
(14)获取和设置设备位置
(15)获取和设置默认设置
(16)获取设备的支持的语言模式
(17)获取/设置设备当前语言模式
(18)获取软件版本文本描述
(19)获取BootLoader的软件版本
(20)获取BootLoader版本文本描述
(21)获取和设置设备模式
(22)获取设备模式描述
(23)获取和设置设备DMX地址
(24)获取通道相关信息之通道信息
(25)获取通道相关信息之通道ID文本描述
(26)获取通道相关信息之通道默认值
前言
最近开发RDM控制端的时候遇到了许多问题,在查阅官方文档后才发现RDM协议不仅只有9种数据包。截至目前的文章只介绍了九种,在这里补充剩下的数据包。之前的九种数据包可以看这篇文章 标准RDM协议详解及代码实现篇一 —— RDM协议详解及数据包定义-CSDN博客
一、命令类型和命令ID
1、CC(命令类型)
CC还是只有三大类,发现,获取,设置,如下图,而PID( 命令ID)就有很多了
2、DISC(发现命令)
DISC有三个PID,前面文章有介绍。分别是发现设备,哑音,解除哑音
3、GET&SET(获取和设置命令)
(1)获取代理设备UID&获取代理设备总数
实际应用中暂时使用不到,后面用到了再讲解
(2)获取错误数据包计数值
接收器在收到校验错误包或者不完整的包时,需要计数加一,然后这条命令用来获取设备的这个计数值。
响应格式如下。使用设置命令时就是将计数值清零
字段说明:
-
短消息(Short Message)
-
当消息在接收到完整的目标 UID 之前终止(由于 BREAK 或超时条件)时,此字段应递增。
-
-
长度不匹配(Length Mismatch)
-
在 BREAK 或消息超时条件发生之前接收到的槽位数与消息长度加上校验和的大小不匹配。
-
仅当数据包中的目标 UID 与设备的 UID 匹配时,此计数器才会递增。发送到适用的广播地址的消息也应递增此计数器。
-
-
校验和失败(Checksum Fail)
-
消息校验和失败
-
仅当数据包中的目标 UID 与设备的 UID 匹配时,此计数器才会递增。发送到适用的广播地址的消息也应递增此计数器。
-
(3)获取数据包队列信息
这个包就比较有意思了,当控制器发送这个包时,接收器需要回应自己消息队列中排队的消息数量。如果回应数据长度是零表示设备不支持这个包,如果数据长度是1但是数据是0表示队列中没有排队的消息。
发送数据包时需要指定想要获取的消息类型
Status Type字段的定义如下,可以看到消息类型分别有无要求,上一条信息,咨询消息,警告消息,错误消息
对应的有清除类型
例如,设备在本地修改了DMX地址,这时就会产生一条错误信息在消息队列中,控制端发送后接收端回应更新后的DMX地址。同时看到回应的数据包中 Message_Count = 0x01,表示消息队列中还有一条未处理的数据包。
当未处理的数据包为0时,再发送 QUEUD_MESSAGE 接收端就会回应如下字段,这个回应和第(4)条相同。
(4)获取设备状态信息
获取设备的状态信息,获取的类型与上面相同
回应的是子设备的ID和子设备的状态ID和两段自定义的数据。最多可以返回25个子设备的状态信息。
(5)获取设备状态信息描述
上面的命令获取到了一个16位的状态ID,但是不同的厂商定义的状态ID都不同,这个命令就是获取状态ID对应的描述。
在0x0000 - 0x7FFF范围内的状态信息ID是为公开定义的状态信息保留的。关于公开定义的状态信息ID的更多信息可以在附录B中找到。
制造商专用信息的范围是0x8000-0xFFDF。每个制造商特定的状态ID应具有独特的含义,在具有特定制造商ID的所有产品中应是一致的
返回的包如下,返回ASCII文本描述。该描述最多可以是32个字符。
(6)清除设备状态信息队列
很简单理解,就是清除接收端统计的状态信息。
(7)获取/设置子设备状态报告阈值
不能让一个设备不断重复报错误,通过这个命令设置阈值。
通过GET命令类型获取不断产生错误的命令类型,再用SET命令设置阈值
(8)获取设备支持的命令类型
这个命令比较重要,用于控制器了解这个设备支持什么命令。
RDM协议规定一个RDM设备最少需要支持九个命令包,也就是文中标红的九个命令。如果支持扩展命令的话就先要实现这个命令,这个命令告诉控制器你支持哪些扩展命令(不用包含基本的九个命令包)。
回应包是一个命令列表,看PDL就知道RDM协议数据包远不止九个。
(9)获取设备命令类型定义
没错,RDM协议是支持自定义命令类型的,通过这个命令可以让控制端了解你的自定义PID怎么使用
数据描述:
要求的PID:
控制器所要求的制造商特定的PID。范围为0x8000至0xFFDF。
PDL大小:
PDL Size定义了与该PID相关的所有GET_RESPONSE和SET消息中用于PDL字段的数字。在DS_ASCII值的情况下,PDL大小代表一个可变大小的ASCII字符串的最大长度。
数据类型:
数据类型定义了该PID的消息PD中的数据条目的大小。例如:无符号8位字符与有符号16位字。表A-15列举了这些字段代码。
命令类:
命令类定义了是否为指定的PID执行Get和或Set消息。表A-16列举了这些字段代码。
类型:
这个字段不再有任何意义,应该在响应中填写0x00。 控制器应该忽略这个字段的内容。
单位:
单位是一个无符号的8位数值,由表A-13列举。 它定义了指定PID数据的SI(国际单位制)单位。
前缀:
前缀是一个无符号的8位值,由表A-14列举。它定义了单位的SI前缀和乘法系数。
最小有效值:
这是一个32位的字段,代表数据可以达到的最低值。该数字的格式由数据类型定义。对于DS_BIT_FIELD或DS_ASCII的数据类型,这个字段没有意义。对于小于32位的数据类型,最重要的字节应以0x00填充到32位。例如,一个8位的数据值0x12应在字段中表示为。0x00000012.
最大有效值:
这是一个32位的字段,代表数据可以达到的最高值。该数字的格式由数据类型定义。这个字段对于DS_BIT_FIELD或DS_ASCII的数据类型没有意义。对于小于32位的数据类型,最重要的字节应以0x00填充到32位。例如,一个8位的数据值0x12应在字段中表示为。0x00000012
默认值:
这是一个32位的字段,代表该数据的默认值。这个字段对于DS_BIT_FIELD或DS_ASCII的数据类型没有意义。默认值应在最小和最大范围内。对于小于32位的数据类型,最重要的字节应以0x00填充到32位。例如,一个8位的数据值0x12应在字段中表示为。0x00000012.
描述:
描述字段用于描述指定PID的功能。这个文本字段的长度应是可变的,最多32个字符。
这么麻烦还是不自定义算了......
(10)获取设备信息
发送时可以设置Sub-Device字段来获取子设备或者根设备的信息
获取的数据包和解释如下。
数据描述:
RDM协议版本:
该字段包含设备所支持的已发布的RDM标准的版本号。这些版本字段的值由本标准和未来发布的本标准的任何后续修订版或增补版所控制。
本标准的版本是1.0。这个版本字段的值只能由本文件的未来版本、修订版或增补版来改变。16位字段被编码为8位的主要和次要版本,如下所示。
Major Version Release (0x01)
| Minor Version Release (0x00)
|
Device Model ID:
该字段标识了根设备或子设备的设备型号ID。制造商不得使用相同的ID来代表一个以上的独特模型类型。
可以使用DEVICE_MODEL_DESCRIPTION参数从设备中检索设备模型ID的文本描述
Product Category:
根据产品的主要功能报告一个产品类别。
产品类别被编码为表A-5中定义的16位数值。这些值的排列方式是,上面的8位定义了粗略的产品分类,下面的8位是额外的(可选)细分类,如下图所示。
Product Category Coarse | Product Category Fine |
我们也鼓励制造商按照第10.5.2节和表A-6的规定申报和支持产品细节。
软件版本ID。
此字段表示设备的软件版本ID。软件版本ID是一个由制造商确定的32位数值。
32位软件版本ID可以使用任何编码方案,以便控制器可以识别包含相同软件版本的设备。
任何来自同一制造商但具有不同软件的设备不应报告相同的软件版本ID。
通过使用SOFTWARE_VERSION_LABEL参数,可以获得用于向用户显示的有意义的软件版本描述。
DMX512 Footprint:
该字段指定了 DMX512 大小(所需的连续 DMX512 插槽的数量)。该信息可与 DMX_START_ADDRESS 一起使用,以实现自动配对功能。
如果 DEVICE_INFO 信息指向一个子设备,那么该字段的响应就包含该子设备的 DMX512 占用空间。如果该消息被发送到根设备,它就是根设备本身的足迹。如果设备或子设备不利用空起始码数据包进行任何控制或功能,那么它应报告0x0000的足迹。
这个字段的范围是0-512。
说人话就是根设备或者子设备占用的通道数
DMX512 Personality:
DMX512个性字段详见第10.6.1节。16位字段被编码为两个8位字段,如下所示。
Current Personality | Total # of Personalities |
DMX512 Start Address:
DMX512起始地址字段在第10.6.3节中详细说明。
如果该信息指向的设备或子设备的DMX512足迹为0,则该字段应设置为0xFFFF。
说人话就是当前DMX地址
Sub-Device Count:
该参数用于检索第9节所述的根设备所代表的子设备的数量。
无论该信息是针对根设备还是子设备,该字段的响应都应相同。
Sensor Count:
该字段表示根设备或子设备中可用的传感器数量。当这个参数指向一个子设备时,对于特定的根设备所拥有的任何子设备,答复应是相同的。
当一个设备或子设备装有一个传感器时,它将返回一个0x01的传感器计数值。然后,在使用其他与传感器有关的参数信息时,该传感器将被编为传感器编号0x00。
(11)获取产品类别细节
对上面获取产品类别的补充,用于获取更详细的产品信息
(12)获取DEVICE_MODE_ID的文本描述
没什么好说的,用法如下。
(13)获取制造商文本描述
也没什么好说的,用法如下
(14)获取和设置设备位置
获取和设置设备位置,用法如下。
(15)获取和设置默认设置
当为GET命令时,获取设备是否在默认设置中,当为SET命令时,将设备恢复到默认设置
(16)获取设备的支持的语言模式
在解析文本描述的时候需要知道设备是用那种语言,哪个编码格式进行编码的,这样才不会解析出乱码,这个数据包就是用来获取设备支持的所有语言。返回的数据按照ISO 639-1国际标准定义
(17)获取/设置设备当前语言模式
应该很好理解,下面给出数据包。
(18)获取软件版本文本描述
软件版本号在(10)号包有给出,这里是文本描述
(19)获取BootLoader的软件版本
可以看到RDM的功能实在是太多了,甚至Bootloader的版本都能查询
(20)获取BootLoader版本文本描述
有版本号就有版本文本描述。
(21)获取和设置设备模式
重点来了,这个数据包用于设置设备的模式,不同模式有不同的通道占用数。所以一个高级的控台必不可少的就是支持这个数据包
首先看获取,返回的是八位的当前模式和八位的模式总数。
设置就发送八位先要设置的模式即可。
(22)获取设备模式描述
对应上面的设置。每一种模式都有一段文本描述,同时附带两字节该模式占用的通道数。
(23)获取和设置设备DMX地址
RDM协议最重要的功能就是获取和设置设备DMX地址,这个包我之前的文章也有介绍过
需要注意的就是,当前设备通道占用为零时,返回的DMX地址应当是0xFFFF
(24)获取通道相关信息之通道信息
这三个包就比较复杂了,先看第一个包。
获取通道信息返回如下,前16为是通道的编号,如果有16个通道就从0编到15.
中间八位是通道类型,描述通道是用于什么功能,如下图,这些参数只有真正开发过舞台产品才能知道是什么意思
ST_PRIMARY 0x00 槽直接控制参数(对于16位参数,表示粗调)
ST_SEC_FINE 0x01 细调,用于16位参数
ST_SEC_TIMING 0x02 槽设置关联参数的时间值
ST_SEC_SPEED 0x03 槽设置关联参数的速度/速率
ST_SEC_CONTROL 0x04 槽为参数提供控制/模式信息
ST_SEC_INDEX 0x05 槽设置关联参数的索引位置
ST_SEC_ROTATION 0x06 槽设置关联参数的旋转速度
ST_SEC_INDEX_ROTATE 0x07 组合索引/旋转控制
ST_SEC_UNDEFINED 0xFF 未定义的次级类型
最后16位表示的是通道ID,只有ST_PRIMARY才能有ID,其他类型的ID为主要类型的偏移量。例如通道零是主要类型,那它就有通道ID,通道二三是通道零的附加类型,那他们的ID就分别是0x0001,0x0002。关于通道ID的定义也是有规范的,这里篇幅有限,不介绍了,可以翻官方文档的表C-2。如果ID是0xFFFF表示通道的定义是通过下面的数据包获取。
(25)获取通道相关信息之通道ID文本描述
没什么好说的,数据包如下,所有通道ID都应当可以获取到文本描述,如果不支持就在响应类型中填入NR_DATA_OUT_OF_RANGE
(26)获取通道相关信息之通道默认值
一般情况下,通道的默认值就是0x00,但奈何不了某些设备通道的默认值不是0,这时就需要确认通道的默认值,数据包格式很简单,前16位表示通道几,后八位表示通道默认值
后续会完善剩余的数据包,有空的话把数据包的代码给补全再单独出一篇文章。