.Net Core跨平臺應用研究-HelloArm(串口篇)

来源:https://www.cnblogs.com/flyfire-cn/archive/2019/02/08/10356991.html
-Advertisement-
Play Games

為了驗證採用dotnet core技術開發的物聯網設備數據採集接入服務應用是否能在高性價比的linux嵌入式平臺運行,針對dotnet core應用程式進行嵌入式linux環境的發佈部署運行驗證研究。 ...


引言

        為了驗證採用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,通過如下命令進行網路終端接入:

ssh [email protected]

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

 

 

.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 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相關操作,請自行百度或必應。

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運行時以及相關依賴,微軟官方已有詳細的說明文檔,本文不再贅述。

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

 

本文為作者原創,未經許可,請勿轉載。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、字元串運算 String類 1.概述 String是特殊的引用數據類型,它是final類。 2.構造方法 String str = "abc"; 相當於: char date[] = {'a','b','c'}; String str = new String{data}; 3.主要方法 cha ...
  • 題意 "題目鏈接" 給出長度為$n$的序列,每次詢問區間$[l, r]$,要求最大化 $max |x − y| : L_i ≤ x, y ≤ R_i and A_x = A_y$ Sol 標算神仙的一批看不懂。 維護好每個數出現的左右位置之後直接上不刪除莫隊就行了 cpp include const ...
  • 目錄 [TOC] 1. 安裝Jupyter notebook 2. 啟動Jupyter notebook 3. 文件管理 4. 基本的操作與概念 5. 常用快捷鍵 (一)安裝Jupyter notebook 1.在控制台輸入: pip install jupyter 2.註意: 很多網上的教程推薦安 ...
  • 通過以下幾個步驟解決: 1.install-package entityFramework; 2.更新 nuget; 3.更新 visual studio; 我是通過第三個步驟解決的。 ...
  • 前端 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Tex ...
  • [TOC] 前言 本文主要是以 C 為例介紹 .NET 中的三種指針類型(本文不包含對於函數指針的介紹): 對象引用 、 非托管指針 、 托管指針 。 學習是一個不斷深化理解的過程,藉此博客,把自己關於 .NET 中指針相關的理解和大家一起討論一下,若有表述不清楚,理解不正確之處,還請大家批評指正。 ...
  • 記錄CentOS 7.4 上安裝MySQL&MariaDB&Redis&Mongodb ...
  • 什麼是Sql註入?如何避免Sql註入? 用戶根據系統的程式構造非法的參數從而導致程式執行不是程式期望的惡意Sql語句。 使用參數化的Sql就可以避免Sql註入。 資料庫三範式是什麼? 第一範式:欄位不能有冗餘信息,所有欄位都是必不可少的。 第二範式:滿足第一範式並且表必須有主鍵。 第三範式:滿足第二 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...