• 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。
13、esp32 内置 dns 服务器,无需外网访问域名返回指定网页。
14、esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录界面。
15、认识本地离线语音唤醒识别框架 esp-skainet ,实现较低成本的硬件语音本地识别控制。
16、学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?
17、全网首发,乐鑫esp32 sdk直连京东微联·小京鱼 · IoT开放平台,实现叮咚音响语音智能控制。


文章目录

  • 一、前言
  • 二、实现原理和流程
    • 2.1 原理
    • 2.2 流程
  • 三、代码
    • 3.1 DNS服务器
    • 3.2 server服务器
  • 四、其他
      • 源码学习与总结,参考来自:
      • 本博文代码下载(不再需要积分下载,免费给大家使用)
    • 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

一、前言


在物联网搞了这么多的玩意,包括服务器、嵌入式、小程序、Android等,我的确是不会 ‘精通’ 一门技术,看到网上很多招聘信息,嵌入式开发的工资较低的,其中 Android和服务器这边薪酬较高,我在想,如果我哪一天去面试新公司,我该面试哪个职位?真不知道。。。

随着年龄成长,成家立业的想法迫使我压力很大,也许你到了这30未至,未成家的阶段,和我一样的焦虑。好吧!说到底,还是工作与生活,明年准备换个公司吧。希望身边都是优秀的人,待遇薪酬也高一点!

说了这么多,开始正题:如何没有外网的情况下,实现访问域名返回指定的网页!

二、实现原理和流程


也许你会问,这个无需外网访问域名就可以返回 html 有啥用啊?这个问题提的好,我们可以在平时的生活中也遇到这样的事情:第一次买的路由器,需要配置 网络运营商的 账号密码,我们一般是 浏览器地址栏输入“192.168.xx.xx” ,而有的是 访问 “www.xxx.com” 这样的域名。你觉得哪个好?我觉得域名比较好;

  • 第一:体现你的品牌,比如小米的 mi.wifi.com 这样的域名;
  • 第二:主机名便于人的记忆,而IP地址便于计算机网络设备的处理;

2.1 原理

因为没外网访问域名,所以需要内置一个 dns 服务器,毕竟我们平时访问的域名,都是先经过 dns 解析得到 ip 地址再访问 ip 地址的,就像前几天的国内码云域名被阿里云冻结事件,不难分析出,如果你的域名无法被解析,那么客户端无法访问;

有一个dns服务器还是不够的,因为你即使得到 ip 地址,客户端还会去 get 请求这个域名,所以,你还得具备一个 server 服务器,而 server 服务器是基于 tcp 的,所以你得做一个 tcp 服务器 http 格式,端口号是 80 ;

而DNS走的是UDP协议,使用的端口号是53,所以不管收到什么,都回复!

dns服务器建立参考:传送门


2.2 流程


第一步自己开启热点,这时候你就是相当于一个没外网的一个路由器啦!之后开启 dns 服务器,再开启 tcp 服务器,等待客户端 dns 解析请求和 http 请求 !


三、代码


  • 所有代码,都在博文下面获取!

3.1 DNS服务器

  • 得到一个 dns 解析请求:
