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讀寫

文章插圖
服務端寫好了以后,就可以寫調用端代碼了,為了圖方便我就在電子腦殼代碼里加了調用代碼 。

推薦閱讀