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-- 创建一个dhcp服务器, 最简介的版本dhcpsrv.create({adaptersocket.LWIP_AP})-- 详细的版本-- 创建一个dhcp服务器localdhcpsrv_opts{adaptersocket.LWIP_AP,-- 监听哪个网卡, 必须填写mark{255,255,255,0},-- 网络掩码, 默认 255.255.255.0gw{192,168,4,1},-- 网关, 默认自动获取网卡IP如果获取失败则使用 192.168.4.1ip_start100,-- ip起始地址, 默认100ip_end200,-- ip结束地址, 默认200ack_cbfunction(ip,mac)end,-- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来}localmydhcpsrvdhcpsrv.create(dhcpsrv_opts)localfunctionget_client()whiletruedosys.wait(10000)-- 这里可以打印一下当前的客户端列表forip,clientinpairs(mydhcpsrv.clients)dolog.info(client,ip,client.mac:toHex(),client.tm,client.stat)endendend-- 以下是一个打印客户端列表的例子, 非必选, 仅供参考-- 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常量含义4G网卡 LWIP是指传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈 GP是GPRS的缩写GPRS是2G网络时代的分组数据网络此处用来代指移动蜂窝数据网络例如4G网络 数据类型number 示例代码socket.localIP(socket.LWIP_GP)socket.LWIP_STA常量含义WiFi设备模式网卡 LWIP是指传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈 STA是STATION的缩写表示WiFi设备模式需要连接WiFi热点才能上网 数据类型number 示例代码socket.localIP(socket.LWIP_STA)socket.LWIP_AP常量含义WiFi热点模式网卡 LWIP是指传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈 AP是Access Ponit的缩写意思是WiFi热点供其他WiFi设备接入上网 数据类型number 示例代码socket.localIP(socket.LWIP_AP)socket.LWIP_ETH常量含义使用LwIP协议栈的以太网卡 LWIP是指传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈 ETH是Ethernet的缩写意思是以太网 数据类型number 示例代码socket.localIP(socket.LWIP_ETH)socket.ETH0常量含义使用硬件协议栈的以太网卡 ETH是Ethernet的缩写意思是以太网ETH0表示编号为0的硬件协议栈以太网卡 数据类型number 示例代码socket.localIP(socket.ETH0)socket.USB常量含义USB接口的以太网卡 常见的USB以太网卡又可以分为 USB RNDIS以太网卡 和 USB ECM以太网卡两种 数据类型number 示例代码socket.localIP(socket.USB)socket.LWIP_USER0常量含义使用LWIP协议栈的自定义网卡0 数据类型number 示例代码socket.localIP(socket.LWIP_USER0)socket.LWIP_USER1常量含义使用LWIP协议栈的自定义网卡1 数据类型number 示例代码socket.localIP(socket.LWIP_USER1)socket.LWIP_USER2常量含义使用LWIP协议栈的自定义网卡2 数据类型number 示例代码socket.localIP(socket.LWIP_USER2)socket.LWIP_USER3常量含义使用LWIP协议栈的自定义网卡3 数据类型number 示例代码socket.localIP(socket.LWIP_USER3)socket.LWIP_USER4常量含义使用LWIP协议栈的自定义网卡4 数据类型number 示例代码socket.localIP(socket.LWIP_USER4)socket.LWIP_USER5常量含义使用LWIP协议栈的自定义网卡5 数据类型number 示例代码socket.localIP(socket.LWIP_USER5)socket.LWIP_USER6常量含义使用LWIP协议栈的自定义网卡6 数据类型number 示例代码socket.localIP(socket.LWIP_USER6)socket.LWIP_USER7常量含义使用LWIP协议栈的自定义网卡7 数据类型number 示例代码socket.localIP(socket.LWIP_USER7)四、函数详解4.1 dhcpsrv.create(opts)功能创建一个 dhcp 服务器注意事项无参数opts参数含义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.100ip,参数含义mac数据类型string取值范围无是否必选必选参数示例2E4EDBB1A054mac数据类型function取值范围暂无是否必选可选注意事项ack回调,有客户端连接上来时触发,ip和mac地址会传进来参数示例:参数名称 opts.ack\_cb}数据类型table取值范围暂无是否必选可选注意事项无参数示例dhcpsrv.create({adaptersocket.LWIP\_AP})返回值local mydhcpsrv dhcpsrv.create(ops)for ip, client in pairs(mydhcpsrv.clients) dolog.info(“client”, ip, client.mac:toHex(), client.tm, client.stat)endmydhcpsrv含义说明客户端列表{clients{-- 含义说明ip的最后一段数字-- 数据类型number-- 取值范围2-255-- 注意事项非完整ip-- 返回示例100ip{-- 含义说明mac地址-- 数据类型string-- 取值范围无-- 注意事项返回原始mac地址打印时建议使用client.mac:toHex()转换成HEX字符串-- 返回示例0x2E4EDBB1A054mac0x2E4EDBB1A054,-- 含义说明客户端连接的时间。设备开机到连接时的运行秒数-- 数据类型number-- 取值范围无-- 注意事项会动态变化出现重连时会更新数据-- 返回示例6tm6,-- 含义说明客户端状态-- 数据类型number-- 取值范围1/3 1已分配ip但未确认 3已分配ip且已确认-- 注意事项无-- 返回示例1stat1}}}数据类型table 取值范围无 注意事项-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP-- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能返回示例{100{mac0x2E4EDBB1A054,tm6 stat1}}示例-- 创建一个dhcp服务器, 最简单的版本dhcpsrv.create({adaptersocket.LWIP_AP})-- 详细的版本-- 创建一个dhcp服务器localdhcpsrv_opts{adaptersocket.LWIP_AP,-- 监听哪个网卡, 必须填写mark{255,255,255,0},-- 网络掩码, 默认 255.255.255.0gw{192,168,4,1},-- 网关, 默认自动获取网卡IP如果获取失败则使用 192.168.4.1ip_start100,-- ip起始地址, 默认100ip_end200,-- ip结束地址, 默认200ack_cbfunction(ip,mac)log.info(ack_cb,new client,ip,mac)end-- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来}localmydhcpsrvdhcpsrv.create(dhcpsrv_opts)-- 以下是一个打印客户端列表的例子, 非必选, 仅供参考-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP-- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能localfunctionget_client()whiletruedosys.wait(10000)-- 这里可以打印一下当前的客户端列表forip,clientinpairs(mydhcpsrv.clients)dolog.info(client,ip,client.mac:toHex(),client.tm,client.stat)endendend-- 以下是一个打印客户端列表的例子, 非必选, 仅供参考-- clients是一个table, 包含MAC和IP的对应关系, 注意, IP只记录了最后一段数字, 非完整IP-- 注意, clients是动态变化的过程, mydhcpsrv对象的其他属性切勿修改, 仅提供clients的只读功能sys.taskInit(get_client)-- 自动分配网段功能说明-- 如果不指定gw参数系统会自动获取网卡IP作为网关地址-- 这样可以确保DHCP分配的IP与网卡IP在同一网段五、模组支持说明支持 LuatOS 开发的所有产品均支持 dhcpsrv 扩展库今天就分享到这里啦~~~