void get_dns_request(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{printf("get the massage from sat\n");struct dns_ans_hdr hdr;upcb1 = upcb;addr1 = addr;port1 = port;if (p->tot_len < (SIZEOF_DNSANS_HDR + SIZEOF_DNSANS_HDRQUE)){printf("dns_recv: pbuf too small\n");/* 非dns请求 */}else{pbuf_copy_partial(p, &hdr, SIZEOF_DNSANS_HDR, 0);txid = ntohs(hdr.id);nquestions = ntohs(hdr.numquestions);}pbuf_free(p); //check thisdns_server_send();
}

  • 返回 dns 解析请求给客户端,下面我是指为一个域名,宏定义的 TABLENAME 为: www.xuhong.com,这样的格式!
void dns_server_send(void)
{struct pbuf *rp = NULL;struct dns_ans_hdr hdr;struct dns_ans_ans qry;uint8_t n;uint16_t query_idx, copy_len;const char *hostname, *hostname_part;struct dns_table_entry dns_server_table = {.txid = DNS_SERVER_ID,.flags = DNS_SERVER_FLAGS,.numque = DNS_SERVER_NUMQUE,.ansrrs = DNS_SERVER_ANSRRS,.autrrs = DNS_SERVER_AUTRRS,.addrrs = DNS_SERVER_ADDRRS,.name = {0},.type = DNS_SERVER_TYPE,.class = DNS_SERVER_CLASS,.poiname = DNS_POINAME,.anstype = DNS_SERVER_ANSTYPE,.anstypee = DNS_SERVER_ANSTYPEE,.datalen = DNS_SERVER_DATALEN,.anstime = DNS_SERVER_ANSTIME,.adress = DNS_SERVER_ADRESS};strcpy(dns_server_table.name, TABLENAME); // TABLENAME是我指定的域名struct dns_table_entry *entry = &dns_server_table;rp = pbuf_alloc(PBUF_TRANSPORT, 51, PBUF_RAM);if (rp != NULL){memset(&hdr, 0, SIZEOF_DNSANS_HDR);/* fill dns_ans header */hdr.id = htons(txid);hdr.flag = htons(entry->flags);hdr.numquestions = htons(entry->numque);hdr.numanswers = htons(entry->ansrrs);hdr.numauthrr = htons(entry->autrrs);hdr.numextrarr = htons(entry->addrrs);pbuf_take(rp, &hdr, SIZEOF_DNSANS_HDR);/* convert hostname into suitable query format. */hostname = entry->name;--hostname;query_idx = SIZEOF_DNSANS_HDR;do{++hostname;hostname_part = hostname;for (n = 0; *hostname != '.' && *hostname != 0; ++hostname){++n;}copy_len = (u16_t)(hostname - hostname_part);pbuf_put_at(rp, query_idx, n);pbuf_take_at(rp, hostname_part, copy_len, query_idx + 1);query_idx += n + 1;} while (*hostname != 0);pbuf_put_at(rp, query_idx, 0);query_idx++;/* fill dns ans */qry.typ = htons(entry->type);qry.cls = htons(entry->class);qry.point = htons(entry->poiname);qry.antyp = htons(entry->anstype);qry.antypp = htons(entry->anstypee);qry.len = htons(entry->datalen);qry.time = htonl(entry->anstime);qry.addr = htonl(entry->adress);pbuf_take_at(rp, &qry, SIZEOF_DNSANS_HDRQUE, query_idx);udp_sendto(upcb1, rp, addr1, port1);free(rp);}
}

3.2 server服务器

  • 下面代码演示了如何作为一个 http 格式返回给客户端,其中 http_html_hdr 是头部 header ,http_index_hml 是body 部分,部分浏览器可能头部还需要添加 Content-Length 作为返回body长度才会正常显示,这个您自己添加吧!我就不加了!
  • 如果你要修改返回的内容,可以修改下面的 http_index_hml;
const static char http_html_hdr[] ="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";
const static char http_index_hml[] = "<!DOCTYPE html>""<html>\n""<head>\n""  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n""  <style type=\"text/css\">\n""    html, body, iframe { margin: 0; padding: 0; height: 100%; }\n""    iframe { display: block; width: 100%; border: none; }\n""  </style>\n""<title>HELLO ESP32</title>\n""</head>\n""<body>\n""<h1>Hello World, from ESP32!</h1>\n""</body>\n""</html>\n";static void web_http_server(struct netconn *conn)
{struct netbuf *inputbuf;char *buf;u16_t buflen;err_t err;err = netconn_recv(conn, &inputbuf);if (err == ERR_OK) {netbuf_data(inputbuf, (void**)&buf, &buflen);printf("the received data:\n%s\n",buf);/* Judge if this is an HTTP GET command */if (buflen >= 5 && buf[0] == 'G' && buf[1] == 'E' && buf[2] == 'T' && buf[3] == ' ' && buf[4] == '/' ) {netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY);netconn_write(conn, http_index_hml, sizeof(http_index_hml)-1, NETCONN_NOCOPY);}else {netconn_write(conn, http_index_hml, sizeof(http_index_hml)-1, NETCONN_NOCOPY);}}}netconn_close(conn);netbuf_delete(inputbuf);
}

