初次尝试!在|初次尝试!在 Spirit 1 实现 DDC 协议的嗅探器

初次尝试!在 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...省略一万字):
初次尝试!在|初次尝试!在 Spirit 1 实现 DDC 协议的嗅探器
文章图片

我这里就简单实现了一下,页面画的有点磕碜,只能将就着用了。加了一个设备的选择框,一个发送数据的编辑框,一个设备响应的显示框。
使用的话也比较简单,选中一个设备,然后构建一下要发送的指令消息,然后点击send,应用后端会通过 device 模块将数据在 Spirit 1 中进行处理,最后发送到我写的红外测温的设备中,设备收到消息后会回传给 Spirit 1 当前的环境温度和目标温度,而我的应用后端通过 device 模块也会监听到设备发送的消息,并在前端将其打印出来,这样我以后开发的时候就可以测试设备和 Spirit 1 之间的通信了,只能对自己说一句:忒牛 ?( ?????ω????? )? 。
A FEW MOMENT LATER ......
【初次尝试!在|初次尝试!在 Spirit 1 实现 DDC 协议的嗅探器】......
下面正经的和大家讲一下实现的技术难点(我胡扯的,(?ω?) 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 仓库里面去看完整的通信工具测试代码,好了好了,不写了,我要去撸猫了,
本文仅个人学习使用,如有错误,欢迎指正, ( ? ˙?˙ )?谢谢老板!

    推荐阅读