netdrv - 网络设备管理。
作者:魏健强
一、概述
netdrv 是指网络设备,用于初始化并管理不同的网络设备。如:4G,以太网,WIFI。还可以提供路由功能.把各种联网方式融合起来,如:4G 连接外部网络,支持以太网 lan 模式为其他以太网设备提供接入。exnetif 扩展库对 netdrv 做了进一步封装可以查看详细的 api 文档;
- 支持指定任意一个 netdrv 作为外网访问的出口,使用本文的 netdrv 和 exnetif 扩展库的流程对比,推荐使用 exnetif 扩展库实现,使用更简单
如:通过以太网访问外网时,使用 netdrv 和 exnetif 的流程参考下图
- 支持设置路由功能,如:4G 连接外部网络,支持以太网 lan 模式为其他以太网设备提供接入,使用本文的 netdrv 和 exnetif 扩展库的流程对比,推荐使用 exnetif 扩展库实现,使用更简单
- 本文中提到的网卡、网络适配器,网络设备,均为同一概念,如:"4G 网卡"等同于"4G 网络适配器"。
二、核心示例
1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;
2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;
3、更加完整和详细的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/netdrv;
-- 初始化以太网设备
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8})
-- 配置以太网网络参数,包括静态IP,子网掩码,网关IP,
-- 本测试需要将4G网络转以太网络相当于自身作为路由器,网关IP地址为自身静态IP地址
local ipv4,mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
log.info("ipv4", ipv4,mark, gw)
-- 等待以太网网口连接
while netdrv.link(socket.LWIP_ETH) ~= true do
sys.wait(100)
end
-- 插入sim卡,等待4G网络连接
while netdrv.link(socket.LWIP_GP) ~= true do
sys.wait(100)
end
-- 配置以太网络打开DHCP服务器
dhcp.create({adapter=socket.LWIP_ETH})
-- 配置DNS服务
dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
-- 使用4G网络作为主网关出口
netdrv.napt(socket.LWIP_GP)
三、常量详解
核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
3.1 netdrv.CH390
常量含义:南京沁恒CH390系列,支持CH390D/CH390H, SPI通信;
数据类型:number;
取值范围:1;
示例代码: netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8});
3.2 netdrv.WHALE
常量含义:虚拟网卡,用于780EPM外挂Air8101实现多网融合,初始化netdrv设备时指定的实现方式;
数据类型:number;
取值范围:64;
示例代码: netdrv.setup(socket.LWIP_USER0, netdrv.WHALE);
3.3 netdrv.CTRL_RESET
常量含义:控制类型-软件复位(发送指令控制ch390软件重启),当前仅支持CH390H;
数据类型:number;
取值范围:0;
示例代码: -- 重启网卡, 仅CH390H支持, 其他网络设备暂不支持
netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD);
3.4 netdrv.RESET_HARD
常量含义:请求对网卡硬件复位,当前仅支持CH390H;
数据类型:number;
取值范围:257;
示例代码: -- 重启网卡, 仅CH390H支持, 其他网络设备暂不支持
netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD);
3.5 netdrv.RESET_SOFT
常量含义:请求对网卡软复位,当前仅支持CH390H;
数据类型:number;
取值范围:258;
示例代码: -- 重启网卡, 仅CH390H支持, 其他网络设备暂不支持
netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_SOFT);
3.6 netdrv.EVT_SOCKET
常量含义:事件类型-socket事件;
数据类型:number;
取值范围:1;
示例代码: netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, fun_cb);
关于网络适配器类型的常量:
注意:目前除 8101 系列产品默认网络适配器为 socket.LWIP_STA,其他主流模组默认网络适配器为 socket.LWIP_GP。
3.7 socket.LWIP_GP
常量含义:4G网卡;
LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
GP是GPRS的缩写,GPRS是2G网络时代的分组数据网络,此处用来代指移动蜂窝数据网络,例如4G网络;
数据类型:number;
取值范围:1;
示例代码:socket.localIP(socket.LWIP_GP);
3.8 socket.LWIP_STA
常量含义:WiFi设备模式网卡;
LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
STA是STATION的缩写,表示WiFi设备模式,需要连接WiFi热点才能上网;
数据类型:number;
取值范围:2;
示例代码:socket.localIP(socket.LWIP_STA);
3.9 socket.LWIP_AP
常量含义:WiFi热点模式网卡;
LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
AP是Access Ponit的缩写,意思是WiFi热点,供其他WiFi设备接入上网;
数据类型:number;
取值范围:3;
示例代码:socket.localIP(socket.LWIP_AP);
3.10 socket.LWIP_ETH
常量含义:使用LwIP协议栈的以太网卡;
LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
ETH是Ethernet的缩写,意思是以太网;
数据类型:number;
取值范围:4;
示例代码:socket.localIP(socket.LWIP_ETH);
3.11 socket.ETH0
常量含义:使用硬件协议栈的以太网卡;
ETH是Ethernet的缩写,意思是以太网,ETH0表示编号为0的硬件协议栈以太网卡;
数据类型:number;
取值范围:16;
示例代码:socket.localIP(socket.ETH0);
3.12 socket.USB
常量含义:USB接口的以太网卡;
常见的USB以太网卡又可以分为 USB RNDIS以太网卡 和 USB ECM以太网卡两种;
数据类型:number;
取值范围:17;
示例代码:socket.localIP(socket.USB);
3.13 socket.LWIP_USER0
常量含义:使用LWIP协议栈的自定义网卡0;
数据类型:number;
取值范围:7;
示例代码:socket.localIP(socket.LWIP_USER0);
3.14 socket.LWIP_USER1
常量含义:使用LWIP协议栈的自定义网卡1;
数据类型:number;
取值范围:8;
示例代码:socket.localIP(socket.LWIP_USER1);
3.15 socket.LWIP_USER2
常量含义:使用LWIP协议栈的自定义网卡2;
数据类型:number;
取值范围:9;
示例代码:socket.localIP(socket.LWIP_USER2);
3.16 socket.LWIP_USER3
常量含义:使用LWIP协议栈的自定义网卡3;
数据类型:number;
取值范围:10;
示例代码:socket.localIP(socket.LWIP_USER3);
3.17 socket.LWIP_USER4
常量含义:使用LWIP协议栈的自定义网卡4;
数据类型:number;
取值范围:11;
示例代码:socket.localIP(socket.LWIP_USER4);
3.18 socket.LWIP_USER5
常量含义:使用LWIP协议栈的自定义网卡5;
数据类型:number;
取值范围:12;
示例代码:socket.localIP(socket.LWIP_USER5);
3.19 socket.LWIP_USER6
常量含义:使用LWIP协议栈的自定义网卡6;
数据类型:number;
取值范围:13;
示例代码:socket.localIP(socket.LWIP_USER6);
3.20 socket.LWIP_USER7
常量含义:使用LWIP协议栈的自定义网卡7;
数据类型:number;
取值范围:14;
示例代码:socket.localIP(socket.LWIP_USER7);
四、函数详解
4.1 netdrv.setup(id, tp, opts)
功能
初始化指定 netdrv 设备;
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.setup(socket.LWIP_ETH);
tp
参数含义:实现方式,如果是设备自带的硬件,那就不需要传, 外挂设备需要传,当前支持CH390H/D;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如netdrv.CH390;
是否必选:可选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8});
opts
参数含义:外挂方式,需要额外的参数,参考示例;
opts = {
-- 参数含义:外挂的spi_id;
-- 数据类型:number;
-- 取值范围:0/1;
-- 是否必选:必选;
-- 注意事项:仅spi方式外挂以太网时需要填写;
-- 参数示例:
spi,
-- 参数含义:外挂的spi片选引脚(GPIO号);
-- 数据类型:number;
-- 取值范围:暂无;
-- 是否必选:必选;
-- 注意事项:仅spi方式外挂以太网时需要填写;
-- 参数示例:
cs,
-- 参数含义:irq中断引脚;
-- 数据类型:number;
-- 取值范围:暂无;
-- 是否必选:必选;
-- 注意事项:支持CH390H的中断模式, 能提供响应速度,实测对总网速没有帮助, 轻负载时 能降低功耗, 让模组能进入低功耗模式;
-- 参数示例:
irq
}
数据类型:table;
取值范围:暂无;
是否必选:可选;
注意事项:无;
参数示例:netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8,irq=20});
返回值
local res = netdrv.setup(id, tp, opts)
log.info("netdrv",res)
res
含义说明:初始化指定netdrv设备的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:返回值为true代表成功,false代表失败;
返回示例:true;
示例
-- Air8101初始化内部以太网控制器
netdrv.setup(socket.LWIP_ETH)
-- Air8000/Air780EPM初始化CH390H/D作为LAN/WAN
-- 支持多个CH390H, 使用不同的CS脚区分不同网口
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8})
-- 支持CH390H的中断模式, 能提供响应速度, 但是需要外接中断引脚
-- 实测对总网速没有帮助, 轻负载时能降低功耗, 让模组能进入低功耗模式
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8,irq=20})
-- Air780EPM外挂Air8101时,使用虚拟网卡的方式初始化网络
netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
4.2 netdrv.dhcp(id, enable)
功能
在指定的网络适配器上开启或者关闭 DHCP,仅作为数据出口的网卡使用,以太网 lan 模式和 wifi ap 模式需要使用 netdrv.ipv4 接口手动设置。
如果需要 netdrv.ipv4 设置静态 ip,就不要调用本接口;
[DHCP]设备自动获取 ip 地址和网关信息;
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.dhcp(socket.LWIP_ETH, true);
enable
参数含义:开启或关闭DHCP;
数据类型:boolean;
取值范围:true/false;
是否必选:必选;
注意事项:推荐使用dhcp获取ip。如果需要设置静态ip,就不要调用本接口;
参数示例: netdrv.dhcp(socket.LWIP_ETH, true);
返回值
local res = netdrv.dhcp(id, enable)
log.info("netdrv",res)
res
含义说明:开启或关闭DHCP的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:返回值为true代表成功,false代表失败;
返回示例:true;
示例
netdrv.dhcp(socket.LWIP_ETH, true)
4.3 netdrv.mac(id)
功能
获取指定网络适配器的 MAC;
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.mac(socket.LWIP_ETH);
返回值
local mac = netdrv.mac(id)
log.info("netdrv",mac)
mac
含义说明:指定网络适配器的MAC;
数据类型:string;
取值范围:无;
注意事项:需要等netdrv.setup成功之后再获取mac地址;
返回示例:"3CAB724406E8";
示例
-- 获取MAC地址
log.info("netdrv", "mac addr", netdrv.mac(socket.LWIP_ETH))
-- 暂不支持设置
4.4 netdrv.ipv4(id, addr, mark, gw)
功能
设置或读取 ipv4 地址,不填写 addr, mark, gw 参数是读取,填写的是设置功能,
使用 netdrv.ipv4 手动设置参数时需要保持 dhcp 功能是关闭的状态,不可以 netdrv.dhcp 开启 dhcp 功能;
注意:不是所有 netdrv 都支持设置的, 尤其 4G Cat.1 自带的 netdrv 就不能设置 ipv4
当前设置 ip 但 ip 值非法, 不返回任何东西
如果设置 ip 且 ip 值合法, 会返回 ip, mask, gw
[DHCP]设备自动获取 ip 地址和网关信息;
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1");
addr
参数含义:静态ipv4地址;
数据类型:string;
取值范围:暂无;
是否必选:可选,如果是读取就不需要传此参数;
注意事项:需要填写正确的ipv4地址;
参数示例:netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1");
mark
参数含义:子网掩码;
数据类型:string;
取值范围:暂无;
是否必选:可选,如果是读取就不需要传此参数;
注意事项:需要填写正确的掩码;
参数示例:netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1");
gw
参数含义:网关;
数据类型:string;
取值范围:暂无;
是否必选:可选,如果是读取就不需要传此参数;
注意事项:需要填写正确的ipv4网关;
参数示例:netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1");
返回值
local ipv4,mark, gw = netdrv.ipv4(id, addr, mark, gw)
log.info("ipv4", ipv4,mark, gw)
ipv4
含义说明:ip地址;
数据类型:string;
取值范围:暂无;
注意事项:无;
返回示例:"192.168.111.2";
mark
含义说明:子网掩码;
数据类型:string;
取值范围:暂无;
注意事项:无;
返回示例:"255.255.255.0";
gw
含义说明:网关;
数据类型:string;
取值范围:暂无;
注意事项:无;
返回示例:"192.168.111.1";
示例
-- 注意, 不是所有netdrv都支持设置的, 尤其4G Cat.1自带的netdrv就不能设置ipv4
-- 注意, 设置ipv4时, DHCP要处于关闭状态!!
-- 当前设置ip但ip值非法, 不返回任何东西
-- 如果设置ip且ip值合法, 会返回ip, mask, gw
-- 设置
log.info("静态ip",netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1"))
-- 读取
log.info("静态ip",netdrv.ipv4(socket.LWIP_USER0))
4.5 netdrv.napt(id)
功能
在指定的网络适配器上开启或关闭 NAPT
专业术语:
NAPT - 网络地址端口转换, 也是家用路由器的最基础功能
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:当前接口填写-1为关闭所有网络适配器的napt功能;
参数示例:netdrv.napt(socket.LWIP_GP);
返回值
local res = netdrv.napt(id)
log.info("netdrv",res)
res
含义说明:开启或关闭NAPT的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:返回值为true代表成功,false代表失败;
返回示例:true;
示例
-- 使用4G网络作为主网关出口
netdrv.napt(socket.LWIP_GP)
-- 关闭napt功能
netdrv.napt(-1)
4.6 netdrv.link(id)
功能
获取指定的网络适配器的物理连接状态,如以太网网线接入和断开;
以太网网线接入,或者使用 wifi,4G 网络 netdrv.link(id)会返回 true
第一次获取到 ip 会上报"IP_READY"消息,
ip 状态正常 netdrv.ready(id)会返回 true,等同于 socket.adapter 接口
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.link(socket.LWIP_GP);
返回值
local res = netdrv.link(id)
log.info("netdrv",res)
res
含义说明:netdrv的物理连接状态,如以太网网线接入和断开;
数据类型:boolean;
取值范围:true/false;
注意事项:已连接返回true, 否则返回false. 如果id对应的netdrv不存在,返回nil;
返回示例:true;
示例
-- 注意, 本函数仅支持读取连接状态, 不能查询ip状态, 不能判断是否可以联网
-- 查询4G网卡状态
netdrv.link(socket.LWIP_GP)
4.7 netdrv.ready(id)
功能
获取指定的网络适配器的 IP 状态;
以太网网线接入,或者 wifi,4G 网络 netdrv.link(id)会返回 true
第一次获取到 ip 会上报"IP_READY"消息,
ip 状态正常 netdrv.ready(id)会返回 true,等同于 socket.adapter 接口
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.ready(socket.LWIP_GP);
返回值
local res = netdrv.ready(id)
log.info("netdrv",res)
res
含义说明:netdrv的网络状态;
数据类型:boolean;
取值范围:true/false;
注意事项:已连接返回true, 否则返回false. 如果id对应的netdrv不存在,返回nil;
返回示例:true;
示例
-- 注意, 本函数仅支持读取连接状态, 不能判断是否可以联网
-- 查询4G网卡状态
netdrv.ready(socket.LWIP_GP)
4.8 netdrv.ctrl(id, cmd, arg)
功能
给具体的网络适配器发送控制指令;
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD);
cmd
参数含义:指令, 例如 netdrv.CTRL_RESET;
数据类型:number;
取值范围:netdrv.CTRL_RESET;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD);
arg
参数含义:指令cmd携带的参数;
数据类型:number;
取值范围:netdrv.RESET_HARD/netdrv.RESET_SOFT;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD);
返回值
local res = netdrv.ctrl(id, cmd, arg)
log.info("netdrv",res)
res
含义说明:发送控制指令的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:返回值为true代表成功,false代表失败;
返回示例:true;
示例
-- 硬件重启网卡, 仅CH390H支持, 其他网络设备暂不支持
-- 本函数于 2025.4.14 新增
netdrv.ctrl(socket.LWIP_ETH, netdrv.CTRL_RESET, netdrv.RESET_HARD)
4.9 netdrv.debug(id, enable)
功能
指定的网络适配器调试信息输出开关(开启后会增加一些相关日志输出);
参数
id
参数含义:网络适配器编号;如果传0就是全局调试开关,适用于所有网络适配器;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.debug(socket.LWIP_ETH, true);
enable
参数含义:是否开启调试信息输出;
数据类型:boolean;
取值范围:true/false;
是否必选:必选;
注意事项:无;
参数示例: netdrv.debug(socket.LWIP_ETH, true);
返回值
local res = netdrv.debug(id, enable)
log.info("netdrv",res)
res
含义说明:设置调试模式的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:返回值为true代表成功,false代表失败;
返回示例:true;
示例
-- 打开netdrv全局调试开关
netdrv.debug(0, true)
4.10 netdrv.ping(id, ip, len)
功能
在指定的网络适配器上发起 PING 请求;如果发起成功,会有异步消息"PING_RESULT"通知 PING 结果,
在代码中可以通过 sys.subscribe 和 sys.waitUntil 两种方式订阅处理异步消息"PING_RESULT",处理代码如下:
sys.subscribe("PING_RESULT", function(id, time, dst)
log.info("ping", id, time, dst); --获取到响应结果
end)
或
sys.waitUntil("PING_RESULT")
参数
id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.ping(socket.LWIP_GP, "121.14.77.221");
ip
参数含义:要ping的目标ip地址;
数据类型:string;
取值范围:暂无;
是否必选:必选;
注意事项:需要填写正确的ipv4地址;
参数示例:netdrv.ping(socket.LWIP_GP, "121.14.77.221");
len
参数含义:ping包大小;
测试网络性能和吞吐量
小包(例如 32 或 64 字节):主要用来测试网络延迟(Latency/Ping值)。数据包很小,几乎瞬间 就能完成传输,所以返回的时间(如 20ms)更能真实地反映信号传输和处理的开销。
大包(例如 1024, 2048 或更大):用来测试网络带宽(Bandwidth) 和吞吐量(Throughput)。 发送大量数据需要更多时间,此时返回的时间会显著增加。通过计算单位时间内成功传输的数据量,可 以粗略估算网络带宽。如果大包延迟急剧增加或丢包,可能表明网络存在拥塞或带宽不足。
数据类型:number;
取值范围:暂无;
是否必选:可选;
注意事项:默认128字节;
参数示例:netdrv.ping(socket.LWIP_GP, "121.14.77.221",128);
返回值
local res = netdrv.ping(id, ip, len)
log.info("netdrv",res)
res
含义说明:发起ping的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:true仅代表发送成功,不代表服务器已经响应;
返回示例:true;
示例
-- 本功能在2025.9.3新增
local function ping_test()
-- 要等联网了才能ping
sys.waitUntil("IP_READY")
while 1 do
-- 必须指定使用哪个网卡
netdrv.ping(socket.LWIP_GP, "121.14.77.221")
sys.waitUntil("PING_RESULT", 3000)
sys.wait(3000)
end
end
local function ping_res(id, time, dst)
log.info("ping", id, time, dst); --获取到响应结果
end
sys.taskInit(ping_test)
sys.subscribe("PING_RESULT", ping_res)
4.11 netdrv.on(adapter_id, event_type, callback)
功能
订阅指定的网络适配器上的网络事件;
使用网卡联网时,获取网络事件,如果有 error 或 timeout 事件可以切换其他可用网卡
参数
adapter_id
参数含义:网络适配器编号;
数据类型:number;
取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, func_cb);
event_type
参数含义:事件类型;
数据类型:number;
取值范围:netdrv.EVT_SOCKET;
是否必选:必选;
注意事项:参考第三部分常量详解;
参数示例:netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, func_cb);
callback
参数含义:回调函数;
回调函数接收以下两个参数:
-- 参数含义:网络适配器编号;
-- 数据类型:number;
-- 取值范围:常量详解章节中的“网络适配器类型的常量”,例如socket.LWIP_ETH;
-- 是否必选:必选;
-- 注意事项:参考第三部分常量详解;
id
-- 参数含义:事件;
-- 数据类型:string;
-- 取值范围:-- "create" 创建socket对象
-- "release" 释放socket对象
-- "connecting" 正在连接, 域名解析成功后出现
-- "connected" 连接成功, TCP三次握手成功后出现
-- "closed" 连接关闭
-- "remote_close" 远程关闭, 网络中断,或者服务器主动断开
-- "timeout" dns解析超时,或者tcp连接超时
-- "error" 错误,包括一切异常错误;
-- 是否必选:必选;
-- 注意事项:无;
event
-- 参数含义:参数表;
-- 数据类型:table;
-- 取值范围:-- params.remote_ip 远端ip地址,未必存在 数据类型:string;
-- params.remote_port 远端端口,未必存在 数据类型:number;
-- params.online_ip 实际连接的ip地址,未必存在 数据类型:string;
-- params.domain_name 远端域名,如果是通过域名连接的话, release时没有这个值, create时也没有 数据类型:string;
-- 是否必选:必选;
-- 注意事项:无;
params
数据类型:function;
取值范围:暂无;
是否必选:必选;
注意事项:无;
参数示例:netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, func_cb);
返回值
local res = netdrv.on(adapter_id, event_type, callback)
log.info("netdrv",res)
res
含义说明:订阅网络事件的结果;
数据类型:boolean;
取值范围:true/false;
注意事项:返回值为true代表成功,false代表失败;
返回示例:true;
示例
local function socket_event(id, event, params)
log.info("netdrv", "socket event", id, event, json.encode(params or {}))
if params then
-- params里会有remote_ip, remote_port等信息, 可按需获取
local remote_ip = params.remote_ip
local remote_port = params.remote_port
local domain_name = params.domain_name
log.info("netdrv", "socket event", "remote_ip", remote_ip, "remote_port", remote_port, "domain_name", domain_name)
end
end
netdrv.on(socket.LWIP_ETH, netdrv.EVT_SOCKET, socket_event)
五、产品支持说明
支持 LuatOS 开发的所有产品都支持 netdrv 核心库。