Ver código fonte

add: 新增httpdns demo示例

tuoyiheng 4 meses atrás
pai
commit
81f013f5a9

+ 45 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/httpdns/httpdns_task.lua

@@ -0,0 +1,45 @@
+--[[
+@module httpdns_task
+@summary httpdns 功能模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+用法实例
+
+启动 HTTPDNS 功能
+- 运行 httpdnstask 任务,等待网络就绪后循环查询域名。
+- 示例中分别使用阿里DNS和腾讯DNS解析 “air32.cn” 与 “openluat.com”。
+- 解析结果通过 log.info 打印到串口。
+
+注:本demo无需额外配置,直接在 main.lua 中 require "httpdns_task" 即可加载运行。
+]]
+
+httpdns = require "httpdns"
+
+local function httpdnstask()
+    -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
+    while not socket.adapter(socket.dft()) do
+        log.warn("httpdns", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态
+        sys.waitUntil("IP_READY", 1000)
+    end
+    
+    -- 检测到了IP_READY消息
+    log.info("httpdns", "recv IP_READY", socket.dft())
+    log.info("已联网")
+    while true do
+        sys.wait(1000)
+        -- 通过阿里DNS获取结果
+        local ip = httpdns.ali("air32.cn")
+        log.info("httpdns", "air32.cn", ip)
+
+
+        -- 通过腾讯DNS获取结果
+        local ip = httpdns.tx("openluat.com")
+        log.info("httpdns", "openluat.com", ip)
+    end
+end
+
+sys.taskInit(httpdnstask)

+ 63 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/httpdns/main.lua

@@ -0,0 +1,63 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+HTTPDNS通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,适用于4G蜂窝、WiFi、以太网等网络场景。
+功能使用说明
+本demo以解析“air32.cn” 与 “openluat.com”为例,展示完整流程:初始化、发起查询、获取结果。
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "HTTPDNS"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载 httpdns 功能模块
+require "httpdns_task"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 77 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/httpdns/readme.md

@@ -0,0 +1,77 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载httpdns_task模块;
+
+2、httpdns_task.lua:HTTPDNS功能实现模块,演示如何使用阿里DNS和腾讯DNS进行域名解析;
+
+## 演示功能概述
+
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+
+HTTPDNS的主要功能特性:
+
+1、**绕过DNS污染**:通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,有效避免运营商DNS劫持问题;
+
+2、**支持多种DNS服务**:内置支持阿里DNS和腾讯DNS两种主流的HTTPDNS服务提供商;
+
+3、**简单易用**:仅需调用一行API即可完成域名解析;
+
+4、**自动处理错误**:内置错误处理机制,当解析失败时会返回nil;
+
+## 演示硬件环境
+
+1、Air780EHM/Air780EHV/Air780EGH核心板一块+sim卡一张
+
+2、TYPE-C USB数据线一根
+
+3、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口供电;
+
+- 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者5V管脚进行5V供电;
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、固件获取地址:
+
+[Air780EHM 固件](https://docs.openluat.com/air780epm/luatos/firmware/version/#air780ehmluatos)
+
+[Air780EHV 固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+
+[Air780EGH 固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,确保开发板能正常联网
+
+2、使用Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,设备自动开机运行,等待网络就绪
+
+4、当网络就绪后,设备会自动执行HTTPDNS解析任务,默认解析以下域名:
+   - 通过阿里DNS解析 "air32.cn"
+   - 通过腾讯DNS解析 "openluat.com"
+
+5、通过串口调试工具,可以查看设备的运行日志,包括域名解析结果:
+
+```lua
+[2025-10-29 11:10:21.571][000000000.689] I/user.main HTTPDNS 001.000.000
+[2025-10-29 11:10:22.614][000000007.414] D/mobile NETIF_LINK_ON -> IP_READY
+[2025-10-29 11:10:22.615][000000007.415] I/user.已联网
+[2025-10-29 11:10:22.633][000000007.454] D/mobile TIME_SYNC 0
+[2025-10-29 11:10:23.726][000000008.548] I/user.httpdns air32.cn 49.232.89.122
+[2025-10-29 11:10:23.882][000000008.697] I/user.httpdns openluat.com 121.40.220.186
+
+```
+
+6、如需修改解析的域名,只需修改httpdns_task.lua文件中的域名参数:
+
+```lua
+-- 示例:修改为解析其他域名
+local ip = httpdns.ali("example.com")  -- 使用阿里DNS解析example.com
+local ip = httpdns.tx("example.org")   -- 使用腾讯DNS解析example.org
+```

+ 45 - 0
module/Air780EPM/demo/httpdns/httpdns_task.lua

@@ -0,0 +1,45 @@
+--[[
+@module httpdns_task
+@summary httpdns 功能模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+用法实例
+
+启动 HTTPDNS 功能
+- 运行 httpdnstask 任务,等待网络就绪后循环查询域名。
+- 示例中分别使用阿里DNS和腾讯DNS解析 “air32.cn” 与 “openluat.com”。
+- 解析结果通过 log.info 打印到串口。
+
+注:本demo无需额外配置,直接在 main.lua 中 require "httpdns_task" 即可加载运行。
+]]
+
+httpdns = require "httpdns"
+
+local function httpdnstask()
+    -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
+    while not socket.adapter(socket.dft()) do
+        log.warn("httpdns", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态
+        sys.waitUntil("IP_READY", 1000)
+    end
+    
+    -- 检测到了IP_READY消息
+    log.info("httpdns", "recv IP_READY", socket.dft())
+    log.info("已联网")
+    while true do
+        sys.wait(1000)
+        -- 通过阿里DNS获取结果
+        local ip = httpdns.ali("air32.cn")
+        log.info("httpdns", "air32.cn", ip)
+
+
+        -- 通过腾讯DNS获取结果
+        local ip = httpdns.tx("openluat.com")
+        log.info("httpdns", "openluat.com", ip)
+    end
+end
+
+sys.taskInit(httpdnstask)

+ 63 - 0
module/Air780EPM/demo/httpdns/main.lua

@@ -0,0 +1,63 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+HTTPDNS通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,适用于4G蜂窝、WiFi、以太网等网络场景。
+功能使用说明
+本demo以解析“air32.cn” 与 “openluat.com”为例,展示完整流程:初始化、发起查询、获取结果。
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "HTTPDNS"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载 httpdns 功能模块
+require "httpdns_task"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 73 - 0
module/Air780EPM/demo/httpdns/readme.md

@@ -0,0 +1,73 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载httpdns_task模块;
+
+2、httpdns_task.lua:HTTPDNS功能实现模块,演示如何使用阿里DNS和腾讯DNS进行域名解析;
+
+## 演示功能概述
+
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+
+HTTPDNS的主要功能特性:
+
+1、**绕过DNS污染**:通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,有效避免运营商DNS劫持问题;
+
+2、**支持多种DNS服务**:内置支持阿里DNS和腾讯DNS两种主流的HTTPDNS服务提供商;
+
+3、**简单易用**:仅需调用一行API即可完成域名解析;
+
+4、**自动处理错误**:内置错误处理机制,当解析失败时会返回nil;
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/app/driver/eth/image/RFSvb75NRoEWqYxfCRVcVrOKnsf.jpg)
+
+1、Air780EPM V1.3版本开发板一块+可上网的sim卡一张+4g天线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+2、TYPE-C USB数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
+
+- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EPM 固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,确保开发板能正常联网
+
+2、使用Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,设备自动开机运行,等待网络就绪
+
+4、当网络就绪后,设备会自动执行HTTPDNS解析任务,默认解析以下域名:
+   - 通过阿里DNS解析 "air32.cn"
+   - 通过腾讯DNS解析 "openluat.com"
+
+5、通过串口调试工具,可以查看设备的运行日志,包括域名解析结果:
+
+```lua
+[2025-10-29 11:10:21.571][000000000.689] I/user.main HTTPDNS 001.000.000
+[2025-10-29 11:10:22.614][000000007.414] D/mobile NETIF_LINK_ON -> IP_READY
+[2025-10-29 11:10:22.615][000000007.415] I/user.已联网
+[2025-10-29 11:10:22.633][000000007.454] D/mobile TIME_SYNC 0
+[2025-10-29 11:10:23.726][000000008.548] I/user.httpdns air32.cn 49.232.89.122
+[2025-10-29 11:10:23.882][000000008.697] I/user.httpdns openluat.com 121.40.220.186
+
+```
+
+6、如需修改解析的域名,只需修改httpdns_task.lua文件中的域名参数:
+
+```lua
+-- 示例:修改为解析其他域名
+local ip = httpdns.ali("example.com")  -- 使用阿里DNS解析example.com
+local ip = httpdns.tx("example.org")   -- 使用腾讯DNS解析example.org
+```

+ 45 - 0
module/Air8000/demo/httpdns/httpdns_task.lua

@@ -0,0 +1,45 @@
+--[[
+@module httpdns_task
+@summary httpdns 功能模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+用法实例
+
+启动 HTTPDNS 功能
+- 运行 httpdnstask 任务,等待网络就绪后循环查询域名。
+- 示例中分别使用阿里DNS和腾讯DNS解析 “air32.cn” 与 “openluat.com”。
+- 解析结果通过 log.info 打印到串口。
+
+注:本demo无需额外配置,直接在 main.lua 中 require "httpdns_task" 即可加载运行。
+]]
+
+httpdns = require "httpdns"
+
+local function httpdnstask()
+    -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
+    while not socket.adapter(socket.dft()) do
+        log.warn("httpdns", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态
+        sys.waitUntil("IP_READY", 1000)
+    end
+    
+    -- 检测到了IP_READY消息
+    log.info("httpdns", "recv IP_READY", socket.dft())
+    log.info("已联网")
+    while true do
+        sys.wait(1000)
+        -- 通过阿里DNS获取结果
+        local ip = httpdns.ali("air32.cn")
+        log.info("httpdns", "air32.cn", ip)
+
+
+        -- 通过腾讯DNS获取结果
+        local ip = httpdns.tx("openluat.com")
+        log.info("httpdns", "openluat.com", ip)
+    end
+end
+
+sys.taskInit(httpdnstask)

+ 63 - 0
module/Air8000/demo/httpdns/main.lua

@@ -0,0 +1,63 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+HTTPDNS通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,适用于4G蜂窝、WiFi、以太网等网络场景。
+功能使用说明
+本demo以解析“air32.cn” 与 “openluat.com”为例,展示完整流程:初始化、发起查询、获取结果。
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "HTTPDNS"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载 httpdns 功能模块
+require "httpdns_task"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 69 - 0
module/Air8000/demo/httpdns/readme.md

@@ -0,0 +1,69 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载httpdns_task模块;
+
+2、httpdns_task.lua:HTTPDNS功能实现模块,演示如何使用阿里DNS和腾讯DNS进行域名解析;
+
+## 演示功能概述
+
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+
+HTTPDNS的主要功能特性:
+
+1、**绕过DNS污染**:通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,有效避免运营商DNS劫持问题;
+
+2、**支持多种DNS服务**:内置支持阿里DNS和腾讯DNS两种主流的HTTPDNS服务提供商;
+
+3、**简单易用**:仅需调用一行API即可完成域名解析;
+
+4、**自动处理错误**:内置错误处理机制,当解析失败时会返回nil;
+
+## 演示硬件环境
+
+1、Air8000开发板一块+可上网的sim卡一张+4g天线一根:
+
+- sim卡插入开发板的sim卡槽
+- 天线装到开发板上
+
+2、TYPE-C USB数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+- Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,确保开发板能正常联网
+
+2、使用Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,设备自动开机运行,等待网络就绪
+
+4、当网络就绪后,设备会自动执行HTTPDNS解析任务,默认解析以下域名:
+   - 通过阿里DNS解析 "air32.cn"
+   - 通过腾讯DNS解析 "openluat.com"
+
+5、通过串口调试工具,可以查看设备的运行日志,包括域名解析结果:
+
+```lua
+[2025-10-29 11:10:21.571][000000000.689] I/user.main HTTPDNS 001.000.000
+[2025-10-29 11:10:22.614][000000007.414] D/mobile NETIF_LINK_ON -> IP_READY
+[2025-10-29 11:10:22.615][000000007.415] I/user.已联网
+[2025-10-29 11:10:22.633][000000007.454] D/mobile TIME_SYNC 0
+[2025-10-29 11:10:23.726][000000008.548] I/user.httpdns air32.cn 49.232.89.122
+[2025-10-29 11:10:23.882][000000008.697] I/user.httpdns openluat.com 121.40.220.186
+
+```
+
+6、如需修改解析的域名,只需修改httpdns_task.lua文件中的域名参数:
+
+```lua
+-- 示例:修改为解析其他域名
+local ip = httpdns.ali("example.com")  -- 使用阿里DNS解析example.com
+local ip = httpdns.tx("example.org")   -- 使用腾讯DNS解析example.org
+```

+ 45 - 0
module/Air8101/demo/httpdns/httpdns_task.lua

@@ -0,0 +1,45 @@
+--[[
+@module httpdns_task
+@summary httpdns 功能模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+用法实例
+
+启动 HTTPDNS 功能
+- 运行 httpdnstask 任务,等待网络就绪后循环查询域名。
+- 示例中分别使用阿里DNS和腾讯DNS解析 “air32.cn” 与 “openluat.com”。
+- 解析结果通过 log.info 打印到串口。
+
+注:本demo无需额外配置,直接在 main.lua 中 require "httpdns_task" 即可加载运行。
+]]
+
+httpdns = require "httpdns"
+
+local function httpdnstask()
+    -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
+    while not socket.adapter(socket.dft()) do
+        log.warn("httpdns", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态
+        sys.waitUntil("IP_READY", 1000)
+    end
+    
+    -- 检测到了IP_READY消息
+    log.info("httpdns", "recv IP_READY", socket.dft())
+    log.info("已联网")
+    while true do
+        sys.wait(1000)
+        -- 通过阿里DNS获取结果
+        local ip = httpdns.ali("air32.cn")
+        log.info("httpdns", "air32.cn", ip)
+
+
+        -- 通过腾讯DNS获取结果
+        local ip = httpdns.tx("openluat.com")
+        log.info("httpdns", "openluat.com", ip)
+    end
+end
+
+sys.taskInit(httpdnstask)

+ 66 - 0
module/Air8101/demo/httpdns/main.lua

@@ -0,0 +1,66 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+HTTPDNS通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,适用于4G蜂窝、WiFi、以太网等网络场景。
+功能使用说明
+本demo以解析“air32.cn” 与 “openluat.com”为例,展示完整流程:初始化、发起查询、获取结果。
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "HTTPDNS"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载“WIFI STA网卡”驱动模块
+require "netdrv_wifi"
+
+-- 加载 httpdns 功能模块
+require "httpdns_task"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 55 - 0
module/Air8101/demo/httpdns/netdrv_wifi.lua

@@ -0,0 +1,55 @@
+--[[
+@module  netdrv_wifi
+@summary “WIFI STA网卡”驱动模块
+@version 1.0
+@date    2025.07.01
+@author  马梦阳
+@usage
+本文件为WIFI STA网卡驱动模块,核心业务逻辑为:
+1、初始化WIFI网络;
+2、连接WIFI路由器;
+3、和WIFI路由器之间的连接状态发生变化时,在日志中进行打印;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_wifi"就可以加载运行;
+]]
+
+local function ip_ready_func(ip, adapter)
+    if adapter == socket.LWIP_STA then
+        log.info("netdrv_wifi.ip_ready_func", "IP_READY", json.encode(wlan.getInfo()))
+    end
+end
+
+local function ip_lose_func(adapter)
+    if adapter == socket.LWIP_STA then
+        log.warn("netdrv_wifi.ip_lose_func", "IP_LOSE")
+    end
+end
+
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察WIFI的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+
+-- 设置默认网卡为socket.LWIP_STA
+-- 在Air8101上,内核固件运行起来之后,默认网卡就是socket.LWIP_STA
+-- 在单socket.LWIP_STA网卡使用场景下,下面这一行代码加不加都没有影响,为了和其他网卡驱动模块的代码风格保持一致,所以加上了
+socket.dft(socket.LWIP_STA)
+
+
+wlan.init()
+-- 连接WIFI热点,连接结果会通过"IP_READY"或者"IP_LOSE"消息通知
+-- Air8101仅支持2.4G的WIFI,不支持5G的WIFI
+-- 此处前两个参数表示WIFI热点名称以及密码,更换为自己测试时的真实参数即可
+-- 第三个参数1表示WIFI连接异常时,内核固件会自动重连
+wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1)
+
+-- WIFI联网成功(做为STATION成功连接AP,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+-- 各个功能模块可以订阅"IP_READY"消息实时处理WIFI联网成功的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_STA)来获取WIFI网络是否连接成功
+
+-- WIFI断网后,内核固件会产生一个"IP_LOSE"消息
+-- 各个功能模块可以订阅"IP_LOSE"消息实时处理WIFI断网的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_STA)来获取WIFI网络是否连接成功

+ 93 - 0
module/Air8101/demo/httpdns/readme.md

@@ -0,0 +1,93 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载httpdns_task模块;
+
+2、netdrv_wifi.lua:WIFI STA网卡驱动模块,负责初始化WIFI网络、连接WIFI路由器并监控连接状态;
+
+3、httpdns_task.lua:HTTPDNS功能实现模块,演示如何使用阿里DNS和腾讯DNS进行域名解析;
+
+## 演示功能概述
+
+1、httpdns_task:演示如何通过HTTPDNS功能,在LuatOS环境下实现域名解析,从而绕过运营商DNS污染或劫持,提高网络访问稳定性。
+
+2、netdrv_wifi:WIFI STA网卡功能
+   - 初始化WIFI网络并连接到指定的WIFI热点
+   - 监控WIFI连接状态,通过"IP_READY"和"IP_LOSE"消息通知网络变化
+   - 支持WIFI连接异常时自动重连
+   - 仅支持2.4G WIFI,不支持5G WIFI
+
+HTTPDNS的主要功能特性:
+
+1、**绕过DNS污染**:通过直接向指定DNS服务器发起HTTP/HTTPS请求获取域名解析结果,不依赖本地UDP 53端口,有效避免运营商DNS劫持问题;
+
+2、**支持多种DNS服务**:内置支持阿里DNS和腾讯DNS两种主流的HTTPDNS服务提供商;
+
+3、**简单易用**:仅需调用一行API即可完成域名解析;
+
+4、**自动处理错误**:内置错误处理机制,当解析失败时会返回nil;
+
+## 演示硬件环境
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8101核心板和数据线的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电;(核心板背面的功耗测试开关拨到OFF一端)
+
+- 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者VIN管脚进行5V供电;
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,确保开发板能正常联网
+
+2、配置WIFI连接信息:打开`netdrv_wifi.lua`文件,修改以下代码行中的WIFI热点名称和密码:
+
+```lua
+-- 连接WIFI热点,连接结果会通过"IP_READY"或者"IP_LOSE"消息通知
+-- Air8101仅支持2.4G的WIFI,不支持5G的WIFI
+-- 此处前两个参数表示WIFI热点名称以及密码,更换为自己测试时的真实参数即可
+-- 第三个参数1表示WIFI连接异常时,内核固件会自动重连
+wlan.connect("你的WIFI热点名称", "你的WIFI密码", 1)
+```
+
+**重要注意事项**:
+- Air8101仅支持2.4GHz频段的WIFI网络,不支持5GHz频段
+- 确保WIFI热点信号稳定,建议距离不要太远
+- 密码区分大小写,请确保输入正确
+
+3、使用Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,设备自动开机运行,等待网络就绪
+
+5、当网络就绪后,设备会自动执行HTTPDNS解析任务,默认解析以下域名:
+   - 通过阿里DNS解析 "air32.cn"
+   - 通过腾讯DNS解析 "openluat.com"
+
+6、通过串口调试工具,可以查看设备的运行日志,包括域名解析结果:
+
+```lua
+[2025-10-29 11:10:21.571][000000000.689] I/user.main HTTPDNS 001.000.000
+[2025-10-29 11:10:22.614][000000007.414] D/mobile NETIF_LINK_ON -> IP_READY
+[2025-10-29 11:10:22.615][000000007.415] I/user.已联网
+[2025-10-29 11:10:22.633][000000007.454] D/mobile TIME_SYNC 0
+[2025-10-29 11:10:23.726][000000008.548] I/user.httpdns air32.cn 49.232.89.122
+[2025-10-29 11:10:23.882][000000008.697] I/user.httpdns openluat.com 121.40.220.186
+```
+
+7、如需修改解析的域名,只需修改httpdns_task.lua文件中的域名参数:
+
+```lua
+-- 示例:修改为解析其他域名
+local ip = httpdns.ali("example.com")  -- 使用阿里DNS解析example.com
+local ip = httpdns.tx("example.org")   -- 使用腾讯DNS解析example.org
+```