跳转到内容

设备软件手册

1. 以太网端口

1.1. 网络设置概述

本文档介绍系统的基本网络设置。同时,为满足在程序中修改网络设置的需求,也提供了一个使用 yaml-cpp 库修改网络设置的简单示例。

1.1.1 Netplan 与 YAML 文件

1.1.1.1 背景

本分析系统的运行环境采用 Ubuntu 22.04。从 Ubuntu 18.04 版本开始,网络设置不再使用 ifupdown,而是使用 netplan,因此在 /etc/network/interfaces 中设置固定 IP 已无效。因此,需要在 /etc/netplan/xxxx.yaml 中进行网络设置,并需要理解 YAML 文件的基本语法。

1.1.1.2 Netplan 网络设置技巧

请阅读《Netplan 网络设置技巧》,其中详细说明了语法基础和注意事项。

1.1.2 以太网卡操作方法

1.1.2.1 网口接线

网口接线

网口接线

1.1.2.2 修改以太网设置

使用以下命令查看开发板网络设置的保存路径,可以找到 4 个配置文件。其中,50-eth0-init.yaml 是与【NET0】相关的 netplan 配置,51-eth1-init.yaml 是与【NET1】相关的 netplan 配置。

Terminal window
ls /etc/netplan/

修改以太网设置

修改以太网设置

内容如下:

修改以太网设置

修改以太网设置

关于【DHCP】和【静态 IP(Static IP)】各自的设置详情,请参考下图。

修改以太网设置

修改以太网设置

💡 注意:无论是【DHCP】还是【静态 IP】,都需要连接网线后配置才会生效。连接后才能通过 ifconfig 命令查看分配到的 IP 地址。

网络设置既可以拆分到不同文件中,也可以写入同一个 YAML 文件中。以下示例将 NET0 和 NET1 合并到一个文件(99_config.yaml)中,并将 eth0 设置为 DHCP、eth1 设置为静态 IP:

修改以太网设置

修改以太网设置

修改 YAML 文件后,需要执行以下命令使更新生效:

Terminal window
sudo netplan generate
sudo netplan apply

1.2. 快速开始

1.2.1 准备开发环境

在 PC 端的 Ubuntu 系统中执行 run 脚本,进入 EASY-EAI 编译环境。具体如下。

Terminal window
cd ~/develop_environment
./run.sh 2204

1.2.2 下载源码并编译示例

首先,在虚拟机后台终端中执行以下命令,创建外设示例源码的管理目录:

Terminal window
cd /opt
mkdir -p EASY-EAI-Nano-TB/demo

例如,将示例程序下载到“PC\D:”(没有指定要求,用户可放在任意位置)。

之后,将下载的示例复制到虚拟机文件系统中。

下载源码并编译示例

下载源码并编译示例

最后,进入对应示例目录并执行编译操作。具体命令如下:

Terminal window
cd EASY-EAI-Nano-TB/demo/01_network
./build.sh

💡 注意:由于依赖库放置在开发板上,因此交叉编译过程中需要保持 /mnt 挂载。

下载源码并编译示例

下载源码并编译示例

如果发生错误,需要在【开发板上】安装 libyaml-cpp-dev 库:

下载源码并编译示例

下载源码并编译示例

Terminal window
sudo apt-get install libyaml-cpp-dev

1.2.3 运行示例

通过串口调试或 SSH 进入开发板后台,并进入示例所在目录:

Terminal window
cd /userdata

运行示例

运行示例

运行示例的命令如下:

Terminal window
./test-ethernet

该 demo 的作用是将 eth0 的设置修改为【静态 IP:192.168.1.170】。如果在编译环境中挂载了 eth0,或者通过 SSH 进行调试且修改前通过 DHCP 获取到的 IP 不是 192.168.1.170,则该示例代码运行完成后,所有连接都会断开。

1.2.4 运行结果

运行结果如下图所示。

运行结果

运行结果

配置文件也会同时被修改。

运行结果

运行结果

1.3 操作示例

示例代码位于 01_network/test-ethernet/main.cpp。

1.3.1 示例源码

以下代码是设置 eth0 的 IP 地址、DNS 和网关参数的使用示例,可作为编码参考:

int main() {
// 加载 YAML 文件
YAML::Node config = YAML::LoadFile("/etc/netplan/50-eth0-init.yaml");
// =====================修改 eth0 参数==========================
// 禁用 DHCP
config["network"]["ethernets"]["eth0"]["dhcp4"] = "false";
// 修改 eth0 的 IP 地址
// 方法 1:固定写入第一个位置
config["network"]["ethernets"]["eth0"]["addresses"][0] = "192.168.1.170/24";
// 方法 2:追加插入
// 输入 IP 地址和子网掩码
// std::string eth0_ip_str = "192.168.1.171";
// std::string eth0_mask_str = "255.255.255.0";
// std::string eth0_cidr = mask_transition_cidr(eth0_ip_str, eth0_mask_str);
// config["network"]["ethernets"]["eth0"]["addresses"].push_back(eth0_cidr);
// 修改 eth0 的 DNS 地址
YAML::Node addresses_eht0_dns = YAML::Load("[8.8.8.8,8.8.4.4]"); // [8.8.8.8, 8.8.4.4] 是一个序列,因此需要转换
config["network"]["ethernets"]["eth0"]["nameservers"]["addresses"] = addresses_eht0_dns;
// 修改 eth0 的路由(routes)地址
config["network"]["ethernets"]["eth0"]["routes"][0]["to"] = "0.0.0.0/0";
config["network"]["ethernets"]["eth0"]["routes"][0]["via"] = "192.168.1.1";
config["network"]["ethernets"]["eth0"]["routes"][0]["metric"] = "100";
#if 0
// =====================修改 eth1 参数=========================
config["network"]["ethernets"]["eth1"]["dhcp4"] = "false";
// 方法 1:固定写入第一个位置
config["network"]["ethernets"]["eth1"]["addresses"][0] = "192.168.1.172/24";
// 方法 2:追加插入
// std::string eth1_ip_str = "192.168.1.171";
// std::string eth1_mask_str = "255.255.255.0";
// std::string eth1_cidr = mask_transition_cidr(eth1_ip_str,eth1_mask_str);
// config["network"]["ethernets"]["eth1"]["addresses"].push_back(eth1_cidr);
YAML::Node addresses_eht1_dns = YAML::Load("[8.8.8.8,8.8.4.4]");
config["network"]["ethernets"]["eth1"]["nameservers"]["addresses"] = addresses_eht1_dns;
config["network"]["ethernets"]["eth1"]["routes"][0]["to"] = "0.0.0.0/0";
config["network"]["ethernets"]["eth1"]["routes"][0]["via"] = "192.168.1.1";
config["network"]["ethernets"]["eth1"]["routes"][0]["metric"] = "150";
#endif
// ==============将修改后的 YAML 文档写回文件==================
std::ofstream fout("/etc/netplan/50-eth0-init.yaml");
fout << config;
fout.close();
// =======================重启网卡===============================
system("sudo netplan generate");
system("sudo netplan apply");
return 0;
}

2. Wi-Fi STA

2.1 网络设置概述

本文档介绍系统的基本网络设置。同时,为满足在程序中修改网络设置的需求,也提供了一个使用 yaml-cpp 库修改网络设置的简单示例。

2.1.1 Netplan 与 YAML 文件

2.1.1.1 背景

本分析系统的运行环境采用 Ubuntu 22.04。从 Ubuntu 18.04 版本开始,网络设置不再使用 ifupdown,而是使用 netplan,因此在 /etc/network/interfaces 中设置固定 IP 已无效。因此,需要在 /etc/netplan/ 目录中使用 YAML 文件进行网络设置,并需要理解 YAML 文件的基本语法。

2.1.1.2 Netplan 网络设置技巧

2.1.2 Wi-Fi 操作方法

