欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

樹(shù)莓派Zero 2 W(ubuntu-22.04)通過(guò).NET6和libusb操作USB讀寫(xiě)

有這個(gè)想法的初衷

喜歡電子和DIY硬件的朋友對(duì)稚暉君應(yīng)該都不陌生,他定期都會(huì)分享一些自己做的好玩的硬件,他之前做了一個(gè)ElectronBot桌面機(jī)器人我就很感興趣,所以就自己也做了一個(gè)。

起初我只是自己開(kāi)發(fā)了一個(gè)叫電子腦殼的上位機(jī)軟件,大家在之前的博客里應(yīng)該也有見(jiàn)到,是個(gè)用WinUI(WASDK)開(kāi)發(fā)的Windows應(yīng)用軟件。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到龍口網(wǎng)站設(shè)計(jì)與龍口網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋龍口地區(qū)。

ElectronBot機(jī)器人要一直和電腦連接通過(guò)應(yīng)用進(jìn)行控制,很多的網(wǎng)友都想ElectronBot脫離電腦使用,于是我也想著能有什么好辦法,所以也就有了這個(gè)標(biāo)題的想法。

項(xiàng)目代碼地址

技術(shù)選型

大家想到樹(shù)莓派肯定就會(huì)想起python,大學(xué)的時(shí)候玩樹(shù)莓派確實(shí)用python比較多,但是作為一個(gè).NET開(kāi)發(fā)人員當(dāng)然要嘗試下.NET的跨平臺(tái)能力到底如何了。

由于先有了之前寫(xiě)的上位機(jī)軟件電子腦殼,也想著讓之前封裝的SDK能夠直接用在樹(shù)莓派上,所以選擇.NET是順理成章的事情了。

  • 應(yīng)用開(kāi)發(fā)選擇.NET框架
  • 通訊方式選擇GRPC
  • USB操作選擇LibUsbDotNet調(diào)用libusb

整體方案如下圖:

環(huán)境配置

1. 樹(shù)莓派系統(tǒng)安裝及網(wǎng)絡(luò)配置

樹(shù)莓派支持的系統(tǒng)有很多種,像官方的Debian,Ubuntu等等。
我平時(shí)使用Debian比較多,但是測(cè)試的時(shí)候好像usb操作有些問(wèn)題,應(yīng)該是我用的.net互操作庫(kù)對(duì)Debian支持的不太好,所以我選擇了ubuntu的系統(tǒng)。

  • Raspberry Pi Imager 樹(shù)莓派官方的系統(tǒng)燒錄工具

  • Ubuntu系統(tǒng)下載地址 Download Ubuntu Server

安裝燒錄工具,下載系統(tǒng),然后燒錄系統(tǒng)。如下圖所示:

目前樹(shù)莓派Zero 2 W的Ubuntu只有Server版本和Core版本,需要使用命令行做操作。

網(wǎng)絡(luò)配置可以參考下面的文章進(jìn)行配置。

樹(shù)莓派4B ubuntu server ssh服務(wù)器部署全過(guò)程詳解(內(nèi)網(wǎng)穿透)

能正常聯(lián)網(wǎng)安裝軟件就可以了。

2. .NET6的運(yùn)行環(huán)境

由于.NET6 Arm64官方?jīng)]提供包管理安裝,所以需要大家通過(guò)腳本,或者下載文件安裝。
網(wǎng)絡(luò)好的可以通過(guò)腳本安裝,簡(jiǎn)單,本文以腳本安裝示例。

參考文檔如下:

使用安裝腳本或通過(guò)提取二進(jìn)制文件在 Linux 上安裝 .NET

下載安裝腳本dotnet-install.sh放到用戶家目錄

執(zhí)行以下指令添加執(zhí)行權(quán)限

sudo chmod +x ./dotnet-install.sh

執(zhí)行指令安裝

./dotnet-install.sh -c Current

下載解壓結(jié)束需要我們配置環(huán)境變量,就像windows安裝軟件一樣,配置完環(huán)境變量,才可以直接通過(guò)dotnet直接使用了,不然是提示找不到指令的。

以下指令是編輯環(huán)境變量的,我選擇了~/.bashrc,在文檔最底部添加環(huán)境變量?jī)?nèi)容。

sudo vim ~/.bashrc

內(nèi)容

export DOTNET_ROOT=$HOME/.dotnet
export PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools

保存并退出,然后執(zhí)行dotnet如果正常就可以進(jìn)行下面的操作了。

實(shí)踐過(guò)程記錄

1. GRPC服務(wù)的開(kāi)發(fā)與調(diào)試

首先用創(chuàng)建一個(gè)grpc服務(wù)

微軟官方的文檔協(xié)議文件編寫(xiě)介紹

協(xié)議文件編寫(xiě)和服務(wù)編寫(xiě)

以我的協(xié)議內(nèi)容為例包含了float,bool,bytes類型

float 對(duì)應(yīng) c# float

bool 對(duì)應(yīng) c# bool

bytes 對(duì)應(yīng) c# byte[]

syntax = "proto3";

option csharp_namespace = "Verdure.ElectronBot.GrpcService";

package electronbotactiongrpc;

