[WFD] WFD 连接做connect和disconnect,手机概率性的没有反应以及重启

本文探讨了WFD连接中的connect和disconnect操作导致手机无响应及重启的问题。通过分析发现,故障出现的原因主要分为两种情况:VideoSource无法正常停止和UdpSession创建失败。针对这两种情况,文中给出了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[WFD] WFD 连接做connect和disconnect,手机概率性的没有反应以及重启

[DESCRIPTION]

连续操作手机,做WFD connect和disconnect 的动作,手机会概率发生没有反应以及重
启的问题。
从log 发生来看,WindowManager 这边会卡在RemoteDisplay.nativeDispose()。具体
的CallStack 如下。
"WindowManager" prio=5 tid=12 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x420f6530 self=0x5ce662a8
| sysTid=710 nice=-4 sched=0/0 cgrp=apps handle=1558603520
| state=S schedstat=( 11487599370 9157963355 38440 ) utm=877 stm=271
core=2
#00 pc 000247e8 /system/lib/libc.so (__ioctl+8)
#01 pc 00038248 /system/lib/libc.so (ioctl+28)
#02 pc 0001d3a9 /system/lib/libbinder.so
(android::IPCThreadState::talkWithDriver(bool)+140)
#03 pc 0001d8c3 /system/lib/libbinder.so
(android::IPCThreadState::waitForResponse(android:arcel*, int*)+42)
#04 pc 0001dacb /system/lib/libbinder.so
(android::IPCThreadState::transact(int, unsigned int, android:arcel
const&, android:arcel*, unsigned int)+118)
#05 pc 00019797 /system/lib/libbinder.so
(android::BpBinder::transact(unsigned int, android:arcel const&,
android:arcel*, unsigned int)+36)
#06 pc 00064b35 /system/lib/libmedia.so
#07 pc 00088863 /system/lib/libandroid_runtime.so
#08 pc 0001e74c /system/lib/libdvm.so (dvmPlatformInvoke+112)
#09 pc 0004fa91 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int
const*, JValue*, Method const*, Thread*)+484)
#10 pc 00027b28 /system/lib/libdvm.so
#11 pc 0002f100 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
#12 pc 0002c5e4 /system/lib/libdvm.so (dvmInterpret(Thread*, Method
const*, JValue*)+188)
#13 pc 00062e6d /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method
const*, Object*, bool, JValue*, std::__va_list)+340)
#14 pc 00062e91 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method
const*, Object*, JValue*, ...)+20)
#15 pc 000574a5 /system/lib/libdvm.so
#16 pc 0000d600 /system/lib/libc.so (__thread_entry+72)
at android.media.RemoteDisplay.nativeDispose(Native Method)
at android.media.RemoteDisplay.dispose(RemoteDisplay.JAVA:137)
at android.media.RemoteDisplay.dispose(RemoteDisplay.java:113)
at
com.android.server.display.WIFIDisplayController.updateConnection(WifiDisp
layController.java:1042)
at
com.android.server.display.WifiDisplayController.disconnect(WifiDisplayCon
troller.java:1005)
at
com.android.server.display.WifiDisplayController.requestDisconnect(WifiDis
playController.java:608)
at
com.android.server.display.WifiDisplayAdapter$7.run(WifiDisplayAdapter.jav
a:247)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:61)
从具体分析log来看,有两种case 会导致这种状况:
Ø Case 1: WFD disconnect 操作中,Video Source没办法stop成功。
在WifiDisplaySource stop过程中,一直没有红色的log,表示video source一直没有被
stopped。
07-21 10:09:07.028 151 3010 I MediaPuller: MediaPuller(audio/raw)
stopping.
07-21 10:09:07.029 151 3001 I MediaPuller: MediaPuller(video/raw)
stopping.
07-21 10:09:07.103 151 3010 I MediaPuller: MediaPuller(audio/raw) stopped.
MediaPuller: MediaPuller(video/raw) stopped.
Ø Case 2: Udp Session 创建失败。
从main log中来看,一直打出如下的error log。
01-01 01:13:05.891 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.898 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.903 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.913 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.923 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.928 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.931 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.934 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.938 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.948 157 11398 E NetworkSession: Error in
createClientOrServer:-101
01-01 01:13:05.951 157 11398 E NetworkSession: Error in
createClientOrServer:-101

[SOLUTION]

