LuatOS扩展库API——【dhcpsrv】DHCP服务器

LuatOS 是物联网终端开发领域的常用工具,作为轻量级嵌入式 Lua 脚本运行框架兼实时系统,其基于 Lua 5.3 完成深度优化,主要适配 4G-Cat.1、MCU 等物联网终端硬件,以 Lua 脚本为开发基础,采用协程多任务设计架构,配套有 70 余个核心库、20 余个扩展库及 1000 余个应用 demo 示例的完善开发资源,可覆盖物联网开发各类基础场景。

一、概述

dhcpsrv 扩展库,dhcp 服务器端,为 wifi AP 和以太网 LAN 网卡提供 dhcp 功能,为连接的设备自动分配 ip

二、核心示例

1、核心示例是指:使用本扩展库文件提供的 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、 完整的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/netdrv;

lua 复制代码
-- 创建一个dhcp服务器, 最简介的版本
dhcpsrv.create({adapter=socket.LWIP_AP})
-- 详细的版本
-- 创建一个dhcp服务器
local dhcpsrv_opts = {
    adapter=socket.LWIP_AP, -- 监听哪个网卡, 必须填写
    mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
    gw = {192, 168, 4, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
    ip_start = 100, -- ip起始地址, 默认100
    ip_end = 200, -- ip结束地址, 默认200
    ack_cb = function(ip, mac) end, -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
}
local mydhcpsrv = dhcpsrv.create(dhcpsrv_opts)

local function get_client()
    while true do
        sys.wait(10000)
        -- 这里可以打印一下当前的客户端列表
        for ip, client in pairs(mydhcpsrv.clients) do
            log.info("client", ip, client.mac:toHex(), client.tm, client.stat)
        end
    end
end

-- 以下是一个打印客户端列表的例子, 非必选, 仅供参考
-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP
-- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能
sys.taskInit(get_client)

-- 自动分配网段功能说明:
-- 如果不指定gw参数,系统会自动获取网卡IP作为网关地址
-- 这样可以确保DHCP分配的IP与网卡IP在同一网段

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

合宙LuatOS内核固件中定义的核心库常量,和此扩展库功能有关,所以也会放到本文描述。

关于网络适配器类型的常量:

注意:目前除 8101 系列产品默认网络适配器为 socket.LWIP_STA,其他主流模组默认网络适配器为 socket.LWIP_GP。

socket.LWIP_GP
lua 复制代码
常量含义:4G网卡;
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
         GP是GPRS的缩写,GPRS是2G网络时代的分组数据网络,此处用来代指移动蜂窝数据网络,例如4G网络;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_GP);
socket.LWIP_STA
lua 复制代码
常量含义:WiFi设备模式网卡;
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
         STA是STATION的缩写,表示WiFi设备模式,需要连接WiFi热点才能上网;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_STA);
socket.LWIP_AP
lua 复制代码
常量含义:WiFi热点模式网卡;
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
         AP是Access Ponit的缩写,意思是WiFi热点,供其他WiFi设备接入上网;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_AP);
socket.LWIP_ETH
lua 复制代码
常量含义:使用LwIP协议栈的以太网卡;
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈;
         ETH是Ethernet的缩写,意思是以太网;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_ETH);
socket.ETH0
lua 复制代码
常量含义:使用硬件协议栈的以太网卡;
         ETH是Ethernet的缩写,意思是以太网,ETH0表示编号为0的硬件协议栈以太网卡;
数据类型:number;
示例代码:socket.localIP(socket.ETH0);
socket.USB
lua 复制代码
常量含义:USB接口的以太网卡;
         常见的USB以太网卡又可以分为 USB RNDIS以太网卡 和 USB ECM以太网卡两种;
数据类型:number;
示例代码:socket.localIP(socket.USB);
socket.LWIP_USER0
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡0;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER0);
socket.LWIP_USER1
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡1;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER1);
socket.LWIP_USER2
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡2;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER2);
socket.LWIP_USER3
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡3;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER3);
socket.LWIP_USER4
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡4;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER4);
socket.LWIP_USER5
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡5;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER5);
socket.LWIP_USER6
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡6;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER6);
socket.LWIP_USER7
lua 复制代码
常量含义:使用LWIP协议栈的自定义网卡7;
数据类型:number;
示例代码:socket.localIP(socket.LWIP_USER7);

四、函数详解

4.1 dhcpsrv.create(opts)

功能

创建一个 dhcp 服务器;

注意事项

无;

参数

opts

