局域网内android设备发现及通讯

                最近一个项目需要实现在局域网内android手机操控另一个没有显示屏的android设备(音箱),具体实现就是手机端向音箱端发送命令字符串,音箱端通过解析命令字符串来完成操作,而手机端也要实时显示音箱当前的状态(正在播放什么歌曲之类的信息),这样就需要两边的交互要具有稳定性和快捷性,不然用户体验就会非常差。

               博主替换了三套方案终于在稳定性和快捷性上基本达到要求,下面来简单说下这三套方案。第一套方案采用的是高通提供的aoojoyn框架,aoojoyn提供了一整套的局域网内设备互相发现以及通讯的功能,但是稳定性很差,经常会出现发现不了的情况,特别是在apk运行中切换网络后通常很难再互相发现,由于aoojony的资料太少以及想彻底解决这个问题需要花费大量的时间和精力,所以就放弃了这套方案。第二套方案是基于udp广播,通过手机端先发送全局广播,广播中携带了手机端的ip地址信息,音箱端接收到全局广播后向手机端所在的ip发送广播,手机端接收到音箱端发送的广播后也改为向音箱的ip发送广播,这样就实现了发现和通讯,这个方案虽然稳定性和速度比aoojoyn都提高了很多,但是也有问题,首先稳定性还是不够还是会有一段时间接收不到广播,其次手机端和音箱端的通讯很频繁,2秒一次,当udp广播发送太多后路由就会瘫痪,所以这套方案也不行。第三种是udp和socket组合,先通过udp来知道手机端和音箱端的ip地址,再通过socket来进行通讯,当手机端在连接后接收不到音箱端的心跳时就再发送udp全局广播,音箱端就会重启socket,这样稳定性和快捷性就大大提升了,也不会对路由器造成负担。

                    写的很乱,请见谅。

利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址的局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值