Ø 若是Case 1,请麻烦做如下修改(修改的code以红色为标注)。
1) alps/mediatek/frameworks-ext/av/media/libstagefright/wifi-displaymediatek/
source/RepeaterSource.cpp
status_t RepeaterSource::start(MetaData *params) {
CHECK(!mStarted);
//add start
mStop=false;
//add end
..........................
}
status_t RepeaterSource::stop() {
CHECK(mStarted);
ALOGI("stopping");
mStop = true;
if (mBuffer != NULL) {
ALOGV("releasing mbuf %p", mBuffer);
mBuffer->release();
mBuffer = NULL;
}
tatus_t err = mSource->stop();
if (mLooper != NULL) {
mLooper->stop();
mLooper.clear();
mReflector.clear();
}
ALOGI("stopped");
mStarted = false;
return err;
}
void RepeaterSource:nMessageReceived(const sp<AMessage> &msg) {
switch (msg->what()) {
case kWhatRead:
{
MediaBuffer *buffer;
//add start
if (true == mStop) {
break;
}
//add end
#ifdef MTB_SUPPORT
ATRACE_BEGIN("Repeater, KWhatRead");
#endif
#ifndef ANDROID_DEFAULT_CODE
int64_t startUs = ALooper::GetNowUs();
#endif
status_t err = mSource->read(&buffer);
//add start
if (true==mStop) {
if (mBuffer != NULL) {
mBuffer->release();
mBuffer = NULL;
}
if(buffer!=NULL) {
buffer->release();
}
break;
}
//add end
........................
}
2) alps/mediatek/frameworks-ext/av/media/libstagefright/wifi-displaymediatek/
source/RepeaterSource.h
struct RepeaterSource : public MediaSource {
..............
//add start
bool mStop;
//add end
....................
}
&Oslash; 若是case 2 ,请麻烦做如下修改 (修改的code 以红色为标注)。
\alps\mediatek\frameworks-ext\av\media\libstagefright\wifi-displaymediatek\
rtp\RTPSender.cpp
status_t RTPSender::initAsync(
const char *remoteHost,
int32_t remoteRTPPort,
TransportMode rtpMode,
int32_t remoteRTCPPort,
TransportMode rtcpMode,
int32_t *outLocalRTPPort) {
...........................

for (;;) {
修改成
int count =0;
status_t err;
for(;count <6;count ++){
............................
//將err 放在for 循環外面
//status_t err;
}
//add that start
if(count >5)
{
notifyError(err);
return err;
}
//add that end
if(rtpMode == TRANSPORT_UDP){
mRTPConnected =true;
}
.....................
}


### WFD (Wi-Fi Display) 技术实现与配置方法 WFD 是一种基于 Wifi 的无线投屏技术,其核心功能在于通过网络协议栈完成音视频数据的高效传输。以下是关于其实现配置的关键点: #### 协议基础 WFD 可以运行于多种底层通信模式之上,包括 WiFi Direct TDLS(Tunneled Direct Link Setup)。对于不同版本的支持情况如下: - **R1 版本**支持的基础架构为 WiFi-P2P 或者 TDLS[^2]。 - **R2 版本**则扩展至 WiFi-P2P 或 WiFi Infrastructure,并对后者进行了简化处理。 #### 设备发现机制 在实际应用过程中,设备间需先完成相互识别操作。这一过程通常依赖于 WiFi Direct 提供的服务发现能力。当源端(Source Device)检测到目标显示装置(Sink Device),双方即可协商并构建专用链路用于后续的数据交换活动[^1]。 #### 数据流管理 一旦建立了稳定的物理层链接之后,则进入到了更高层次的应用层面交互阶段。这里涉及到如何有效地打包、压缩以及同步多媒体内容等问题。具体而言: - 音频部分可能采用 AAC 编码标准; - 而视频方面或许会选择 H.264/AVC 这样的主流算法来达到较好的画质表现同时兼顾带宽消耗平衡的目的。 ```python import socket def create_wifi_direct_socket(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: # Bind the socket to a local address and port. sock.bind(('localhost', 8080)) # Listen for incoming connections from sink devices. sock.listen() print("Waiting for connection...") conn, addr = sock.accept() # Accept an incoming connection. with conn: print(f'Connected by {addr}') while True: data = conn.recv(1024).decode('utf-8') if not data or 'disconnect' in data.lower(): break response_message = process_received_data(data) conn.sendall(response_message.encode('utf-8')) finally: sock.close() def process_received_data(data_string): """Process received string.""" processed_result = f"Processed: {data_string}" return processed_result ``` 上述代码片段展示了一个简单的 Python 实现例子,它模拟了创建监听套接字等待来自接收器设备连接请求的过程,并简单展示了消息收发逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值