跟隨.net core 3.0 一起發布的System.Device.Gpio 1.0已經可以讓我們用熟悉的C#原汁原味的開發莓派上面的GPIO了.並且在 Iot.Device.Bindings這個包下面有許多開發者已經封裝好了許多模塊,供我們使用.入門的教程可以參考https://www.cnblogs.com/zhanggaoxing/,寫的非常好哈.
我這里使用的是吃灰已久的樹莓派3B,其他的配件還包括超聲波模塊,紅外避障模塊,TT馬達(使用L298N驅動),一塊定制的電路板(個人感覺,主要為了好看),電池盒,電壓顯示模塊,第一步,先把這一堆配件組裝起來,效果如下:
1.先安裝樹莓派.net core環境
怎么接線等下章在講 首選我們先把樹莓派運行.net core的環境安上,由於現在官方操作系統Raspbian不是64位的.第三方系統我沒有用,想在樹莓派上跑 .net core 3.0,我們只能使用ARM32.怎么安裝系統,百度一大堆,這里就不介紹了.
樹莓派要聯網,先更新系統:
sudo apt-get update sudo apt-get upgrade
之后下載下載 .net core 3.0 sdk 和 asp.net core 3.0 runtime :
wget https://download.visualstudio.microsoft.com/download/pr/8ddb8193-f88c-4c4b-82a3-39fcced27e91/b8e0b9bf4cf77dff09ff86cc1a73960b/dotnet-sdk-3.0.100-linux-arm.tar.gz wget https://download.visualstudio.microsoft.com/download/pr/e9d4b012-a877-443c-8344-72ef910c86dd/b5e729b532d7b3b5488c97764bd0fb8e/aspnetcore-runtime-3.0.0-linux-arm.tar.gz
下載完成之后我們建立一個目錄,把剛才下載的文件解壓進去
mkdir dotnet tar zxf aspnetcore-runtime-3.0.0-linux-arm.tar.gz -C $HOME/dotnet tar zxf dotnet-sdk-3.0.100-linux-arm.tar.gz -C $HOME/dotnet
現在只能在dotnet這個目錄里面執行dotnet命令,要在任何地方都能執行命令,我們要創建一個環境變量指向這個文件夾.
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
我們使用dotnet --info看一下:
環境是裝完了,但是重啟這個環境不見了.所以我們需要配置一下自啟動環境變量:
sudo vim .profile
這里我習慣使用vim 如果沒有安裝換成 nano即可
在最后添加:
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
保存 重啟 可直接使用dotnet命令.到此為止,我們可以建立一個asp.net core的web放在上面試一下了.
2.新建項目,並配置nginx
打開VS2019,新建一個asp.net core3.0項目:
我這里修改了 Program.cs 文件添加了指定監聽:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.UseUrls("http://localhost:5000/"); });
之后在樹莓派home/pi下新建文件夾web->iot文件夾用debug模式生成把所有生成的文件全都傳到這個目錄下面.之后我們 dotnet 一下看看:
現在我們的網站只能localhost訪問.現在我們安裝NGINX做反向代理.首先,安裝並啟動ngix
sudo apt-get install nginx sudo /etc/init.d/nginx start
打開配置文件:
sudo vim /etc/nginx/sites-available/default
替換為:
server { listen 80 default_server; server_name _; location / { proxy_buffer_size 128k; proxy_buffers 32 32k; proxy_busy_buffers_size 128k; proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; # 轉發websocket需要的設置 proxy_set_header X-Real_IP $remote_addr; proxy_set_header X_Forward_For $proxy_add_x_forwarded_for; } }
保存 完成 測試 重啟nginx:
sudo nginx -t
sudo nginx -s reload
現在我們dotnet我們的網站.在瀏覽器中使用樹莓派的IP來訪問:
但是這樣有個缺點.我們必須每次重啟都要dotnet xx.dll 並且程序一旦異常了,也需要手動執行.這里我們借助 systemd 服務實現來重啟
sudo vim /etc/systemd/system/kestrel-carapp.service
替換如下內容:
[Unit] Dcription=ASP.NET Core 3.0 App - Car [Service] WorkingDirectory=/home/pi/web/iot ExecStart=/home/pi/dotnet/dotnet /home/pi/web/iot/WebIoT.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-car User=root Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
注意,systemd 要求我們使用絕對路徑。
注冊,並啟動服務:
sudo systemctl enable kestrel-carapp.service sudo systemctl start kestrel-carapp.service sudo systemctl status kestrel-carapp.service
現在重啟系統后也可以訪問網站,不用我們手動敲命令了.
3.后記
今天就這么多了,下章在說怎么接線,並使用剛才建立的web項目顯示超聲波模塊的數據
參考:
https://mp.weixin.qq.com/s/ksWs-_5JsmTQpACZfcKo6Q