一、问题现象

大屏项目打开Miracast投屏应用后,使用手机进行无线投屏时,首次投屏大概率失败,必须重试1~2次才能成功投屏。

  1. 问题概率4/5(高概率复现)
  1. 影响范围:主要表现为首次投屏连接失败,重试后可成功
  1. 失败表现:手机搜索到设备并尝试连接,但最终超时或断开,无法建立投屏会话

 

二、分析过程

1. 初步分析(日志分析)

从日志分析,底层的P2P流程是正常的,连接已经成功建立:

1.1 启动GO

01-19 17:29:48.258  2211  3201 D C01560/WifiWpaHal: wpa recv buf: <3>P2P-GROUP-STARTED p2p0 GO ssid="DIRECT-9c-GK6320-miracast" freq=5180 passphrase="mTfcHSMx" go_dev_addr=fa:ab:4d:79:72:93 [PERSISTENT]!

01-19 17:29:48.258  2211  3201 D C01560/WifiWpaHal: wpa p2p callback p :P2P-GROUP-STARTED p2p0 GO ssid="DIRECT-9c-GK6320-miracast" freq=5180 passphrase="mTfcHSMx" go_dev_addr=fa:ab:4d:79:72:93 [PERSISTENT]!

01-19 17:29:48.258  3182  3183 I C05200/wpa_supplicant: P2P-GROUP-STARTED p2p0 GO ssid="DIR*******************ast" freq=5180 go_dev_addr=fa:ab:**:**:**:93 [PERSISTENT]

01-19 17:29:48.258  3182  3183 I C05200/wpa_supplicant: P2P: Storing credentials for a persistent group (GO Dev Addr fa:ab:**:**:**:93)

01-19 17:29:48.258  2211  3201 I C01560/WifiHalCallback: P2p group started event groupIfName: p2p0

01-19 17:29:48.258  3182  3183 I C05200/wpa_supplicant: P2P: Create a new persistent group entry

 

1.2 WPS交互成功

 

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: Probe Request for PBC received from d2:69:**:**:**:65

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: UUID-E from Probe Request - hexdump(len=16): c7 d9 6a fb fa bd 5e 24 8f d7 3b d7 12 5e 38 d6

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: Checking active PBC sessions for overlap

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: Add one for the requested UUID

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: Requested UUID - hexdump(len=16): c7 d9 6a fb fa bd 5e 24 8f d7 3b d7 12 5e 38 d6

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: Consider PBC session with d2:69:**:**:**:65

01-19 17:29:53.674  3182  3183 D C05200/wpa_supplicant: WPS: UUID-E - hexdump(len=16): c7 d9 6a fb fa bd 5e 24 8f d7 3b d7 12 5e 38 d6

01-19 17:29:53.676  3182  3183 D C05200/wpa_supplicant: WPS: 1 active PBC session(s) found

01-19 17:29:53.676  3182  3183 D C05200/wpa_supplicant: WPS: attr type=0x104a len=1

...

01-19 17:29:53.718  3182  3183 D C05200/wpa_supplicant: WPS: Received M1

...

01-19 17:29:53.719  3182  3183 D C05200/wpa_supplicant: WPS: Building Message M2

...

01-19 17:29:53.757  3182  3183 D C05200/wpa_supplicant: WPS: Received M3

...

01-19 17:29:53.757  3182  3183 D C05200/wpa_supplicant: WPS: Building Message M4

...

01-19 17:29:53.765  3182  3183 D C05200/wpa_supplicant: WPS: Received M5

...

01-19 17:29:53.767  3182  3183 D C05200/wpa_supplicant: WPS: Building Message M6

...

01-19 17:29:53.774  3182  3183 D C05200/wpa_supplicant: WPS: Received M7

...

01-19 17:29:53.775  3182  3183 D C05200/wpa_supplicant: WPS: Building Message M8

...

01-19 17:29:53.787 3182 3183 D C05200/wpa_supplicant: WPS: Received WSC_Done

