背景

在电视的实际应用中,投屏功能占了很大的一个比重,熟悉和掌握投屏的原理和应用,对于
我们开发和测试人员是必不可少的;在投屏时,首先第一步,手机和IPAD等客户端需要发
现局域网中的目标投屏设备(也即电视),才能将音视频或图片或镜像投放到电视上去。

在局域网中,设备和设备之前相互通信需要知道对方的ip地址的,大多数情况,设备的ip
不是静态ip地址,而是通过dhcp 协议动态分配的ip 地址,如何设备发现呢,就是要mdns
大显身手,例如:现在物联网设备和app之间的通信,要么app通过广播,要么通过组播,
发一些特定信息,感兴趣设备应答,实现局域网设备的发现,当然mdns 比这强大的多。


简介

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

本文简要的介绍一下Mdns的工作原理,设备注册和设备发现。


工作原理

Mdns 使用组播地址为: 224.0.0.251 (ipv6:FF02::FB) 端口为5353,mdns 是用于局域
网内部的,并且主机的域名为.local 结尾,每个进入局域网的主机,如果开启了mDNS服务的
话,都会向局域网内的所有主机组播一个消息,我是谁(域名),和我的IP地址是多少。然
后其他有Mdns服务的主机就会响应,也会告诉你,它是谁(域名),它的IP地址是多少。
当然设备需要服务时,就是使用Mdns查询域名对应的ip地址,对应的设备收到该报文后
同样通过组播方式应答,此时其他主机设备也是可以收到该应答报文,其他主机也会记录域
名和ip 以及ttl 等,更新缓存。
简单的来说,同在一个局域网的投屏设备,源设备和目标设备会加入同一个组播组【IP:
224.0.0.251 PORT: 5353 】;
目标设备,主要是指电视或电脑等大屏设备,在服务启动时,会根据设备名和MAC注册两
个服务(_raop._tcp.local和_airplay._tcp.local),并向组播地址(224.0.0.251)发布广播,宣称自
己提供的服务;
源设备,也即苹果手机或Ipad等,在打开视频APP 投屏时(一般都会有个类似TV图标提示 ),
或在浏览相册需要进行投屏时,向组播地址询问是否有_raop._tcp.local和_airplay._tcp.local
服务的设备,组内其他的主机在接收到请求后,如果本机注册了该两项服务,则会就行应对,
应答时,包含了本机的IP 地址和所提供的服务。
大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。

Airplay协议用Bonjour做设备发现,它是Apple公司为基于组播域名服务(multicast DNS)的开
放性零配置网络标准所起的名字。

以下我们以开源项目Jmdns 为例讲解mDNS 服务的注册和设备发现


