引言

为了验证采用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 pi@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\ pi@172.16.93.74:/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运行时以及相关依赖,微软官方已有详细的说明文档,本文不再赘述。

注:本实验中,使用了两种硬件设备,故截图有所不同,但系统相同,不影响实验效果和结论。

.Net Core跨平台应用研究-HelloArm(串口篇)的更多相关文章

  1. .Net Core跨平台应用研究-HelloDDNS(动态域名篇)

    .Net Core跨平台应用研究-HelloDDNS -玩转DDNS 摘要 为解决自己搭建的内网服务器需要域名而因没有超级用户密码不能开启光猫内置DDNS功能的问题,自己动手,基于.net core, ...

  2. .net core跨平台应用研究-ubuntu core下配置.net core运行时

    引言 年初研究了一阵子.net core跨平台应用,先后发表了几篇应用研究的文章.因工作原因,忙于项目上线,有一阵子没来博客园写文章了.最近项目基本收尾,抽空翻了下自己的博客,廖廖几篇文章,真让人汗颜 ...

  3. .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)

    .Net Core跨平台应用研究-CustomSerialPort -增强型跨平台串口类库 摘要 在使用SerialPort进行串口协议解析过程中,经常遇到接收单帧协议数据串口接收事件多次触发,协议解 ...

  4. .Net Core 跨平台应用使用串口、串口通信 ,可能出现的问题、更简洁的实现方法

    前些天在学习在 .NET Core下,跨平台使用串口通讯,有一篇文章说到在Linux/物联网下,实现通讯. 主要问题出现在以下两个类库 SerialPortStream flyfire.CustomS ...

  5. .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇

    .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇 本文作为初级篇,适合已经安装好.NET Core 环境以及 Gtk 环境,并具备了 C#开发基础知识,能跑一些简单的例子,希望更 ...

  6. .NET Core跨平台:使用.NET Core开发一个初心源商城总括

    1..NET Core基本介绍 a 作为一个.NET的开发者,在以前的开发中,我们开发的项目基本都是部署在windows服务器上,但是在windows服务器上的话某些比较流行的解决访问量的方案基本都是 ...

  7. [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建

    [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建 1.概述 读前必备:认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET ...

  8. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  9. .NET Core跨平台的奥秘[中篇]:复用之殇

    在<.NET Core跨平台的奥秘[上篇]:历史的枷锁>中我们谈到:由于.NET是建立在CLI这一标准的规范之上,所以它天生就具有了"跨平台"的基因.在微软发布了第一个 ...

随机推荐

  1. zabbix添加IIS网站计数器(并发连接数)详解

    环境:windows server 2012 前提:IIS上要添加好配置   1,在被监控主机,powershell输入perfmon.msc   2,点击添加按钮     3,在下拉菜单中点击小箭头 ...

  2. C# 比较和排序(IComparable和IComparer以及它们的泛型实现)

    准备工作: 1.创建实体类:ClassInfo,默认想要对其按照班级学生数量进行排序 public class ClassInfo  { /// <summary> /// 班级名称 // ...

  3. 《转》:JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

    原链接:https://my.oschina.net/feichexia/blog/196575 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 ...

  4. Linux下MySQL在知道密码的情况下修改密码

    1.在知道原密码的情况下,进入MySQL: mysql -u root -p 2.进入 mysql数据库,然后通过语句修改密码: 我的MySQL版本是:mysql  Ver 14.14 Distrib ...

  5. "Loading a plug-in failed The plug-in or one of its prerequisite plug-ins may be missing or damaged and may need to be reinstalled"

    The Unarchiver 虽好,但存在问题比我们在mac上zip打包一个软件xcode, 然后copy to another mac, 这时用The Unarchiver解压缩出来的xcode包不 ...

  6. 非对称加密, 助记词, PIN, WIF

    一钱包 1.1非对称加密, 助记词, PIN, WIF, 地址 1.1.1 非对称加密算法 非对称加密算法, 加密与解密使用不同的KEY, 我们分别称为私钥与公钥,其中可以通过私钥生成公钥 在比特币中 ...

  7. 安装网卡ifconfig不出现问题

    安装万兆网卡,Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection 使用lspci ...

  8. D2 有关写博客新的体会以及面向对象

    之前几篇博客一大堆废话,着实浪费时间也没啥实际作用.除了总结一些java的知识点外,再用一些比喻或者形象化的语言来表述这些知识点,无可厚非.但是,现在看来,应当减少这种堆满偏理论式偏方法性的内容的博客 ...

  9. 关于grub修复引导系统

    这周末遇到停电,机房的一台数据服务器启动不了,开机硬件自检以后,就停留在一个黑屏状态左上角有光标闪烁,却一直进入不了系统. 还好手里有centos6.5的系统盘,进入修复选项,具体进入修复请参照这里 ...

  10. java-15习题

    通过键盘分别输入年份.月份.日把它存储到日期时间对象中,然后计算1000天以后的日期并输出. import java.util.Calendar; import java.util.Scanner; ...