ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写

有这个想法的初衷喜欢电子和DIY硬件的朋友对稚晖君应该都不陌生,他定期都会分享一些自己做的好玩的硬件,他之前做了一个ElectronBot桌面机器人我就很感兴趣,所以就自己也做了一个 。

ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写

文章插图
起初我只是自己开发了一个叫电子脑壳的上位机软件,大家在之前的博客里应该也有见到 , 是个用WinUI(WASDK)开发的Windows应用软件 。
ElectronBot机器人要一直和电脑连接通过应用进行控制,很多的网友都想ElectronBot脱离电脑使用,于是我也想着能有什么好办法,所以也就有了这个标题的想法 。
项目代码地址
技术选型大家想到树莓派肯定就会想起python,大学的时候玩树莓派确实用python比较多,但是作为一个.NET开发人员当然要尝试下.NET的跨平台能力到底如何了 。
由于先有了之前写的上位机软件电子脑壳,也想着让之前封装的SDK能够直接用在树莓派上,所以选择.NET是顺理成章的事情了 。
  • 应用开发选择.NET框架
  • 通讯方式选择GRPC
  • USB操作选择LibUsbDotNet调用libusb
整体方案如下图:
ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写

文章插图
环境配置1. 树莓派系统安装及网络配置树莓派支持的系统有很多种,像官方的Debian,Ubuntu等等 。我平时使用Debian比较多,但是测试的时候好像usb操作有些问题,应该是我用的.net互操作库对Debian支持的不太好,所以我选择了ubuntu的系统 。
  • Raspberry Pi Imager 树莓派官方的系统烧录工具
  • Ubuntu系统下载地址 Download Ubuntu Server
安装烧录工具,下载系统 , 然后烧录系统 。如下图所示:
ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写

文章插图
目前树莓派Zero 2 W的Ubuntu只有Server版本和Core版本,需要使用命令行做操作 。
网络配置可以参考下面的文章进行配置 。
树莓派4B ubuntu server ssh服务器部署全过程详解(内网穿透)
能正常联网安装软件就可以了 。
2. .NET6的运行环境由于.NET6 Arm64官方没提供包管理安装,所以需要大家通过脚本,或者下载文件安装 。网络好的可以通过脚本安装,简单,本文以脚本安装示例 。
参考文档如下:
使用安装脚本或通过提取二进制文件在 Linux 上安装 .NET
下载安装脚本dotnet-install.sh放到用户家目录
执行以下指令添加执行权限
sudo chmod +x ./dotnet-install.sh执行指令安装
./dotnet-install.sh -c Current下载解压结束需要我们配置环境变量,就像windows安装软件一样,配置完环境变量,才可以直接通过dotnet直接使用了,不然是提示找不到指令的 。
以下指令是编辑环境变量的,我选择了~/.bashrc,在文档最底部添加环境变量内容 。
sudo vim ~/.bashrc内容
export DOTNET_ROOT=$HOME/.dotnetexport PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools保存并退出,然后执行dotnet如果正常就可以进行下面的操作了 。
实践过程记录1. GRPC服务的开发与调试首先用创建一个grpc服务
微软官方的文档协议文件编写介绍
【ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写】
ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写

文章插图
协议文件编写和服务编写
以我的协议内容为例包含了float,bool,bytes类型
float 对应 c# float
bool 对应 c# bool
bytes 对应 c# byte[]
syntax = "proto3";option csharp_namespace = "Verdure.ElectronBot.GrpcService";package electronbotactiongrpc;// The electronbotaction service definition.service ElectronBotActionGrpc {// Sends a greetingrpc PlayEmoticonAction (EmoticonActionFrameRequest) returns (EbHelloReply);}// The request message containing the user's name.message EmoticonActionFrameRequest { float J1 = 1; float J2 = 2; float J3 = 3; float J4 = 4; float J5 = 5; float J6 = 6; bool Enable = 7; bytes FrameBuffer = 8;}// The response message containing the greetings.message EbHelloReply {string message = 9;}然后生成对应的服务代码
主要注意点是bytes类型的转换
ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写

文章插图
服务端写好了以后,就可以写调用端代码了,为了图方便我就在电子脑壳代码里加了调用代码 。

推荐阅读