当前位置: 首页 > 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()

相关文章:

ESP32和mDNS学习

目录 mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址 mDNS调试工具例程mDNS如何开发和使用注册服务查询服务 mDNS的作用 mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。 你要和设备通信,需要记住…...

学习SQL如何使用CASE语句查询分析设备状态

学习SQL如何使用CASE语句查询分析设备状态 一、前言1. 问题背景2. SQL查询分析3. SQL查询解析 二、结论 一、前言 在实际应用中,经常需要对设备的状态进行监控和分析。通过SQL查询,我们可以有效地从数据库中提取和计算设备的状态信息。本文将介绍如何编…...

Gartner发布2024年零信任网络技术成熟度曲线:20项零信任相关的前沿和趋势性技术

大多数组织都制定了零信任信息安全策略,而网络是零信任实施领域的顶级技术。此技术成熟度曲线可以帮助安全和风险管理领导者确定合适的技术,以将零信任原则嵌入其网络中。 战略规划假设 到 2026 年,15% 的企业将在企业拥有的局域网上用 ZTNA …...

React hook 之 useState

在组件的顶部定义状态变量,并传入初始值,确保当这些状态变量的值发生变化时,页面会重新渲染。 const [something,setSomething] useState(initialState); useState 返回一个由两个值组成的数组:1、当前的 state,在首次…...

jenkins中shell脚本中使用构建参数化Groovy变量的四种方式

jenkins中shell脚本中使用构建参数化Groovy变量的四种方式: 以字符变量为例: 流水线代码: pipeline {agent {//label "${server}"label "${28}"}stages {stage(Hello) {steps {echo Hello Worldecho "${28}"echo "…...

Robot Operating System——ParameterEventHandler监控Parameters的增删改行为

大纲 创建订阅"/parameter_events"的Node监控自身Node内部Parameter监控自身Node外部Parameter监听所有Node的所有Parameter的变动执行效果总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》一文中,我们通过AsyncPa…...

计算机网络(Wrong Question)

一、计算机网络体系结构 1.1 计算机网络概述 D 注:计算机的三大主要功能是数据通信、资源共享、分布式处理。(负载均衡、提高可靠性) 注:几段链路就是几段流水。 C 注:记住一个基本计算公式:若n个分组&a…...

Docker+consul容器服务的更新与发现

1、Consul概述 (1)什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点…...

全网最详细!! Linux 安装、配置教程

一、下载安装包 首先去官网下载VMware最新版本,以及发行版CentOS -7,懒得下载的可以私信我,我给你发包 其中,CentOS(Community Enterprise Operating System)是一个基于Linux的开源操作系统,它是…...

cocos creator 3学习记录01——如何替换图片

一、动态加载本地图片 1、通过将图片关联到CCClass属性上来进行代码切换。 1、这种方法,需要提前在脚本文件中声明好代表图片的CCClass属性。 2、然后拖动图片资源,到脚本内声明好的属性上以进行关联。 3、然后通过程序,来进行切换展示。…...

【Android Compose】ListView效果

【Android Compose】ListView效果 1、Column、Row 和 Box2、LazyColumn和LazyRow3、Compose 中的状态4、ListView效果5、android-compose-codelabs Jetpack Compose 使用入门 Jetpack Compose 教程 Jetpack Compose 1、Column、Row 和 Box Compose 中的三个基本标准布局元素是 …...

【Pytorch实战教程】Pytorch中.detach()的详细介绍

detach() 是 PyTorch 中用于分离张量的计算图的一个方法。它在处理计算图时非常有用,尤其是在需要停止梯度传播的情况下。以下是 detach() 方法的详细介绍: 方法概述 detach() 方法返回一个新的张量,从当前计算图中分离出来,即返回的张量不会参与梯度计算。这在某些情况下…...

AR 眼镜之-充电动画定制-实现方案

目录 📂 前言 AR 眼镜系统版本 充电动画 1. 🔱 技术方案 1.1 方案介绍 1.2 实现方案 关机充电动画 亮屏/锁屏充电动画 2. 💠 关机充电动画 2.1 关机充电动画核心处理类与路径 2.2 实现细节 步骤一:1)定制 …...

AJAX-XMLHttpRequest 详解

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…...

内容管理系统 Contentful 与 Baklib

对于希望管理其产品和服务的在线文档或知识库以支持其客户和员工的组织来说,市场上有太多的平台和工具。 遵循的做法之一是使用无头内容管理系统 (CMS)。 如果您是这样的组织之一,正在考虑使用无头 CMS - Contentful 之一来管理您的在线知识库&#xff0…...

[Mysql-视图和存储过程]

视图 视图是从一个或者几个基本表(或视图)导出的表。它与基 本表不同,是一个虚表。 创建使用视图 # 视图 -- 视图只能用来查询,不能做增删改 -- 创建视图 -- create view 视图名【view_xxx / v_xxx】 -- as 查询语句 create view…...

Linux下C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C静态链接库&#xff08;.a文件&#xff09;。 二.生成静态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&g…...

【8月EI会议推荐】第四届区块链技术与信息安全国际会议

一、会议信息 大会官网&#xff1a;http://www.bctis.nhttp://www.icbdsme.org/ 官方邮箱&#xff1a;icbctis126.com 组委会联系人&#xff1a;杨老师 19911536763 支持单位&#xff1a;中原工学院、西安工程大学、齐鲁工业大学&#xff08;山东省科学院&#xff09;、澳门…...

2024年【甘肃省安全员B证】考试资料及甘肃省安全员B证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年甘肃省安全员B证考试资料为正在备考甘肃省安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的甘肃省安全员B证模拟试题祝您顺利通过甘肃省安全员B证考试。 1、【多选题】5kW以上电动机开关箱中电…...

结合el-upload上传组件,验证文件格式及大小

结合el-upload上传组件&#xff0c;验证文件格式及大小 效果如下&#xff1a; 代码如下&#xff1a; upgradeFirmwareInfo.vue页面 <template><div><el-dialog title"新增固件升级包" :visible.sync"dialogFormVisible"top"7vh&qu…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...