安卓设备之间的投屏互联,为了便捷使用无线连接,为了低延时用udp进行数据传输。因为短距离的数据传输,如果使用TCP进行音视频数据传输,容易出现视频数据堆积、音频数据卡顿等问题。
wifidisplay 的连接考虑的是整个安卓平台设备,所以p2p连接过程是走标准的p2p流程:p2p设备搜索、主从设备协商、连接过程。对p2p整个流程有兴趣的小伙伴可以跟下看下这几篇p2p的文章很详细:https://www.jianshu.com/p/38da33064659 Android-内功篇-WifiP2p-WifiP2pService的启动以及P2P的连接_ZWAlert的博客-CSDN博客
谈谈对WiFi P2P的理解_SKY.D的博客-CSDN博客_p2p wifi
。
走标准的p2p协商有两个问题:(1)主从关系可能协商失败,因为可能协商的等级相同;(2)p2p协商组群,默认走2.4G 通道。问题1会出现 wifidisplay连接不上;问题2 是限制了板子传输能力,现在很多设备都是带双天线,支持5G通道,如果限制在2.4G,就限制了传输能力,抗干扰能力也较弱。所以在定制内部互联协议时,为了快速连接,通过其它方式获取到mac地址,例如通过蓝牙交互、通过NFC、通过二维码,快速获取mac,进行组网。如下代码是简单的创建p2p GO,设置设置为5G传输通道,GO的创建要在要在通道设置之前,否则会设置失败。另外如果要设置成5G 通道,需要硬件支持,如果设置失败,先确认下硬件设备是否支持
wifiP2pManager.createGroup(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {}@Overridepublic void onFailure(int reason) {}} WifiP2pConfig config = new WifiP2pConfig.Builder().setNetworkName("DIRECT-sink").setPassphrase("passphrase").enablePersistentMode(false).setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ).build();wifiP2pManager.createGroup(channel, config, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {dismissLoadingDialog();showToast("onSuccess");}@Overridepublic void onFailure(int reason) {dismissLoadingDialog();showToast("onFailure");}});
获取mac后进行连接,连接代码如下
WifiP2pConfig config = new WifiP2pConfig();if (config.deviceAddress != null && mWifiP2pDevice != null) {config.deviceAddress = mac;config.wps.setup = WpsInfo.PBC;wifiP2pManager.connect(channel, config, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {}@Overridepublic void onFailure(int reason) {}});}
这样最简单的p2连接就完成了。
有些同硬件相关的是在性能前期评估时时需要确认的,所用的平台是单天线还是双天线,5G、2.4G对应的带宽是多少,这些都会直接影响用户的体验效果。如果只有单天线,p2p跟AP有个占比会有数据接收的时间切换,这样数据传输就容易出现较大的抖动,对延时、画面流畅、音频是否卡顿都会有较大的影响。
当然在获取mac过程都需要先通过各种方式的认证,毕竟手机涉及各种隐私,需要保证隐私安全。