2.1.2.1 连接 Wi-Fi 天线

连接 Wi-Fi 天线

连接 Wi-Fi 天线

2.1.2.2 修改 Wi-Fi 网络设置

使用以下命令查看开发板网络设置的保存路径,可以找到 4 个配置文件。其中, 52-wlan0-init.yaml 是与【Wi-Fi 网卡】相关的 netplan 配置。

Terminal window
ls /etc/netplan/

修改 Wi-Fi 网络设置

修改 Wi-Fi 网络设置

以下是将 wlan0 设置为 DHCP 的示例:

修改 Wi-Fi 网络设置

修改 Wi-Fi 网络设置

关于网卡设置各部分的详细说明,请参考下图:

修改 Wi-Fi 网络设置

修改 Wi-Fi 网络设置

修改 YAML 文件后,需要执行以下命令使更新生效:

Terminal window
sudo netplan generate
sudo netplan apply

2.2 快速开始

2.2.1 准备开发环境

在 PC 端的 Ubuntu 系统中, 执行 run 脚本,进入 EASY-EAI 编译环境。具体如下。

Terminal window
cd ~/develop_environment
./run.sh 2204

2.2.2 下载源码并编译示例

首先,在虚拟机后台终端中执行以下命令,创建外设示例源码的管理目录:

Terminal window
cd /opt
mkdir -p EASY-EAI-Nano-TB/demo

例如,将示例程序下载到“PC\D:”(没有指定要求,用户可放在任意位置)。

之后,将下载的示例复制到虚拟机文件系统中。步骤请参考下图。

下载源码并编译示例

下载源码并编译示例

最后,进入对应示例目录并执行编译操作。具体命令如下:

Terminal window
cd EASY-EAI-Nano-TB/demo/01_network
./build.sh

💡 注意:由于依赖库放置在开发板上,因此交叉编译过程中需要保持 /mnt 挂载。

下载源码并编译示例

下载源码并编译示例

如果出现以下错误,需要在【开发板上】 安装 libyaml-cpp-dev 库:

下载源码并编译示例

下载源码并编译示例

Terminal window
sudo apt-get install libyaml-cpp-dev

2.2.3 运行示例

通过串口调试或 SSH 进入开发板后台,并进入示例所在目录:

Terminal window
cd /userdata

运行示例

运行示例

运行示例的命令如下:

Terminal window
./test-wifi

该 demo 的作用是将 wlan0 设置为 Wi-Fi Station,并连接到名为“HUAWEI-0H1YW8”的 Wi-Fi AP(接入点)。

2.2.4 运行结果

运行后,如果连接正常,接入点会为开发板分配 IP 地址。结果如下图所示。

运行结果

运行结果

2.3 操作示例

示例代码位于 01_network/test-wifi/main.cpp。

2.3.1 示例源码

以下代码是设置 wlan0 接入点连接的使用示例,可作为编码参考:

int main() {
// 加载 YAML 文件
YAML::Node config = YAML::LoadFile("/etc/netplan/52-wlan0-init.yaml");
// =====================修改 Wi-Fi 参数===========================
config["network"]["wifis"]["wlan0"]["dhcp4"] = "true";
config["network"]["wifis"]["wlan0"]["dhcp4-overrides"]["route-metric"] = "200";
config["network"]["wifis"]["wlan0"]["access-points"]["HUAWEI-0H1YW8"]["password"] = "lmo12345678";
// =============================================================
// 将修改后的 YAML 文档写回文件
std::ofstream fout("/etc/netplan/52-wlan0-init.yaml");
fout << config;
fout.close();
// =======================重启网卡===============================
system("sudo netplan generate");
system("sudo netplan apply");
return 0;
}

3.Wi-Fi AP

3.1. 本文档概述

3.1.1 Wi-Fi AP 模式的重要意义

