米尔电子
直播中

jf_50393217

4年用户 202经验值
擅长:可编程逻辑 嵌入式技术
私信 关注

【米尔-全志T113-i开发板试用】6、使用mDNS实现局域网域名访问

在局域网中,设备和设备之前相互通信是需要知道对方的ip地址的。大多数情况,设备的ip不是静态ip地址,而是通过dhcp 协议动态分配的ip 地址。而且IP地址也不好记,那我们是不是可以通过局域网域名来访问设备呢?
可以的,要实现域名访问设备,有三种常见的方法:

  1. 在路由器上开启DNS域名解析服务(例如OpenWrt上常用的dnsmasq),并添加对应的域名和IP地址。这种方法对于DHCP动态获取,有可能改变IP地址的情况并不理想。
  2. 在设备的hosts文件里添加自定义的域名和IP地址,和前一种方案一样,如果设备IP地址变化了,就要重新修改
  3. 在被访问设备上开启mDNS服务,这个方案是目前很多嵌入式设备和智能设备都广泛使用的方案。

什么是mDNS

mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。

简单来说,就是B设备在开启了mDNS服务的情况下,会在本机IP的5353端口注册一个服务,并登记它的域名。A电脑想访问myir.local这个域名,那A电脑就会使用mdns协议去查询是否存在这个域名,此时同一个网段下的B设备就会主动响应这是我的域名,我的IP是XXX。然后A电脑就使用该IP来访问设备了。

如何实现一个简单的mDNS服务器

这个在golang里其实非常简单,我们可以直接使用github上的一个 示范代码,简单改一下域名就行了。
https://github.com/pion/mdns/blob/master/examples/server/main.go

// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT

// This example program showcases the use of the mDNS server by publishing "pion-test.local"
package main

import (
	"net"

	"github.com/pion/mdns/v2"
	"golang.org/x/net/ipv4"
	"golang.org/x/net/ipv6"
)

func runDNS() {
	addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4)
	if err != nil {
		panic(err)
	}

	addr6, err := net.ResolveUDPAddr("udp6", mdns.DefaultAddressIPv6)
	if err != nil {
		panic(err)
	}

	l4, err := net.ListenUDP("udp4", addr4)
	if err != nil {
		panic(err)
	}

	l6, err := net.ListenUDP("udp6", addr6)
	if err != nil {
		panic(err)
	}

	_, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{
		LocalNames: []string{"myir.local"},
	})
	if err != nil {
		panic(err)
	}
	select {}
}

这就是已经改好的代码,然后我们只需要在Go程序的main函数里,创建一个新的线程,来运行这个runDNS函数即可。

func main() {
	go runDNS()
	getInfo()
	r := setupRouter()
	// Listen and Server in 0.0.0.0:8080
	r.Run(":80")
}

是不是特别简单呢,就短短的几十行代码,程序编译好,我们上传到设备上运行看看。

image.png

我们在电脑浏览器上,也可以直接使用这个域名来访问应用了。

image.png

更多回帖

发帖
×
20
完善资料,
赚取积分