lua 复制代码
> 参数含义:dhcp参数设置;  
> {  
> 参数含义:网络适配器;  
> 数据类型:number;  
> 取值范围:参考第三节常量详解;  
> 是否必选:必选;  
> 注意事项:无;  
> 参数示例: socket.LWIP\_AP  
> 参数名称: opts.adapter
> 
> 参数含义:网络掩码;  
> 数据类型:table;  
> 取值范围:暂无;  
> 是否必选:可选,默认{255, 255, 255, 0};  
> 注意事项:无;  
> 参数示例: {255, 255, 255, 0}  
> 参数名称: opts.mark
> 
> 参数含义:网关;  
> 数据类型:table;  
> 取值范围:暂无;  
> 是否必选:可选,默认自动获取网卡IP,如果获取失败则使用 {192, 168, 4, 1};  
> 注意事项:无;  
> 参数示例: {192, 168, 4, 1}  
> 参数名称: opts.gw
> 
> 参数含义:分配的网段内的起始ip;  
> 数据类型:number;  
> 取值范围:2-255,不能使用网关的IP,不能超过ip\_end;  
> 是否必选:可选.默认100;  
> 注意事项:无;  
> 参数示例: 100  
> 参数名称: opts.ip\_start
> 
> 参数含义:分配的网段内的结束ip;  
> 数据类型:number;  
> 取值范围:ip\_start 至 255;  
> 是否必选:可选,默认200;  
> 注意事项:无;  
> 参数示例: 200  
> 参数名称: opts.ip\_end
> 
> 参数含义:客户端连接模块时的回调函数;  
> function(ip, mac)  
> log.info("ack\_cb", "new client", ip, mac)  
> end  
> 回调函数接收以下两个参数:  
> 参数含义:ip;  
> 数据类型:string;  
> 取值范围:无;  
> 是否必选:必选;  
> 参数示例:"192.168.4.100";  
> ip,  
> 
> 参数含义:mac;  
> 数据类型:string;  
> 取值范围:无;  
> 是否必选:必选;  
> 参数示例:"2E4EDBB1A054";  
> mac  
> 
> 数据类型:function;  
> 取值范围:暂无;  
> 是否必选:可选;  
> 注意事项:ack回调, 有客户端连接上来时触发, ip和mac地址会传进来;  
> 参数示例:  
> 参数名称: opts.ack\_cb  
> }
> 
> 数据类型:table;  
> 取值范围:暂无;  
> 是否必选:可选;  
> 注意事项:无;  
> 参数示例:dhcpsrv.create({adapter=socket.LWIP\_AP})

返回值

local mydhcpsrv = dhcpsrv.create(ops)

for ip, client in pairs(mydhcpsrv.clients) do

log.info("client", ip, client.mac:toHex(), client.tm, client.stat)

end

mydhcpsrv

lua 复制代码
含义说明:客户端列表;
        {
         clients = 
         {
             -- 含义说明:ip的最后一段数字;
             -- 数据类型:number;
             -- 取值范围:2-255;
             -- 注意事项:非完整ip;
             -- 返回示例:100;
             ip = 
            {
               -- 含义说明:mac地址;
               -- 数据类型:string;
               -- 取值范围:无;
               -- 注意事项:返回原始mac地址,打印时建议使用client.mac:toHex()转换成HEX字符串;
               -- 返回示例:0x2E4EDBB1A054;
               mac = 0x2E4EDBB1A054,
               -- 含义说明:客户端连接的时间。设备开机到连接时的运行秒数;
               -- 数据类型:number;
               -- 取值范围:无;
               -- 注意事项:会动态变化,出现重连时会更新数据;
               -- 返回示例:6;
               tm = 6,
               -- 含义说明:客户端状态;
               -- 数据类型:number;
               -- 取值范围:1/3 1:已分配ip但未确认 3:已分配ip且已确认;
               -- 注意事项:无;
               -- 返回示例:1;
               stat = 1
            }
          }
        }
数据类型:table;
取值范围:无;
注意事项:-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP
         -- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能;
返回示例:{ 100 = {mac = 0x2E4EDBB1A054 , tm = 6 , stat = 1}};

示例

lua 复制代码
-- 创建一个dhcp服务器, 最简单的版本
dhcpsrv.create({adapter=socket.LWIP_AP})
-- 详细的版本
-- 创建一个dhcp服务器
local dhcpsrv_opts = {
    adapter=socket.LWIP_AP, -- 监听哪个网卡, 必须填写
    mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
    gw = {192, 168, 4, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
    ip_start = 100, -- ip起始地址, 默认100
    ip_end = 200, -- ip结束地址, 默认200
    ack_cb = function(ip, mac)
                 log.info("ack_cb", "new client", ip, mac)
             end -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
}
local mydhcpsrv = dhcpsrv.create(dhcpsrv_opts)

-- 以下是一个打印客户端列表的例子, 非必选, 仅供参考
-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP
-- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能
local function get_client()
    while true do
        sys.wait(10000)
        -- 这里可以打印一下当前的客户端列表
        for ip, client in pairs(mydhcpsrv.clients) do
            log.info("client", ip, client.mac:toHex(), client.tm, client.stat)
        end
    end
end

-- 以下是一个打印客户端列表的例子, 非必选, 仅供参考
-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP
-- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能
sys.taskInit(get_client)

-- 自动分配网段功能说明:
-- 如果不指定gw参数,系统会自动获取网卡IP作为网关地址
-- 这样可以确保DHCP分配的IP与网卡IP在同一网段

五、模组支持说明

支持 LuatOS 开发的所有产品均支持 dhcpsrv 扩展库;

今天就分享到这里啦!~~~

相关推荐
源码学社2 小时前
DeerFlow 2.0:字节跳动开源的超级智能体框架,让AI真正“干活”
人工智能·开源
路由侠内网穿透2 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·开源
开开心心就好2 小时前
模拟真人手写软件,支持随机调节
运维·服务器·windows·gitee·pdf·开源·excel
小陈工2 小时前
Python后端实战:GraphQL高级应用与性能优化全解析
开发语言·人工智能·后端·python·性能优化·开源·graphql
jomoly3 小时前
盛思锐SEN66 - ArtPi2+RTOS 数据记录/开源
嵌入式硬件·开源·传感器
LQQrk智能排产物联网规则引擎3 小时前
协议不通用、设备连不上?三步拆解物联网的“语言障碍”(JVS物联网)
物联网·jvs
开源能源管理系统3 小时前
边缘计算与云端协同:MyEMS 在工业能源实时监测与智能调度中的应用突破
人工智能·开源·能源·边缘计算·能源管理系统
luanma1509803 小时前
PHP vs Lua:脚本语言核心差异解析
开发语言·php·lua
小陈工4 小时前
Python开源代码管理避坑实战:从Git高级操作到Docker环境配置
开发语言·git·python·安全·docker·开源·源代码管理