C-Bus
C-Bus 是 Clipsal 专有的家庭与楼宇自动化总线,用于通过由 C-Bus 设备(继电器、调光器、传感器、面板)组成的低速串行网络控制照明、暖通空调(HVAC)、安防等类似的楼宇服务。网络通过 PC 接口(PCI)单元接入,驱动通过 TCP 与该单元通信。
Go 驱动功能完整:可读取状态、发送 SAL 命令、监控 SAL 与 MMI 流量,并浏览已安装的设备。Java 驱动仅能建立连接;它没有标签处理器,且下面四项操作均未实现。
支持的操作
| 名称 | 值 | 描述 |
|---|---|---|
read | 通过 status/ 标签读取设备的状态。 | |
write | 通过 sal/ 标签发送 SAL 命令。 | |
subscribe | 通过 salmonitor/ 或 mmimonitor/ 标签监控 SAL 或 MMI 流量。 | |
browse | 通过 info/ 查询发现已安装的设备及其属性。 |
连接字符串
C-Bus 的连接字符串格式如下:
c-bus:{transport}://{ip-address}:{port}?{options}唯一支持的传输方式是 tcp,在未指定端口时,它会连接到 PCI 的默认端口 10001:
c-bus:tcp://192.168.42.11连接字符串选项
名称
类型
默认值
必填
描述
名称
Clipsal C-Bus
代码
c-bus
Maven 依赖
<dependency>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-driver-c-bus</artifactId>
<version>1.0.0</version>
</dependency>默认传输
tcp
支持的传输协议
tcp
配置选项:
srchk
BOOLEAN
false
源校验。
传输配置选项:
tcp
tcp.connect-timeout-ms
INT
5000
以毫秒为单位的连接超时时间。
tcp.read-timeout-ms
INT
0
Socket 读取超时时间(毫秒)。0 表示不超时。
tcp.write-timeout-ms
INT
0
以毫秒为单位的套接字写入超时时间。0 表示不超时。
tcp.no-delay
BOOLEAN
true
启用 TCP_NODELAY(禁用 Nagle 算法)。
tcp.keep-alive
BOOLEAN
false
启用 SO_KEEPALIVE。
tcp.send-buffer-size
INT
81920
发送缓冲区大小(字节)。设为 0 表示使用系统默认值。
tcp.receive-buffer-size
INT
81920
接收缓冲区大小,以字节为单位。0 表示使用系统默认值。
tcp.local-address
STRING
要绑定到的本地地址(可选)。若未设置,则使用默认值。
tcp.local-port
INT
0
要绑定的本地端口(可选)。0 表示使用临时端口。
标签地址
标签地址的寻址仅在 Go 中实现。Java 驱动可以连接,但未实现任何操作,也没有标签处理器。各实现具体支持的功能请参阅协议支持矩阵]。
通用格式
标签地址由五种带前缀的形式之一构成。每种形式都可以携带一个可选的桥接链(b<address>[-b<address>]{0,5},最多 6 个桥),用于将命令跨桥接网络进行路由。
status/
status/[<bridges>/]binary|level=0xNN/<application> - 读取应用组地址的二进制状态或电平状态。
cal/
cal/[<bridges>-]<unit>/recall=[<param>, <count>]|identify=<attr>|getStatus=<param>, <count>
- 发送给某个单元的设备/网络管理(“CAL”)命令。仅实现了
recall=、identify=和getStatus=;见下文。
sal/
sal/[<bridges>/]<application>/<salCommand> - 向应用程序发送 SAL 命令。
salmonitor/
salmonitor/<unit>|/<application>| - 用于监控某个单元和/或应用的 SAL 流量的订阅标签,或 * 用于任意一个的标签。
mmimonitor/
mmimonitor/<unit>|/<application>| —— 一个订阅标签,用于监控 MMI 流量,其 unit/application/* 结构与 salmonitor/ 相同。
解析器还接受它并未实现的 cal/ 形式:reset、write=[<param>, 0xNN]、identifyReply=<attr>、reply=<param>、status=<app> 和 statusExtended=<app> 均可无错误地解析,但在驱动中被标记为 TODO: implement me,使用时会返回 Not implemented。
sal/ 和 status/ 的应用来自驱动的应用表;其中大多数已实现(LIGHTING、TEMPERATURE_BROADCAST、VENTILATION、IRRIGATION_CONTROL、POOLS_SPAS_PONDS_FOUNTAINS_CONTROL、HEATING、AIR_CONDITIONING、TRIGGER_CONTROL、ENABLE_CONTROL、AUDIO_AND_VIDEO、SECURITY、METERING、ACCESS_CONTROL、CLOCK_AND_TIMEKEEPING、TELEPHONY_STATUS_AND_CONTROL、MEASUREMENT、MEDIA_TRANSPORT_CONTROL、ERROR_REPORTING、HVAC_ACTUATOR),但 RESERVED、FREE_USAGE、ROOM_CONTROL_SYSTEM 和 TESTING 虽可被地址解析器接受,同样尚未实现。
浏览
info/ 并非标签地址——它是一个浏览查询,由 ParseQuery 而非 ParseTag 单独解析,且仅与 browse 操作配合使用:
info/
info/<unit>|/<identifyAttribute>| — 列出已安装的单元,可选择只筛选某一个单元和/或某个识别属性。
数据类型
C-Bus 标签是命令和状态请求,而非带类型的内存地址,因此不使用也不接受 :{data-type} 后缀。值从 C-Bus 响应中解码为 Struct(当为 status/ 时则是 NULL);地址本身没有可供选择的数据类型。
示例
| 地址 | 含义 |
|---|---|
status/binary/LIGHTING | 所有 LIGHTING 组地址的二进制状态 |
status/b1/binary/LIGHTING | 同上,经由一座桥路由 |
status/b1-b2-b3-b4-b5-b6/binary/LIGHTING | 同上,经由六座桥路由 |
cal/2/getStatus=1,2 | 获取参数 1、计数 2 的状态,来自单元 2 |
cal/b1-u2/getStatus=1,2 | 同一 getStatus,经由一座桥路由到单元 2 |
cal/0/recall=[0x20, 4] | 从单元 0 调用参数 0x20 的 4 个值 |
sal/LIGHTING/ON | 向 LIGHTING 应用发送 ON SAL 命令 |
sal/b1/LIGHTING/ON | 同上,经由一座桥路由 |
salmonitor/2/LIGHTING | 监视单元 2 的 SAL 流量,应用为 LIGHTING |
salmonitor// | 监视所有 SAL 流量 |
mmimonitor/2/LIGHTING | 监视单元 2 的 MMI 流量,应用为 LIGHTING |
mmimonitor// | 监视所有 MMI 流量 |
info/0x13/DSIStatus | 针对单元 0x13 的 `DSIStatus 属性的浏览查询 |
info// | 针对每个已安装单元及其所有属性的浏览查询 |
表 1. 示例
注意事项与技巧
数组表示法不适用于 C-Bus 地址:cal/ 命令(例如 recall=[0x20, 4])中的括号承载的是该命令自身的参数(一个参数编号和一个计数),而不是附加在地址上的选择。读取多个值的命令仍会通过标签的数组信息来报告,与其他列表完全一样——只是没有另外叠加一层选择语法。
评论
登录后参与评论
KnowForge