UDP初始化超时
wx.createUDPSocket,真机(IPhone 14 IOS 16.1.2)调试的时候,UDP初始化,提示UDP初始化超时,目前声明了权限开启了地址权限和本地网络权限,目标地址和小程序链接的wifi在同一局域网内,目标机器的端口是开放的求回答和指导; createUdpSocket(ip) {
if (!this.validateIpAddress(ip)) {
const errorMsg = `无效的IP地址: ${ip}`;
this._showError(errorMsg);
return;
}
const targetPort = 8280;
this.cleanupUdpResources();
this.setData({
udpInitializing: true,
statusText: `正在初始化UDP(目标: ${ip}:${targetPort})...`
});
console.log(`=== 开始UDP初始化,目标 ${ip}:${targetPort} ===`);
const udpInitTimeout = setTimeout(() => {
if (this.data.udpInitializing) {
this.checkUdpPermissions().then(permResult => {
this.setData({
statusText: `UDP初始化超时(10秒),可能受系统限制`,
udpInitializing: false
});
this._showErrorModal(
'UDP初始化超时',
'可能原因:\n1. 微信对UDP权限限制(尝试重启微信)\n2. 手机系统阻止小程序使用UDP(检查应用权限)\n3. 目标设备未响应',
() => this.createUdpSocket(ip)
);
}).catch(err => {
console.error('权限检查失败:', err);
this.setData({
statusText: '权限检查失败,初始化终止',
udpInitializing: false
});
});
}
}, 10000); // 10秒超时
this.setData({ udpInitTimeout });
try {
const udpSocket = wx.createUDPSocket();
udpSocket.onError((err) => {
console.error(`[UDP错误] 错误码: ${err.errCode}, 信息: ${err.errMsg}`);
this.cleanupUdpResources();
// 错误码解析(微信官方错误码)
const errorMap = {
10003: '微信无网络权限,请在手机设置中开启',
10013: '端口被占用或系统禁止使用(尝试重启手机)',
10014: 'IP地址无效或不可达',
10022: '系统安全策略限制(如Android 10+的网络隔离)'
};
const errorMsg = errorMap[err.errCode] || `未知错误(${err.errCode})`;
this.setData({ statusText: `UDP错误: ${errorMsg}` });
this._showErrorModal('UDP通信失败', errorMsg);
});
const bindPorts = [0, 8081, 8082, 8083];
let currentPortIndex = 0;
const tryBind = () => {
if (currentPortIndex >= bindPorts.length) {
this.cleanupUdpResources();
this.setData({ statusText: '所有端口尝试绑定失败,系统可能限制UDP' });
this._showErrorModal('端口绑定失败', '尝试了多个端口均失败,可能是系统限制');
return;
}
const localPort = bindPorts[currentPortIndex];
console.log(`尝试绑定本地端口: ${localPort}`);
udpSocket.bind({
port: localPort,
success: () => {
console.log(`✅ 端口${localPort}绑定成功`);
// 绑定成功后立即验证通信
this._verifyUdpCommunication(udpSocket, ip, targetPort);
},
fail: (err) => {
console.error(`❌ 端口${localPort}绑定失败: ${err.errMsg}`);
currentPortIndex++;
tryBind(); // 尝试下一个端口
}
});
};
tryBind();
} catch (err) {
console.error('创建UDP套接字异常:', err);
this.cleanupUdpResources();
this.setData({ statusText: `创建UDP失败: ${err.message}` });
}
}