Node.js 连接阿里云 MQTT 微消息队列

工作中需要用 MQTT 与 IOT 客户端数据互通,虽然业务代码是用 Java 开发,但平时为了测试方便,也写了一部分 Node.js 代码来交互。这里分享一下 Node.js 如何与阿里云 MQTT 微消息队列打通。

1开通并配置阿里云 MQTT

可以在 mqtt.console.aliyun.com[1] 开通 MQTT 服务。

开通后注意保存 Access KeySecret Key。在实例列表中点开实例详情,可以看到 实例id公网接入点 url

在实例详情页左侧栏中依次点开 Topic 管理Group 管理,并新建一个 TopicGroup Id

Node.js 连接阿里云 MQTT 微消息队列

以上工作完成后,我们看 Node.js 这边要做什么。

2Node.js 连接阿里云 MQTT

首先安装客户端库:

npm install mqtt

连接前,先要了解签名鉴权的格式[2]

这里我们选择以 username + password 的形式鉴权,其中:

  1. username 的格式是:Signature|Access Key|实例 id
  2. 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');
});

如果运行该文件,可以看到如下输出:

Node.js 连接阿里云 MQTT 微消息队列

说明连接成功了。

我们再实验一下 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()})
});

运行该代码,可以看到:

Node.js 连接阿里云 MQTT 微消息队列

发送 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()})
});

运行代码,得到如下输出:

Node.js 连接阿里云 MQTT 微消息队列

注意:p2p 消息不需要客户端主动订阅,在监听消息时,要注意 topic 的值。


好了,以上就是简单的使用入门了。

参考资料

[1]

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!