01-19 17:29:53.787 3182 3183 D C05200/wpa_supplicant: WPS: Negotiation completed successfully

01-19 17:29:53.787 3182 3183 I C05200/wpa_supplicant: WPS-REG-SUCCESS d2:69:**:**:**:65

...

01-19 17:29:53.903 3182 3183 D C05200/wpa_supplicant: IEEE 802.1X: Force disconnection of d2:69:**:**:**:65 after EAP-Failure in 10 ms

01-19 17:29:53.914 3182 3183 D C05200/wpa_supplicant: p2p0: ap_sta_disconnect STA d2:69:**:**:**:65 reason=23

 

 

1.3 四次握手成功及连接成功

 

01-19 17:29:54.378 3182 3183 D C05200/wpa_supplicant: hostapd_logger: STA d2:69:**:**:**:65 - sending 1/4 msg of 4-Way Handshake

01-19 17:29:54.390 3182 3183 D C05200/wpa_supplicant: hostapd_logger: STA d2:69:**:**:**:65 - received EAPOL-Key frame (2/4 Pairwise)

01-19 17:29:54.391 3182 3183 D C05200/wpa_supplicant: hostapd_logger: STA d2:69:**:**:**:65 - sending 3/4 msg of 4-Way Handshake

01-19 17:29:54.397 3182 3183 D C05200/wpa_supplicant: hostapd_logger: STA d2:69:**:**:**:65 - received EAPOL-Key frame (4/4 Pairwise)

...

01-19 17:29:54.399 3182 3183 I C05200/wpa_supplicant: AP-STA-CONNECTED

01-19 17:29:54.399 3182 3183 I C05200/wpa_supplicant: p2p0: AP-STA-CONNECTED d2:69:**:**:**:65 p2p_dev_addr=d2:**:**:**:81:65

01-19 17:29:54.400 3182 3183 D C05200/wpa_supplicant: hostapd_logger: STA d2:69:**:**:**:65 - authorizing port

01-19 17:29:54.400 3182 3183 D C05200/wpa_supplicant: hostapd_logger: STA d2:69:**:**:**:65 - pairwise key handshake completed (RSN)

01-19 17:29:54.400 3182 3183 I C05200/wpa_supplicant: p2p0: EAPOL-4WAY-HS-COMPLETED d2:69:**:**:**:65

 

 

1.4 连接上,大屏设备作为Group Owner

01-19 17:29:54.439  2516  2516 I C04602/sharing: [Sharing][OnP2pConnectionChanged()][wfd_sink_scene.cpp:158] OnP2pConnectionChanged State: 1 (0=Dis, 1=Con), IsGO: 1, GoAddr: 1******1

...

01-19 17:29:54.440  2520  2520 I C05764/ConnWD: [p2p_entity.cpp:35] P2pConnectionChangeCallback# ConnectionState=1, isGroupOwner=1

 

 

1.5 上层应用发现并连接上该设备

01-19 17:29:54.552  2516  2651 I C04602/sharing: [Sharing][OnP2pGcJoinGroup()][wfd_sink_scene.cpp:193] Callback Info -> Mac: d******5, Ip: 1******4

01-19 17:29:54.552  2516  2651 I C04602/sharing: [Sharing][OnP2pGcJoinGroup()][wfd_sink_scene.cpp:202] Scanning P2P Device: Mac=d******5, Status=0

01-19 17:29:54.552  2516  2651 I C04602/sharing: [Sharing][OnP2pGcJoinGroup()][wfd_sink_scene.cpp:220] Found NEW device: d******5

...

01-19 17:29:54.556  2516  2651 I C04602/sharing: [Sharing][OnP2pPeerConnected()][wfd_sink_scene.cpp:1343] connected, create sink agent, contextId: 4, agentId: 5, devMac: d2:69:44:22:81:65, devName: wifitest, devIp: 192.168.49.4.

01-19 17:29:54.556  2516  2651 I C04602/sharing: [Sharing][OnP2pPeerConnected()][wfd_sink_scene.cpp:1357] connected, devMac: d******5, devName: w******t, devIp: 1******4.

 

 

