喜歡電子和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ù)莓派肯定就會(huì)想起python,大學(xué)的時(shí)候玩樹(shù)莓派確實(shí)用python比較多,但是作為一個(gè).NET開(kāi)發(fā)人員當(dāng)然要嘗試下.NET的跨平臺(tái)能力到底如何了。
由于先有了之前寫(xiě)的上位機(jī)軟件電子腦殼,也想著讓之前封裝的SDK能夠直接用在樹(shù)莓派上,所以選擇.NET是順理成章的事情了。
整體方案如下圖:
樹(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)安裝軟件就可以了。
由于.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)行下面的操作了。
首先用創(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)目代碼地址
通過(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)行的效果如下圖:
最大的一個(gè)問(wèn)題就是在sdk放到linux系統(tǒng)上測(cè)試寫(xiě)入數(shù)據(jù)異常。
由于使用的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)