边缘计算机EC950系列
用户手册
(适用于Debian11,IEOS V2.0.0及以上版本)
Version2.0,2024年01月
本手册中描述的软件是根据许可协议提供的,只能按照该协议的条款使用。
版权声明
© 2023 映翰通网络 保留所有权利。
商标
InHand标志是映翰通网络的注册商标。
本手册中的所有其他商标或注册商标属于其各自的制造商。
免责声明
本公司保留对此手册更改的权利,产品后续相关变更时,恕不另行通知。对于任何因安装、使用不当而导致的直接、间接、有意或无意的损坏及隐患概不负责。
本用户手册适用于基于Arm架构的边缘计算机EC954系列,并涵盖整套适用于所有支持型号的说明。在参考这些章节之前,请确认您计算机型号的硬件规格是否支持所涵盖的功能/设置。
在本章中,我们将介绍基于Arm结构的边缘计算机EC954系列的硬件安装说明。
下面的章节以EC954系列举例,描述了EC954系列的外部连接器和引脚分配的应用。
前面板
后面板
这是用于以太网连接的四个 RJ45 连接器
EC954有四个RJ45以太网口,支持10M/100M/1000M自适应速率。
绿灯:LINK指示灯,对端设备是1000M接口时长亮,对端设备是10/100M接口时长灭。
黄灯:ACT灯,当有数据时闪烁
|
|||
|
EC954具有2路CAN总线接口,支持CAN 2.0A/B标准。CAN2兼容CAN FD,最高速率可达5Mbps。
EC954提供两个 USB 2.0 Host 接口。
EC954 有12个LED灯,分别对电源及系统运行状态进行指示。
当系统正常启动后,STATUS闪烁,如果系统启动阶段发生异常导致系统启动失败;或者恢复出厂操作尚未完成时,STATUS长灭。 |
||
SIM1卡指示灯,选中则常亮 |
||
EC954提供API接口,用户可以调用API接口检测可编程按键的状态,然后实现自己的按键逻辑。
EC954支持12~48V直流输入
EC954支持2个SIM卡插槽,SIM卡需要在断电状态下安装,将SIM卡按压插入卡槽即可。
EC954有一个MircoSD卡的卡槽,SD不支持热插拔,需要在断电情况下插拔。插入SD卡,给设备上电后,系统会自动挂载所有的分区。
有一个复位按钮用于系统恢复出厂。参考《恢复出厂设置》进行操作。
EC954配有一个开关机按键用于开关机。
EC954共有7个天线接口,不同型号标配的天线数量不同,将天线拧入相应的天线接口完成天线安装。
EC954支持mSata硬盘,出厂默认不配带mSata硬盘,如果用户有大容量的存储需求,需要自购mSata硬盘,也可咨询映翰通进行mSATA的购买。
在本章中,我们将介绍基于Arm结构的边缘计算机EC900的基础配置。
您需要一台计算机,用于连接到EC900并登录到命令行界面。可以通过以太网网线的方式连接。
出厂默认的用户名和密码:
Username: edge
Password: security@edge
EC900设备出厂默认创建了root,但是登录被禁用。如果需要使用root用户,请手动修改系统配置,输入sudo -s 切换至root用户。用户edge在sudo组中,所以您可以在edge用户下使用sudo来执行系统级命令。有关其他细节,请参阅第5章中的sudo机制部分。
提示
当出现command not found时,输入sudo -s切换至root用户或使用sudo命令来操作。
注意
出于安全考虑,我们建议您禁用默认的用户账户,并创建您自己的用户帐户。
EC900支持通过以太网的SSH连接。使用以下默认IP 地址连接到EC900。
提示
这些步骤适用于您在 Linux PC上连接到EC900。请不要将这些步骤应用于EC900设备本身。在您运行ssh命令之前,请确保将PC的以太网口IP地址配置在特定范围内。ETH1:192.168.3.0/24,ETH2:192.168.4.0/24,ETH3:192.168.5.0/24,ETH4:192.168.6.0/24。
在 Linux PC上使用 ssh 命令访问EC900的ETH1 端口。
输入yes继续完成连接。
当界面出现终端提示符edge@edge-computer:~$,可输入shell命令时,连接成功。
提示
这些步骤适用于您在Windows PC上连接EC900。请不要将这些步骤应用于EC900设备本身。
请在您的Windows PC机上做出如下步骤
点击链接http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html,下载PuTTY(免费的软件),在Windows环境下以SSH命令的方式来建立与边缘计算机EC900的连接。下图是使用SSH连接的示例:
您可以使用sudo -s的命令来切换到root用户。出于安全考虑,不要在root权限下操作所有的命令。
提示
点击链接获取更多关于sudo命令的信息。
注意
您可能会在非root权限下使用一些管道或者重定向行为的时候得到”permission denied“的提示,此时您必须使用'sudo su -c'来取代'>','<','>>','<<','etc'等命令,需要包含完整命令的单引号。
您可以使用useradd和userdel命令来创建和删除用户的账户。请务必在主界面使用这些命令来设置该账户的相关访问权限。以下是如何在sudo组中创建test1的示例 (test1用户的默认登陆环境是bash,其主目录是/home/test1)
修改test1的密码,用passwd命令,输入新密码然后重复输入新密码以确认更改
如果要删除用户test1,请使用命令userdel
注意
在禁用默认帐户之前,应首先创建一个用户帐户
使用passwd命令来锁定默认用户账户,使edge用户无法登录
对edge用户进行解除锁定
EC954基于debian 11系统,因此可以使用Linux原生的命令进行网络管理和系统管理;为了便于用户配置,映翰通开发了一套IEOS系统程序,提供web界面,用户可以方便的通过web进行网络管理和系统管理,但需要注意的是,当启用IEOS功能后,IEOS会接管网络管理和系统管理,此时通过Linux原生命令进行网络管理和系统管理可能会失效;设备出厂默认启用IEOS,如果用户需要基于Linux原生的命令行进行网络管理和系统管理,需要先关闭IEOS。
IEOS是映翰通自研的一套运行在Linux系统上的网络管理和系统管理程序,IEOS提供web界面,用户可以通过web进行以太网口ip地址,蜂窝拨号,Wi-Fi Station,DHCP Client/Server,静态路由,防火墙等网络配置;也可以对系统时间,时区,固件升级和系统重启等进行操作;另外IEOS还支持对接映翰通的设备管理平台DeviceLive,用户可以通过DeviceLive平台对EC954设备进行远程监控和管理。
IEOS采用状态和配置分离的设计方案,分为网络管理,系统管理和状态三大功能板块。网络管理菜单和系统管理菜单下只能进行网络和系统的相关配置,状态信息需要统一到状态页面查看。
重要说明:使用IEOS程序管理网络配置和系统配置的时候,如果同时使用Linux原生命令,二者可能会相互影响,导致异常的运行状态。建议IEOS支持的配置都通过IEOS web来实现管理,IEOS不支持的配置,比如VPN,可以结合Linux原生命令一起实现配置目标。
考虑到用户的程序可能会需要使用HTTP/HTTPS标准端口号80/443,IEOS使用9100端口号做为HTTPS连接的端口,不支持通过HTTP访问;当用户使用HTTP访问web的时候,会自动跳转到通过HTTPS。本文档以通过eth2的默认地址192.168.4.100为例来进行说明。用户在浏览器中输入192.168.4.100:9100后跳转到登录页面
重要说明:IEOS程序启用时,会预留一些端口号供内部通信使用,预留端口号范围9100 ~ 9200,启用IEOS后,客户的程序应该避开使用这些端口号,否则可能会产生冲突导致功能异常。
给eth1接口配置静态IP地址
给eth1接口配置DHCP Client
在eth1接口上启动dhcp server功能,给eth1的下挂设备分配地址
DHCP Server配置参数说明:
Enable DHCP Server:DHCP Server功能的开关
Starting Address:DHCP Server地址池起始基址,网段 + 起始地址 = 地址池的起始ip地址。在截图中,eth1的网段是192.168.3.0/24,基址是1,则地址池的起始地址是192.168.3.1/24.
Max Address Number:地址池中的最大地址数量.
Lease period:租期时间
蜂窝网参数说明:
Enabled: 蜂窝功能的开关;默认是开启的状态。
Profiles:拨号参数集,用于专网卡拨号时配置APN,用户名,密码以及认证方式等信息。如果不是专网卡,通常不需要修改这里的配置。拨号参数集最多可以添加10条记录。
Network Mode:蜂窝的网络制式,可以选择3G,4G等相关网络制式,比如LTE,WCDMA等。如果不清楚选哪种网络制式,则选择自动;程序会自动选择一个最合适的网络制式。默认值是自动。
Enable Default Route:启用添加默认路由功能,开启后,当拨号成功后,会添加一条蜂窝口的默认路由。默认是开启的。
Metric:蜂窝口默认路由的度量值,当蜂窝口,Wi-Fi和以太网口都配置了默认路由的时候,度量值最小的生效。
Dual SIM Enabled:启用双卡功能。EC954为了提高网络的可靠性,支持双卡单拨。设备上需要插入2张sim卡,开启该功能后,如果sim1卡因为欠费导致拨号失败,会自动切换到sim2卡进行拨号。默认是关闭的。
Main SIM:主sim卡,拨号时会优先使用选中的sim卡进行拨号,拨号失败达到一定次数时,在切换到另外一张sim卡进行拨号,默认先使用sim1进行拨号。
Max Number of Dials: 开启双卡单拨功能后,当前拨号sim卡拨号达到指定次数,切换到另外一张sim卡进行拨号。
APN Profile: sim卡选用的拨号参数集,默认值是自动。通常专网卡通常需要配置拨号参数集,并在此处选择拨号参数集的Index。
PIN Code:sim卡的PIN码。
无线蜂窝网络比较复杂,有些时候会出现拨号假连接的情况,即拨号状态是成功的,但却ping不通目标地址;发生这些状况的时候,重新拨号一次就可以恢复正常。IEOS蜂窝拨号支持ICMP探测以发现假连接。建议使用蜂窝联网的客户开启ICMP探测,这样出现假连接的时候也可以快速恢复。
ICMP探测参数:
ICMP Detection Server Probes:ICMP探测地址;可以配置2个探测地址,只要有1个地址探测成功,则说明蜂窝没有出现假连接。2个地址都没有配置的时候,ICMP探测功能处于关闭状态。
Detection Interval:间隔多久进行一次ICMP探测。
Detection Timeout:ICMP探测超时时间,等待多久没有收到探测响应报文,则认为此次探测失败
Detection Max Retries:最大探测次数;当探测失败达到这个值的时候,触发重新拨号。取值范围[1,5]
Detection Strict:是否开启严格探测。关闭严格探测时,探测程序在每个探测周期会检测蜂窝接口接收的报文是否发生变化,如果有变化,说明蜂窝网络是通的,则不会发送ICMP报文进行探测,这样可以节省一些流量;如果开启探测,则无论蜂窝接口接收报文的数量是否发生变化,都会周期性的发送ICMP探测报文。默认是关闭的。
高级配置中是一些不常用的设置选项。
Debug Mode enabled:是否启用debug功能,开启后,日志中会增加一些拨号相关的调试信息,默认关闭。
Enable Infinitely Redial:开启无限重拨。某些情况下,拨号会处于异常状态,通过重启系统可以恢复正常;默认无限重拨是关闭的,当拨号失败一定次数后,会重启系统尝试恢复。由于拨号默认是开启的,有些客户在不插sim卡的情况下,拨号失败,系统会重启,针对这种情况,可以开启无限重拨;这样无论拨号失败多少次,系统都不会重启。
Dial Interval:拨号间隔;但某次拨号失败时,进行下一次拨号之前等待的时间。
Signal Query Interval:信号查询间隔。信号不好时,可能会产生假连接的问题;这时重新拨号有一定概率可以解决假连接的问题。拨号程序会定期检测信号强度,这里配置的是信号检测周期。
Enable Wi-Fi:使能开关;默认关闭
Client SSID:需要连接的ssid,可以手动输入;也可以通过扫描按钮获取附近可连的ssid
Enable Default Route:是否启用添加默认路由功能,开启后,当wifi连接成功后,会添加一条wlan口的默认路由。默认是开启的。
Metric:wifi口默认路由的度量值,当蜂窝口,Wi-Fi和以太网口都配置了默认路由的时候,度量值最小的生效。
Auth Method:认证方式,支持无认证,WPA-PSK,WPA2-PSK,WPA-PSK/WPA2-PSK Mixed
Encrypt Mode:加密方式;支持CCMP,TKIP,TKIP和CCMP
WPA/WPA2 PSK Key:密钥信息
这里配置的是以太网的静态路由,当同时配置了以太网,蜂窝,wifi的默认路由时,metric值最小的那一条默认路由生效。需要保证默认路由的Metric值是不同的。
静态路由配置参数:
Interface:静态路由的出接口
Target:目标网络
Netmask:目标网络掩码
Gateway:下一跳地址
Metric:静态路由的度量值
目前只支持使用iptables命令进行配置。
DNS Servers:DNS Server地址,最多支持配置4个
Domain name hijacking:域名劫持功能,可以实现IP地址和域名之间的绑定。
网络诊断支持ping,traceroute和nslookup功能。
云管理
Enabled: 对接DeviceLive平台的使能开关; DeviceLive是映翰通设备的远程监控和管理平台;
Cloud Server:DeviceLive平台有2个地址;一个是国内平台的地址,另外一个是海外平台地址;这里选择连接哪个平台。
时区和NTP client
最多可以配置10个NTP Server地址,程序周期性的依次向每个服务器地址发送同步请求,同步成功后,将系统时间写入RTC,并不再继续向后面的NTP服务器发送同步请求。
除了使用NTP同步时间,在Device Info状态页面有一个同步按钮可以手动同步时间,但只有当设备时间和本地时间(访问设备所使用的电脑的时间)相差超过3s时,才会显示这个同步按钮。
这里支持配置的导入,导出以及恢复出厂。
自动重启选项默认是关闭的,升级固件之后,需要手动重启系统才能生效;开启自动重启选项后,升级固件成功后会自动重启系统。
这个页面有重启系统和重置系统2个功能。重置系统需要慎重使用,重置系统功能会将系统的配置状态和文件系统状态恢复到和出厂时一致,也就是说用户安装的软件也会被清除。
设备信息状态页面显示主机名,设备型号,序列号,固件版本,内核版本,文件系统版本以及CPU,内存和磁盘空间的使用概况。
蜂窝拨号状态页面显示当前拨号使用的sim卡,IMEI,IMSI,ICCID,信号强度,以及拨号获取的IP地址,DNS等信息。
Wi-Fi状态页面显示Wi-Fi连接成功后获取的IP地址,网关以及DNS等信息。
DHCP Server状态页面显示设备做为DHCP Server,分配出去的IP地址,客户端主机名,客户端主机mac以及过期时间。
路由状态页面显示IPv4直连路由,静态路由以及路由邻居等信息。
防火墙状态信息显示过滤规则,IP地址映射规则等信息。
日志页面可以查看系统日志,用户日志以及设置查看的日志等级,包括Error,Info,Debug等级别。日志也可以下载到本地。
使用Linux命令行进行网络配置和系统配置的时候,首先需要关闭IEOS程序。IEOS是通过systemctl来管理的,
关闭IEOS的方式如下:
systemctl stop ieos_daemon
这种关闭只针对本次启动生效,系统重启后,IEOS程序依然会启动,禁止IEOS程序开机启动的方式如下:
systemctl disable ieos_daemon
重要说明:关闭IEOS之后,拨号,Wi-Fi等无线联网功能需要用户基于Linux原生命令来实现,而且也无法实现对接DeviceLive平台对设备进行远程管理。
如果要为EC954设置静态IP地址,通过命令 vim /etc/network/interfaces.d/eth1或 vim /etc/network/interfaces.d/eth2修改对应的网络配置文件来对以太网接口的默认网关,地址,网络以及子网掩码进行设置。这里以给eth2口设置静态IP来举例说明:
修改接口IP配置后,执行/etc/init.d/networking restart,重启网络服务,使配置生效。
如果要为EC954设置动态IP地址,通过命令vim /etc/network/interfaces.d/eth1或 vim /etc/network/interfaces.d/eth2修改对应的网络配置文件,在inet后设置为DHCP将自动获取IP地址。
这里以给eth1口设置动态IP来举例说明。
修改接口IP配置后,执行/etc/init.d/networking restart,重启网络服务,使配置生效。
要检查EC954的计算机固件版本,请键入:
加上-a的选项可以看到完整的版本信息:
要确定可用驱动器空间的量,请使用带有-h选项的df命令。系统将返回按文件系统分解的驱动器空间量。EC954产品,用户可用的磁盘分区是/dev/mmcblk0p8。下面是一个示例:
devinfo工具可以查看产品的型号信息
EC954有两个时间设置。一个是系统时间,另一个是由EC954的硬件所保持的RTC(实时时钟)时间。使用date命令来查询当前的系统时间或设置一个新的系统时间。使用hwclock命令查询当前的RTC时间或设置一个新的RTC时间。
使用命令date MMDDhhmmYYYY来设置系统时间:
MM: 月
DD: 日
hh: 时
mm: 分
YYYY: 年
使用以下命令可以将RTC时间设置为系统时间
点击以下的链接来获取更多有关日期和时间的详细信息:
https://www.debian.org/doc/manuals/system-administrator/ch-sysadmin-time.html
https://wiki.debian.org/DateTime
有两种方法可以配置EC954的时区。一个是使用命令tzselect。另一个是使用/etc/localtime文件。
当键入tzselect命令后,会进入到选择地区的界面先选择大致的区域(按大洲大洋划分)输入大洲或大洋前面的数字
再选择该大洲或大洋下的国家
按照以上步骤获取到中国时区关键字Asia/Shanghai,执行以下命令设置时区
本地时区存储在/etc/localtime中,如果没有为TZ环境变量设置值,则被GNU库用于C(glibc)。此文件或者是/usr/share/zoneinfo/file的副本,或者是指向它的符号链接。若EC954无法找到/usr/share/zoneinfo/文件,请从该网站上下载您所需要的时区信息文件(https://www.iana.org/time-zones),并在EC900中重新链接到本地时间文件。
注意
成功下载所需要的时区信息文件后,进行解压,之后使用zic命令编译生成对应的二进制文件,生成的时区文件为“/usr/share/zoneinfo/自定义时区文件名”。
在本章中,我们将介绍基于Arm结构的边缘计算机EC900的外设接口的高级配置。
EC954有8个串口,前4个串口支持RS-232、RS-422和RS-485 多种串口模式,默认模式为RS-485,使用ih_uart_ctl命令可以切换串口模式。后4个串口固定为RS-485模式。
P1对应的设备节点是/dev/ttyCOM1
P2对应的设备节点是/dev/ttyCOM2
P3对应的设备节点是/dev/ttyCOM3
P4对应的设备节点是/dev/ttyCOM4
用stty命令查看和设置串口
通过键入sudo stty --help查看详细命令内容:
sudo stty -F /dev/ttyCOM1 ispeed 9600 ospeed 9600 cs8
sudo stty -F /dev/ttyCOM1 ispeed 9600 ospeed 9600 cs8
sudo stty -F /dev/ttyCOM3 ispeed 9600 ospeed 9600 cs8
sudo stty -F /dev/ttyCOM4 ispeed 9600 ospeed 9600 cs8
注意
关于stty命令的详细信息可在以下链接中获得
http://www.gnu.org/software/coreutils/manual/coreutils.html
EC954提供两个USB 2.0 Host接口,主要用于扩展存储设备、接鼠标和键盘
EC954支持USB存储设备热插拔。它会自动挂载所有的分区。EC954会把所有USB存储设备分区挂载到/mnt/路径下,挂载文件夹的命名格式为usb_<node>_<num>。其中,<node>是分区的设备节点名称,<num>可以是0~9的数字。
注意
在断开USB大容量存储设备之前,请记住输入sync同步命令,以防止数据丢失。当您断开存储设备的连接时,请从/media/* 目录下退出。如果您留在/media/usb*中,则自动卸载过程将会失败。如果发生这种情况,请键入umount /media/usb*以手动卸载设备
EC954支持micro SD存储卡不支持热插拔。它会自动挂载所有的分区。EC954会把所有micro SD存储卡分区挂载到/mnt/路径下,挂载文件夹的命名格式为sd_<node>_<num>。其中,<node>是分区的设备节点名称,<num>是0~9的数字。
(1)登录系统,执行sudo fdisk -l,找到自己硬盘分区,如下图是/dev/sda1
(2) 将分区格式化为需要使用的文件系统,比如ext4
(3) 创建挂载点, 比如/mnt/sda1
(4) 编辑vi /etc/fstab文件,
在末尾行加上/dev/sda1 /mnt/sda1 ext4 defaults,nofail,x-systemd.device-timeout=1s 0 0,添加后如下图所示:
/dev/sda1:设备分区,需要用户根据实际情况进行配置
/mnt/sda1: 挂载点,需要用户根据实际情况进行配置
etx4 硬盘分区的文件系统格式,需要用户根据实际情况进行配置
defaults,nofail,x-systemd.device-timeout=1s 0 0固定配置,推荐使用这样的配置,用户也可以根据需要自行修改。
EC954的CAN端口支持两个CAN总线,CAN1对应设备can0,CAN2对应设备can1
默认情况下,CAN端口将被初始化。如果需要任何其他配置,请使用ip链接命令检查CAN设备。要检查CAN设备的状态,请使用ip链接命令:
要配置CAN设备,请使用ip link set can0 down来先关闭设备
sudo ip link set can0 down
然后配置比特率(以下是125k比特率示例):
sudo ip link set can0 type can bitrate 125000
最后重新开启设备
sudo ip link set can0 up
默认情况下,CAN端口将被初始化。如果需要任何其他配置,请使用ip链接命令检查CAN设备。要检查CAN设备的状态,请使用ip链接命令:
要配置CAN设备,请使用ip link set can1 down来先关闭设备
sudo ip link set can1 down
然后配置比特率(以下是125k比特率示例):
ip link set can1 type can bitrate 125000 dbitrate 1250000 fd on
最后重新开启设备
sudo ip link set can1 up
EC954支持4路DI和4路DO。当您要使用IO口的时候请键入dio_mgmt命令用于控制io的输入输出。dio_mgmt的用法:
当需要设置某位IO口为高或者低时,可以键入命令dio_mgmt set D<I/O><number><HIGH/LOW>
通过键入dio_mgmt show D<I/O><number>打印对应的IO口的电平信息。
EC900部分型号内部集成GPS模块,数据串口节点为/dev/ttyS9。
如果要查看GPS的详细信息,有两种方式可以进行查看:
1.通过长按开关机按键8秒进行关机
2.您可以使用Linux命令来关闭设备上运行的所有软件并停止系统。但是,在运行此命令后,CPU、RAM和存储设备等主要组件将掉电。
短按开关机键,系统就会执行开机操作。
在本章中,我们将介绍基于ARM结构的边缘计算机EC900的安全机制。
在EC900中,为了获得更好的安全性,根用户被禁止使用。Sudo是一个程序,让系统管理员允许被同意的用户作为根用户或其他用户执行一些命令。最基础的准则是给予尽可能少的特权完成工作。使用sudo比使用root身份的会话打开更安全,原因有很多,包括:
• 不用知道root密码(sudo会提示当前用户的密码),可授予普通用户特权
• 通过sudo运行需要特权的命令很容易,其余时间,都作为无特权用户工作,从而降低由于错误操作可能造成的损害。
• 有些系统级命令不能直接对用户使用,如下示例输出所示:
Netfileter/iptables (以下简称iptables)是nuix/linux 系统自带的优秀且完全免费的基于包过滤的防火墙工具、它的功能十分强大、使用非常灵活、可以对流入、流出及流经服务器的数据包进行精细的控制。
TPM代表“Trusted Platform Module”(可信平台模块),它是一种硬件安全模块,旨在提供计算机系统的安全和加密功能。它是一个安全微控制器,可以在计算机系统中嵌入或作为独立硬件设备出售。它包含一个加密协处理器,用于存储加密密钥、数字证书和其他安全数据,以及支持多种加密算法和安全协议。在EC954上,已经集成了标准的TPM2.0协议栈和TPM2.0工具供用户使用。
在本章中,我们将介绍基于Arm结构的边缘计算机EC900如何恢复出厂设置及更新。
有两种方法可以恢复出厂设置:
准备一个U盘(micro SD卡)。如果该U盘(SD卡)有多个分区,请使用第一个分区。建议不做多个分区。U盘(SD卡)分区需要格式为FAT32格式。本文档以升级EC954-V2.0.0.img为例进行说明。
EC900提供了一个JSON格式的设备信息描述文件,需要操作IO,LED,串口等外设的客户,可以通过查询设备描述信息文件获取这些外设的设备节点信息。
设备描述信息文件路径:/tmp/ieos/etc/system_info.json, 内容如下:
{
"device_info":{
"model_info":{
"model":"EC954",
"pn":"IO-FQ58",
"sn":"EC9540000011111",
"oem":"inhand",
"features":";io;cell-FQ58;wlan;ble;gps;"
},
"software_info":{
"boot_loader":"1.0.2",
"kernel":"5.10.160-00001-g406d1811beab-dirty",
"version":"V2.0.0-beta.1",
"OS":"Debian GNU/Linux 11 (bullseye)"
},
"hardware_info":{
"arch":"arm64",
"soc":"rk3568",
"interface":{
"eth":[
{
"iface_name":"eth1",
"iface_mac":"00:33:44:11:00:01"
},
{
"iface_name":"eth2",
"iface_mac":"00:33:44:11:00:02"
},
{
"iface_name":"eth3",
"iface_mac":"00:33:44:11:00:03"
},
{
"iface_name":"eth4",
"iface_mac":"00:33:44:11:00:04"
}
],
"wlan":[
{
"iface_name":"wlan0",
"iface_mac":"94:A4:08:8A:30:CD"
},
{
"iface_name":"wlan1",
"iface_mac":"96:A4:08:8A:30:CD"
}
],
"ble":[
]
},
"gpio":[
{
"gpio_name":"cellular_power",
"dev_node":"/sys/class/gpio/gpio0"
},
{
"gpio_name":"sim_switch",
"dev_node":"/sys/class/gpio/gpio19"
},
{
"gpio_name":"msata_power",
"dev_node":"/sys/class/gpio/gpio20"
},
{
"gpio_name":"gnss_power",
"dev_node":"/sys/class/gpio/gpio110"
},
{
"gpio_name":"ble_power",
"dev_node":"/sys/class/gpio/gpio220"
}
],
"user_key":[
{
"user_key_name":"USER",
"dev_node":"/sys/class/gpio/gpio95"
}
],
"uart":[
{
"uart_name":"P1",
"dev_node":"/dev/ttyO1"
},
{
"uart_name":"P2",
"dev_node":"/dev/ttyO2"
},
{
"uart_name":"P3",
"dev_node":"/dev/ttyO3"
},
{
"uart_name":"P4",
"dev_node":"/dev/ttyO4"
},
{
"uart_name":"P5",
"dev_node":"/dev/ttyO5"
},
{
"uart_name":"P6",
"dev_node":"/dev/ttyO6"
},
{
"uart_name":"P7",
"dev_node":"/dev/ttyO7"
},
{
"uart_name":"P7",
"dev_node":"/dev/ttyO8"
}
],
"io":{
"di":[
{
"di_name":"DI1",
"dev_node":"/sys/class/gpio/gpio487"
},
{
"di_name":"DI2",
"dev_node":"/sys/class/gpio/gpio488"
},
{
"di_name":"DI3",
"dev_node":"/sys/class/gpio/gpio489"
},
{
"di_name":"DI4",
"dev_node":"/sys/class/gpio/gpio490"
}
],
"do":[
{
"di_name":"DO1",
"dev_node":"/sys/class/gpio/gpio491"
},
{
"di_name":"DO2",
"dev_node":"/sys/class/gpio/gpio492"
},
{
"di_name":"DO3",
"dev_node":"/sys/class/gpio/gpio493"
},
{
"di_name":"DO4",
"dev_node":"/sys/class/gpio/gpio494"
}
]
},
"led":[
{
"led_name":"USER1",
"dev_node":"/sys/class/leds/user1"
},
{
"led_name":"USER2",
"dev_node":"/sys/class/leds/user2"
},
{
"led_name":"4G/5G",
"dev_node":"/sys/class/leds/cell"
},
{
"led_name":"SIM1",
"dev_node":"/sys/class/leds/sim1"
},
{
"led_name":"SIM2",
"dev_node":"/sys/class/leds/sim2"
},
{
"led_name":"WARN",
"dev_node":"/sys/class/leds/warn"
},
{
"led_name":"ERROR",
"dev_node":"/sys/class/leds/error"
},
{
"led_name":"STATUS",
"dev_node":"/sys/class/leds/status"
},
{
"led_name":"L1",
"dev_node":"/sys/class/leds/level1"
},
{
"led_name":"L2",
"dev_node":"/sys/class/leds/level2"
},
{
"led_name":"L3",
"dev_node":"/sys/class/leds/level3"
}
]
}
}
}
目前设备上一共8个IO接口:如设备面板上DI0~DI3为4个输入管脚;DO0~DO3为4个输出管脚。
根据设备描述信息文件/tmp/ieos/etc/system_info.json可以获取到IO设备节点为:
DI0~DI3-----sys/class/gpio/gpio487~sys/class/gpio/gpio490
DO0~DO3------sys/class/gpio/gpio491~sys/class/gpio/gpio494
当您需要对IO接口进行编程时,直接操作后台设备节点下面的value值即可(sys/class/gpio/gpioxxx/value)
案例:
当DO0需要输出高电平时,可以直接向sys/class/gpio/gpio491/value写入1
echo 1 > /sys/class/gpio/gpio491/value
当需要查看DI0的电平是,同样可以直接查看sys/class/gpio/gpio487/value的值
cat /sys/class/gpio/gpio487/value
完整shell脚本:
#!/bin/bash
gpio491="/sys/class/gpio/gpio491/value"
gpio492="/sys/class/gpio/gpio492/value"
gpio493="/sys/class/gpio/gpio493/value"
gpio492="/sys/class/gpio/gpio494/value"
# 当DO0需要输出高电平时,可以直接向sys/class/gpio/gpio491/value写入1
if [ -f "$gpio491" ]; then
echo 1 > /sys/class/gpio/gpio491/value
else
echo "no file exit "$gpio491
fi
# 当DO1需要输出低电平时,可以直接向sys/class/gpio/gpio491/value写入1
if [ -f "$gpio492" ]; then
echo 0 > $gpio492
else
echo "no file exit "$gpio492
fi
gpio487="/sys/class/gpio/gpio487/value"
gpio488="/sys/class/gpio/gpio488/value"
gpio489="/sys/class/gpio/gpio489/value"
gpio490="/sys/class/gpio/gpio490/value"
# 当需要查看DI0的电平是,同样可以直接查看sys/class/gpio/gpio487/value的值
if [ -f "$gpio487" ]; then
cat $gpio487
else
echo "no file exit "$gpio487
fi
设备上用户可以使用USER1和USER2两个灯进行状态提示,请查看灯签确认USER1和USER2两个灯的位置。
根据设备描述信息文件/tmp/ieos/etc/system_info.json可以获取到USER1和USER2设备节点为:
user1:/sys/class/leds/user1
user2:/sys/class/leds/user2
/sys/class/leds/user1目录下有一些控制文件用于控制LED的属性和状态:
/sys/class/leds/user1/brightness:该文件用于控制USER1灯的亮或者灭。写入1即是常亮,写入0即是常灭。
/sys/class/leds/user1/trigger:LED灯的触发器,可写入timer表示定时器触发,写入none表示取消触发器。
/sys/class/leds/user1/delay_on:该文件表示led灯亮的时间,以ms为单位。
/sys/class/leds/user1/delay_off:该文件表示led灯灭的时间,以ms为单位。
若配置了trigger为定时触发,则brightness中的值将不再生效,会自动变为0。
将文件路径中user1替换为user2即为控制USER2灯的操作。
案例:
当需要USER1灯常亮时,将1写入brightness文件
echo 1 > /sys/class/leds/user1/brightness
当需要USER1灯闪烁时,将timer写入trigger文件,通过delay_on和delay_off控制亮和灭的时间
# 开始定时器
echo timer > /sys/class/leds/user1/trigger
# 亮1秒钟
echo 1000 > /sys/class/leds/user1/delay_on
# 灭1秒钟
echo 1000 > /sys/class/leds/user1/delay_off
完整shell脚本:
#!/bin/bash
USER1_BRIGTHNESS="/sys/class/leds/user1/brightness"
USER1_TRIGGER="/sys/class/leds/user1/trigger"
USER1_DELAY_ON="/sys/class/leds/user1/delay_on"
USER1_DELAY_OFF="/sys/class/leds/user1/delay_off"
USER2_BRIGTHNESS="/sys/class/leds/user2/brightness"
USER2_TRIGGER="/sys/class/leds/user2/trigger"
USER2_DELAY_ON="/sys/class/leds/user2/delay_on"
USER2_DELAY_OFF="/sys/class/leds/user2/delay_off"
# 点亮USER1灯
if [ -f "$USER1_BRIGTHNESS" ]; then
echo 1 > $USER1_BRIGTHNESS
else
echo "no file exit "$USER1_BRIGTHNESS
fi
# 点亮USER2灯
if [ -f "$USER2_BRIGTHNESS" ]; then
echo 1 > $USER2_BRIGTHNESS
else
echo "no file exit "$USER2_BRIGTHNESS
fi
# 设置USER1灯闪烁
if [ -f "$USER1_TRIGGER" ]; then
echo timer > $USER1_TRIGGER
else
echo "no file exit "$USER1_TRIGGER
fi
# 设置USER2灯闪烁
if [ -f "$USER2_TRIGGER" ]; then
echo timer > $USER2_TRIGGER
else
echo "no file exit "$USER2_TRIGGER
fi
# 设置USER1灯亮1000ms
if [ -f "$USER1_DELAY_ON" ]; then
echo 1000 > $USER1_DELAY_ON
else
echo "no file exit "$USER1_DELAY_ON
fi
# 设置USER1灯灭1000ms
if [ -f "$USER1_DELAY_OFF" ]; then
echo 1000 > $USER1_DELAY_OFF
else
echo "no file exit "$USER1_DELAY_OFF
fi
# 设置USER2灯亮1000ms
if [ -f "$USER2_DELAY_ON" ]; then
echo 1000 > $USER2_DELAY_ON
else
echo "no file exit "$USER2_DELAY_ON
fi
# 设置USER2灯灭1000ms
if [ -f "$USER2_DELAY_OFF" ]; then
echo 1000 > $USER2_DELAY_OFF
else
echo "no file exit "$USER2_DELAY_OFF
fi
# 关闭USER1闪烁
if [ -f "$USER1_TRIGGER" ]; then
echo none > $USER1_TRIGGER
else
echo "no file exit "$USER1_TRIGGER
fi
# 关闭USER2闪烁
if [ -f "$USER2_TRIGGER" ]; then
echo none > $USER2_TRIGGER
else
echo "no file exit "$USER2_TRIGGER
fi
用户自己的c/c++程序可以通过在开发机器上使用交叉编译工具链进行交叉编译,然后将目标文件上传到EC954设备上执行。
交叉编译工具压缩包:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz
为交叉编译工具链配置环境变量的方法:
以经典的hello world程序为示例进行说明,创建如下目录和文件
mkdir ~/example
touch ~/example/hello.c
touch ~/example/Makefile
~/example/hello.c文件的内容如下:
#include <stdio.h>
int main(void)
{
printf("hello, world!\n");
return 0;
}
~/example/Makefile文件的内容如下:
# 定义目标文件名和源文件名
TARGET := hellworld
DIRS := $(shell find . -maxdepth 3 -type d)
SRCS := $(foreach dir,$(DIRS),$(wildcard $(dir)/*.c))
OBJS := $(SRCS:.c=.o)
CC=aarch64-linux-gnu-gcc
# 定义编译器和编译选项
CFLAGS := -Wall -Wextra -g -Wno-unused-parameter
# 定义默认目标
all: $(TARGET)
# 定义目标文件的依赖关系和编译命令
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(LIBS) $^ -o $@
# 定义将源文件编译成目标文件的命令
%.o: %.c
$(CC) $(CFLAGS) $(LIBS) -c $< -o $@
# 定义清除临时文件的命令
clean:
rm -f $(TARGET) $(OBJS)
# 声明伪目标 ".PHONY"
.PHONY: all clean
在~/example目录下执行make,生成目标文件helloworld