当前位置: 首页 > news >正文

ESP32和mDNS学习

目录

  • mDNS的作用
  • mDNS涉及到的标准文件
  • 组播地址
    • IPv4 多播地址
    • IPv6 多播地址
    • 预先定义好的组播地址
  • mDNS调试工具
  • 例程
  • mDNS如何开发和使用
    • 注册服务
    • 查询服务

mDNS的作用

mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。

  • 你要和设备通信,需要记住IP地址不好记。用了mDNS只要几个名字就行。
  • 你需要快速知道局域网内是否有你想要的服务,用mDNS查一下就行。
  • 这个协议只在局域网内有效。
  • 先简单了解下什么是组播–一种被预先定义好的IP地址数字。用于实现一对多的通信。
组播是一对多。
广播是一对所有。

mDNS涉及到的标准文件

  • rfc6762
  • rfc6763

组播地址

  • 因为有IPV4和IPV6两类地址,因此组播也分两类。
  • 多播地址在网络通信中用于发送数据到多个接收器,而不是单一接收器或广播到所有接收器。多播地址有其特定的规则和范围

IPv4 多播地址

IPv4 多播地址范围是 224.0.0.0 到 239.255.255.255。这些地址进一步细分为特定用途的子范围:

局部网络控制块: 224.0.0.0 到 224.0.0.255这些地址保留用于本地网络内的协议控制消息,不会被路由器转发到其他网络。例如,224.0.0.1 是所有主机的多播地址,224.0.0.2 是所有路由器的多播地址。预留多播地址: 224.0.1.0 到 238.255.255.255这些地址用于全球范围的多播应用,且路由器会转发这些地址的数据包。本地管理地址: 239.0.0.0 到 239.255.255.255这些地址保留用于组织内部的多播,不会被全球路由。

IPv6 多播地址

IPv6 多播地址以 ff00::/8 前缀开头,并具有不同的范围标识符和子范围:

范围标识符(Scope Identifier):ff01:: 链路本地(Link-Local)ff02:: 本地网络(Local Network)ff05:: 站点本地(Site-Local)ff08:: 组织本地(Organization-Local)ff0e:: 全球范围(Global)预定义多播地址:ff02::1 所有节点地址(所有主机)ff02::2 所有路由器地址

预先定义好的组播地址

不同的标准,如果用到组播地址,会定义出组播地址的值。下面列出常见的。

常见IPv4 预定义组播地址
这些地址用于局域网内的控制消息,通常不被路由器转发。

224.0.0.1: 所有主机
224.0.0.2: 所有路由器
224.0.0.4: DVMRP 路由器
224.0.0.5: OSPF 路由器
224.0.0.6: OSPF 指定路由器
224.0.0.9: RIPv2 路由器
224.0.0.10: EIGRP 路由器
224.0.0.13: PIM 路由器
224.0.0.18: VRRP 路由器
224.0.0.22: IGMPv3
224.0.0.251: mDNS (Multicast DNS)
224.0.0.252: Link-Local Multicast Name Resolution (LLMNR)
224.0.1.1: NTP (Network Time Protocol)
224.0.1.22: H.323 网关发现

常见IPv4 预定义预留多播地址(224.0.1.0 - 238.255.255.255)

这些地址用于全球范围的多播应用,路由器会转发这些地址的数据包。

224.0.1.2: SGI-Dogfight(多用户虚拟现实游戏)
224.0.1.35: SVRLOC (Service Location Protocol)
224.0.1.60: AAP (AOL Access Protocol)
239.255.255.250: SSDP (Simple Service Discovery Protocol)

常见IPv4 预定义本地管理地址(239.0.0.0 - 239.255.255.255)

这些地址用于组织内部的多播,不会被全球路由。

常见IPv6 预定义组播地址
范围标识符(Scope Identifier)

ff01::: 节点本地(Node-Local)
ff02::: 链路本地(Link-Local)
ff05::: 站点本地(Site-Local)
ff08::: 组织本地(Organization-Local)
ff0e::: 全球范围(Global)

预定义多播地址

ff02::1: 所有节点(All Nodes)
ff02::2: 所有路由器(All Routers)
ff02::5: OSPF 路由器
ff02::6: OSPF 指定路由器
ff02::9: RIPv2 路由器
ff02::a: EIGRP 路由器
ff02::d: PIM 路由器
ff02::16: MLDv2(Multicast Listener Discovery version 2)
ff02::fb: mDNS (Multicast DNS)
ff02::1:3: Link-Local Multicast Name Resolution (LLMNR)
ff05::1:3: DHCPv6 服务器/中继代理