1.6 上层应用没有成功进行RTSP协商

1connecting

01-19 17:29:55.327  2516  2988 I C04602/sharing: [Sharing][ConnectSocket()][socket_utils.cpp:186] connecting.

01-19 17:29:55.327  2516  2988 D C04602/sharing: [Sharing][CheckAsyncConnect()][socket_utils.cpp:203] trace.

01-19 17:29:57.830  2516  2988 E C04602/sharing: [Sharing][CheckAsyncConnect()][socket_utils.cpp:222] async connect timeout.

01-19 17:29:57.830  2516  2988 E C04602/sharing: [Sharing][Connect()][tcp_socket.cpp:98] connect socket failed, ip: 1******4, port: 7236.

 

2connecting

01-19 17:29:58.031  2516  2988 I C04602/sharing: [Sharing][ConnectSocket()][socket_utils.cpp:186] connecting.

01-19 17:29:58.031  2516  2988 D C04602/sharing: [Sharing][CheckAsyncConnect()][socket_utils.cpp:203] trace.

01-19 17:30:00.533  2516  2988 E C04602/sharing: [Sharing][CheckAsyncConnect()][socket_utils.cpp:222] async connect timeout.

01-19 17:30:00.533  2516  2988 E C04602/sharing: [Sharing][Connect()][tcp_socket.cpp:98] connect socket failed, ip: 1******4, port: 7236.

...

01-19 17:30:00.533  2516  2988 E C04602/sharing: [Sharing][Connect()][tcp_client.cpp:78] [TcpClient] Connect failed!

01-19 17:30:00.533  2516  2988 E C04602/sharing: [Sharing][StartWfdSession()][wfd_sink_session.cpp:305] sessionId: 6, Failed to connect wfd rtsp server 1******4:7236.

01-19 17:30:00.733  2516  2988 I C04602/sharing: [Sharing][Connect()][tcp_client.cpp:39] peerIp:1******4, peerPort:7236, thread_id: 3056336024.

 

如上重复5次,然后超时失败。

 

 

 

1.7 随后上层应用主动断开

01-19 17:30:11.351  2516  2988 I C04602/sharing: [Sharing][P2pRemoveClient()][wfd_sink_scene.cpp:1675] p2p remove client: d******5.

01-19 17:30:11.355  3182  3183 D C05200/wpa_supplicant: P2P: Disconnect peer d2:69:**:**:**:65 (iface_addr=0) from group

01-19 17:30:11.359  2211  3201 D C01560/WifiWpaHal: wpa recv buf: IFNAME=p2p0 <3>AP-STA-DISCONNECTED d2:69:44:22:01:65 p2p_dev_addr=d2:69:44:22:81:65!

01-19 17:30:11.359  3182  3183 I C05200/wpa_supplicant: AP-STA-DISCONNECTED

01-19 17:30:11.359  2211  3201 D C01560/WifiWpaHal: wpa p2p callback p :AP-STA-DISCONNECTED d2:69:44:22:01:65 p2p_dev_addr=d2:69:44:22:81:65!

01-19 17:30:47.715  2516  3007 I C04602/sharing: [Sharing][P2pRemoveClient()][wfd_sink_scene.cpp:1675] p2p remove client: d******5.

01-19 17:30:47.720  3182  3183 D C05200/wpa_supplicant: P2P: Disconnect peer d2:69:**:**:**:65 (iface_addr=0) from group

01-19 17:30:47.722  3182  3183 I C05200/wpa_supplicant: AP-STA-DISCONNECTED

01-19 17:30:47.722  2211  3201 D C01560/WifiWpaHal: wpa recv buf: IFNAME=p2p0 <3>AP-STA-DISCONNECTED d2:69:44:22:01:65 p2p_dev_addr=d2:69:44:22:81:65!

01-19 17:30:47.722  2211  3201 D C01560/WifiWpaHal: wpa p2p callback p :AP-STA-DISCONNECTED d2:69:44:22:01:65 p2p_dev_addr=d2:69:44:22:81:65!

