安卓基于MDNS协议的局域网内服务发现

article/2025/9/18 5:35:34

mDNS简介

mdns 即多播(组播)dns(Multicast DNS),用于本地局域网服务发现的协议,在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务(Bonjour)。

mDNS有以下几种免费实现方式:

avahi:Linux下实现(http://www.avahi.org/)
jmDNS:JAVA实现(http://jmdns.sourceforge.net/)
Bonjour:MAC OS实现(默认安装)
Bonjour:Windows下实现(https://support.apple.com/kb/DL999?locale=en_US)

本文基于Jmdns开源库实现客户端服务端核心代码

客户端–》服务搜索

JmDNS方法都需要在子线程调用

获取本地IP InetAddress

 WifiManager wifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);private InetAddress getLocalIpAddress(WifiManager wifiManager) throws UnknownHostException {WifiInfo wifiInfo = wifiManager.getConnectionInfo();int intAddr = wifiInfo.getIpAddress();byte[] byteaddr = new byte[]{(byte) (intAddr & 255),(byte) (intAddr >> 8 & 255),(byte) (intAddr >> 16 & 255),(byte) (intAddr >> 24 & 255)};return InetAddress.getByAddress(byteaddr);}

初始化搜索监听

 private class JmdnsListener implements ServiceListener {private MdnsCallback mCallback;public JmdnsListener(MdnsCallback mCallback) {this.mCallback = mCallback;}public void serviceAdded(ServiceEvent ev) {Log.i(TAG, "serviceAdded: ");mJmdns.requestServiceInfo(ev.getType(), ev.getName(), 1);}public void serviceRemoved(ServiceEvent ev) {Log.i(TAG, "serviceRemoved: ");jsonMap.remove(ev.getName());}public void serviceResolved(ServiceEvent ev) {if (!jsonMap.containsKey(ev.getName())) {// 新设备JSONObject jsonObj = toJsonObject(ev.getInfo());Log.i(TAG, "serviceResolved: add");jsonMap.put(ev.getName(), jsonObj);if (mCallback != null) {if (jsonObj == null) {Log.w(TAG, "serviceResolved: jsonObj is null");return;}// 重开线程回调mCallback.onDeviceFind(jsonObj);}}}}/*** mDNS数据格式解析*/private JSONObject toJsonObject(ServiceInfo sInfo) {JSONObject jsonObj;try {jsonObj = new JSONObject();String ipv4 = "";if (sInfo.getInet4Addresses().length > 0) {ipv4 = sInfo.getInet4Addresses()[0].getHostAddress();}// 发现的是被名称,ip 端口信息jsonObj.put("Name", sInfo.getName());jsonObj.put("IP", ipv4);jsonObj.put("Port", sInfo.getPort());byte[] allInfo = sInfo.getTextBytes();int allLen = allInfo.length;byte fLen;for (int index = 0; index < allLen; index += fLen) {fLen = allInfo[index++];byte[] fData = new byte[fLen];System.arraycopy(allInfo, index, fData, 0, fLen);String fInfo = new String(fData, StandardCharsets.UTF_8);if (fInfo.contains("=")) {String[] temp = fInfo.split("=");jsonObj.put(temp[0], temp[1]);}}} catch (Exception e) {e.printStackTrace();jsonObj = null;}return jsonObj;}

加入组播并开始搜索服务

private JmDNS mJmdns;private static final String mServiceName= "_sample._tcp.local.";// 要搜索的服务类型 类似_http._tcp.local.ServiceListener listener = new JmdnsListener(mCallback);InetAddress addr = getLocalIpAddress(wifiManager);mJmdns = JmDNS.create(addr);// step 1mJmdns.addServiceListener(mServiceName, listener); // step 2

结束搜索

 mJmdns.removeServiceListener(mServiceName, listener);mJmdns.close();

以上即为客户端搜索服务核心代码

服务端发布服务

注册服务

private final static String REMOTE_TYPE = "_sample._tcp.local.";//注册服务类型,你的发现设备的代码中的type也是这个才能找到这个设备。// step 1 获取本地ip信息InetAddress ip = getLocalIpAddress(wifiManager);// step 2创建jmdns对象JmDNS jmdns = JmDNS.create(ip, "jmdnsSampleName");// jmdns实例名称// step 3发布的服务携带的额外参数final HashMap<String, String> values = new HashMap<String, String>();values.put("test", "vlaue");// step 4创建服务信息类,serverName唯一服务名称(发现端显示服务端的名字),PORT服务端提供建链的端口mServiceInfo = ServiceInfo.create(REMOTE_TYPE, serverName, PORT, 0, 0, values);// step 5 注册服务jmdns.registerService(mServiceInfo);

关闭服务:

  jmdns.unregisterService(mServiceInfo);jmdns.close();

搜索端抓包

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
设备发现:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/RqloVrm6.shtml

相关文章

mDNS协议

1&#xff0c;这个项目主要使用go的原生net包和github.com/miekg/dns这个dns工具包来实现mdns的。我们需要实现mdns的服务端和客户端的代码&#xff0c;可以从开源项目里找过来用的。 数据包主要用到了网络层的icmp差错控制协议来返回响应数据包的&#xff0c;它里面携带了一个…

网络协议学习-mDNS

前面在学习局域网设备发现的时候&#xff0c;学习了UPnP协议&#xff0c;学习到了里面的设备发现协议SSDP&#xff0c;SSDP设备发现。 最近又发现了一种常见的协议&#xff0c;用来发现局域网内的设备及服务&#xff0c;就是mDNS协议&#xff0c;这是一种零配置服务。 mDNS即多…

mysql数据库备份 dump,使用mysqldump对数据库备份和恢复

数据库存储引擎&#xff1a;InnoDB 启用binlong 一、恢复误删除的数据库到最新状态 1、备份数据库 mysqldump -A -F -uroot -p --master-data2 --single-transaction > /backups/all-date %F_%T.sql 2、对数据库误删除 MariaDB [reset_gq]> drop database reset_gq; 3、对…

MySQL全量备份和增量备份

MySQL目前是市面上比较流程的关系型数据库&#xff0c;很多人使用MySQL里的数据真的安全吗&#xff1f;如果发生以下问题的话&#xff1a; MySQL数据目录所在磁盘损坏MySQL服务器发生故障人为操作失误导致删除了一些数据黑客入侵导致数据被攻陷等问题 这个时候如果没有备份数…

mysql备份test数据库_mysql和test数据库

安装mysql yum -y install mysql mysql-server mysql-devel service mysqld startmysqladmin -uroot -p password "123456"mysql -uroot -pshow databases; use mysql; sho... 文章 weibinwps 2017-12-25 983浏览量 mysql导入和导出数据 Linux下如何单个库进行导入和…

app服务器 数据库文件,app访问服务器mysql数据库文件

app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制&#xff0c;用来提高实例的稳定性和安全性&#xff0c;具体详见表1。 对于mysqlpump工具&#xff0c;由于在并行备份场景有coredump问题&#xff0c;不建议您使用&#xff0c;推…

定时备份MYSQL数据库

首先查看磁盘情况&#xff0c;选择空间充足的磁盘空间&#xff0c;避免出现因空间不足导致备份失败 df -h 这里选择磁盘较大的&#xff0c;app 创建备份目录 cd /app mkdir bkdatabase cd bkdatabase 创建备份的shell脚本 vim backmysql.sh 添加内容&#xff1a; #!/bi…

MYSQL数据库(八)数据库备份和恢复

成功不易&#xff0c;加倍努力&#xff01; 5 备份和恢复5.1 备份恢复概述5.1.1 为什么要备份5.1.2 备份类型5.1.3 备份什么5.1.4 备份注意要点5.1.5 还原要点5.1.6 备份工具5.1.6 基于 LVM 的快照备份5.1.7 实战案例&#xff1a;数据库冷备份和还原 5.2 mysqldump备份工具5.2.…

【脚本分享】- Windows下利用Powershell进行MySQL数据库备份

关注「WeiyiGeek」公众号 将我设为「特别关注」&#xff0c;每天带你玩转网络安全运维、应用开发、物联网IOT学习&#xff01; 测试环境: Server 2008 R2 所需软件: - MySQLdump.exe - msvcp120.dll x64/x86- msvcr120.dll x64/x86- powershell- 7z 设置PowerShell策略: PS…

数据库备份脚本大全

备份脚本六个注意点 在写脚本前我这里按照个人习惯大概总结了以下六点&#xff0c;感兴趣的可以继续看看&#xff0c;不感兴趣的直接跳过就好。 1、首先要注意的一点就是 shell 环境是 bash 还是 sh ,需要在你的脚本开头中注明。 #!/bin/bash 2、其次就是数据库环境变量需要申明…

C#实现MySQL数据库数据的备份与恢复

这几天一直在做学校的C#期末项目&#xff0c;其中有一个功能就是数据的备份与恢复&#xff0c;在百度了一番之后&#xff0c;只找到了适用于SQL Server的备份SQL语句 BACKUP DATABASE database_name TO DISK physical_device_name [ WITH { DIFFERENTIAL | COPY_ONLY | {…

Linux Mysql自动备份

1.配置自动备份环境 1.1 创建文件见放脚本文件和备份数据 # 创建/data/backup/mysqlmkdir -p /data/backup/mysqlcd /data/backup# 创建mysql_backup.sh的脚本并且填充数据vi mysql_backup.sh# vi mysql_backup.sh进行编辑和修改 1.2 创建 备份数据的语句 mysql_backup.sh…

wamp 备份 mysql数据库_wamp:MySql数据库备份还原(mysqldump)

mysql数据库备份和恢复命令在mysql安装目录中的bin目录下&#xff0c;例如wamp安装在e:\wamp目录下&#xff0c;备份目录就在e:\wamp\mysql\mysql5.0.51b\bin目录中&#xff0c;备份和恢复操作在DOS命令符状态下完成&#xff1a; 1、备份数据库&#xff1a; mysqldump -u 用户名…

MySQL 20 MySQL 数据库备份

8.2 数据库备份 不用我多说&#xff0c;都知道 为什么需要数据库备份。因为 你在增删改查的时候&#xff0c;肯定会 出现 误操。&#xff08;导致一些数据修改错误&#xff0c;或者一些数据被不小心干掉&#xff01;&#xff09; 保证重要的数据不丢失为了让我们 对数据操作的…

MySQL数据库的定时备份实践

1.背景介绍 也许你会发现本站建站时间久远&#xff0c;但是本站的各类访问量总是很低&#xff0c;这大概是有两个方面的原因&#xff0c;其一是因为本站升级2.0后&#xff0c;所有的文章访问数据并未同步&#xff08;不仅仅是文章&#xff0c;所有的数据均为同步&#xff0c;比…

Python NumPy计算欧氏距离(Euclidean Distance)

欧氏距离定义&#xff1a; 欧氏距离&#xff08; Euclidean distance&#xff09;是一个通常采用的距离定义&#xff0c;它是在m维空间中两个点之间的真实距离。 在二维和三维空间中的欧式距离的就是两点之间的距离&#xff0c;二维的公式是&#xff1a; begin{equation} d sq…

Euclidean division

In arithmetic, Euclidean division – or division with remainder – is the process of dividing one integer (the dividend) by another (the divisor), in a way that produces an integer quotient and a natural number remainder strictly smaller than the absolute …

PRN(20201012):Improved updating of Euclidean distance maps and Voronoi diagrams

[*] Lau B , Sprunk C , Burgard W . Improved updating of Euclidean distance maps and Voronoi diagrams[C]// IEEE/RSJ International Conference on Intelligent Robots & Systems. IEEE, 2010. 本文对[*]中的Occupancy Map to Euclidean Distance Maps算法进行python…

java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...

最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算&#xff0c;而且有很多论文提出了Attention机制&#xff0c;所以这里就介绍一下如何使用tensorflow实现上述各种功能。 这里首先假定我们的输入是两个四维的Tensor&#xff0c;然后我们需要计算的是其…

点云检测--欧式聚类Euclidean Cluster

1.版本要求 版本: >PCL1.3 2.简介 欧式聚类是点云聚类的一种重要方法&#xff0c;利用点云中点与点之间的欧式距离进行聚类&#xff0c;当点与点之间的欧式距离小于设定的阈值则视为一类。欧式聚类是车辆前方障碍物检测的重要方法。 3.数据 本例中使用的点云数据&#…