备注:
“组播”和“多播”在网络通信中基本上是同一个概念。两者指的是同一种技术。

mDNS调试工具

在电脑端,有两款,

  • 一款是Apple开发的Bonjour 的服务(有windows版本),这款我下载安装了,不会用尴尬,好像只能识别打印机服务。
  • 一款是在linux平台下的avahi(默认已安装),也有图形界面。后面会有这款工具的截图。

例程

ESP的mDNS文档和例程都放在下面的git 库里面

例程

  1. git下来后vscode打开例程。
  2. 设置wifi账号密码
    在这里插入图片描述编译和运行测试
    运行命令avahi-discover,打开图形界面,如下所示。
    在这里插入图片描述点击任意一项,就可以看到解析出来的数据。如下所示。
    在这里插入图片描述直接ping域名也是可以ping通的
ping esp32-mdns.local

在这里插入图片描述按下按钮0,打印如下信息。查询到局域网里有这些服务。
在这里插入图片描述

mDNS如何开发和使用

开发主要看需求,分两个需求:注册服务和查询服务。
根据自己的需求决定是否要做这两个动作。
下面只是把关键的代码片段拿出来,完整代码,请看例程。

初始化mdns
mdns_init() 这一步是通用的,不过是注册还是查询,都要先初始化。

注册服务

1.设置主机名
mdns_hostname_set(hostname)

2.设置实例名
mdns_instance_name_set(EXAMPLE_MDNS_INSTANCE)

3.注册服务

mdns_service_add("ESP32-WebServer", "_http", "_tcp", 80, serviceTxtData, 3) 
mdns_service_subtype_add_for_host("ESP32-WebServer", "_http", "_tcp", NULL, "_server") 

查询服务

例程将查询服务做了一次封装,只需要输入服务名和使用协议,就可以查网络中是否存在有这个服务。

在例程里,只要按一下按钮0,就回调用这个函数,并将查询结果在串口打印。

static void query_mdns_service(const char *service_name, const char *proto)

上面的函数实际是调用库函数,实现查询

mdns_query_ptr()

相关文章:

  • Vue3可媲美Element Plus Tree组件开发之append节点
  • 高级及架构师高频面试题-基础型
  • Python --NumPy库基础方法(2)
  • 【k8s故障处理篇】calico-kube-controllers状态为“ImagePullBackOff”解决办法
  • Python | Leetcode Python题解之第278题第一个错误的版本
  • 系统架构设计师教程 第4章 信息安全技术基础知识-4.5 密钥管理技术4.6 访问控制及数字签名技术-解读
  • 某量JS逆向
  • 【时时三省】(C语言基础)循环语句while
  • 大模型算法面试题(十二)
  • scp 服务器复制命令
  • redis:清除缓存的最简单命令示例
  • 学习记录——day17 数据结构 队列 链式队列
  • C#中GridControl的数据源双向绑定
  • 双向门控循环神经网络(BiGRU)及其Python和MATLAB实现
  • Redis快速入门(一)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【知识碎片】第三方登录弹窗效果
  • 5、React组件事件详解
  • Angular2开发踩坑系列-生产环境编译
  • E-HPC支持多队列管理和自动伸缩
  • Elasticsearch 参考指南(升级前重新索引)
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 多线程编程之:notify 和 wait 用法
  • JAVA 学习IO流
  • javascript 总结(常用工具类的封装)
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaScript学习总结——原型
  • js算法-归并排序(merge_sort)
  • Markdown 语法简单说明
  • Meteor的表单提交:Form
  • Mysql5.6主从复制
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • spring-boot List转Page
  • springboot_database项目介绍
  • Vue2.0 实现互斥
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聊聊flink的TableFactory
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 设计模式走一遍---观察者模式
  • elasticsearch-head插件安装
  • Java总结 - String - 这篇请使劲喷我
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​Python 3 新特性:类型注解
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (回溯) LeetCode 46. 全排列
  • (十三)Flink SQL
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)u-boot-nand.bin的下载
  • (译) 函数式 JS #1:简介
  • .gitignore文件设置了忽略但不生效
  • .NET 5种线程安全集合