Wi-Fi AP(接入点)模式的主要价值在于将设备(如嵌入式开发板)变成无线接入点,实现多个无线设备的集中连接和网络互通。对于 EASY-EAI 系列开发板而言,该模式可以摆脱对路由器的依赖,直接为手机、PC、平板等设备提供无线网络功能,支持设备间数据共享、远程调试、协同工作等场景,尤其适合无路由器环境下的临时网络搭建以及嵌入式设备无线管理需求。

3.2. Wi-Fi AP 模式设置

3.2.1 启用 wlan1 接口

  1. 执行以下命令,创建用于构建 AP 模式的 wlan1 接口:
Terminal window
sudo echo "Featureid0 create wlan1 ap" \> /sys/ccsys/ccpriv
  1. 查看 wlan1 接口状态: 执行 ifconfig,如果显示 wlan1,则表示已启用。如果未显示,则执行 ifconfig -a;如果存在,则表示尚未启动。

  2. 启动 wlan1 接口(未启动时执行):

Terminal window
sudo ifconfig wlan1 up

💡 注意:为避免修改网络设置导致 SSH 连接断开,后续操作请使用 ADB 或串口调试进行。

3.2.2 配置 hostapd 服务

hostapd 是实现 AP 模式的核心服务,用于管理无线网络的 SSID、加密方式、信道等参数。

  1. 创建 hostapd 配置文件的保存目录(如果不存在):
Terminal window
sudo mkdir -p /etc/wireless
  1. 编辑 hostapd 配置文件:
Terminal window
sudo vim /etc/wireless/hostapd.conf
  1. 写入以下配置内容(重要参数附有说明):
Terminal window
# 指定要使用的无线接口(例如:wlan0)
interface=wlan1
# 使用 nl80211 驱动(大多数现代系统采用 nl80211)
driver=nl80211
# 设置软件 AP 的名称(SSID)
ssid=EASY-EAI-TEST
# 无线模式:g 表示 2.4GHz 802.11g(如果是 5GHz,可使用 a 模式,但配置可能略有不同)
hw_mode=g
# 设置无线信道(选择干扰较少的信道,如 6)
channel=6
# MAC 地址过滤:0 表示不使用过滤
macaddr_acl=0
# 认证算法(1 表示仅使用开放系统认证)
auth_algs=1
# 是否隐藏 SSID:0 表示广播 SSID
ignore_broadcast_ssid=0
# 启用 WPA 加密。推荐使用 WPA2(wpa=2 表示仅支持 WPA2)
wpa=2
# 设置 WPA2 预共享密钥(长度为 8 到 63 个字符)
wpa_passphrase=12345678
# 指定密钥管理方式为 WPA-PSK
wpa_key_mgmt=WPA-PSK
# 指定加密算法。通常建议仅使用 CCMP (AES),以提供更高安全性。
# TKIP 可兼容部分旧设备,但安全性较低。此处可同时列出多种算法以兼容不同设备。
wpa_pairwise=CCMP TKIP
rsn_pairwise=CCMP

4)保存配置文件并退出 Vim(按 ESC 键,输入 :wq 后按 Enter 键)。

3.2.3 配置 udhcpd 服务

udhcpd 是一个轻量级 DHCP 服务器,用于为连接到 AP 的设备自动分配 IP 地址,并保证设备之间的网络互通。

1)编辑 udhcpd 配置文件:

Terminal window
sudo vim /etc/wireless/udhcpd.conf

2)写入以下配置内容(IP 地址范围可根据需要调整):

Terminal window
# Sample udhcpd configuration file (/etc/udhcpd.conf)
# The start and end of the IP lease block
# 设置可分配的 IP 地址范围
start 192.168.123.20 #default: 192.168.0.20
end 192.168.123.254 #default: 192.168.0.254
# The interface that udhcpd will use
# 指定 DHCP 服务器监听的端口(接口)
interface wlan1 #default: eth0
#Examles
# 设置网络相关参数信息
opt dns 223.5.5.5
option subnet 255.255.255.0
opt router 192.168.123.1
opt wins 192.168.123.1
#option dns 129.219.13.81 # appened to above DNS servers for a total of 3
option domain local
option lease 864000 # 10 days of seconds

