跳转至

netdrv - 网络设备管理。

作者:魏健强

一、概述

netdrv 是指网络设备,用于初始化并管理不同的网络设备。如:4G,以太网,WIFI。还可以提供路由功能.把各种联网方式融合起来,如:4G 连接外部网络,支持以太网 lan 模式为其他以太网设备提供接入。exnetif 扩展库对 netdrv 做了进一步封装可以查看详细的 api 文档;

  1. 支持指定任意一个 netdrv 作为外网访问的出口,使用本文的 netdrv 和 exnetif 扩展库的流程对比,推荐使用 exnetif 扩展库实现,使用更简单

如:通过以太网访问外网时,使用 netdrv 和 exnetif 的流程参考下图

  1. 支持设置路由功能,如:4G 连接外部网络,支持以太网 lan 模式为其他以太网设备提供接入,使用本文的 netdrv 和 exnetif 扩展库的流程对比,推荐使用 exnetif 扩展库实现,使用更简单

  1. 本文中提到的网卡、网络适配器,网络设备,均为同一概念,如:"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 核心库。