四、其他


  • 代码编译成功之后,手机连接热点 XUHONG-DNS , 密码是 12345678 ,然后浏览器访问 www.xuhong.com 即可看到效果!
源码学习与总结,参考来自:
  • 强制门户认证:https://www.jianshu.com/p/0293e1a30b89
  • 乐鑫:https://github.com/WeldonWangwang/

本博文代码下载(不再需要积分下载,免费给大家使用)

https://github.com/xuhongv/StudyInEsp32/tree/master/12_dns_server

另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

  • 玩转esp8266带你飞、加群付费QQ群,不喜的朋友勿喷勿加:434878850
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
  • 关注下面微信公众号二维码,干货多多,第一时间推送!

乐鑫Esp32学习之旅13 esp32 内置 dns 服务器,无需外网访问域名返回指定网页。(附带Demo)相关推荐

  1. 乐鑫Esp32学习之旅14 esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录html界面。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  2. 乐鑫Esp32-S2学习之旅① 入门 ESP32-S2 环境搭建 ,分享如何直连苹果智能家居 HomeKit 平台,轻松语音 Siri 控制!

    本系列博客学习由非乐鑫官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 基于乐鑫ESP32 芯片模组 C SDK二次开发的技 ...

  3. 乐鑫Esp32-S2学习之旅② ESP32-S2 控制 ws2812b 实现五彩斑斓的效果,代码开源!

    本系列博客学习由非乐鑫官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 基于乐鑫ESP32 芯片模组 C SDK二次开发的技 ...

  4. 乐鑫Esp32学习之旅② 巧用eclipes编辑器,官方教程在Windows下搭建esp32开发环境,打印 “Hello World”。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  5. 乐鑫Esp32学习之旅 22 讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等,附带Demo;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  6. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  7. 乐鑫Esp32学习之旅11 入门 乐鑫esp-adf 音频框架开发,造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  8. 乐鑫Esp32学习之旅28 分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,扩大容量存储更多的资源。(开源源码工程)。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 系列一:ESP32系列模组基础学习系列笔记 1. 爬坑学习新旅程,虚 ...

  9. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

最新文章

  1. 数据预处理为什么使用独热编码one-hot
  2. Python初学问题-if/else的运用
  3. android 环境配置和安装, Android系统包说明,基本控件,常用代码,ADB 命令行,APK文件确解,小技艺,...
  4. 搭建cacti监控平台
  5. JAVA JDK配置
  6. 软件测试中有关界面测试经验总结
  7. 从键盘输入n个整数,求它们的最小公倍数
  8. Lync Server 2010迁移至Lync Server 2013部署系列 Part14:A/V服务器目录迁移
  9. 容器技术Docker K8s 36 容器服务ACK基础与进阶-应用与发布管理
  10. 计算机怎么把硬盘分成几个,怎么把硬盘分成整数分区_硬盘分区整数对照表
  11. 菜鸟也疯狂,易语言自绘控件__进度条、滑块条
  12. python随机森林回归_机器学习:Python实现随机森林回归
  13. 听说你要删库跑路了?这篇Linux脚本请收好
  14. 团队项目(小小大佬带飞队)
  15. 一张纸厚度是多少毫米_10张纸的厚度大约是多少10张纸能有多厚
  16. Python获取逐浪小说内容
  17. oracle12c密码登录失败,【译】解决Oracle12c Cloud Control登录验证出错问题
  18. 网站Logo SEO优化
  19. STM32调试过程中出现的问题1:
  20. Word详细教程一(解决word护眼设置,但有些字底色仍是白色的)

热门文章

  1. 【渗透笔记】友情检测朋友公司并拿下shell过程
  2. 上传本地项目到github远程仓库
  3. leetcode 1884-鸡蛋掉落-两枚鸡蛋
  4. Visual and Object Geo-localization: A Comprehensive Survey
  5. react 使用dom-to-image 将html转为图片并保存
  6. 酷炫的数据可视化大屏来了!满足你99%大屏需求
  7. mysql数据库工程师简历_数据库工程师简历-自我评价怎么写(范文)
  8. 阿木动态 | 助力机器人教育!一站式智能无人机专业课程建设方案!
  9. 凌晨3点不回家,你不要老婆孩子了?
  10. 安装程序时提示installshield wizard错误,错误代码-6003