用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
2019-5-1 00:48:07 SchumyHao ioBroker开发者 楼主 5887
本文为SchumyHao原创文章,未经许可,严禁转载! https://bbs.iobroker.cn/thread-69-1-1.html

ioBroker的mqtt适配器

MQTT协议相信对每一个接触智能家居的用户,都不会很陌生。许多智能设备都通过此协议与云端或智能家居平台通信,ioBroker与其他智能家居平台一样,也有系统自带的mqtt适配器

此图片大概描述了mqtt协议的工作过程。
mqtt_basic_working_mode.gif

安装适配器

首先需要明确一下,ioBroker有关mqtt的适配器有两个,一个是MQTT Broker/Client,另一个是MQTT client

这篇帖子介绍的是MQTT Broker/Client(版本2.0.4)。

安装mqtt适配器和其他适配器一样,在管理员页面,点击添加实例按钮安装即可。

mqtt_install.png

配置适配器

这个适配器分为Broker(也就是接收所有mqtt消息的中枢)和Client(发布mqtt topic或者订阅mqtt topic)两种模式。我们可以创建多个适配器分别工作在Broker和Client状态下,互不影响。此帖先讲Client相关的内容。

Client通信配置

mqtt_client_config_connection.png

这页是基本的通信配置页面。主要需要配置以下几个参数

  • Type:实例的类型,是Broker模式还是Client模式。此处我们选择Client模式。
  • URL:创建连接的IP地址,需要和Broker的IP一致。
  • port:创建连接的Port,需要和Broker的Port一致。
  • Secure:是否ssl连接。
  • User:创建连接时的用户名,需要和Broker设置的用户名一致。
  • Password:创建连接时的密码,需要和Broker设置的密码一致。
  • Password Confirmation:再次输入连接时的密码。

Client MQTT配置

mqtt_client_config_mqtt.png

  • Subscribe patterns: 订阅哪些topic。
    如果是#表示Broker收到的所有的topic都会发给该Client。
    如果是javascript/#表示Broker只有以javascript/开头的topic,才会转发给该Client。
    如果要订阅多个匹配,使用英文逗号分隔每一个匹配的模式。

  • Prefix for all topics:当此Client发布任何topic的时候,都会在topic前加上这里定义的前缀。
    比如此Client要发布hass-mqtt\0\switch\set这个topic,如果在此处定义Prefix是haha\,则发布出去的topic是haha\hass-mqtt\0\switch\set

  • Mask to publish own states:需要发布哪些ioBroker系统的状态。
    默认不配置的话,此client会监听ioBroker系统所有的对象的状态,并且当状态发生变化时,将这个变化信息发布到Broker。
    比如当hass-mqtt.0.switch.state的值变为false了,此Client就会向Broker发布这样的topichass-mqtt\0\switch\state,值为false
    如果配置此项,仅有此项ioBroker状态变化时才会发布。

  • Publish only on change: 配合上一个描述,如果勾选此项,仅有监听的ioBroker系统状态值发生了变化,才会发布此状态变化到Broker。

  • Publish own states on connection: 配合上上个描述,如果勾选此项,当连接到Broker之后,将监听状态的当前值都发布到mqtt系统中。

  • Trace output for every message:如果勾选此项,在适配器的debug级别的log中,将打印出发出的每一条mqtt消息的详细内容。

  • Send state (ack=true) too:如果勾选此项,监听的ioBroker状态发生变化,不管变化值ack为true与否,都会交与client处理。如果不勾选,只有(ack=false)的状态才会交给client处理。

  • Use different topic for get and set:如果勾选此项,监听的ioBroker状态发生变化后,需要发送给Broker时,会在topic增加\set后缀。从Broker获取topic值时,并不会增加。
    比如hass-mqtt.0.switch.state的值发生了变化,发送给Broker的topic将变为hass-mqtt\0\switch\state\set。而获取state值时,仍然是订阅的hass-mqtt\0\switch\statetopic。

  • Client ID:与Broker建立连接时的ID。

  • Max topic:topic的最长长度。

  • Interval before send topics by connection:当建立连接后,需要等待多久再发送监听的ioBroker状态值。

  • Send interval:发送mqtt消息之间的间隔。

  • Default QoS:发送mqtt消息时QoS值的设置。

  • Default retain flag:发送mqtt消息时retain值的设置。

Client连接后的对象

mqtt_client_config_objects.png

  • info.connection:表示是否与Broker建立了连接。
  • 其他对象是Client收到了自己订阅的topic,但是topic并没有能够对应到ioBroker系统的对象。

Client收到MQTT消息

当Client收到订阅的消息后,分两种情况。

  1. 该消息topic能够符合ioBroker的object的命名规范,比如收到hass-mqtt\0\switch\state这样的topic,此时ioBroker系统中也有对应的hass-mqtt.0.switch.state的对象,那么该消息的值将直接赋值到该ioBroker对象的状态值中。
  2. 该消息topic不符合ioBroker的object的命名规范,比如收到homeassistant\switch\config这样的topic,此时Client适配器会在自己的命名空间内创建这样的对象,并且保存topic的值。

Client发送MQTT消息

MQTT发送消息也有三种方式。

  1. 如之前Client配置中讲到,Client可以配置监听ioBroker系统的指定的对象状态值,当值改变后,会将此对象按照规则转换为topic,并且将状态值作为payload发送出去。
    比如hass-mqtt.0.switch.state对象状态变为false。则会发送一条消息,topic是hass-mqtt\0\switch\state,值为false

  2. 在其他适配器创建ioBroker对象时,如果在native: {topic: "specific/topic/demo"}定义了topic这样的字段,那么当此ioBroker状态发生变化时,topic将以此定义的字段为topic发送mqtt消息。

  3. mqtt client自己命名空间下的所有对象,如果状态值改变了,则也会发送mqtt消息。比如mqtt.0.homeassistant.switch.demo.power的值变为true,则client会发布一条mqtt消息,topic是homeassistant.switch.demo.power(注意此处没有mqtt\0\的前缀),值为true。

下期预告

下一篇帖子将介绍如何配置mqtt server。

使用道具 举报 回复
超级详细的基础教程,学习了。谢谢大佬(传说中的老妖大佬?)。
使用道具 举报 回复 支持 反对
咸味土豆 发表于 2019-5-3 21:30
超级详细的基础教程,学习了。谢谢大佬(传说中的老妖大佬?)。

嗯,是的。

我后期会写mqtt broker的教程。
那个需要写的更多。。。
使用道具 举报 回复 支持 反对
SchumyHao 发表于 2019-5-5 15:23
嗯,是的。

我后期会写mqtt broker的教程。

膜拜老妖。
使用道具 举报 回复 支持 反对

不敢不敢
使用道具 举报 回复 支持 反对
SchumyHao 发表于 2019-5-5 15:23
嗯,是的。

我后期会写mqtt broker的教程。

妖神,mqtt broker的教程啥时出呢
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册