前言

本文是在 Snap! 中使用 MQTT 插件的笔记。

对 Snap! 不了解的读者,推荐 @angilent 的图形编程工具 Snap! 初探

Snap! 的 MQTT 插件

Snap! 内置了 MQTT 插件:

有了 MQTT 插件,我们就可以在 Snap! 与其他平台之间传递消息。

一旦能够在对象之间异步(pub/sub)传递消息,几乎就可以做任何事情

消息:应将计算视为对象的固有功能,可以通过发送消息统一调用它们。 – Smalltalk背后的设计原则

如何使用

最简单的方式是从这个例子开始。

我将其视为在 Snap! 中使用 MQTT 插件的最佳实践。

注意事项

其中有两处值得注意:

MQTT connect 积木下拉菜单里内置了四个 MQTT broker。如果你使用自己的 MQTT broker (比如我的例子), 你需要自己填入 MQTT broker 的 url。具体规则可以右键积木, 查看帮助(帮助里也解释了 options, 第一个参数是用户名,第二个参数是密码…)。 如果你使用自己的 broker ,要确保它支持 wss 连接。

MQTT subscribe 积木中, on each message run 后边的参数是积木(作为回调函数),每当收到相关主题的消息,就执行这些积木参数。回调函数会传入两个参数(按顺序), 第一个参数是 payload, 第二个参数是 topic 。 我使用 broadcast 作为通用的回调函数,它负责将消息广播出去,然后由事件积木处理,这样的好处是,可以动态地决定如何处理 MQTT 消息,而不必直接修改 subscribe 回调函数(多次订阅会导致累积,除非重新 connect)。

从这个例子开始Snap! 的 MQTT 之旅,或许是不错的选择。

更多 MQTT 插件的使用方法,可以查看 MQTT 插件最后一个积木(MQTT Extension Examples)的定义。

进阶: client-server 模式

MQTT 协议围绕 pub/sub 构建, 是一种异步消息系统, 有时候我们想要同步的 client-server 模式(HTTP 就采用了 client-server 模式): 你希望发送一个请求,然后得到这个请求被处理的结果(request-response)。

基于 pub/sub 可以构建出 client-server 消息模式。 Snap! 的 MQTT 插件内置了实现 client-server 的积木。这并不是 MQTT 协议的内置模式,所以它无法与其他 MQTT 客户端协作,只能在不同的 Snap! 页面之间协作。

如果你想基于 MQTT 构建更为通用的 client-server 系统。可以查看这些积木的实现方式,弄懂原理后在其他 MQTT client 里(诸如 Python paho-mqtt)实现相应机制。

你也可以自行实现,原理可以参考我之前的这篇文章: 建立在异步消息之上的同步指令: 分别在JavaScript、Python、Squeak上实现