Sample Code for Service Registration
import java.io.IOException;
import java.net.InetAddress;import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo;public class ExampleServiceRegistration {public static void main(String[] args) throws InterruptedException {try {// Create a JmDNS instanceJmDNS jmdns = JmDNS.create(InetAddress.getLocalHost());// Register a serviceServiceInfo serviceInfo = ServiceInfo.create("_http._tcp.local.", "example", 1234, "path=index.html");jmdns.registerService(serviceInfo);// Wait a bitThread.sleep(25000);// Unregister all servicesjmdns.unregisterAllServices();} catch (IOException e) {System.out.println(e.getMessage());}}
}

Sample code for Service Discovery
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;public class ExampleServiceDiscovery {private static class SampleListener implements ServiceListener {@Overridepublic void serviceAdded(ServiceEvent event) {System.out.println("Service added: " + event.getInfo());}@Overridepublic void serviceRemoved(ServiceEvent event) {System.out.println("Service removed: " + event.getInfo());}@Overridepublic void serviceResolved(ServiceEvent event) {System.out.println("Service resolved: " + event.getInfo());}}public static void main(String[] args) throws InterruptedException {try {// Create a JmDNS instanceJmDNS jmdns = JmDNS.create(InetAddress.getLocalHost());// Add a service listenerjmdns.addServiceListener("_http._tcp.local.", new SampleListener());// Wait a bitThread.sleep(30000);} catch (UnknownHostException e) {System.out.println(e.getMessage());} catch (IOException e) {System.out.println(e.getMessage());}}
}

上面这段代码在是一个简单的设备注册示例;主要分为两部分

  1. 创建一个ServiceInfo 实例
  2. 将刚刚创建的ServerInfo进行注册,并进行广播

PART1: ServiceInfo 详细

ServiceInfo create(final String type, final String name, final int port, final String text)
@param type服务类型,Bonjour要求格式为"_服务名._传输协议",例如"_ftp._tcp";目前传输协议仅支持TCP和UDP
@param name [唯一的]服务名称
@param port 服务端口号, 如果为0的话,Bonjour会自动分配一个
@param text 对服务的描述

以Bonjour 为例,Airplay 投屏需要创建两个服务,分别是_raop._tcp.local和_airplay._tcp.local

private void startRaop(String devicename) {………String raopName = preMac + "@" + devicename;raopService = ServiceInfo.create(raopName + raopType, raopName,RAOP_PORT, 0, 0, values);jmdnsRaop = JmDNS.create(inetAddress);jmdnsRaop.registerService(raopService);}
private void startAirplay(String devicename) {………airplayService = ServiceInfo.create(devicename + airplayType, devicename,AIRPLAY_PORT, 0, 0, values);jmdnsAirplay = JmDNS.create(inetAddress);jmdnsAirplay.registerService(airplayService);}
Devicename 表示本机的设备名
raopType = "._raop._tcp.local";
airplayType = "._airplay._tcp.local"
raopService 的raopName 中需要加入设备的MAC 地址后面紧跟一个@,否则服务将不被识别。

PART2: 服务注册和广播
javax.jmdns.impl.JmDNSImpl.java

public void registerService(ServiceInfo infoAbstract) throws IOException {if (this.isClosing() || this.isClosed()) {throw new IllegalStateException("This DNS is closed.");}final ServiceInfoImpl info = (ServiceInfoImpl) infoAbstract;if (info.getDns() != null) {if (info.getDns() != this) {throw new IllegalStateException("A service information can only be registered with a single instamce of JmDNS.");} else if (_services.get(info.getKey()) != null) {throw new IllegalStateException("A service information can only be registered once.");}}info.setDns(this);this.registerServiceType(info.getTypeWithSubtype());// bind the service to this addressinfo.recoverState();info.setServer(_localHost.getName());info.addAddress(_localHost.getInet4Address());info.addAddress(_localHost.getInet6Address());this.makeServiceNameUnique(info);while (_services.putIfAbsent(info.getKey(), info) != null) {this.makeServiceNameUnique(info);}this.startProber();logger.debug("registerService() JmDNS registered service as {}", info);}

有兴趣的朋友可以点击进入项目,下载源码
项目地址

设备发现[Airplay投屏应用]-mdns协议简介相关推荐

  1. IOS设备使用Airplay投屏到Windows的软件对比

    Airplay是苹果的投屏协议,由于该协议并未公开,目前IOS设备投屏到Windows端的软件效果各不相同.本文通过对比各个软件的使用效果,希望能够找到令人满意的投屏软件.本人使用的设备为Ipad p ...

  2. rpiplay实现树莓派AirPlay投屏器

    rpiplay实现树莓派AirPlay投屏器 (一) 参考代码和文档 (二)解析代码实现原理 1.发现模块 2.屏幕分享 1)RTSP协议 2)UDP音频数据 3)TCP视频数据 3.音视频渲染 尝试 ...

  3. 手游直播正在连接推流服务器,游戏直播时Airplay投屏卡死完美解决方案

    游戏直播时Airplay投屏卡死完美解决方案 作者:葫芦君 来源:小葫芦 时间:2018-03-08 11:38 在使用OBS直播手游时,用投屏软件投屏到电脑上,然后用OBS捕捉到游戏源.比如:手机打 ...

  4. ios10 Android airplay,iOS下AirPlay投屏功能实现

    这篇文章注重于如何实现AirPlay投屏功能.具体AirPlay的实现逻辑这里不再赘述,网上帖子很多 首先.想要呼出AirPlay列表的话,需要将MPVolumnView控件声明且添加到UI.上使用之 ...

  5. RPiPlay配置树莓派AirPlay投屏

    文章目录 总结 相关文档 RPiPlay项目按照说明安装 命令行常用操作 运行 报错timeout 总结 报错的原因应该是系统OpenMAX等的图像渲染等上的支持问题(换了个系统重新烧录不知道为啥就好 ...

  6. iOS投屏搜索不到设备如何解决?投屏怎么设置?

    iOS投屏设置在哪里? 一般来说,大家进行iOS投屏的场景有以下两种:一种是手机屏幕直接投屏,另外一种是电影电视剧播放投屏. 1.对于手机屏幕直接投屏这种情况,大家可以在屏幕下方手指上拉,唤出iOS的 ...

  7. 优酷视频手机上能发现投屏设备,但投屏失败?

    1.投屏失败的提醒如果是文件格式不兼容,则按文件格式不兼容解决; 2.并不是文件格式难题,移动端提醒连接失败,TV端无反映,提议在电视机或小盒子端安裝CIBN酷喵影视App,起动CIBN酷喵影视App ...

  8. 视频播放器上实现AirPlay投屏功能

    实现类似腾讯视频App 投影到电脑或电视上的功能 先明确几个问题: 1.多屏互动功能中 iphone设备基于AirPlay协议,Android设备基于DLNA协议: 2.原理是把正在播放的视频推送到同 ...

  9. Android投屏到设备及图像设备投屏到手机方案

    手机(Android)投屏到投影仪可以使用type-C转HDMI转换器,(需要手机硬件支持) 也可以投到电脑上,电脑再使用HDMI等线缆连接到投影仪. 手机投屏到电脑可以wifi投屏,或者scrcpy ...

  10. 关于mstar TV芯片苹果设备Airplay投屏播放画面竖屏窗体旋转、窗体显示不正常的解决方案

    用下面命令从tv中读出当前storage的比例设定值 1.cd /Database 2.sqlite3 user_setting.db 3.select enARCType from tbl_Vide ...

最新文章

  1. 企业微信发送企业红包java_发放企业红包
  2. 卷积神经网络(CNN)新手指南
  3. 在线网上打字系统_在线网上打字比赛软件_打字练习_中英文打字系统
  4. python转换维度
  5. 多线程, 注入spring 服务
  6. 用Python实现二叉树,完全二叉树和满二叉树
  7. macos安装盘第三方工具制作_一步一步教你为macOS创建系统安装盘
  8. LG P990开机黑屏,但能进入系统的解决办法
  9. HH SaaS电商系统的结算系统设计
  10. Waymo离线点云序列3D物体检测网络 (3D Auto Labeling): Offboard 3D Object Detection from Point Cloud Sequences
  11. 如何使用分析模型 — 3. 排比图,分析问题的同时给出答案
  12. java chackbox,Java CheckBox.setText方法代码示例
  13. 物联网卡云平台如何分析信息数据
  14. 原来这就是Java中的模板设计模式,太easy太实用了!
  15. C语言知识点笔记完全整理
  16. 浅析redis雪崩击穿和穿透
  17. HTML 页面 meta 的作用
  18. 第2关:创建 <h2>-<h6> 标签
  19. sqlserver 查询单引号
  20. avatar Logo

热门文章

  1. Python实现网络出口带宽自动巡检
  2. MySQL笔记:第17章_其他数据库日志
  3. cad图形如何导入到奥维地图_CAD图导入奥维简易操作步骤--陈浩
  4. asp html5 ajax,ASP – AJAX 与 ASP | 菜鸟教程
  5. 如何基于FastReport报表工具,生成报表PDF文档展示医院处方笺的内容
  6. 小米更新显示非官方rom_MIUI官改篇对比分析-极光ROM-台湾W大-星空未来-其他官改官网...
  7. 隐藏水滴屏的软件_手机隐藏水滴屏的APP
  8. 计算机模拟题操作题错误,计算机模拟试卷操作题答案.doc
  9. 安装华为P10plus的手机驱动过程
  10. RJ45口线序的理解