请教一下,如何通过 EMQX 的 API 向 EMQX 的主题推送消息?
👍
积分差一点,刷一下
我也买了个科信的 ttl,发送的文本内容是什么呢?直接发汉字貌似不能播放,用他的软件转成 modbus rtu 协议 GB2312 码,也没播放啊。谢谢了
https://bbs.mingdao.net/topic/5690
这是我实现的方式,你参考一下看看
![](https://mdbbs.oss-accelerate.aliyuncs.com/images/2022/07/24/9d3ab6ba9fc754459ebd376d29990b07.png!avatar)
Authoration 可以用明道的组件去获取,也可以自己写代码块实现
// 用户名和密码 const username = 'yourusername'; const password = 'yourpassword'; // 将用户名和密码合并,并编码为 Base64 const authorization = Buffer.from(`{username}:{password}`).toString('base64'); output = { authorization: authorization }
另外,这个是 Linux 的命令行去获取的方式,
echo -n "yourusername:yourpassword" | base64
方式有很多
我也买了个科信的 ttl,发送的文本内容是什么呢?直接发汉字貌似不能播放,用他的软件转成 modbus rtu 协议 GB2312 码,也没播放啊。谢谢了
Authoration 可以用明道的组件去获取,也可以自己写代码块实现
// 用户名和密码 const username = 'yourusername'; const password = 'yourpassword'; // 将用户名和密码合并,并编码为 Base64 const authorization = Buffer.from(`{username}:{password}`).toString('base64'); output = { authorization: authorization }
另外,这个是 Linux 的命令行去获取的方式,
echo -n "yourusername:yourpassword" | base64
方式有很多
多谢大神指导,现在已经实现了通过 API 向 EMQX 推送数据,并且在昆仑通态触摸屏上实现数据交互,这样在通过 webhok 就可以实现数据双向的流通了,不过触摸屏 MQTT 局限还是传输汉字的时候不能成功,只能传输英语字符和数字,然后 200 块钱买个科星的 TTL 转语音,通过 python 代码块向设备推送文本,实现了语音播报,这样每笔订单都能播报客户某某某,下单什么货多少数量,如果有想这么搞的,可以多交流。
Authoration 可以用明道的组件去获取,也可以自己写代码块实现
// 用户名和密码
const username = 'yourusername';
const password = 'yourpassword';
// 将用户名和密码合并,并编码为 Base64
const authorization = Buffer.from(`{username}:{password}`).toString('base64');
output = {
authorization: authorization
}
另外,这个是 Linux 的命令行去获取的方式,echo -n "yourusername:yourpassword" | base64
方式有很多
通常情况,建议先用 postman 等工具来验证 API,然后再结合 postman 的设置,配置到 mingdao 中,这样效率会更高一些
嗯,你可以看下官网,官网的例子是这样的调用,注意 -u
这个不分
上述调用方式,还有另外一种形态,就是把 -u 后面的用户名和密码,用 base64 编码了
以下是我这边测试的两种调用方式
所以,你可以仿照上述的方式来完成鉴权
根据你提供的截图,应该是第二种方式,所以,你可以这样去调整
这个是 HTTP 的方式,确实比较简单
先去 MQTT 系统中,创建一个 API
这里用 postman 测试了下,可以正常发送指令
老哥,我试了一下,在 API 接口集成中添加的,但是一直失败,我看了一下调用历史,明道云是把用户名和密码都转换成一个参数传出去了,返回值说是鉴权错误。直接自定义 API 接口也不行,试了两天还没搞定,过来请教一下
这个是 HTTP 的方式,确实比较简单
先去 MQTT 系统中,创建一个 API
这里用 postman 测试了下,可以正常发送指令
多谢 多谢 我先去试试 API 的吧,改环境还是太麻烦了
这个是 HTTP 的方式,确实比较简单
先去 MQTT 系统中,创建一个 API
这里用 postman 测试了下,可以正常发送指令
不需要这么麻烦的,直接代码块给 emqx 发 payload 消息就完事了。
嗯,之前说的方法是基于 MQTT 协议来实现的集成,你也可以参考他提到的方法,使用 HTTP 方式来实现
这个是官方 API 文档,可以参考下,会比 MQTT 的要简单些
https://docs.emqx.com/zh/emqx/v5.7/admin/api-docs.html#tag/Publish/paths/~1publish/post
我这边是可以的,感觉你应该是哪里没有配置正确
这个是我这边的配置文件
我这边没有对容器的名字做修改
不需要这么麻烦的,直接代码块给 emqx 发 payload 消息就完事了。
如果你对容器中的目录不是很确定时,可以登录到容器中,进行查看
docker exec -it script_command_1 bash
ls /usr/local/node-20.11/
docker 容器的名字变了,是 script_commandv2_1,进入容器后 npm 命令无效,搞来搞去一个问题接一个问题,头疼啊。持久化修改配置文件的时候,需不需要把配置文件的 command 修改为 script_commandv2_1,
如果你对容器中的目录不是很确定时,可以登录到容器中,进行查看
docker exec -it script_command_1 bash
ls /usr/local/node-20.11/
是这样的,官方文档,用的例子还是 10.18.0
版本,而你用了最新的 registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-command:node2011-python312
,docker cp 中有一些路径就需要跟着来调整了
docker cp $(docker ps | grep command | awk '{print $1}'):/usr/local/node-20.11/lib/node_modules/ /data/mingdao/script/volume/command/package/nodejs-20.11/
/usr/local/node-20.11/lib/node_modules/
这个是你出问题的地方,应更换为新镜像里面的文件路径
/data/mingdao/script/volume/command/package/nodejs-20.11/
这个结合你实际来调整,是宿主机上进行持久化的目录
可以现在 nodejs 的环境下进行测试,然后再考虑迁移到 mingdao 代码块的环境
vscode + nodejs 就可以了
老哥,还得请教一下,我现在做好了环境的更新,安装了 20.11 的 nodejs,但是在做持久化的时候遇到了问题,做到第二步的时候命令输入不行,之前做持久化的时候可以,现在我把版本号改成 10.18.0 输入命令也无法执行,是不是这个现在找不到镜像导致的?能否指导一下怎么处理吗?纯小白,只会简单的用点 docker。🎉️
可以现在 nodejs 的环境下进行测试,然后再考虑迁移到 mingdao 代码块的环境
vscode + nodejs 就可以了
参考了如何在 Node.js 项目中使用 MQTT,基本实现了通过按钮控制智能开关的打开和关闭。
在 mingdao 中使用代码块实现上述逻辑,需要引入 mqtt 模块,需要参考 mingdao 的这一篇如何扩展代码块依赖库
还需要注意,下载 mqtt 模块,需要高版本的 nodejs,需要将
registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-command:node1018-python36
升级到registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-command:node2011-python312
以下是代码块中的代码
/** * 数字孪生智慧楼宇-下发指令-下发指令给MQTT * @author zxm * @version 1.0 * @date 2024-06-14 * @memo 注意 output 的位置,且 client.on 里面的 console.log 都要注释,否则会报错 '程序返回值序列化失败' */ const mqtt = require('mqtt'); const mqttUrl = input.mqttUrl; const devEUI = input.devEUI; const type = input.type; const data = input.data; // 创建客户端实例 const options = { clean: true, connectTimeout: 4000, // 认证信息 clientId: 'emqx_mingdao', // username: '', // password: '', }; // 定义返回结果 let ret = { "status": 0, "msg": "成功", "data": "" }; // 定义 topic const topic = '/milesight/downlink/' + devEUI; // 组装 message let message_data = ""; if (type === "智能移动插座") { // 打开 { "confirmed": true, "data": "CAEA/w==", "fPort": 85 } // 关闭 { "confirmed": true, "data": "CAAA/w==", "fPort": 85 } if (data === "开") { message_data = "CAEA/w=="; } else if (data === "关") { message_data = "CAAA/w=="; } else { ret.status = 2; ret.msg = "失败,指令错误"; ret.data = "传入的指令未配置,请检查,devEUI: " + devEUI + " type: " + type + " data: " + data; } } else { ret.status = 1; ret.msg = "失败,分类未配置"; ret.data = "传入的分类未配置,请检查,devEUI: " + devEUI + " type: " + type + " data: " + data; }; const message = `{ "confirmed": true, "data": "${message_data}", "fPort": 85 }`; const client = mqtt.connect(mqttUrl, options); // 当连接成功时触发,参数为 connack // 消息发布 client.on('connect', () => { // console.log('Connected'); client.publish(topic, message, { qos: 0, retain: false }, (error) => { if (error) { // console.error(error); } }); client.end(); }); // 在断开连接以后触发 client.on('close', function () { // console.log('Disconnected'); // output = ret; 放到此处,会报错 'output is not defined at api' }); // output 此行代码放在代码块中执行,会优先完成 // 但上述业务代码也只有两种情况,执行成功,或者是执行超时,如果超时,代码块是会报错的 // 所以,整体来看,要么必定返回 { status: 0, msg: '成功', data: '' } 要么,代码块执行超时 output = ret; // console.log('output', output);
非常感谢大神指导,晚上我去试试,👍 👍 🚀️
升级到 20.11 版本 nodejs,并做了持久化之后,进入容器安装 mqtt 库即可,这个是我这边操作的日志
嗯,我也是问了 mingdao 的小机器人助理知道的,x86 架构,这个镜像是有的
参考了如何在 Node.js 项目中使用 MQTT,基本实现了通过按钮控制智能开关的打开和关闭。
在 mingdao 中使用代码块实现上述逻辑,需要引入 mqtt 模块,需要参考 mingdao 的这一篇如何扩展代码块依赖库
还需要注意,下载 mqtt 模块,需要高版本的 nodejs,需要将 registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-command:node1018-python36
升级到 registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-command:node2011-python312
以下是代码块中的代码
/**
* 数字孪生智慧楼宇-下发指令-下发指令给MQTT
* @author zxm
* @version 1.0
* @date 2024-06-14
* @memo 注意 output 的位置,且 client.on 里面的 console.log 都要注释,否则会报错 '程序返回值序列化失败'
*/
const mqtt = require('mqtt');
const mqttUrl = input.mqttUrl;
const devEUI = input.devEUI;
const type = input.type;
const data = input.data;
// 创建客户端实例
const options = {
clean: true,
connectTimeout: 4000,
// 认证信息
clientId: 'emqx_mingdao',
// username: '',
// password: '',
};
// 定义返回结果
let ret = {
"status": 0,
"msg": "成功",
"data": ""
};
// 定义 topic
const topic = '/milesight/downlink/' + devEUI;
// 组装 message
let message_data = "";
if (type === "智能移动插座") {
// 打开 { "confirmed": true, "data": "CAEA/w==", "fPort": 85 }
// 关闭 { "confirmed": true, "data": "CAAA/w==", "fPort": 85 }
if (data === "开") {
message_data = "CAEA/w==";
} else if (data === "关") {
message_data = "CAAA/w==";
} else {
ret.status = 2;
ret.msg = "失败,指令错误";
ret.data = "传入的指令未配置,请检查,devEUI: " + devEUI + " type: " + type + " data: " + data;
}
} else {
ret.status = 1;
ret.msg = "失败,分类未配置";
ret.data = "传入的分类未配置,请检查,devEUI: " + devEUI + " type: " + type + " data: " + data;
};
const message = `{ "confirmed": true, "data": "${message_data}", "fPort": 85 }`;
const client = mqtt.connect(mqttUrl, options); // 当连接成功时触发,参数为 connack
// 消息发布
client.on('connect', () => {
// console.log('Connected');
client.publish(topic, message, { qos: 0, retain: false }, (error) => {
if (error) {
// console.error(error);
}
});
client.end();
});
// 在断开连接以后触发
client.on('close', function () {
// console.log('Disconnected');
// output = ret; 放到此处,会报错 'output is not defined at api'
});
// output 此行代码放在代码块中执行,会优先完成
// 但上述业务代码也只有两种情况,执行成功,或者是执行超时,如果超时,代码块是会报错的
// 所以,整体来看,要么必定返回 { status: 0, msg: '成功', data: '' } 要么,代码块执行超时
output = ret;
// console.log('output', output);