配置 udhcpd 服务

配置 udhcpd 服务

配置 udhcpd 服务

配置 udhcpd 服务

  1. 设置 wlan1 的静态 IP(必须与 DHCP 地址范围处于同一子网):

💡 注意:为避免 IP 地址冲突,静态 IP 应设置为 DHCP 范围之外的地址。

3.2.4 启动 Wi-Fi AP 服务

  1. 在后台启动 hostapd 服务(& 表示后台运行):
Terminal window
sudo hostapd /etc/wireless/hostapd.conf &
  1. 启动 udhcpd 服务(-S 表示前台运行,便于查看日志):
Terminal window
sudo udhcpd -S /etc/wireless/udhcpd.conf
  1. 如果需要让 udhcpd 服务在后台运行,请执行以下命令:
Terminal window
sudo udhcpd /etc/wireless/udhcpd.conf &
  1. 如果提示找不到命令,请使用以下命令安装工具。
Terminal window
sudo apt-add-repository universe sudo apt update sudo apt install hostapd udhcpd

3.3 功能测试

3.3.1 基本连接测试

  1. 打开手机、PC 等无线设备的 Wi-Fi 功能。

  2. 搜索 SSID(本文档示例为:EASY-EAI-TEST)。

  3. 输入设置的密码(本文档示例为:12345678)。

  4. 连接确认:连接成功后,设备会获取 192.168.123.x 网段的 IP 地址。请尝试相互 ping,确认是否连通。

基本连接测试

基本连接测试

3.3.2 数据传输测试

  1. 开发板端:在 /userdata 目录中创建测试文件。
Terminal window
sudo echo "WIFI AP Test File" \> /userdata/test_ap.txt
  1. 客户端(如 PC):通过 SSH 或 SCP 连接到开发板并下载文件。
Terminal window
scp root@192.168.123.1:/userdata/test_ap.txt ./
  1. 反向测试:从客户端上传文件到开发板,确认双向通信正常。

3.3.3 注意事项

  1. 如需修改 SSID 或密码,需要编辑 hostapd.conf 后重启服务:
Terminal window
sudo pkill hostapd && sudo hostapd /etc/wireless/hostapd.conf &
  1. 开发板重启后,需要重新执行启动命令(也可以创建开机自动执行脚本)。

  2. 为防止接口冲突,请不要同时启用多个无线服务。

  3. 如果使用 5GHz 频段(hw_mode=a),需要确认开发板硬件是否支持该频段。

4 4G

4.1 4G 模块使用概述

4G 模块需要配合 SIM 卡(【普通 SIM 卡】或【IoT SIM 卡】)使用,因此需要通过 AT 命令进行拨号连接。同时,在 Linux 系统中它会被视为网卡设备,因此也需要管理网络设置。由于 AT 命令只在网卡初始化时使用,本文档重点说明 4G 模块相关的网络设置。

4.1.1 Netplan 与 YAML 文件

4.1.1.1 背景

本分析系统的运行环境采用 Ubuntu 22.04。从 Ubuntu 18.04 版本开始,网络设置不再使用 ifupdown,而是使用 netplan ,因此在 /etc/network/interfaces 中设置固定 IP 已无效。因此,需要在 /etc/netplan/ 目录中使用 YAML 文件进行网络设置,并需要理解 YAML 文件的基本语法。

4.1.1.2 Netplan 网络设置技巧

4.1.2 AT 命令

AT 命令:4G 模块需要通过 AT 命令设置其运行状态和部分参数。AT 命令本质上是串口通信,所有命令均以“AT”开头,并以“(即回车)”结束。模块启动后,串口默认设置为:数据位 8 位、停止位 1 位、无校验、硬件流控(CTS/RTS)。发送 AT 命令时请注意,串口终端要求在末尾追加“(即换行)”。在 Linux 系统中,通过 /dev/ttyUSB* 设备节点进行收发。AT 命令发送时,除“AT”两个字符外,最多可接收 1056 个字符(包括最后的 Null 字符)。其分类和命令格式如下图所示。

