ubuntu-22.04 樹莓派Zero 2 W通過.NET6和libusb操作USB讀寫( 二 )


WinUI調用GRPC注意事項
直接將gprc相關的東西放到winui項目里好像有一些問題,所以我把它放到了一個庫項目里進行操作了 。
配置協議文件生成client代碼

ubuntu-22.04 樹莓派Zero 2 W通過.NET6和libusb操作USB讀寫

文章插圖
電子腦殼注入grpc-client
services.AddGrpcClient<ElectronBotActionGrpc.ElectronBotActionGrpcClient>(o =>{o.Address = new Uri("http://192.168.3.236:5241");});數據發送端也要注意bytes類型的轉換
ubuntu-22.04 樹莓派Zero 2 W通過.NET6和libusb操作USB讀寫

文章插圖
grpc服務的打包發布
打包的時候選擇目標運行時為可移植(windows和linux都可以運行)
ubuntu-22.04 樹莓派Zero 2 W通過.NET6和libusb操作USB讀寫

文章插圖
項目代碼地址
2. 服務的部署與效果驗證通過ftp工具將grpc服務放到樹莓派上,首先需要連接ElectronBot之后再運行服務
進入項目所在目錄執行指令如下:
dotnet Verdure.ElectronBot.GrpcService.dll --urls="http://*:5241"如果通訊正常,那么應該會報錯,提示libusb找不到,系統已經安裝了libusb,只是.net調用的時候目錄沒有找到,需要我們創建軟連接 。
LibUsbDotNet README最底部有說
樹莓派實際操作如下:
sudo find / -name "libusb-1.0*.so*" //列出庫的目錄位置cd /usr/lib/aarch64-linux-gnu/ //進入庫所在目錄sudo ln -s libusb-1.0.so.0 libusb-1.0.so //創建鏈接通過上面的操作 libusb的操作應該就沒有問題了 。
運行的效果如下圖:
ubuntu-22.04 樹莓派Zero 2 W通過.NET6和libusb操作USB讀寫

文章插圖
特殊問題與心得體會最大的一個問題就是在sdk放到linux系統上測試寫入數據異常 。
  • 需要sdk單獨處理linux環境
  • 需要sdk補一些內核驅動卸載邏輯
  • 特別注意otg數據線不要使用那種一拖幾的,用一個口的就行不然數據發送不過去
由于使用的LibUsbDotNet上述邏輯沒暴露到上層 , 我只好拉了一個分支改了發了一個包,問pr也沒人理我 。
sdk內部特別處理的代碼如下:
執行了一個設備的SetAutoDetachKernelDriver
if (wholeUsbDevice.DriverMode == UsbDevice.DriverModeType.MonoLibUsb){_logger.LogInformation("MonoLibUsb DetachKernelDriver");var retDetach = wholeUsbDevice.SetAutoDetachKernelDriver(true);_logger.LogInformation(retDetach.ToString());}通過這次的嘗試,我算是明白了理想很豐滿,現實很骨感的意思 , 本來覺得樹莓派Zero 2 W小巧便攜 , 而且我只是用它接收數據發送數據,結果數據發送的時候屏幕的刷新很慢,不知道是性能差勁,還是usb傳輸是瓶頸 。下次換個4b進行測試一下 。
至此整個過程就分享完了,這個項目基本上涵蓋了.net技術內的很多東西,如果ElectronBot和樹莓派結合獨立以后能夠很好的使用,我覺得用MAUI開發一個手機端的管理工具也是順理成章了 , 可以期待一下,能看到這里的可以在評論區給點意見了 。
電子腦殼 GRPC服務項目代碼地址
LibUsbDotNet地址

推薦閱讀