08 RNDIS/ECM
作者:拓毅恒 | 最后修改:2026-09-02
一、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等操作系统无需额外专用驱动即可使用。
二、演示功能概述
2.1 本教程实现的功能定义
本章节将演示如何使用 780EGH 来开启RNDIS功能。
注意:ECM功能由于缺少测试环境,无法进行完整测试,本文档教程主要演示RNDIS功能。
三、准备硬件环境
因为rndis_ecm功能不受硬件限制,所以本篇教程选用 780EGH 核心板来开发调试。也可以参考:780EGH硬件环境清单,准备好硬件环境。
3.1 780EGH 核心板

四、准备软件环境
4.1 文章内容应用
在开始实践本示例之前,先筹备一下软件环境:
1. 烧录工具:Luatools工具;
2. 内核固件:https://docs.openluat.com/air780egh/luatos/firmware/version/
3. 脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EGH/demo/rndis_ecm
4. LuatOS运行所需要的lib文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到780EGH中,将本篇文章中演示使用的项目文件烧录到780EGH核心板中。
4.2 API 介绍
这里仅介绍本篇文档所使用的API,详情请查看:API - mobile
mobile.config(item, value)
网络特殊配置
mobile.flymode(index, enable)
进出飞行模式
五、代码演示
5.1 RNDIS 应用
-- 运行 RNDIS 模式任务
local function rndis_task()
-- 蜂窝网络模块的usb以太网卡控制,bit0开关:1开0关,bit1模式:1-NAT 0-独立IP(在usb以太网卡开启前可以修改,开启过就不行),bit2协议:1 ECM,0 RNDIS(设置完毕后需要进出一次飞行模式)
log.info("我看看 RNDIS 是否启动成功:", mobile.config(mobile.CONF_USB_ETHERNET, 3))
-- 设置完毕后,需要进出一次飞行模式,才能生效
log.info("进入飞行模式")
mobile.flymode(0, true)
log.info("退出飞行模式")
mobile.flymode(0, false)
-- 设置网卡需要开关USB电源将USB协议重置为RNDIS配置
pm.power(pm.USB ,false)
pm.power(pm.USB ,true)
end
5.2 ECM 应用
-- 运行 ECM 模式任务
-- 注:由于Windows系统没有测试环境无法测试 ECM 功能,所以本demo没有完整测试。
local function ecm_task()
-- 调用 mobile.config 函数启用 ECM 功能
-- 传入的第二个参数 7 ,实际为二进制的 0111
-- 蜂窝网络模块的usb以太网卡控制,bit0开关:1开0关,bit1模式:1-NAT 0-独立IP(在usb以太网卡开启前可以修改,开启过就不行),bit2协议:1 ECM,0 ECM(需在飞行模式下设置)
log.info("我看看 ECM 是否启动成功:", mobile.config(mobile.CONF_USB_ETHERNET, 3))
-- 设置完毕后,需要进出一次飞行模式,才能生效
log.info("进入飞行模式")
mobile.flymode(0, true)
log.info("退出飞行模式")
mobile.flymode(0, false)
-- 设置网卡需要开关USB电源将USB协议重置为ECM配置
pm.power(pm.USB ,false)
pm.power(pm.USB ,true)
end
六、功能演示
6.1 Windows 下使用RNDIS功能
因为window 系统默认支持 RNDIS,所以直接用 usb 连接就可以使用。
6.1.1 确认RNDIS 状态
首先,先将代码烧录到模组中

通过日志来确认是否已经成功开启RNDIS 功能:

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


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

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

6.2 Linux 下使用RNDIS功能
6.2.1 烧录open_rndis代码
首先,先将代码烧录到模组中

通过日志来确认是否已经成功开启RNDIS 功能:

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

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

输入 ip addr show 查看网卡信息可以看到如下信息:

使用 lsusb -t 可以查看当前使用网卡,网络相关的两个接口(If 0 和 If 1)驱动都是 rndis_host,这直接说明走的是 RNDIS 协议。(后面的 If 2~If 7(Driver=cdc_acm)是串口/AT命令通道,不是网络接口)

尝试使用 ping 命令访问百度,可以看到当前网络已经正常可用了:

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


6.3 Linux 下使用ECM功能
6.3.1 烧录open_ecm代码
首先,先将代码烧录到模组中

通过日志来确认是否已经成功开启RNDIS 功能:

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

使用 lsusb -t 可以查看当前使用网卡,网络相关的两个接口(If 0 和 If 1)驱动都是 cdc-ether,这直接说明走的是 ECM 协议。(后面的 If 2~If 7(Driver=cdc_acm)是串口/AT命令通道,不是网络接口)

尝试使用 ping 命令访问百度,可以看到当前网络已经正常可用了:

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