.Net Core應用程序跨平臺應用研究-HelloArm(串口篇)
引言
為了驗證采用dotnet core技術開發的物聯網設備數據采集接入服務應用是否能在高性價比的linux嵌入式平臺運行,針對dotnet core應用程序進行嵌入式linux環境的發布部署運行驗證研究。
硬件環境
硬件系統經過對比篩選,選用了友善之臂出品的NanoPC-T3 Plus。該控制板為掌上型嵌入式Linux系統迷你PC,采用64位三星arm CPU,具有完善的硬件接口和驅動支持,大於1G的內存和8G以上的eMMC閃存,具有較高的性能價格比。
- NanoPC-T3 Plus是友善之臂專門針對企業用戶而設計,它采用三星八核Cortex -A53架構的S5P6818處理器,動態運行主頻400M-1.4GHz。NanoPC-T3 Plus配備了16GB的eMMC、音頻接口、視頻輸入/輸出接口等;並且集成了WiFi和藍牙,增加千兆以太網和電源管理功能,板載陶瓷天線,帶串口調試功能。為適應工業客戶需要,NanoPC-T3 Plus加裝了標配的散熱片,以解決芯片發熱問題。
- NanoPC-T3 Plus帶兩路視頻輸入,支持DVP 攝像頭及MIPI-CSI攝像頭,並且帶四路視頻輸出,分別為HDMI 1.4A接口、LVDS接口、並行RGB-LCD接口、MIPI-DSI接口。並且支持RTC,板載備份電池接口,引出四個USB接口(其中三個是標準A型接口, 另外一個是2.54mm排母)等。
- NanoPC-T3 Plus)流暢運行Android5.1、Debian、UbuntuCore+Qt等系統,內核驅動源碼完全開源,接口豐富。
硬件資源特性
- CPU: S5P6818, 運行主頻1.4GHz
- 電源管理: 采用一顆ARM? Cortex?-M0單片機做電源管理, 支持動態調壓, 軟件關機和定時開機等功能
- 內存: 2GB 32bit DDR3 RAM
- 存儲: 1 x microSD 卡槽
- 網絡: Gbit Ethernet(RTL8211E)
- Wireless:802.11 b/g/n
- Bluetooth: 4.0 dual mode
- 天線: Wi-Fi和藍牙共用, 板載陶瓷天線, 同時提供IPX接口
- eMMC: 16GB
- 視頻輸入:DVP Camera/MIPI-CSI(雙攝像頭口)
- 視頻輸出:HDMI/LVDS/並行RGB-LCD/MIPI-DSI(四個視頻輸出接口)
- 音頻:3.5mm耳機座/Via HDMI
- 麥克風: 板載麥克風
- USB Host: 4 x USB 2.0 Host , 其中三個是標準A型接口, 另外一個是2.54mm排母
- Micro USB: 1 x USB 2.0 Client
- LCD接口: 45pin, 0.5mm間距FPC貼片座,支持全彩TFT LCD (RGB:8-8-8)
- HDMI: HDMI 1.4a, Type A型口,1080P高清顯示
- DVP Camera接口: 24pin, 0.5mm間距,FPC貼片豎座
- GPIO擴展接口: 30 Pin2.54mm排母, 包含4個UART, 1路I2C, 1路SPI, 3路PWM,9個GPIO
- I2S/USB: 2.54mm間距排母
- 調試串口: 2.54mm間距排針
- 按鍵: 電源按鍵, 復位按鍵, 啟動選擇按鍵各一個
- LED: 1 x power LED and 1 x system LED
- CPU溫度檢測: CPU內部集成溫度傳感器
- RTC: 支持RTC, 板上有備份電池接口
- 散熱片螺絲孔:能加螺絲固定的散熱片
- 供電: DC 5V/3A
- PCB Size:100 x 64mm,八層,沈金工藝
- 溫度工作範圍: -40℃ to 80℃
為避免廣告嫌宜,不過多對設備進行說明(好象難以避免呵,如有此方面問題,請管理員協助進行和諧呵)
在此給出設備的wiki地址:http://wiki.friendlyarm.com/wiki/index.php/NanoPC-T3_Plus/zh
支持的系統平臺
廠家提供的系統映像文件支持以下版本系統
- lubuntu-desktop-xenial-4.4-armhf(基於ubuntu16.04的LUbuntu桌面版,32位arm系統)
- friendlycore-xenial-4.4-armhf(基於ubuntu16.04的FriendlyCore系統,32位arm系統)
- friendlycore-xenial-4.4-arm64(基於ubuntu16.04的FriendlyCore系統,64位arm系統)
- Android5.1系統
FriendlyCore,是一個沒有X-windows環境,基於Ubuntu core構建的系統,使用Qt-Embedded作為圖形界面的輕量級系統,兼容Ubuntu系統軟件源,非常適合於企業用戶用作產品的基礎OS。
系統除了保留Ubuntu Core的特性以外,還包括以下特性:
- 支持電容和電阻觸摸屏
- 支持WiFi連接
- 支持以太網連接
- 支持藍牙,已預裝bluez等相關軟件包
- 支持音頻播放
- 支持Qt 5.10.0 EGLES和OpenGL ES1.1/2.0
系統平臺
.NET Core支持的Linux版本
https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x
.NET Core 2.x 將 Linux 視為一個操作系統。 支持的 Linux 分發都對應有一個 Linux 內部版本(根據芯片體系結構)。
以下 Linux 發行版本/版本支持 NET Core 2.x:
- Red Hat Enterprise Linux 7,6 - 64 位(x86_64 或 amd64)
- CentOS 7 - 64 位(x86_64 或 amd64)
- Oracle Linux 7 - 64 位(x86_64 或 amd64)
- Fedora 28、27 - 64 位(x86_64 或 amd64)
- Debian 9(64 位,arm32)、8.7 或更高版本 - 64 位(x86_64 或 amd64)
- Ubuntu 18.04(64 位,arm32)、16.04、14.04 - 64 位(x86_64 或 amd64)
- Linux Mint 18、17 - 64 位(x86_64 或 amd64)
- openSUSE 42.3 或更高版本 - 64 位(x86_64 或 amd64)
- SUSE Enterprise Linux (SLES) 12 Service Pack 2 或更高版本 - 64 位(x86_64 或 amd64)
- Alpine Linux 3.7 或更高版本 - 64 位(x86_64 或 amd64)
系統平臺選擇
根據.NET Core 2.x對Linux系統的支持,選擇friendlycore-xenial-4.4-arm64作為系統運行平臺。
下載廠家提供的系統映像文件,對NanoPC-T3/Plus進行系統燒寫,方法詳見WIKI教程.
燒寫主要步驟:
1、下載廠家提供的映像文件和燒寫工具win32diskimager(wiki中提供了下載鏈接)
2、準備一張tf卡,格式化為一個分區(FAT32)
3、運行win32diskimager軟件,選擇映像文件,選擇tf卡對應的分區,點擊寫入
4、燒寫完成
5、將tf卡插入卡座,按信boot鍵給控制板上電(需外接顯示器和鍵盤、鼠標)
6、根據屏幕提示,將系統安裝至eMMC閃存。
連接嵌入式Linux系統
FriendlyCore系統默認支持多種連接方式,可通過外接輸入、輸出設備(鍵盤/鼠標、顯示器)進行連接,也可以通過串口終端進行連接,也支持通過網絡,使用ssh終端方式進行連接。
FriendlyCore系統默認配置了兩個用戶帳戶
普通用戶:
用戶名: pi
密碼: pi
Root用戶:
用戶名: root
密碼: fa
系統開機默認會以 pi 用戶自動登錄,你可以使用 sudo npi-config 命令取消自動登錄。
物理連接
NanoPC具有HDMI、TFT顯示接口和USB接口,可以直接連接顯示器、鍵盤/鼠標進行操作。
串口連接
NanoPC默認支持調試串口做為終端。
通過USB轉TTL串口的串口模塊進行連接。默認通訊參數:115200,N,8,1
軟件可使用任意串口終端工具,如SecureCRT或Windows系統自帶超級終端。
網絡連接
可以通SSH工具進行網絡連接,通過網絡終端的方式訪問。(Win10系統自帶)
FriendlyCore系統網絡配置默認為自動獲取IP地址。通過網絡連接設備,需要確定設備的IP地址。
初始IP地址可以通在串口終端模式下輸入ifconfig命令查看,或通過網絡掃描確定。
確定設備的IP地址後,可以通ssh命令進行終端連接
本次實驗中,我們設備的IP地址為172.16.93.74,通過如下命令進行網絡終端接入:
根據提示輸入密碼後,即可成功登入。
.NET Core跨平臺驗證
由於後期主要需要使用的程序功能為網絡通訊和串口通訊,我們主要針對目標嵌入式linux系統下的網絡和串口通訊進行驗證。
本次實驗中,我們先對串口通訊進行驗證。
編寫一個netcore2.x的控制臺程序,程序實現系統信息顯示,串口資源列舉,串口選擇,串口打開/關閉,串口接收顯示和串口定時發送測試數據功能。
驗證程序設計
采用SerialPort類進行串口測試功能實現(netcore項目需通過Nuget安裝SerailPort庫)
實現以下功能:
- 顯示系統平臺信息
- 串口資源列舉,
- 串口選擇,
- 串口打開
- 串口關閉
- 串口接收/數據顯示
- 串口定時發送測試數據
程序較為簡單,在此貼出部分功能代碼:
顯示系統平臺信息
串口資源列舉
串口測試
編譯程序,在window下測試程序通過。
跨平臺發布
因目標平臺為arm64嵌入式linux系統,采用以下方式進行程序發布:
在命令行窗口,切換到項目文件夾,運行如下命令:
dotnet publish -r linux-arm64 -c Release
通過以上命令,得到生成的目標平臺的發布包,程序文件及相關.netcore運行時依賴均被發布到項目release\netcoreapp2.2\linux-arm64\publish文件夾中。
遠程部署
采用scp命令,將發布文件復制到目標機器
在windows(win10)系統中,打開控制臺窗口,輸入scp命令,命令格式如下:
scp –r d:\ubuntu\publish\ [email protected]:/home/pi/.
根據提示輸入用戶密碼,完成文件夾的復制。
在ssh終端窗口,切換到程序文件夾
cd /home/pi/publish
設置程序執行權限:
chmod 777 ./HelloArm # HelloArm為測試程序文件名
輸入./ HelloArm運行程序
Linux環境運行.Net Core程序
在普通用戶pi中運行程序
程序顯示了系統環境信息
由於程序啟動後調用了SerialPort.GetPortNames方法,程序未能按預期執行,出現如下信息:
提示信息表明SerialPort類庫僅支持Windows系統平臺,不支持跨平臺。
至此,.net core程序跨平臺在linux系統運行成功,但串口類庫不支持跨平臺。
第三方串口類庫
為解決串口類支持問題,查找資料,發現github上有一個開源SerialPortStream類庫支持netcore,能夠支持Linux系統。
https://github.com/jcurl/SerialPortStream
該類庫支持windows系統和Linux系統,但在Linux系統下運行,需要額外編譯目標平臺支持庫並進行相關環境配置。
Linux串口類庫編譯
You first need to compile the support library libnserial.so for your platform. To do that, you‘ll need a compiler (e.g. GCC 4.8 or later) and cmake.
在目標系統中(FriendlyCore),安裝GCC編譯器和cmake
首先確定網絡正常連接,能夠訪問互聯網(需要良好的網絡環境)。
執行如下命令:
sudo apt-get update
安裝更新GCC
sudo apt-get install gcc
安裝cmake
sudo apt-get cmake
確保gcc和cmake安裝正常。可采用命令查看安裝情況
gcc –version
cmake –version
After cloning the repository, execute the following:
$ git clone https://github.com/jcurl/serialportstream.git
$ cd serialportstream/dll/serialunix
$ ./build.sh
根據上面的命令,完成類庫的源碼克隆和編譯。
註:類庫linux依賴庫僅需在同一目標平臺編譯一次,其他相同目標平臺,復制並配置依賴庫到目標系統即可。
環境變量配置
Binaries are built and put in the bin folder from where you ran the build script. You can add a reference to LD_LIBRARY_PATH to the library:
$ export LD_LIBRARY_PATH=`pwd`/bin/usr/local/lib:$LD_LIBRARY_PATH
執行上述命令,配置類庫目標到環境變量(上述命令為臨時環境變量配置,僅當前shell有效)
配置全局環境變量的方法:
vi /etc/profile
在文件的最後一行,增加環境變量LD_LIBRARY_PATH的配置
保存退出後,執行source /etc/profile 刷新環境變量
註:vi相關操作,請自行百度或必應。
Linux串口測試
將測試驗證程序中的SerialPort類更換為SerialPortStream類庫(方法、屬性基本兼容),進行適當的調整,在windows系統上編譯運行,通過。
重新發布Linux系統運行版本,進行linux系統部署。
采用普通用戶pi登錄
如環境變量未有效配置,串口類無法正常執行,程序執行到串口方法調用處停止。
按Ctrl+C終止程序。
配置好串口類庫所需環境變量,重新運行程序,程序正常運行。
如下圖,程序啟動,列舉出系統有效串口,如下圖所示:
由於pi用戶帳戶權限原因,程序只顯示了/dev/ttySAC0一個串口,此串口為系統調試終端輸出串口。
切換到系統超級用戶
su root
根據提示輸入密碼:fa
切換到程序目錄,執行測試程序 ./publish/HelloArm,出現如下界面:
在超級用戶下,程序列舉出了5個串口。
通過操作命令,打開指定的串口,開啟接收事件及定時周期發送數據,連接電腦串口(目前大部分電腦已不再提供串口,本實驗通過USB轉串口模塊進行連接),通過PC端的串口工具軟件同Linux迷你PC主機進行通訊,收發通訊正常。
配置程序開機運行
在root用戶下,配置/etc/rc.local文件,將程序添加到系統開機運行
vi /etc/rc.local
在exit 0之前增加一行
/home/pi/publish/HelloArm
保存退出,重啟系統
reboot
重啟系統後,調試串口終端界面中,可以看到程序運行的輸出信息,至此,程序配置完成,開機自動運行成功。
結束語
.net core為微軟推出的跨平臺托管程序框架,具備在非windows系統部署運行的能力,但在實際應用中,不能過於想當然,以為支持跨平臺就萬事大吉,以為凡是.net程序就可以順利移植為.net core跨平臺程序,在實際應用中,需要小心求證,以避免掉進計劃時間過於理想的大坑(本實驗耗費的時間,遠超出計劃時間呵。串口類庫問題耗費了不少時間,對Linux系統相關操作的熟悉,也耗費了較多時間)。
本文中,驗證程序是以指定目標平臺,無環境依賴方式進行的發布部署,.net core程序也支持以跨平臺方式發布部署,但相關目標平臺需安裝.net core運行時以及相關依賴,微軟官方已有詳細的說明文檔,本文不再贅述。
註:本實驗中,使用了兩種硬件設備,故截圖有所不同,但系統相同,不影響實驗效果和結論。
本文為作者原創,未經許可,請勿轉載。
.Net Core應用程序跨平臺應用研究-HelloArm(串口篇)