一、rndis_ecm 概述
- RNDIS(Remote NDIS):基于 USB 实现的 TCP/IP over USB,让 USB 设备在 Windows 系统上呈现为一块网卡,从而使 Windows/Linux 可以通过 USB 设备连接网络。
- ECM(Ethernet Control Model):一种基于 USB 的通信设备类(CDC)子类协议,将"TCP/IP over USB"抽象成一条虚拟以太网链路,在主机侧呈现为一块标准的以太网卡。Linux、macOS 等操作系统无需额外专用驱动即可使用。
注意:合宙模组全系不支持Android
二、演示功能概述
2.1 本教程实现的功能定义
本章节将演示如何使用 Air8000 来开启 RNDIS 功能。
注意:ECM 功能由于缺少测试环境,无法进行完整测试,本文档教程主要演示 RNDIS 功能。
三、准备硬件环境
因为 rndis_ecm 功能不受硬件限制,所以本篇教程选用 Air8000 核心板来开发调试。也可以参考:Air8000 硬件环境清单,准备好硬件环境。
3.1 Air8000 核心板

四、准备软件环境
4.1 文章内容应用
在开始实践本示例之前,先筹备一下软件环境:
-
烧录工具:Luatools 工具;
-
本demo开发测试时使用的固件为LuatOS-SoC_V2012_Air8000_1.soc,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
-
脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/rndis_ecm
-
LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 核心板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
4.2 API 介绍
这里仅介绍本篇文档所使用的 API,详情请查看:API 索引 - luatos@air8000 - 合宙模组资料中心
mobile.config(item, value)
网络特殊配置
mobile.flymode(index, enable)
进出飞行模式
五、代码演示
5.1 RNDIS 应用
lua
-- 运行 RNDIS 模式任务
local function rndis_task()
-- 初始化重试计数器,用于记录进入飞行模式失败的重试次数
local count = 0
-- 尝试进入飞行模式,获取操作结果标志
local fly_sign = mobile.flymode(0, true)
-- 判断是否成功进入飞行模式
if fly_sign then
log.info("进入飞行模式成功,打开RNDIS模式")
-- 调用 mobile.config 函数启用 RNDIS 功能
-- 传入的第二个参数 3 ,实际为二进制的 0011
-- 蜂窝网络模块的usb以太网卡控制,bit0开关,1开0关,bit1模式,1NAT0独立IP(在usb以太网卡开启前可以修改,开启过就不行),bit2协议1 ECM,0 RNDIS,飞行模式里设置。
log.info("我看看 RNDIS 是否启动成功:", mobile.config(mobile.CONF_USB_ETHERNET, 3))
log.info("退出飞行模式")
mobile.flymode(0, false)
else
log.info("进入飞行模式失败")
end
end
5.2 ECM 应用
lua
-- 运行 ECM 模式任务
-- 注:由于Windows系统没有测试环境无法测试 ECM 功能,所以本demo没有完整测试。
local function ecm_task()
-- 初始化重试计数器,用于记录进入飞行模式失败的重试次数
local count = 0
-- 尝试进入飞行模式,获取操作结果标志
local fly_sign = mobile.flymode(0, true)
-- 判断是否成功进入飞行模式
if fly_sign then
log.info("进入飞行模式成功,打开ECM模式")
-- 调用 mobile.config 函数启用 ECM 功能
-- 传入的第二个参数 7 ,实际为二进制的 0111
-- 蜂窝网络模块的usb以太网卡控制,bit0开关,1开0关,bit1模式,1NAT0独立IP(在usb以太网卡开启前可以修改,开启过就不行),bit2协议1 ECM,0 RNDIS,飞行模式里设置。
log.info("我看看 ECM 是否启动成功:", mobile.config(mobile.CONF_USB_ETHERNET, 7))
log.info("退出飞行模式")
mobile.flymode(0, false)
else
log.info("进入飞行模式失败")
end
end
六、功能演示
6.1 Windows 下使用 RNDIS 功能
因为 window 系统默认支持 RNDIS,所以直接用 usb 连接就可以使用。
6.1.1 确认 RNDIS 状态
首先,先将代码烧录到模组中,通过日志来确认是否已经成功开启 RNDIS 功能:

6.1.2 在 Widows 中启用 RNDIS
当开启 RNDIS 功能后,Air8000 工业引擎会虚拟一个网卡,此网卡可在"设备管理器"或"高级网络设置"中看到。(由于 Air8000 驱动使用的是 CDC 驱动,所以请使用 win10 及其以上系统;WIN10 以下系统,Air8000 不做支持)


启用完毕后,即可看到我们电脑的图标已经变为以太网连接,此时也可以正常使用 RNDIS 上网了

6.1.3 注意事项
- 如果启动后日志中打印 RNDIS 启动成功,但是 Windows 上没有连上网络,需要确认下系统是否将 RNDIS 的虚拟网卡禁用了

6.2 Linux 下使用 RNDIS 功能
6.2.1 在 Linux 中启用 RNDIS
因为 Air8000 的 RNDIS 使用 CDC-ACM 驱动,大部分 Linux 系统默认就支持,所以无需设置代码,插入 USB 就可以在 Linux 中使用。
使用 ls /dev/ttyACM* 即可看到三个端口

在控制台查看 USB 设备可以看到一张 ID 为 19d1:0001 的 USB 设备,这张就是 Air8000 虚拟出的 USB 网卡

查看网卡信息可以看到如下信息:

尝试使用 ping 命令访问百度:

6.2.2 注意事项
- 有些 linux 设备存在 Air8000 工业引擎重启后,操作文件会发生移位,比如本来是/dev/ttyACM0/1/2 重启后变成了 ttyUSB1/3/4,最靠谱的方法是通过驱动节点来找到操作文件 usb_find.c
可以用 FindUsbDevice(AIRM2M_USB_DEVICE_AT_INTERFACE_ID),来寻找真正的需要的端口。相关文章见 https://doc.openluat.com/article/2080/0
-
某些最简系统需要根据设备描述来识别,可以参考如下 linux 上展示的细节进行适配:lsusb_618
-
Air8000 只支持 luatos 方式开发,无法使用串口工具发送 AT 指令,所以 Air8000 不支持 PPP 拨号上网
-
每个设备的 ethx 可能不一样,插入 Air8000 工业引擎后增加的网卡即为 RNDIS 网卡。如果没有 RNDIS 驱动的,可在编译内核时按照下图配置:


七、 总结
至此,我们演示了使用 rndis_ecm 上网的全过程