爲了驗證採用dotnet core技術開發的物聯網設備數據採集接入服務應用是否能在高性價比的linux嵌入式平臺運行,針對dotnet core應用程序進行嵌入式linux環境的發佈部署運行驗證研究。php
硬件系統通過對比篩選,選用了友善之臂出品的NanoPC-T3 Plus。該控制板爲掌上型嵌入式Linux系統迷你PC,採用64位三星arm CPU,具備完善的硬件接口和驅動支持,大於1G的內存和8G以上的eMMC閃存,具備較高的性能價格比。 html
爲避免廣告嫌宜,不過多對設備進行說明(好象難以免呵,若有此方面問題,請管理員協助進行和諧呵)linux
在此給出設備的wiki地址:http://wiki.friendlyarm.com/wiki/index.php/NanoPC-T3_Plus/zhgit
廠家提供的系統映像文件支持如下版本系統github
FriendlyCore,是一個沒有X-windows環境,基於Ubuntu core構建的系統,使用Qt-Embedded做爲圖形界面的輕量級系統,兼容Ubuntu系統軟件源,很是適合於企業用戶用做產品的基礎OS。shell
系統除了保留Ubuntu Core的特性之外,還包括如下特性:ubuntu
https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2xwindows
.NET Core 2.x 將 Linux 視爲一個操做系統。 支持的 Linux 分發都對應有一個 Linux 內部版本(根據芯片體系結構)。網絡
如下 Linux 發行版本/版本支持 NET Core 2.x:架構
根據.NET Core 2.x對Linux系統的支持,選擇friendlycore-xenial-4.4-arm64做爲系統運行平臺。
下載廠家提供的系統映像文件,對NanoPC-T3/Plus進行系統燒寫,方法詳見WIKI教程.
燒寫主要步驟:
一、下載廠家提供的映像文件和燒寫工具win32diskimager(wiki中提供了下載連接)
二、準備一張tf卡,格式化爲一個分區(FAT32)
三、運行win32diskimager軟件,選擇映像文件,選擇tf卡對應的分區,點擊寫入
四、燒寫完成
五、將tf卡插入卡座,按信boot鍵給控制板上電(需外接顯示器和鍵盤、鼠標)
六、根據屏幕提示,將系統安裝至eMMC閃存。
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,經過以下命令進行網絡終端接入:
ssh pi@172.16.93.74
根據提示輸入密碼後,便可成功登入。
因爲後期主要須要使用的程序功能爲網絡通信和串口通信,咱們主要針對目標嵌入式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\ pi@172.16.93.74:/home/pi/.
根據提示輸入用戶密碼,完成文件夾的複製。
在ssh終端窗口,切換到程序文件夾
cd /home/pi/publish
設置程序執行權限:
chmod 777 ./HelloArm # HelloArm爲測試程序文件名
輸入./ HelloArm運行程序
在普通用戶pi中運行程序
程序顯示了系統環境信息
因爲程序啓動後調用了SerialPort.GetPortNames方法,程序未能按預期執行,出現以下信息:
提示信息代表SerialPort類庫僅支持Windows系統平臺,不支持跨平臺。
至此,.net core程序跨平臺在linux系統運行成功,但串口類庫不支持跨平臺。
爲解決串口類支持問題,查找資料,發現github上有一個開源SerialPortStream類庫支持netcore,可以支持Linux系統。
https://github.com/jcurl/SerialPortStream
該類庫支持windows系統和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 install 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相關操做,請自行百度或必應。
將測試驗證程序中的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運行時以及相關依賴,微軟官方已有詳細的說明文檔,本文再也不贅述。
注:本實驗中,使用了兩種硬件設備,故截圖有所不一樣,但系統相同,不影響實驗效果和結論。
本文爲做者原創,未經許可,請勿轉載。