01-19 17:31:01.079  2211  3201 D C01560/WifiWpaHal: wpa recv buf: IFNAME=p2p0 <3>AP-STA-DISCONNECTED d2:69:44:22:01:65 p2p_dev_addr=d2:69:44:22:81:65!

01-19 17:31:01.079  2211  3201 D C01560/WifiWpaHal: wpa p2p callback p :AP-STA-DISCONNECTED d2:69:44:22:01:65 p2p_dev_addr=d2:69:44:22:81:65!

01-19 17:31:01.079  3182  3183 I C05200/wpa_supplicant: AP-STA-DISCONNECTED

01-19 17:34:14.136  2516  4080 I C04602/sharing: [Sharing][P2pRemoveClient()][wfd_sink_scene.cpp:1675] p2p remove client: d******5.

 

 

 

1.8 失败根本原因定位
鸿蒙TV在Miracast投屏时失败的主要原因是socket通信失败导致的RTSP连接超时后,上层应用主动去关联

01-19 17:30:11.346 E C04602/sharing: [Sharing][CheckAsyncConnect()][socket_utils.cpp:222] async connect timeout.

01-19 17:30:11.346 E C04602/sharing: [Sharing][Connect()][tcp_socket.cpp:98] connect socket failed, ip: 1******4, port: 7236.

01-19 17:30:11.346 E C04602/sharing: [Sharing][StartWfdSession()][wfd_sink_session.cpp:305] sessionId: 6, Failed to connect wfd rtsp server 1******4:7236.

 

结论: 底层的P2P流程正常、连接已经成功建立。失败的直接原因是网络通路不通,上层的SOCKET通信失败导致RTSP交互流程失败,最终超时后上层主动断开连接。

 

2. 补充测试机型对比分析

  1. 测试多款手机(小米多款、Redmi K80 Pro、荣耀70)均无问题
  1. 仅荣耀30系列手机存在该问题(该机型于2020年上市,较老)
  1. 同厂商的荣耀70无此问题,推测荣耀30可能存在兼容性问题

 

 

 

3. 抓包分析(关键)

tcpdump抓包(capture.pcap)分析:

-- 投屏失败时,大屏发送SYN包(源端口:42522/7236等,目标端口:7236)

-- 荣耀30pro+ 没有回复SYN-ACK

-- 表明TCP连接建立失败,网络层虽通,但手机侧未响应

 

 

4.尝试及验证

鉴于仅荣耀30系列(2020年老机型)存在该问题,且测试发现手机连接5GHz Wi-Fi时失败概率更高,推测老款手机对5GHz高频段信道兼容性较差。为验证该假设,将GO信道分别修改为2.4GHz信道1(2412MHz)和5GHz低频信道36(5180MHz)进行测试,结果首次投屏均成功。由此确认,硬编码使用5GHz高频信道149是该问题的根因。

 

4.1 将GO的信道修改为2.4GHz 2412 MHz(信道1)

-- 测试结果:首次投屏成功

 

4.2 将GO的信道修改为5GHz 36信道(5180MHz)

-- 测试结果:首次投屏成功

结论: 信道选择对荣耀30系列手机的兼容性有显著影响,使用低频信道可解决首次投屏失败问题。

 

三、最终解决方案

根因定位

WFD投屏服务(WfdSinkScene)在创建P2P组时,硬编码使用5GHz高频段信道149(5745MHz)。部分老款手机(如荣耀30系列)对该信道兼容性较差,导致手机侧无法正常响应TCP连接请求(SYN包无SYN-ACK响应),最终RTSP连接超时,投屏失败。

解决方案

将硬编码的频段从 5GHz高频信道149(5745MHz) 修改为兼容性更好的 5GHz低频信道36(5180MHz),确保手机侧能够正常建立TCP连接,完成RTSP交互流程。

验证结果

修改后,首次投屏成功率显著提升,问题得到解决。

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