1. 程式人生 > 程式設計 >.Net Core跨平臺應用開發串列埠篇HelloArm

.Net Core跨平臺應用開發串列埠篇HelloArm

目錄
  • 引言
  • 硬體環境
    • 硬體資源特性
    • 支援的系統平臺
  • 系統平臺
    • .NET Core支援的版本
    • 系統平臺選擇
  • 連線嵌入式Linux系統
    • 物理連線
    • 串列埠連線
    • 網路連線
  • .NET Core跨平臺驗證
    • 驗證程式設計
      • 顯示系統平臺資訊
      • 串列埠資源列舉
      • 串列埠測試
    • 跨平臺釋出
      • 遠端部署
        • Linux環境執行.Net Core程式
        • 第三方串列埠類庫
          • Linux串列埠類庫編譯
            • 環境變數配置
              • Linux串列埠測試
              • 配置程式開機執行
                • 結束語

                  引言

                  為了驗證採用dotnet core技術開發的物聯網裝置資料採集接入服務應用是否能在高性價比的linux嵌入式平臺執行,針對dotnet core應用程式進行嵌入式linux環境的釋出部署執行驗證研究。

                  硬體環境

                  硬體系統經過對比篩選,選用了友善之臂出品的NanoPC-T3 Plus。該控制板為掌上型嵌入式Linux系統迷你PC,採用64位三星arm CPU,具有完善的硬體介面和驅動支援,大於1G的記憶體和8G以上的eMMC快閃記憶體,具有較高的效能價格比。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  • 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)流暢執行5.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./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的特性以外,還包括以下www.cppcns.com特性:

                  • 支援電容和電阻觸控式螢幕
                  • 支援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、下載廠家提供的映像www.cppcns.com檔案和燒寫工具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介面,可以直接連線顯示器、鍵盤/滑鼠進行操作。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  串列埠連線

                  NanoPC預設支援除錯串列埠做為終端。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  通過USB轉TTL串列埠的串列埠模組進行連線。預設通訊引數:115200,N,8,1

                  軟體可使用任意串列埠終端工具,如SecureCRT或Windows系統自帶超級終端。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  網路連線

                  可以通SSH工具進行網路連線,通過網路終端的方式訪問。(Win10系統自帶)

                  FriendlyCore系統網路配置預設為自動獲取IP地址。通過網路連線裝置,需要確定裝置的IP地址。

                  初始IP地址可以通在串列埠終端模式下輸入ifconfig命令檢視,或通過網路掃描確定。

                  確定裝置的IP地址後,可以通ssh命令進行終端連線

                  本次實驗中,我們裝置的IP地址為172.16.93.74,通過如下命令進行網路終端接入:

                  ssh [email protected]

                  根據提示輸入密碼後,即可成功登入。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  .NET Core跨平臺驗證

                  由於後期主要需要使用的程式功能為網路通訊和串列埠通訊,我們主要針對目標嵌入式linux系統下的網路和串列埠通訊進行驗證。

                  本次實驗中,我們先對串列埠通訊進行驗證。

                  編寫一個netcore2.x的控制檯程式,程式實現系統資訊顯示,串列埠資源列舉,串列埠選擇,串列埠開啟/關閉,串列埠接收顯示和串列埠定時傳送測試資料功能。

                  驗證程式設計

                  採用SerialPort類進行串列埠測試功能實現(netcore專案需通過Nuget安裝SerailPort庫)

                  實現以下功能:

                  • 顯示系統平臺資訊
                  • 串列埠資源列舉,
                  • 串列埠選擇,
                  • 串列埠開啟
                  • 串列埠關閉
                  • 串列埠接收/資料顯示
                  • 串列埠定時傳送測試資料

                  程式較為簡單,在此貼出部分功能程式碼:

                  顯示系統平臺資訊

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  串列埠資源列舉

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  串列埠測試

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  編譯程式,在window下測試程式通過。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  跨平臺釋出

                  因目標平臺為arm64嵌入式linux系統,採用以下方式進行程式釋出:

                  在命令列視窗,切換到專案資料夾,執行如下命令:

                  dotnetpublish-rlinux-arm64-cRelease

                  通過以上命令,得到生成的目標平臺的釋出包,程式檔案及相關.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中執行程式

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  程式顯示了系統環境資訊

                  由於程式啟動後呼叫了SerialPort.GetPortNames方法,程式未能按預期執行,出現如下資訊:

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  提示資訊表明SerialPort類庫僅支援Windows系統平臺,不支援跨平臺。

                  至此,.net core程式跨平臺在linux系統執行成功,但串列埠類庫不支援跨平臺。

                  第三方串列埠類庫

                  為解決串列埠類支援問題,查詢資料,發現上有一個開源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

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  安裝更新GCC

                  sudo apt-get install gcc

                  安裝cmake

                  sudo apt-get install cmake

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  確保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登入

                  如環境變數未有效配置,串列埠類無法正常執行,程式執行到串列埠方法呼叫處停止。

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  按Ctrl+C終止程式。

                  配置好串列埠類庫所需環境變數,重新執行程式,程式正常FDWNbaLR執行。

                  如下圖,程式啟動,列舉出系統有效串列埠,如下圖所示:

                  .NetCore跨平臺應用開發串列埠篇HelloArm

                  由於pi使用者帳戶許可權原因,程式只顯示了/dev/ttySAC0一個串列埠,此串列埠為系統除錯終端輸出串列埠。

                  切換到系統超級使用者

                  su root

                  根據提示輸入密碼:fa

                  切換到程式目錄,執行測試程式 ./publish/HelloArm,出現如下介面:

                  .NetCore跨平臺應用開發串列埠篇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執行時以及相關依賴,微軟官方已有詳細的說明文件,本文不再贅述。

                  注:本實驗中,使用了兩種硬體裝置,故截圖有所不同,但系統相同,不影響實驗效果和結論。

                  以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。