【问题标题】:mqtt serial message without ethernet没有以太网的 mqtt 串行消息
【发布时间】:2016-06-04 23:43:08
【问题描述】:

我所看到的所有地方,如果涉及 MQTT 消息传递,它都是通过以太网进行的。很遗憾,我没有可用的以太网线。

我正在自动化我的家,想使用 mqtt 作为消息服务。我的按钮向运行 mqtt 客户端的 arduino 板发出信号(如灯“开”)。如何在串行线路上输出 mqtt 消息,以便 mqtt 代理可以直接接收传输的消息,而不使用以太网电缆?

【问题讨论】:

  • 你家里有什么样的接线?您使用的是 RS-232/RS-485 吗?全双工还是半双工?
  • 都是EIB,4线
  • 我相信有一个用于串行的 mqtt 的变体,但它可能更简单地获得 mqtt 需要的东西,它是使用例如在串行上运行的 tcp 连接。 Ppp 或 njh 所说的使用 slip。当然,您需要将所有 arduino 连接带到您的 mqtt 代理,因此需要具有多个串行端口的硬件,购买以太网交换机和使用以太网可能更便宜。或者你可以把你的arduino放在wifi上吗?
  • 完全避免布线问题,使用带wifi的NodeMCU?

标签: arduino mqtt


【解决方案1】:

由于我一直在寻找相同的答案并且没有找到任何我喜欢的东西,我决定编写一个实现,使任何蓝牙、USB 或纯串行端​​口通信都能够发送 MQTT 消息。你可以在这里找到结果:https://github.com/vortex314/serial2mqtt 它使任何 linux 机器(Raspberry Pi 1、Raspi 3、PC)都可以充当网关。 它是用 C++ 编写的,因此对于小型设备来说应该足够轻量级。 希望这会有所帮助。

27/6 更​​新:构建文件夹包含 Linux Intel 和 Raspberry 的预构建版本。

【讨论】:

    【解决方案2】:

    我正在尝试为我的家庭自动化实现类似的目标,尽管我的墙上确实有 Cat5e,所以可以使用以太网。

    以下是通过串行通信使用 MQTT 的一些可能性:

    • 在 Arduino 和网关之间使用 SLIP。通过串行实现 TCP/IP 的 SerialIP 客户端库:http://playground.arduino.cc/Code/SerialIP。虽然我没有测试这是否适用于 MQTT 客户端库。 Nick O'Leary 的 MQTT 客户端理论上适用于 Arduino 'Client' 类的任何实现。
    • 也许可以直接通过串行实现 MQTT,无需 TCP/IP,尽管我不知道有任何网关可以做到这一点。
    • MQTT-SN(与 MQTT 略有不同的协议)设计用于通过不可靠的传输方式发送消息,并且可能更适合串行线路。如果您对仅发布感兴趣,我编写了一个非常 基本库以通过串行方式发送 MQTT-SN 数据包:https://github.com/njh/DangerMinusOne
    • 您可以在 Linux 网关上使用 Node-RED 之类的东西,将其他串行协议(Firmata?)与 Arduino 通信,然后使用 Node-RED 转换为 MQTT。

    我确实开始研究 MQTT 而非串行实现,但我没有解决的问题之一是如何处理多个设备:

    • 向 Linux 添加大量串行端口是复杂的/昂贵的(有点像https://twitter.com/njh/status/570298977310150656
    • 可靠的长距离串行需要额外的 RS-485 组件
    • MQTT 在半双工上不能很好地工作,没有额外的软件层来处理主节点轮询从节点的消息

    所以我目前正在考虑为 ENC28j60 以太网控制器实现 MQTT-SN...

    【讨论】:

      【解决方案3】:

      对于 SLIP,还有向后兼容的 SlipMux,可以轻松支持 MQTT 数据包类型。另见:sending packets over serial comms java

      您可以构建一个简单的代理,在一侧将 MQTT 数据包转换为 SlipMux 数据包,并在另一侧解码数据包。 MQTT 实现应该不会注意到任何事情。

      【讨论】:

      • “另一边”的 mqtt 数据包是壁挂式 arduino 微板,它没有资源(读取内存)来实际实现不仅仅是基本的串行通信
      • 您不需要更多的读取内存。您只需要花费一点点 CPU 就可以将转义字符替换为非转义版本。这可能需要提前查看 1 个字符。当使用 SlipMux 而不是 Slip 时,您会在消息的开头获得一个额外的字节。在 API 之类的流中可以很好地实现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多