跳转至

11 httpdns

作者:拓毅恒 | 最后修改:2026-04-09

一、httpdns 概述

  • HTTPDNS:一种通过 HTTP/HTTPS 协议直接向 DNS 服务器发起查询请求的域名解析技术,能够有效绕过运营商 DNS 污染或劫持,提高网络访问的稳定性和安全性。
  • 阿里 DNS:阿里巴巴提供的 HTTPDNS 服务,具有解析速度快、稳定性高的特点。
  • 腾讯 DNS:腾讯云提供的 HTTPDNS 服务,覆盖面广,响应及时。

二、演示功能概述

本章节将演示如何使用 Air8101 来开启 HTTPDNS 功能,实现通过阿里 DNS 和腾讯 DNS 进行域名解析。

三、准备硬件环境

参考:Air8101 硬件环境清单,准备好硬件环境。

3.1 Air8101 核心板

四、准备软件环境

4.1 文章内容应用

在开始实践本示例之前,先筹备一下软件环境:

1. 烧录工具:Luatools 工具

2. 本demo开发测试时使用的固件为Air8101 V1006 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

3. 脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8101/demo/httpdns

4. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。

准备好软件环境之后,接下来查看 Air8101 产品手册中“Air8101 核心板使用手册 -> 使用说明”,将本篇文章中演示使用的项目文件烧录到 Air8101 核心板中。

4.2 API 介绍

这里仅介绍本篇文档所使用的 API,详情请查看:API - httpdns

httpdns.ali(domain_name, opts)

通过阿里 DNS 解析域名

httpdns.tx(domain_name, opts)

通过腾讯 DNS 解析域名

五、代码演示

5.1 WIFI STA 网卡配置

用于给 Air8101 核心板连接网络来进行 httpdns 操作,使用时将 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网络是否连接成功

5.2 HTTPDNS 应用

httpdns = require "httpdns"

-- 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

-- 启动HTTPDNS任务
sys.taskInit(httpdnstask)

六、功能演示

6.1 HTTPDNS 功能演示

使用 Luatools 将代码烧录到 Air8101 核心板

烧录完毕后会等待网络连接成功

连接成功后,会开始通过阿里 DNS 和腾讯 DNS 来获取结果

七、 总结

至此,我们演示了使用 httpdns 进行域名解析的全过程