AT 命令

AT 命令

4.1.3 硬件接口说明

4.1.3.1 MINI-PCIE

MINI-PCIE

MINI-PCIE

4.1.3.2 SIM 卡接口

  • 普通 SIM 卡:即我们平时使用的手机 SIM 卡。这类 SIM 卡与 4G 模块没有绑定关系。

  • IoT SIM 卡:需要与 4G 模块绑定。一张 IoT SIM 卡只能绑定一个 4G 模块,但同一个 4G 模块可以同时绑定多张 IoT SIM 卡。

SIM 卡接口

SIM 卡接口

4.2. 拨号连接

4.2.1 查看 YAML 配置

使用以下命令查看开发板网络设置的保存路径,可以找到 4 个配置文件。其中, 61-mobile0-init.yaml 是与【4G 网卡】相关的 netplan 配置。

Terminal window
ls /etc/netplan/

查看 YAML 配置

查看 YAML 配置

如果不存在,需要手动创建。以下是将 mobile0 设置为 DHCP 的示例:

Terminal window
YAML
network:
version: 2
renderer: networkd
ethernets:
mobile0:
optional: true
dhcp4: true
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
dhcp4-overrides:
route-metric: 250

修改 YAML 文件后,需要执行以下命令使更新生效:

Terminal window
sudo netplan generate
sudo netplan apply

4.2.2 确认 4G 网卡是否正常识别

执行 lsusb 命令。如果正常识别, 会显示 Quectel Wireless,如下图所示。

确认 4G 网卡是否正常识别

确认 4G 网卡是否正常识别

接着执行 ifconfig 命令。如果正常识别, 会显示 mobile0,如下图所示。

Terminal window
ifconfig

确认 4G 网卡是否正常识别

确认 4G 网卡是否正常识别

4.2.3 拨号操作

系统与 4G 模块之间的控制交互通常通过 USB 串口实现。具体交互方式是通过 USB 串口发送 AT 命令。因此,首先需要确认有哪些 USB 串口资源。

拨号操作

拨号操作

请联系模块厂商获取《USB 驱动开发指南》,确认对应模块作为【Modem(调制解调器)】使用的 USB 串口。通过该串口进行拨号操作,详情如下图所示。

拨号操作

拨号操作

拨号命令是 AT 命令之一,具体命令为 AT+QNETDEVCTL=3,1,1。EC200N-CN (CAT1) 的拨号命令通过 /dev/ttyUSB2 发送。

在开发板上执行的命令如下:

Terminal window
echo -ne "AT+QNETDEVCTL=3,1,1\n" \> /dev/ttyUSB2
  • 自动拨号:“AT+QNETDEVCTL=3,1,1\n”

  • 手动拨号(重启后需要重新拨号):“AT+QNETDEVCTL=1,1,1\n”

如果以非 root 用户登录,可以通过以下命令将 AT 命令 发送到 /dev/ttyUSB2:

Terminal window
echo -ne "AT+QNETDEVCTL=3,1,1\n" \| sudo tee /dev/ttyUSB2

4.3 网络连接测试

ifconfig 命令,确认 4G 网卡是否正常分配到 IP 地址。

Terminal window
ifconfig

网络连接测试

网络连接测试

如果 IP 地址已正常分配,请执行以下命令确认是否可以访问外部网络:

Terminal window
ping 8.8.8.8 -I mobile0

如果服务器返回数据,则表示访问成功。

网络连接测试

网络连接测试

💡 注意:如果无法访问外部网络,请检查以下内容:

  • 天线是否正确连接

  • 设备安装位置的 4G 信号是否良好

  • 是否已插入 SIM 卡

  • 如果 SIM 卡是 IoT SIM 卡,请确认该卡是否未过期,且未绑定过其他设备

  • 卡内流量或余额等是否充足