Net 8结合ImageSharp、Protobuf及HidApi,能和硬件设备擦出怎样的技术火花?
摘要:前言 本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意把外壳模型重新切割,用3D打印机打印了整
前言
本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意把外壳模型重新切割,用3D打印机打印了整个外壳,不得不说省了八九百的CNC费用。键盘介绍我就不说了,键盘主要特色是左边的拓展模块,有墨水屏和手感超好的旋钮,当然也支持自定义开发,能开发也是我写这篇文章的原因,毕竟是为了开发功能,效果图如下,大家可以关注我的b站账号绿荫阿广,来学习交流一些有趣的东西。
技术选型
在我查阅了一些社区键盘资料发现社区固件有几个版本,稚晖君原版的固件太老了不好用,送我键盘的老哥的版本我觉得挺方便而且用户量应该也很多,于是我就基于这个版本的固件进行dotnet版本的sdk开发了,目前有其他版本的sdk,有python版本的,vue版本的,我是可以拿来直接参考的。
1. 框架选择
作为一名.Net开发,我肯定是想用.net进行开发的,理由是这个键盘用在PC上,用.Net实现SDK对接WPF,MAUI和WinUI可以做很多的任务型的功能。选择采用最新版本的.Net8,然后在SDK测试编写完成之后,对接到我之前的WinUI桌面程序里,大家肯定会问,为什么不选择MAUI,我想说当然因为我暂时不想花时间重新写,不过SDK是支持跨平台的,这点问题不大。
2. 设备通讯协议
键盘采用的固件是开源的ZMK这个代码编写的,设备在电脑识别为hid设备,通讯格式使用的Protobuf协议,所以针对.Net也需要使用这个Protobuf进行数据的打包,这个地方花了我一些时间,主要是有些地方不太懂,坑主要是数据转成字节数组的时候的一些问题,这个在后面的代码讲解里有用到。
设备固件地址:https://github.com/xingrz/zmk-config_helloword_hw-75
python SDK: https://github.com/xingrz/zmkx-sdk
3. 库选择
本来以为.Net可以用的hid库有很多,在本人测试了一圈以后发现不错的也就这个HidApi.Net还可以,其他的什么Device.Net,HidLibrary都不是很满意,在我测试以后选择了HidApi.Net和设备通讯,Google.Protobuf和Grpc.Tools加工通讯数据,SixLabors.ImageSharp进行图片数据的转换。
HidApi.Net
Google.Protobuf
Grpc.Tools
SixLabors.ImageSharp
最终效果如下图:
代码讲解
项目代码我这次提交到了电子脑壳的仓库里,因为我要将功能集成到电子脑壳里,所以放在了这个仓库,目前所在分支为helloworld-keyboard,后期应该会合并到主分支。
仓库地址:https://github.com/maker-community/ElectronBot.DotNet
通讯协议实现
通讯的核心部分是Hw75DynamicDevice的Call方法,包含了将protobuf生成的c#对象转成byte[]并拆分成数据包发送到设备。
