初次尝试!在 Spirit 1 实现 DDC 协议的嗅探器
之前入手了一个搭载了智能边缘计算系统EdgerOS 的设备Spirit 1,通过该设备我们可以将应用与设备连接起来,通过 javascript 应用可以来控制连接的设备,之前就准备弄一个基于 SDDC 协议的红外温度感应的设备接到这个Spirit 1上,来检测下我房间的温度的,关于红外温度感应设备的开发可以参考这篇文章:基于ESP32S 的第一个应用-红外测温枪。
通过 SDDC 协议在爱智的设备应用中扫描、发现、最后添加设备到 Spirit 1上后问题来了(爱智上如何添加设备可以参考这篇文章:边缘计算机 Spirit 1 初体验),我突然意识到自己不知道 Spirit 1 收没收到消息,然后进官网摸索了一个多小时,最终得出了一个结论,他们没有提供可测试的入口 (ノ=Д=)ノ┻━┻。不过好在他们官网我倒是找到了几个小demo,按照官网上的说法,我应该可以自己写一个应用,然后部署到 Spirit 1,这样就可以通过手机去控制设备,同样设备发消息之后我也可以通过应用去获取对应消息内容。
立马我就去官网扫了一下应用开发说明,找到了一个实现这方面功能的模块 device ,唯一不足的是这个模块是 Spirit 1 里面的内置模块,不能在其他系统环境中使用,只支持ZDDC和SDDC协议,不过我这个红外温度感应的就是基于这个SDDC协议的,所以没啥大问题。最后我只能自己去实现一个可以调试的工具应用了, 为此我还特地花费了一晚上去看他们这个应用开发,终于搞出了一个非常非常非常 low 的测试应用,最终也部署上去了。
看一下我最终的成果(wohahaha...省略一万字):
我这里就简单实现了一下,页面画的有点磕碜,只能将就着用了。加了一个设备的选择框,一个发送数据的编辑框,一个设备响应的显示框。
使用的话也比较简单,选中一个设备,然后构建一下要发送的指令消息,然后点击send,应用后端会通过 device 模块将数据在 Spirit 1 中进行处理,最后发送到我写的红外测温的设备中,设备收到消息后会回传给 Spirit 1 当前的环境温度和目标温度,而我的应用后端通过 device 模块也会监听到设备发送的消息,并在前端将其打印出来,这样我以后开发的时候就可以测试设备和 Spirit 1 之间的通信了,只能对自己说一句:忒牛 ୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭ 。
A FEW MOMENT LATER ......
......
下面正经的和大家讲一下实现的技术难点(我胡扯的,(ಡωಡ) hiahiahia),其实实现上面的功能非常的 So Easy,我只用到了官网提供的一个内置模块 device 就完成了,不过我在根据官网说明文档进行开发的时候,发现这个 jsre 和 node.js 很相似,很多功能貌似是直接移植过去的,习惯用 node.js 开发的应该比较容易上手。前端貌似没啥要求,我直接用官网推荐的 vue 进行开发了,还是比较方便的,直接拷贝代码就好了 (ಡωಡ)hiahiahia。
不过这么一个单页面的应用,还是整整消耗了我一天的时间,可能是第一次开发,整个过程中也出现了各种各样的问题,好在最后还是达到预期效果了,我这也算是全栈开发了吧 (〜 ̄▽ ̄)〜。
给大家摆上几行代码长长见识!⁞ つ: •̀ ⌂ •́ : ⁞-︻╦̵̵͇̿̿̿̿══╤─
const Device = require('device');
const deviceMap = new Map(); // 设备列表集合
// 获取设备列表
Device.list(true, (error, list) => {
if (error) {
console.error('Device.list error!' + error);
} else {
list.forEach((item) => {
Device.info(item.devid, (error, info) => {
if (error) {
console.error('Device.info error!' + error);
} else {
deviceMap.set(item.devid, {
devid: item.devid,
...info,
});
}
});
});
}
});
// 监听设备加入
Device.on('join', function (devid, info) {
deviceMap.set(devid, { devid, ...info });
io.emit('list', [...deviceMap.values()]); // 通过socket.io推送数据到前端
});
// 监听设备丢失
Device.on('lost', function (devid) {
deviceMap.delete(devid);
io.emit('list', [...deviceMap.values()]); // 通过socket.io推送数据到前端
});
发送消息和监听设备消息也比较简单:
...
const dev = new Device();
...
// 发送消息
dev.send({unit: 'Centigrade'}, (err) => {
...
}, 3)
// 监听接收设备发送的消息
device.on('message', function (msg) {
...
console.log('message: ', msg) // 可以通过telnet 192.168.128.1 81端口进行查看日志打印
io.emit('message', msg);
...
});
实现主要的关键代码也就上面这些了,一开始我也有点惊讶【淡━━(‾ー‾*|||━━定】,这一点代码就实现了应用与设备之间的通信?不过我后面也替大家测试过了,的确在应用与设备之间打通了数据连接。大家感兴趣的可以到我的 Gitee 仓库里面去看完整的通信工具测试代码,好了好了,不写了,我要去撸猫了,
本文仅个人学习使用,如有错误,欢迎指正, ( ੭ ˙ᗜ˙ )੭谢谢老板!