// The electronbotaction service definition.
service ElectronBotActionGrpc {
  // Sends a greeting
  rpc 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;
}

然后生成對(duì)應(yīng)的服務(wù)代碼

主要注意點(diǎn)是bytes類型的轉(zhuǎn)換

服務(wù)端寫(xiě)好了以后,就可以寫(xiě)調(diào)用端代碼了,為了圖方便我就在電子腦殼代碼里加了調(diào)用代碼。

WinUI調(diào)用GRPC注意事項(xiàng)

直接將gprc相關(guān)的東西放到winui項(xiàng)目里好像有一些問(wèn)題,所以我把它放到了一個(gè)庫(kù)項(xiàng)目里進(jìn)行操作了。

配置協(xié)議文件生成client代碼

電子腦殼注入grpc-client

            services.AddGrpcClient<ElectronBotActionGrpc.ElectronBotActionGrpcClient>(o =>
            {
                o.Address = new Uri("http://192.168.3.236:5241");
            });

數(shù)據(jù)發(fā)送端也要注意bytes類型的轉(zhuǎn)換

grpc服務(wù)的打包發(fā)布

打包的時(shí)候選擇目標(biāo)運(yùn)行時(shí)為可移植(windows和linux都可以運(yùn)行)

項(xiàng)目代碼地址

2. 服務(wù)的部署與效果驗(yàn)證

通過(guò)ftp工具將grpc服務(wù)放到樹(shù)莓派上,首先需要連接ElectronBot之后再運(yùn)行服務(wù)

進(jìn)入項(xiàng)目所在目錄執(zhí)行指令如下:

 dotnet Verdure.ElectronBot.GrpcService.dll --urls="http://*:5241"

如果通訊正常,那么應(yīng)該會(huì)報(bào)錯(cuò),提示libusb找不到,系統(tǒng)已經(jīng)安裝了libusb,只是.net調(diào)用的時(shí)候目錄沒(méi)有找到,需要我們創(chuàng)建軟連接。

LibUsbDotNet README最底部有說(shuō)

樹(shù)莓派實(shí)際操作如下:

  sudo find / -name "libusb-1.0*.so*" //列出庫(kù)的目錄位置
  cd /usr/lib/aarch64-linux-gnu/ //進(jìn)入庫(kù)所在目錄
  sudo ln -s libusb-1.0.so.0 libusb-1.0.so //創(chuàng)建鏈接

通過(guò)上面的操作 libusb的操作應(yīng)該就沒(méi)有問(wèn)題了。

運(yùn)行的效果如下圖:

特殊問(wèn)題與心得體會(huì)

最大的一個(gè)問(wèn)題就是在sdk放到linux系統(tǒng)上測(cè)試寫(xiě)入數(shù)據(jù)異常。

  • 需要sdk單獨(dú)處理linux環(huán)境
  • 需要sdk補(bǔ)一些內(nèi)核驅(qū)動(dòng)卸載邏輯
  • 特別注意otg數(shù)據(jù)線不要使用那種一拖幾的,用一個(gè)口的就行不然數(shù)據(jù)發(fā)送不過(guò)去

由于使用的LibUsbDotNet上述邏輯沒(méi)暴露到上層,我只好拉了一個(gè)分支改了發(fā)了一個(gè)包,問(wèn)pr也沒(méi)人理我。

sdk內(nèi)部特別處理的代碼如下:

執(zhí)行了一個(gè)設(shè)備的SetAutoDetachKernelDriver

if (wholeUsbDevice.DriverMode == UsbDevice.DriverModeType.MonoLibUsb)
{
_logger.LogInformation("MonoLibUsb DetachKernelDriver");

var retDetach = wholeUsbDevice.SetAutoDetachKernelDriver(true);

_logger.LogInformation(retDetach.ToString());
}

通過(guò)這次的嘗試,我算是明白了理想很豐滿,現(xiàn)實(shí)很骨感的意思,本來(lái)覺(jué)得樹(shù)莓派Zero 2 W小巧便攜,而且我只是用它接收數(shù)據(jù)發(fā)送數(shù)據(jù),結(jié)果數(shù)據(jù)發(fā)送的時(shí)候屏幕的刷新很慢,不知道是性能差勁,還是usb傳輸是瓶頸。下次換個(gè)4b進(jìn)行測(cè)試一下。

至此整個(gè)過(guò)程就分享完了,這個(gè)項(xiàng)目基本上涵蓋了.net技術(shù)內(nèi)的很多東西,如果ElectronBot和樹(shù)莓派結(jié)合獨(dú)立以后能夠很好的使用,我覺(jué)得用MAUI開(kāi)發(fā)一個(gè)手機(jī)端的管理工具也是順理成章了,可以期待一下,能看到這里的可以在評(píng)論區(qū)給點(diǎn)意見(jiàn)了。

電子腦殼 GRPC服務(wù)項(xiàng)目代碼地址

LibUsbDotNet地址

分享文章:樹(shù)莓派Zero 2 W(ubuntu-22.04)通過(guò).NET6和libusb操作USB讀寫(xiě)
網(wǎng)頁(yè)路徑:http://chinadenli.net/article46/dsoideg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT自適應(yīng)網(wǎng)站、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、定制開(kāi)發(fā)電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)