1. 项目背景与目标
最近在RK3562开发板上基于OpenHarmony 5.0.3系统适配移远EG800AK-CN模组时,遇到了一些技术挑战。这个4G模组需要通过USB接口与开发板连接,实现蜂窝网络上网功能。由于项目时间紧张,我们决定采用不走鸿蒙框架的适配方案,直接基于Linux驱动层实现。
选择EG800AK-CN模组主要基于几个考虑:首先,它支持LTE Cat4网络,理论下行速率可达150Mbps,满足大多数IoT设备的联网需求;其次,模组体积小巧(30mm × 30mm × 2.9mm),适合嵌入式场景;最重要的是,它提供了完善的Linux驱动支持,包括ECM、RNDIS等多种USB网络驱动模式。
2. 驱动适配与配置
2.1 USB驱动选型分析
EG800AK模组支持多种USB驱动模式,我们需要根据OpenHarmony系统的特点选择最合适的方案:
-
ECM(Ethernet Control Model):
- 标准USB CDC类驱动
- 内核原生支持,兼容性好
- 性能稳定,延迟较低
-
RNDIS(Remote NDIS):
- Windows环境下常用
- 需要额外协议转换开销
- 在Linux系统下性能不如ECM
-
USB转串口+PPP:
- 传统拨号方式
- 配置复杂
- 吞吐量受限
经过对比,我们选择了ECM驱动方案。主要基于以下考虑:OpenHarmony内核基于Linux,对ECM驱动支持完善;ECM无需额外的协议转换层,网络性能更优;调试工具和问题排查方法成熟。
2.2 内核配置修改
在RK3562的标准内核配置文件中(rk3562_standard_defconfig),需要添加以下关键配置:
makefile复制CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_CDCETHER=y
这些配置的作用分别是:
USB_NET_DRIVERS:启用USB网络设备驱动框架USB_USBNET:支持通用的USB网络设备CDCETHER:具体实现ECM协议支持
注意:在修改内核配置后,建议执行
make savedefconfig保存变更,然后重新编译内核。编译时可能会遇到依赖问题,需要确保相关依赖驱动(如USB核心驱动)也已启用。
3. 拨号工具移植
3.1 quectel-CM工具获取与结构分析
移远提供了名为QConnectManager的Linux拨号工具(版本1.6),需要从官方渠道获取。工具包主要包含以下关键文件:
code复制QmiWwanCM.c # QMI协议处理
GobiNetCM.c # 网络接口管理
main.c # 主程序入口
QCQMUX.c # 多路复用处理
QMIThread.c # 异步消息处理
util.c # 工具函数
工具使用标准的Makefile构建系统,通过分析Makefile可以了解其编译依赖和参数:
makefile复制QL_CM_SRC = QmiWwanCM.c GobiNetCM.c main.c QCQMUX.c QMIThread.c util.c
QL_CM_DHCP = qmap_bridge_mode.c mbim-cm.c device.c atc.c atchannel.c at_tok.c udhcpc.c
quectel-CM: ${QL_CM_SRC} ${QL_CM_DHCP}
$(CC) ${CFLAGS} ${QL_CM_SRC} ${QL_CM_DHCP} -o quectel-CM ${LDFLAGS}
3.2 构建系统适配
OpenHarmony使用GN作为构建系统,我们需要将Makefile转换为BUILD.gn文件。在third_party/quectel目录下创建构建描述文件:
gn复制static_library("quectel-cm") {
sources = [
"QmiWwanCM.c",
"GobiNetCM.c",
"main.c",
"QCQMUX.c",
"QMIThread.c",
"util.c",
"qmap_bridge_mode.c",
"mbim-cm.c",
"device.c",
"atc.c",
"atchannel.c",
"at_tok.c",
"udhcpc.c"
]
cflags = [
"-Wall",
"-Werror",
"-fPIC"
]
include_dirs = [
"//third_party/quectel/include",
"//kernel/linux/headers"
]
}
executable("quectel-cm-bin") {
deps = [ ":quectel-cm" ]
install_enable = true
install_images = [ "system" ]
part_name = "ril_adapter"
subsystem_name = "telephony"
}
同时需要在base/telephony/ril_adapter/bundle.json中添加组件声明:
json复制{
"name": "quectel-cm-group",
"description": "Quectel CM tools",
"version": "1.0.0",
"license": "Apache 2.0",
"component": {
"name": "quectel-cm",
"subsystem": "telephony",
"syscap": [],
"features": [],
"adapted_system_type": [ "standard" ],
"rom": "100KB",
"ram": "50KB",
"deps": {
"components": [],
"third_party": []
}
}
}
编译完成后,可在out/rk3562/packages/phone/system/bin目录下找到生成的quectel-CM可执行文件。
4. 系统集成与自启动
4.1 init服务配置
OpenHarmony使用init进程管理系统服务。在init.rk3562.cfg中添加quectel-cm服务定义:
json复制{
"name" : "quectel-cm",
"path" : ["/system/bin/quectel-CM", "-s", "CMNET"],
"uid" : "root",
"gid" : ["shell", "radio"],
"secon" : "u:r:su:s0",
"importance" : 0,
"caps" : ["DAC_OVERRIDE", "NET_ADMIN", "NET_RAW"]
}
4.2 SELinux策略调试
最初配置的u:r:quectel-cm:s0域导致服务启动失败,原因在于:
- SELinux默认采用白名单策略,未明确允许的操作都会被拒绝
- 自定义域
quectel-cm没有对应的.te策略文件 su域具有较宽松的权限,适合调试阶段使用
生产环境中建议:
- 创建专用的SELinux策略文件
- 仅授予必要的权限
- 通过
audit2allow工具生成最小权限集
4.3 设备节点等待机制
通过内核日志分析发现时序问题:
code复制[ 10.400] quectel-cm启动
[ 10.500] quectel-cm退出
[ 11.600] USB设备识别: Quectel
解决方案是在init配置中添加等待条件:
json复制"on" : [{
"name" : "start quectel-cm",
"condition" : "wait /dev/ttyUSB1 10"
}]
5. 问题排查与解决
5.1 工具链缺失问题
现象:系统启动后报错busybox not found
解决方案:
- 在build配置中启用busybox
- 修改
build/ohos/images/mkimage/dac.txt添加执行权限
5.2 DHCP脚本适配
原始default.script需要针对OpenHarmony调整:
bash复制# 修改前
/sbin/route add default gw $router
/sbin/ifconfig $interface $ip netmask $mask
# 修改后
busybox route add default gw $router
ifconfig $interface $ip netmask $mask
5.3 DNS解析异常
根本原因:
third_party/musl/src/network/resolvconf.c中存在条件编译错误:
c复制// 错误写法
#ifdef OHOS_FWMARK_CLIENT_BY_NETSYS
// 正确写法
#if OHOS_FWMARK_CLIENT_BY_NETSYS
临时解决方案:
直接修改musl源码,确保DNS查询走正确路径。
6. 效果验证与性能测试
完成所有适配后,通过以下命令验证功能:
bash复制# 检查网络接口
ifconfig usb0
# 测试网络连通性
ping -c 4 www.example.com
# 测速工具
curl -o /dev/null http://speedtest.tele2.net/100MB.zip
实测指标:
- 网络延迟:平均35ms
- 下载速率:稳定在45Mbps左右
- 上行速率:约20Mbps
- 长时间运行稳定性:连续72小时无断连
7. 优化建议
-
电源管理:
- 添加模组休眠/唤醒控制
- 实现按需联网机制
-
网络监测:
- 增加信号强度监测
- 实现自动重连机制
-
安全性增强:
- 完善SELinux策略
- 添加防火墙规则
-
日志系统:
- 结构化日志记录
- 远程日志上报
实际部署中发现,在信号较弱的区域偶尔会出现DNS解析超时。通过增加备用DNS服务器(如8.8.8.8)可以有效改善这种情况。同时建议在应用层实现重试机制,以应对临时性的网络波动。
