【技术篇】手把手教你如何使用RNDIS网卡实现USB上网!
RNDIS网卡支持将USB设备充当一块网卡,并通过USB连接实现网络共享。下面让我们手把手教您如何使用RNDIS网卡完成 USB 上网任务。
全称是Remote Network Device Interface Specification(RNDIS),其核心机制在于将传统的TCP/IP协议通过USB介质进行封装和传输。其关键特性在于使得所有安装了该技术的USB设备均能模拟为一个网络接口卡。从而实现了基于通用串口技术的远程网络访问。
一、Linux驱动配置
1. 虚拟串口
采用串行口发送AT指令。
Air780ER配备基于CDC-ACM的驱动程序。
大多数Linux系统在安装时默认配置即可支持该功能。
一旦插入即可开始工作。

测试AT指令可以用minicom等工具,运行命令:
sudo minicom -D /dev/ttyACM0
测试结果如下:

如果所用系统不支持CDC-ACM驱动,则可使用如下配置:
▼ 虚拟串口驱动配置 ▼
1)配置内核:

2)确定端口:
交叉编译后,板上运行,demesg打印如下。

说明ACM驱动Air780ER成功,其中节点:
1-1.3:1.2为AT口
该设备文件...进行数据传输。若未提供相应的终端命令行工具,则通过以下提供的源代码编译一个简单的程序,并向Linux系统发送AT小工具。
1-1.3:1.4为日志口
用于捕获设备/dev/ttyACM1的日志信息,请参阅文件中 uart_capture.c 中的具体实现细节
1-1.3:1.6为modem口
对应的操作文件/dev/ttyACM2,客户可以进行PPP拨号。
注意事项:
部分Linux设备在模块重启后会出现操作文件位置的变化。例如,原本支持与AT通讯的设备如/ty AC M0,在之后就无法进行相关操作。
最靠谱的方法是通过驱动节点,来找到操作文件usb_find.c;
可以用:
LocateUsbDevice(AIRM2M_USB_DEVICE_AT_INTERFACE_ID),用来定位真正所需的端口。
最小化设备需基于设备描述进行识别配置;可参考Linux系统中显示的相关信息以完成lsusb-618配置适配
相关最新资料详见:
https://docs.openluat.com/air780er/at/quick_start/usb/
2. RNDIS驱动
基于RNDIS的标准配置 Air780ER 模块现已集成至多数Linux发行版中作为预装组件, 通过USB接口连接该模组后即可方便使用, 一旦该模块启动, 在对应的设备端就会识别到新增网络接口
如下图所示:

注意:
每个设备的网络接口ethx可能会有所不同,在插入该模组后增加的网卡就是RNDIS网卡,在该设备中其地址为192.168.10.2。
如果没有RNDIS驱动的,可按照下图配置:
▼ RNDIS驱动配置 ▼


**二、**RNDIS功能测试
STEP 1:禁用本地网卡 sudo ifconfig eth0 down
STEP 2:使能模组网卡 sudo ifconfig eth10 up
使能之后,最好再通过ifconfig再次确认一下。
STEP 3:联网测试
PING百度网站联网成功,如下图所示。

**三、**如何禁用RNDIS功能
1. 使用设备管理器禁用RNDIS功能
在设备管理器中,在网络适配器下方找到并选择"Remote NDIS"选项后(建议提前确认相关设置是否正确),右键点击并选择"禁用设备"即可完成操作。

2. 使用代码禁用RNDIS功能
发送AT+RNDISCALL=0关闭RNDIS网卡,重启生效。
四、常见问题及解决办法
1. 如何排查Linux使用RNDIS无法上网的问题?
通常情况下,在插入合宙4G模块且无法进行上网操作时
1)能否检测到RNDIS设备?
在命令行中执行dmesg命令可能会显示出 rndis_host 1-1:1.0 eth1 这样的日志输出。如果观察不到这些信息,则可能是硬件有问题或者是使用的Linux版本不支持 rndis 功能,请参考相关文档或资料了解详细的驱动配置信息,并按照指导进行相应的设置操作。
现在查看ifconfig命令时发现系统中并未显示 rndis_host 1-1:1.0 ethtx/duplex 状态下的 ethtx 端口标识符 ethtx=ethn。
因此选择执行 ifconfig -a 命令以获取更多系统信息。
随后观察到该网络接口 ethtx 存在但尚未分配 IP 地址。
这时运行 udhcpc -i ethtx 并等待其分配 IP 地址。
完成这些操作后即可开始通过该网络接口进行上网操作。
2)出现设备网卡,但是无法上网?
这可能是由于模组没有注册上网络,可以通过模组串口发送AT指令查询。
常用AT指令:
AT+CPIN? 查看卡是否在位;
AT+CEREG? 查看是否注册上网络;
AT+CESQ 查看信号值;
ATI 查看版本号。
2. RNDIS上网,获取实时流量、上行下行数据是哪个指令?
可以通过ifconfig获取。
3. Linux其它常见问题的解决方法:
01)无法识别VID与PID
通常采用的是USB协议,在设备被插入后,系统将识别插入设备的唯一标识符:PID VID;
在本系统中 VID 代表制造商代码而 PID 则用于标识具体型号。无需额外安装 drivers 即可完成检测。因此,在无法正确读取 product codes 的情况下 建议首先执行 lsusb 命令获取相关信息。
Air780ER模组的VID与PID,分别是19d1和0001。

如上图所示 ,就是代表已经识别到Air780ER模组了。
查看模组是否已经识别,如果这里没有识别到模组,应该先排除硬件问题。
常见硬件问题:
USB是否走线过长;
USB是否VBUS没有连接;
模组是否没开机。
02)确认是否识别到网卡
当遵循Linux系统中的驱动配置流程时,在dmesg输出相关提示信息的情况下,默认情况下确认网络接口被正确识别。

第8行:
1-2.1设备代表挂在usb bus1上2.1节点为EigenComm的USB 设备;
第13行:
1-2.1:1.0代表usb interface 0,被当做RNDIS使用(其实interface 1也是被RNDIS使用);
第16、17、19行:
1-2.1:1.2 、1-2.1:1.4 、1-2.1:1.6代表usb interface 2,4,6,分别枚举ttyACM0,ttyACM1,ttyACM2(这个不固定)。
第18行:
代表RNDIS被设置成eth10网卡,如下所示:

03)在Linux下发AT的小工具
某些Linux开发板不具备串口工具功能,在出现问题时无法使用AT指令排查故障原因。本处提供一个名为sendat.c的小程序,在编译完成后可以直接运行使用。
最新工具下载详见:
https://docs.openluat.com/air780er/at/quick_start/usb/

今天的内容就分享到这里了~
