一、KNX协议是什么
KNX协议标准由欧洲电信标准协会(ETSI)制定,是全球最流行的智能家居和楼宇自动化协议之一。
1、使用场景:广泛应用于智能家居、楼宇自动化、工业自动化,使用标准化的通信协议,它允许照明、供暖、通风、安全以及音视频设备等通过一个统一的平台进行通信和控制。
2、传输介质:支持多种传输介质,包括双绞线(TP)、电力线通信(PL)、无线射频(RF)以及IP/Ethernet。这种多样性使得KNX既适用于新建建筑,也适合旧建筑改造。
3、设备类型:KNX的设备类型丰富,包括为KNX总线提供电力的电源、控制电气负载的执行器、检测环境参数的传感器以及连接和桥接多个KNX线路或区域的区域耦合器等。
4、拓扑结构:KNX的拓扑结构非常灵活,可以根据建筑的具体需求进行设计。一般分为总线型、星型、树型拓扑结构。一个典型的KNX系统由多个线路组成,每条线路可以连接多达64个设备。通过使用线路中继器或线路耦合器,系统可以进行扩展,以适应更大的建筑或更复杂的控制需求。拓扑的层次结构是:线路、干线(域)、主干线。KNX采用分层结构,分为域和线路;一个系统有15个域,每个域有15条线路,每个线路有64个设备。大型KNX网络中支线/干线耦合器(路由器)和中继器是构建整个网络的关键设备。详见:https://blog.51cto.com/xiaoyaoyou10/5467893
5、地址分配:每个连接到KNX总线上的设备都被分配一个唯一的个体地址,用于标识和通信。组地址则用于多个设备之间的通信,代表系统中的特定功能或控制点。组地址是KNX系统中设备间通信的关键,它确保了不同设备能够按照预设的功能协同工作。组地址由三个部分组成:主线、中间线和末端线。主线表示设备类型,中间线表示设备的功能或应用,末端线表示具体的数据对象。
6、通信协议:KNXnet/IP是KNX系统中用于通过IP网络传输数据的通信协议,它允许从任何有网络连接的地方远程访问、控制和监控KNX安装。KNX支持三种通信模式:广播模式(Broadcast),单播模式(Unicast)和组播模式(Multicast)。广播模式下,消息发送到总线上的所有设备。单播模式下,消息仅发送到指定的设备。组播模式下,消息发送到特定的设备组。设备节点可以发送状态和事件信息到总线上,其他设备可以监听并相应地作出反应。这允许设备节点之间的实时数据交换和联动操作。KNX协议提供了安全机制来保护通信数据的机密性和完整性。这包括对通信包进行加密和身份验证,以防止未经授权的访问和攻击。
7、软件工具:ETS是一款综合性软件,用于配置、编程和调试基于KNX的系统。KNX系统的构建和各种参数设置都需要ETS软件。ETS软件安装好后数据库是空的,需要将各个制造商产品的参数导入数据库;KNX认证过的产品应当会有光盘之类的介质存储相关的产品信息。而KNX Virtual是一个虚拟环境,允许用户在没有实际硬件的情况下模拟KNX系统,为学习和培训提供了平台。
8、使用成本:KNX协议的设备价格相对较高,ETS软件专业版大概8000元左右,系统的整体成本较高。关于java的学习资料较少,相关参考资料不多,使用难度较大。
二、使用方法
1、本地win10系统安装KNX Virtual 版本2.5.0报错,提示安装新版本。KNX Virtual 版本是2.6.0,ETS5给设备添加属性报错。KNX Virtual2.6.0需要和ETS6配套使用。ETS6.0.6 导入产品属性,提升网络连接错误。看官方文档,这个版本不适用接口功能,需要升级到6.2.0版本。综上所述,KNX Virtual2.6.0和ETS6.2.0 可以兼用。
2、使用教程:
KNX Virtual下载需要注册网站、目前只能下载最新版本,官网地址:
https://id.knx.org/
ETS软件不同版本优化功能和下载网站:
https://support.knx.org/hc/zh-cn/articles/16832350936210-ETS-v6-2-0
KNX ETS5入门到精通:
https://www.bilibili.com/video/BV1nT4y1D7JT/
KNX ETS6零基础免费学入门到精通:https://www.bilibili.com/video/BV1ng4y1H7AF/
ETS6可以检测到KNX设备(产品目录),对设备物理地址、组地址进行编辑,然后下载应用到设备。程序可以通过组地址对设备进行操作。KNX Virtual重启后,不会保留之前的状态。
三、java程序读写订阅Demo实现
1、前提:java11及以上版本。
2、源码地址:https://gitcode.com/gh_mirrors/ex/examples/overview?utm_source=highlight_word_gitcode&word=examples&isLogin=1
3、代码中的DefaultKnxClient.createStarted()改成DefaultKnxClient.createStarted(“127.0.0.1:3671”) 不然会报错。
改成本地局域网ip:192.168.23.252:3671和localhost:3671也可以。
4、必须在ETS6上设置组地址是可读的,才能读取到该组地址的值。
5、ETS6取消组地址的链接,下载应用后,程序就不能操作该组地址了。
6、支持订阅全部的组地址,通过添加自定义插件,重写ObserverPlugin接口的onIncomingBody方法,过滤出订阅的组地址。KNX设备只要触发,就会订阅到,没有去重的逻辑。
出现的问题:订阅启动后,在KNX Virtual面板上操作,可以订阅到,然后通过程序写入,订阅不到了,在面板上操作也订阅不到了,重启也订阅不到了。
四、底层源码实现
订阅从实现到监听:
DefaultKnxClient=》createStarted
BaseKnxClient=》() =>start=>startTunneling=》startServices=》
CommunicatorFactory=》newControlChannelCommunicator
ControlChannelCommunicator=》()=》createInboxQueue
AbstractKnxQueue=》run=》action=》add
订阅从源头到实现:
AbstractInboxQueue=》run=》action=》add
InternalKnxClient=》notifyIncomingBody
PluginManager=》notifyIncomingBody
ObserverPlugin=》onIncomingBody
观察者模式的应用:
PluginManager 主题实现,插件管理器。注册了观察者插件observerPlugins
观察者接口:ObserverPlugin 观察者实现:MyPlugin