工作中需要用 MQTT 与 IOT 客户端数据互通,虽然业务代码是用 Java 开发,但平时为了测试方便,也写了一部分 Node.js 代码来交互。这里分享一下 Node.js 如何与阿里云 MQTT 微消息队列打通。
1开通并配置阿里云 MQTT
可以在 mqtt.console.aliyun.com[1] 开通 MQTT 服务。
开通后注意保存 Access Key
和 Secret Key
。在实例列表中点开实例详情,可以看到 实例id
及 公网接入点 url
。
在实例详情页左侧栏中依次点开 Topic 管理
和 Group 管理
,并新建一个 Topic
及 Group Id
。

以上工作完成后,我们看 Node.js 这边要做什么。
2Node.js 连接阿里云 MQTT
首先安装客户端库:
npm install mqtt
连接前,先要了解签名鉴权的格式[2]。
这里我们选择以 username
+ password
的形式鉴权,其中:
-
username
的格式是:Signature|Access Key
|实例 id
。 -
password
的格式是:用Secret Key
作为密钥, 对Client Id
进行 HMAC-SHA1 加密,将得到的二进制数组进行 Base64 编码的结果,就是password
。
我们先写一个 hmac-sha1.js
,它主要用来生成 password
:
import crypto from 'crypto';
/**
* 根据 secret key 和 client id 生成 password
*
* @see https://help.aliyun.com/document_detail/48271.html
*/
export const sha1 = (secretKey, clientId) => crypto.createHmac('sha1', secretKey)
.update(clientId)
.digest('base64');
再写一个 client.js
的文件用来连接:
import mqtt from 'mqtt';
import {sha1} from "./hmac-sha1";
const instanceId = '实例id';
const accessKey = 'xxx';
const secretKey = 'yyy';
const groupId = 'GID_TEST_YOUMOO';
const clientId = `${groupId}@@@youmoo`;
const client = mqtt.connect('mqtt://xxx.mqtt.aliyuncs.com:1883', {
clientId,
protocol: "tcp",
username: `Signature|${accessKey}|${instanceId}`,
password: sha1(secretKey, clientId),
});
client.on('connect', (e) => {
console.log(clientId, 'connected');
});
如果运行该文件,可以看到如下输出:

说明连接成功了。
我们再实验一下 pub/sub 功能:
const parentTopic = 'Topic-Test-Youmoo';
const topic = `${parentTopic}/youmoo`;
client.on('connect', (e) => {
console.log(clientId, 'connected');
// 订阅
client.subscribe(topic, err => {
if (err) {
throw err;
}
// 发布
client.publish(topic, "Hello mqtt");
});
});
// 监听消息
client.on('message', function (topic, message) {
console.log({topic, message: message.toString()})
});
运行该代码,可以看到:

发送 p2p 消息
有时我们想给某一台特定的设备发消息,此时可以发 p2p 消息,此类消息的 Topic 结构比较特别,其格式是:Parent Topic
/p2p/Client Id
。
const parentTopic = 'Topic-Test-Youmoo';
const topic = `${parentTopic}/youmoo`;
const p2pTopic = `${parentTopic}/p2p/${clientId}`;
client.on('connect', (e) => {
console.log(clientId, 'connected');
// 订阅
client.subscribe(topic, err => {
if (err) {
throw err;
}
// 发布普通消息
client.publish(topic, "Hello pqtt");
// 发布 p2p 消息
client.publish(p2pTopic, "Hello p2p");
});
});
// 监听消息
client.on('message', function (topic, message) {
console.log({topic, message: message.toString()})
});
运行代码,得到如下输出:

注意:p2p 消息不需要客户端主动订阅,在监听消息时,要注意 topic
的值。
好了,以上就是简单的使用入门了。
参考资料
mqtt.console.aliyun.com: https://mqtt.console.aliyun.com/
[2]
签名鉴权模式: https://help.aliyun.com/document_detail/48271.html
原文始发于微信公众号(背井):Node.js 连接阿里云 MQTT 微消息队列
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246628.html