MQTT

大象笔记 > 标签 > MQTT

MQTT 协议

MQTT 的使用场景 例如典型的物联网场景,在一台联网硬件设备被扫码支付之后,需要能及时的解锁使用。最常见的应用场景就是停车场扫码缴费,自动起竿。 MQTT 介绍 MQTT(MQ Telemetry Transport,消息队列遥测传输)是近年来出现的一种新型协议,物联网领域会将其作为标准协议。该协议构建于TCP/IP协议上(同样有基于UDP的版本,叫做MQTT-SN)。MQTT原本是IBM公司开发的协议,现在则开源了,被人们不断开发着。MQTT是一种能实现一对多通信(人们称之为发布或订阅型)的协议。它由3种功能构成,分别是中介(broker)、发布者(publisher)和订阅者(subsc ...

阅读全文...

MQTT QoS 服务质量等级

在查看腾讯云 MQTT 相关接口时,看到一个参数 Qos: 服务质量等级,取值为0或1 什么是 QoS Quality of Service,即服务质量。 看上去比较晦涩,找了本专门介绍 MQTT 的书《Hands-On Internet of Things with MQTT》才理解了。 QoS 给终端带来了一项重要的能力,即,可以接收自己离线时,对方发送的消息。例如,Facebook Messager 也是基于 MQTT 实现的消息机制。所以,本质上 MQTT 还是一个消息队列,MQ 已暴露了一切。。。 MQTT QoS 等级 MQTT 设计了 3 个 QoS 等级。 QoS 0:F ...

阅读全文...

微信小程序支付前,使用 MQTT 检测设备是否在线

需求场景 例如,用户要出停车场,进行扫码支付,但是需要在支付之前判断一下起杆设备是否在线。 如果不在线需要给出提示,防止收了钱,但是没有起杆。 TODO [x] 腾讯云 MQTT 接口 [x] golang api [x] controller 更名为 mqtt.go, 把 mqtt 相关的操作都放在这个 controller 里,方便共用一些配置 [x] 封装 DescribeDevice。参数为 deviceId,获取 device,从而得到设备名,然后 mqtt 查询在线状态 [x] 线上测试 [x] 小程序端:预支付这里调用了两个 http 微信接口,可能等待时间有点长,导致用户点两 ...

阅读全文...

单片机 4G 模块进行 MQTT 通信的抓包方法

设备调试中发现 4G 模块进行 MQTT 通信总是出问题,即 QoS 为 1 的情况下,总是收到重复的 Publish Message。即便回复了正确的 Pub ACK 包,也依旧会收到重复的 Publish Message。但是 Wifi 模块下就没有这个问题。 之前 Wifi 模块是通过笔记本 Wifi 共享,在笔记本上使用 Wireshark 进行抓包调试的。但是 4G 模块由于是直连腾讯云 MQTT 服务器,所以没法使用这种方案调试。后来想了个方案就是在自己的公网服务器上设置个转发服务,本地设备通过这个转发服务跟腾讯云 MQTT 服务器通信。这样就能在服务器上对数据包用 tcpdump ...

阅读全文...

腾讯云 MQTT 由服务器生成长期的设备密码

密码过期问题 登录腾讯云管理后台,物联网通信,设备调试。可以看到提示: 以下MQTT三元组仅用于调试,将于2022-09-05 12:00:00后失效,正式设备请按算法生成 Client ID xxx MQTT Username yyy MQTT Password zzz 由于嵌入式硬件不方便接入腾讯云的 MQTT SDK,所以改成硬件从服务器获取 Username 和 Password。 然后将密码过期时间设置成 50 年,因为硬件设备的寿命大概也不会超过 10 年。虽然不严谨,但是满足目前的需求场景。 Client ID 格式 ${productId}${deviceName} ...

阅读全文...

MQTT Broker 的开源实现 EMQX

想使用 EMQX 的根本原因是,蓝牙网关上报数据推荐使用 MQTT 协议。 而这个消息量巨大,我担心扛不住腾讯云的费用。 使用 MQTT 协议的优势 MQTT 协议自带了账号密码验证机制,以及主题订阅权限 蓝牙网关默认支持 MQTT 协议 TCP 需要自己处理数据粘包问题,而 MQTT 则不需要 UDP 无法保证数据到达的顺序,对于时序数据来说,比较致命。而终端的时间戳我觉得不太可靠 但是首先,我还是想把 EMQX 的文档过一遍。之前虽然在一个项目中用过 MQTT, 可那是基于腾讯云 MQTT 实现的,担心很多概念并不清晰,还是需要看一遍文档。 EMQX 5.0 的文档地址 https: ...

阅读全文...

MQTT go 客户端发布消息

为了方便客户端测试,搭建好 EMQX 服务之后,需要用 golang 写一个发布消息的测试程序。 用于向指定主题推送消息,这样客户端可以提前测试 MQTT 相关的功能。 安装 Eclipse Paho MQTT Go Client > go get github.com/eclipse/paho.mqtt.golang go: downloading github.com/eclipse/paho.mqtt.golang v1.4.1 go: downloading github.com/gorilla/websocket v1.4.2 go: added github.com/ecl ...

阅读全文...

mqtt topic

mqtt 主题名字规范 大小写敏感。推荐使用小写 utf-8 至少一个字符,不要使用空格 结构化名字,以斜杠分隔。例如:house/room1/main-light 主题名长度上限 https://github.com/emqx/emqx/issues/3727 65535 内置的 $SYS 主题 只读 可以查询 broker 版本号,例如,$SYS/broker/version 查询当前时间 查询运行时间 主体何时被创建 当有订阅或者发布时自动创建。但是发布需要主题配置了 retained message 只有当有客户端订阅时,topic 才会被保留,否则会被销毁 订阅多个主题 ...

阅读全文...

golang 解析 byte slice 类型的 MQTT 消息 payload

MQTT Message payload 的类型 可以看到 payload 函数返回 byte slice 类型。 var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { fmt.Printf("TOPIC: %s\n", msg.Topic()) fmt.Printf("MSG: %s\n", msg.Payload()) } type Message interface { Duplicate() bool Qos() byte Retained() ...

阅读全文...

mqtt websocket

MQTT WebSocket URI ws(s)://host:8083/mqtt ws 还是 wss ws (非加密)、wss(SSL 加密) 作为协议标识。 在 HTTPS 下使用非加密的 WebSocket 连接: Google 等机构在推进 HTTPS 的同时也通过浏览器约束进行了安全限定, 即 HTTPS 连接下浏览器会自动禁止使用非加密的 ws 协议发起连接请求; 参考 https://www.emqx.io/docs/zh/v3.0/guide.html#mqtt-websocket-%E8%BF%9E%E6%8E%A5 浏览器 https://www.emqx.com/z ...

阅读全文...

EMQX MQTT 服务配置 WSS 证书

为何要配置 WSS 证书 原本用 EMQX 内置的 8083 端口,就可以实现 mqtt over websocket。 例如,地址: ws://www.sunzhongwei.com:8083/mqtt 但是,由于我又需要在微信小程序里使用 mqtt over websocket,而微信小程序只允许使用 WSS 和 HTTPS 协议。所以不得不配置证书。 WSS 与 WS 的区别 WSS 全称是 Web Socket Secure, 即 WebSocket 的加密版本。类似与 HTTPS 之于 HTTP。 WSS 与 WS 类似于 HTTPS 和 HTTP,不同之处在于是不同的通信协议,都 ...

阅读全文...

微信小程序通过 MQTT Over Websocket 实时获取远程设备运行状态

需要实时拉取的数据 远程设备当前运行状态。比如,是运行中,还是已暂停 设备运行时长 设备上传感器的实时数值 如果通过微信小程序端定时轮询,例如,每 10 秒拉取一次,体验上不够好,因为有肉眼可见的延迟。特殊是设备运行状态这里,点击开始,如果不能立即看已启动状态,那就太 low 了。而 MQTT 协议可以实现实时推送的效果。 小程序后台配置可信域名 在 socket 合法域名里填写。例如: wss://www.sunzhongwei.com 这里是一个大坑,配置时候是 wss,用的时候是 wxs。 配置 WSS 证书 参考EMQX MQTT 服务配置 WSS 证书,由于 WSS 默认是使 ...

阅读全文...