RNDIS
一、Air8000 USB 上网应用概述
本章将带你使用 RNDIS 的方式,搭配 Windows 或 Linux 主控终端,快速实现 USB 上网。
由于 Air8000 只支持 LUATOS 模式,且 RNDIS 网卡应用默认关闭,需要使用 mobile.config(mobile.CONF_USB_ETHERNET, 3)这个接口打开,所以在使用 RNIDS 之前,需要提前给 Air8000 工业引擎烧录如下脚本。
该接口开关说明如下:
mobile.config(item, value)
网络特殊配置
参数
传入值类型 | 解释 |
---|---|
int | 配置项目,使用USB网卡时为mobile.CONF_USB_ETHERNET |
int | 配置值,使用网卡时传入的是二进制转10进制数 |
配置项目 | 配置值解释 |
---|---|
mobile.CONF_USB_ETHERNET | 蜂窝网络 Air8000工业引擎的usb以太网卡控制,bit0开关1,开0关,bit1模式1NAT,0独立IP(在usb以太网卡开启前可以修改,开启过就不行),bit2协议1ECM,0RNDIS,飞行模式里设置 |
示例:mobile.config(mobile.CONF_USB_ETHERNET,3)
传入的第二个参数3 实际为二进制的0011
从右往前数第0个bit位为1,则开启USB以太网卡控制,第一个bit位为1,则使用NAT模式(基站分配ip),第二个bit位为0,则开启RNDIS模式
注:以下脚本完整复制后保存为 main.lua,可直接使用
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "rndis"
VERSION = "1.0.0"
log.info("main", PROJECT, VERSION)
-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
if wdt then
-- 添加硬狗防止程序卡死,在支持的设备上启用这个功能
wdt.init(9000) -- 初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
end
-- log.info("main", "RNDIS")
local cont = 0
local function rndis_open()
local fly_sign = mobile.flymode(0, true)
if fly_sign then
log.info("进入飞行模式成功,打开RNDIS模式")
log.info("我看看mobile.config函数的返回值", mobile.config(mobile.CONF_USB_ETHERNET, 3))
log.info("退出飞行模式",mobile.flymode(0, false))
else
while 1 do
sys.wait(1000)
log.info("进入飞行模式失败,重试一次",mobile.flymode(0, true))
local cont = cont + 1
if cont >10 then
log.info("重试了10次都未能成功进入飞行模式,重启试试",pm.reboot())
end
end
end
end
sys.taskInit(rndis_open)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
二、RNDIS 应用
RNDIS 是指 Remote NDIS,基于 USB 实现 RNDIS 实际上就是 TCP/IP over USB,就是在 USB 设备上跑 TCP/IP,让 USB 设备虚拟为一块网卡。从而使 Windows /Linux 可以通过 USB 设备连接 4G 网络。
Window 系统
window 系统默认支持 RNDIS,直接用 usb 连接就可以使用,Air8000 工业引擎会虚拟一个网卡,此网卡可在"设备管理器"或"网络连接"中看到。(由于 Air8000 驱动使用的是 CDC 驱动,所以请使用 win10 及其以上系统,WIN10 以下系统,Air8000 不做支持)
将烧录好上述脚本的 Air8000 核心板 USB 插入电脑,正常开机,即可在右下角看见如下所示图标
Linux 系统
linux 驱动配置
虚拟串口
1.介绍
Air8000 使用 CDC - ACM 驱动,大部分 linux 系统默认就支持,插入就可以使用。
此时查看 USB 设备可以看到一张 ID 为 19d1:0001 的 USB 设备,这张就是 Air8000 虚拟出的 USB 网卡
此时查看网卡信息可以看到如下信息:
尝试使用 ping 命令访问百度:
如果你的系统未编译 CDC - ACM 驱动进入内核,则可以在编译内核的时候参考如下配置:
2.配置内核
3.确定端口
交叉编译后,板上运行成功后将 Air8000 开机并使用 USB 插入你的 linux 板上,使用 ls /dev/ttyACM* 即可看到三个端口
4.注意事项
4.1 有些 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
4.2 某些最简系统需要根据设备描述来识别,可以参考如下 linux 上展示的细节进行适配:lsusb_618
4.3 Air8000 只支持 luatos 方式开发,所以无法使用串口工具给 Air8000 虚拟出来的三个端口发送 AT 指令,所以 Air8000 不支持 PPP 拨号上网
RNDIS
Air8000 是标准的 rndis,目前 linux 大部分发行版本都已经默认支持 RNDIS 驱动了,只要通过 USB 连接 Air8000 工业引擎就可以直接用了,Air8000 工业引擎开机后就会在 linux 设备端看到新的网卡,如下图红框部分为 Air8000 虚拟出的 USB 网卡。
注意: 每个设备的 ethx 可能不一样,插入 Air80000Air8000 工业引擎后增加的网卡即为 RNDIS 网卡
如果没有 RNDIS 驱动的,可在编译内核时按照下图下图配置
RNDIS 功能测试
联网测试
三、如何禁用 RNDIS 功能
win10 如何禁用
在设备管理器,网络适配器下找到 Remote NDIS 选项后点击鼠标右键选择禁用设备即可。
代码上如何禁用 RNDIS 功能?
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "rndis"
VERSION = "1.0.0"
log.info("main", PROJECT, VERSION)
-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
if wdt then
-- 添加硬狗防止程序卡死,在支持的设备上启用这个功能
wdt.init(9000) -- 初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
end
-- log.info("main", "RNIDS")
local cont = 0
local function rndis_close()
local fly_sign = mobile.flymode(0, true)
if fly_sign then
log.info("进入飞行模式成功,打开RNDIS模式")
log.info("我看看mobile.config函数的返回值", mobile.config(mobile.CONF_USB_ETHERNET, 0))
log.info("退出飞行模式",mobile.flymode(0, false))
else
while 1 do
sys.wait(1000)
log.info("进入飞行模式失败,重试一次",mobile.flymode(0, true))
local cont = cont + 1
if cont >10 then
log.info("重试了10次都未能成功进入飞行模式,重启试试",pm.reboot())
end
end
end
end
sys.taskInit(rndis_close)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
四、常见问题
如何排查 linux 使用 RNDIS 无法上网的问题
一般情况下,不是特别精简的 linux 已经支持 rndis 功能,如果插上合宙的 4G Air8000 工业引擎,但是不能上网的话,需要注意以下几点
1,能否检测到 rndis 设备
在命令行中输入 dmesg ,如此出现 rndis_host 1-1:1.0 eth1 这样的打印,则证明已经识别到了,(如果没有,可能是硬件问题,也可能是 linux 真的不支持 rndis,需参考上面驱动配置,配置一下驱动)
此时查看 ifconfig ,如果没有出现 rndis_host 1-1:1.0 eth1 中的 eth1 ,则发送 ifconfig -a ,此时发现有 eth1 但是 没有 ip 地址,发送 udhcpc -i eth1 出现地址后,即可使用此网卡进行上网。(注:如果使用的是较新版本的 linux 内核,可能已经取消了 ifconfig 指令,可以使用 ip 指令替代,关于 ip 指令的说明可以参考这里)
2,出现设备网卡,但是无法上网
这可能是由于 Air8000 工业引擎没有注册上网络,可以将 Air8000 工业引擎 USB 接给 win10 电脑,使用 luatools 查看日志。
RNDIS 上网,获取时时流量,下行下行数据是哪个指令
可以通过 ifconfig 获取。
linux 或者 windos 怎么和 air8000 进行通讯
https://docs.openluat.com/air8000/luatos/app/common/usb_uart/
linux 常见问题解决方法
1. 无法识别 vid 与 pid
一般 air8000 工业引擎对接的 linux 协议是 USB 协议,设备插入后,系统会检测出设备的标识:PID VID(其中 VID 是厂商识别码 PID 是产品识别码),此处不需要装驱动也可以识别,所以,我们排除插入无法识别的时候,先通过命令行命令 lsusb
我们的 Air8000 vid 与 pid,分别是 19d1 和 0001
如上图所示 ,就是代表已经识别到 Air8000 工业引擎了
查看 Air8000 工业引擎是否已经识别,如这里没有识别到我们的 Air8000 工业引擎,应该先排除硬件问题,
常见硬件问题
a.USB 是否走线过长
b.USB 是否 VBUS 没有连接
c.Air8000 工业引擎没开机
d.Air8000 工业引擎进入 boot 模式了(注:进入 boot 后的 PIV 和 VID 会变成 17d1:0001)
2. 确认是否识别到网卡
如果按照 驱动配置加入驱动,linux 发送 dmesg 出现以下的显示说明正常识别到网卡:
第 8 行,1-2.1 设备代表 挂在 usb bus1 上 2.1 节点为 EigenComm 的 USB 设备
第 13 行代表 Air8000 的 1-2.1:1.0 代表 usb interface 0,被当做 rndis 使用(其实 interface 1 也是被 rnids 使用)
第 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 网卡,如下所示: