首页 > 其他分享 >HC32F4A0 lwip_mdns使用

HC32F4A0 lwip_mdns使用

时间:2023-09-20 16:47:03浏览次数:44  
标签:mdns LWIP netif service MDNS HC32F4A0 lwip

前言

LWIP的移植可以参考上篇文章 《HC32F4A0 lwip移植 - USTHzhanglu - 博客园 (cnblogs.com)》

MDNS官方使用文档lwIP: MDNS (nongnu.org)

参数

MCU型号 HC32F4A0PIHB
库版本 HC32F4A0_DDL_Rev2.0.0
LWIP版本 lwip-STABLE-2_2_0_RC1
PHY型号 YT8512
MDK版本 5.37
PHY接口 RMII
IP IPv4

导入库

Lwip自带的example中有mdns的使用,包含到自己的库里即可。

PS D:\lwip-STABLE-2_2_0_RC1\contrib\examples\mdns> tree .\ /f
D:\LWIP-STABLE-2_2_0_RC1\CONTRIB\EXAMPLES\MDNS
    mdns_example.c
    mdns_example.h

对于2.2.0的lwip,需要在project中引入以下三个文件

PS D:\lwip-STABLE-2_2_0_RC1\src\apps\mdns> tree .\ /f
D:\LWIP-STABLE-2_2_0_RC1\SRC\APPS\MDNS
    mdns.c
    mdns_domain.c
    mdns_out.c

配置项

mdns依赖于IGMP协议,因此要在lwopts.h中使能相关宏定义

/* ---------- mdns options ---------- */ 
#define LWIP_MDNS_RESPONDER             1 //使能 MDNS
#define LWIP_IGMP                       1 //MDNS依赖项
#define LWIP_NUM_NETIF_CLIENT_DATA      1 //MDNS 至少需要1个,如果已经定义,则在以前的基础上+1

在网卡初始化时开启IGMP,不开启IGMP的话,MDNS无法广播出去。

/* Set netif link flag */
 netif->flags |= NETIF_FLAG_IGMP;

启用MDNS

mdns_example.c 已经写好了基本的使用项

#include "lwip/apps/mdns.h"
#include "mdns_example.h"

#if LWIP_MDNS_RESPONDER
static void
srv_txt(struct mdns_service *service, void *txt_userdata)
{
  err_t res;
  LWIP_UNUSED_ARG(txt_userdata);
  
  res = mdns_resp_add_service_txtitem(service, "path=/", 6);
  LWIP_ERROR("mdns add service txt failed\n", (res == ERR_OK), return);
}
#endif

#if LWIP_MDNS_RESPONDER
static void
mdns_example_report(struct netif* netif, u8_t result, s8_t service)
{
  LWIP_PLATFORM_DIAG(("mdns status[netif %d][service %d]: %d\n", netif->num, service, result));
}
#endif

void
mdns_example_init(void)
{
#if LWIP_MDNS_RESPONDER
  mdns_resp_register_name_result_cb(mdns_example_report);
  mdns_resp_init();
  mdns_resp_add_netif(netif_default, "lwip");
  mdns_resp_add_service(netif_default, "myweb", "_udp", DNSSD_PROTO_UDP, 80, srv_txt, NULL);
  mdns_resp_announce(netif_default);
#endif
}

通过调用mdns_example_init,即可使能MDNS服务。

测试

由于windows上没找到一个好用的MDNS测试工具,因此只能用PING或者wireshark抓包进行测试MDNS是否成功。

PING

ping lwip.local

Pinging lwip.local [192.168.1.20] with 32 bytes of data:
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255

Ping statistics for 192.168.1.20:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

可以看到,域名和IP绑定成功。

如果IP发生变化,则需要重新调用mdns_resp_announce函数进行广播;

如果连接发生变化,则需要调用mdns_resp_restart()重新启动mdns。

如果定义了LWIP_NETIF_EXT_STATUS_CALLBACK,则不需要手动调用,LWIP会自动重启,

标签:mdns,LWIP,netif,service,MDNS,HC32F4A0,lwip
From: https://www.cnblogs.com/USTHzhanglu/p/17717717.html

相关文章

  • mDNS知识
    1.域名系统(DomainNameSystem,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。 2.多播DNS(mDNS)协议将主机名解析为不包含本地名称服务器的小型网络中的IP地址。它是一种零配置服务,使用与单......
  • mDNS原理的简单理解——每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的
    MDNS协议介绍mDNSmulticastDNS,使用5353端口,组播地址224.0.0.251。在一个没有常规DNS服务器的小型网络内,可以使用mDNS来实现类似DNS的编程接口、包格式和操作语义。MDNS协议的报文与DNS的报文结构相同,但有些字段对于MDNS来说有新的含义。每个进入局域网的主机,如果开启了mDNS服......
  • 【lwip】15-NETCONN接口
    前言终于到接口层了。原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/17442931.html‍框架描述前面我们已经学完了,都知道raw接口了,其实也可以直接用,就是麻烦点。这里NETCONN就是封装了raw接口,让用户使用更加简单。socket接口是封装NETconn接口的,让用户使用更加标准,方......
  • 【lwip】14-TCP协议分析之TCP协议之可靠传输的实现(TCP干货)
    lwip_14_TCP协议之可靠传输的实现前言‍前面章节太长了,不得不分开。这里已源码为主,默认读者已知晓概念或原理,概念或原理可以参考前面章节,有分析。参考:李柱明博客:https://www.cnblogs.com/lizhuming/p/17438743.html‍两个时钟处理函数lwip的时钟机制可以翻看前面章节。lw......
  • MDns C# 实现 Makaretu.Dns.Multicast
    Makaretu.Dns.Multicast是一个基于C#的跨平台DNS组播(Multicast)解析库,支持IPv4和IPv6。它可以让你在局域网中实现简单、高效的DNS解析服务,并提供简化的API来创建和管理DNS服......
  • mDNS协议初识
    mDNS协议初识TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarian......
  • LWIP协议栈---ARP协议(3)ARP数据包发送过程
    ARP数据包发送过程先看一些指向流程图,ARP数据包发送的过程: 主要看看右边这块内容,ip_output()调用etharp_output()函数发送出ip层的内容。而该函数又根据数据包是否是......
  • LWIP学习记录---ARP协议(2)ARP数据包发送过程
    (一)ARP之数据包接收过程​​ 先看一下整个数据流的传输过程。首先etherneti_input()函数从底层网卡驱动接收到原始数据,若是ip包或者ARP包则调用ethernet_input()......
  • LWIP学习记录------ARP协议(1)
    关于LWIP网络协议在嵌入式设备使用越来越广泛,还是要好好学习一下,之前也看过一些资料,总是学了又忘(可能实践的太少了吧!!)。所以本文重新整理一下笔记。共同进步!(一)ARP基础知......
  • LWIP 总述
    不过这个网站真的很逗http://savannah.nongnu.org/projects/lwip/,这个“nongnu”会激起多少程序员的遐想啊。lwIP移植工作:其实,LWIP不需要自己亲自移植,不同的厂商都有移植......