smart-home/smart-home-app/utils/networkConnectivityTest.js
2026-02-26 09:16:34 +08:00

364 lines
9.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 网络连通性测试工具
* 专门用于测试移动设备的网络连接能力
*/
/**
* 全面的网络连通性测试
*/
export async function runConnectivityTest(targetIP = '192.168.1.98') {
console.log('🔍 开始网络连通性测试...')
const results = {
internetAccess: null,
gatewayAccess: null,
targetDeviceAccess: null,
dnsResolution: null,
recommendations: []
}
try {
// 1. 测试互联网连接
console.log('🌐 测试互联网连接...')
results.internetAccess = await testInternetAccess()
// 2. 测试网关连接
console.log('🏠 测试网关连接...')
results.gatewayAccess = await testGatewayAccess(targetIP)
// 3. 测试目标设备连接
console.log('🎯 测试目标设备连接...')
results.targetDeviceAccess = await testTargetDevice(targetIP)
// 4. 测试DNS解析
console.log('🔍 测试DNS解析...')
results.dnsResolution = await testDNSResolution()
// 5. 生成建议
results.recommendations = generateConnectivityRecommendations(results)
} catch (error) {
console.error('❌ 连通性测试异常:', error)
results.error = error
}
// 输出测试报告
printConnectivityReport(results)
return results
}
/**
* 测试互联网连接
*/
async function testInternetAccess() {
const testSites = [
'https://www.baidu.com',
'https://www.qq.com',
'http://www.baidu.com' // 也测试HTTP
]
for (const site of testSites) {
try {
console.log(`🌐 测试: ${site}`)
const result = await new Promise((resolve, reject) => {
const startTime = Date.now()
uni.request({
url: site,
method: 'GET',
timeout: 5000,
success: (res) => {
const duration = Date.now() - startTime
console.log(`✅ 互联网连接成功 (${duration}ms)`)
resolve({
success: true,
site,
duration,
statusCode: res.statusCode
})
},
fail: (err) => {
const duration = Date.now() - startTime
console.log(`❌ 互联网连接失败: ${err.errMsg} (${duration}ms)`)
reject({
success: false,
site,
duration,
error: err.errMsg
})
}
})
})
return result
} catch (error) {
console.log(`${site} 连接失败:`, error.error)
continue
}
}
return {
success: false,
error: 'All internet sites failed'
}
}
/**
* 测试网关连接
*/
async function testGatewayAccess(targetIP) {
// 从目标IP推断网关IP
const ipParts = targetIP.split('.')
const gatewayIP = `${ipParts[0]}.${ipParts[1]}.${ipParts[2]}.1`
console.log(`🏠 测试网关: ${gatewayIP}`)
try {
const result = await new Promise((resolve, reject) => {
const startTime = Date.now()
uni.request({
url: `http://${gatewayIP}`,
method: 'GET',
timeout: 5000,
success: (res) => {
const duration = Date.now() - startTime
console.log(`✅ 网关连接成功 (${duration}ms)`)
resolve({
success: true,
gateway: gatewayIP,
duration,
statusCode: res.statusCode
})
},
fail: (err) => {
const duration = Date.now() - startTime
console.log(`❌ 网关连接失败: ${err.errMsg} (${duration}ms)`)
// 网关连接失败是正常的很多路由器不提供HTTP服务
resolve({
success: false,
gateway: gatewayIP,
duration,
error: err.errMsg,
note: '网关连接失败是正常的大多数路由器不提供HTTP服务'
})
}
})
})
return result
} catch (error) {
return {
success: false,
gateway: gatewayIP,
error: error.message
}
}
}
/**
* 测试目标设备连接
*/
async function testTargetDevice(targetIP) {
const testPorts = [80, 8080, 443]
const testPaths = ['/', '/api/status', '/api/device/info']
for (const port of testPorts) {
for (const path of testPaths) {
try {
const url = `http://${targetIP}:${port}${path}`
console.log(`🎯 测试: ${url}`)
const result = await new Promise((resolve, reject) => {
const startTime = Date.now()
uni.request({
url,
method: 'GET',
timeout: 8000,
header: {
'Content-Type': 'application/json',
'User-Agent': 'uni-app/ConnectivityTest',
'Cache-Control': 'no-cache'
},
success: (res) => {
const duration = Date.now() - startTime
console.log(`✅ 目标设备连接成功 (${duration}ms)`)
resolve({
success: true,
url,
port,
path,
duration,
statusCode: res.statusCode,
data: res.data
})
},
fail: (err) => {
const duration = Date.now() - startTime
console.log(`❌ 目标设备连接失败: ${err.errMsg} (${duration}ms)`)
reject({
success: false,
url,
port,
path,
duration,
error: err.errMsg
})
}
})
})
return result
} catch (error) {
console.log(`${targetIP}:${port}${path} 连接失败:`, error.error)
continue
}
}
}
return {
success: false,
error: 'All target device endpoints failed'
}
}
/**
* 测试DNS解析
*/
async function testDNSResolution() {
const testDomains = [
'www.baidu.com',
'www.qq.com'
]
for (const domain of testDomains) {
try {
console.log(`🔍 测试DNS解析: ${domain}`)
const result = await new Promise((resolve, reject) => {
const startTime = Date.now()
uni.request({
url: `https://${domain}`,
method: 'HEAD', // 只获取头部,减少数据传输
timeout: 3000,
success: (res) => {
const duration = Date.now() - startTime
console.log(`✅ DNS解析成功 (${duration}ms)`)
resolve({
success: true,
domain,
duration
})
},
fail: (err) => {
const duration = Date.now() - startTime
console.log(`❌ DNS解析失败: ${err.errMsg} (${duration}ms)`)
reject({
success: false,
domain,
duration,
error: err.errMsg
})
}
})
})
return result
} catch (error) {
console.log(`${domain} DNS解析失败:`, error.error)
continue
}
}
return {
success: false,
error: 'All DNS resolution tests failed'
}
}
/**
* 生成连通性建议
*/
function generateConnectivityRecommendations(results) {
const recommendations = []
// 互联网连接建议
if (!results.internetAccess?.success) {
recommendations.push('🌐 互联网连接失败:')
recommendations.push(' - 检查手机是否真正连接到WiFi')
recommendations.push(' - 尝试打开浏览器访问网页')
recommendations.push(' - 检查WiFi是否需要认证')
}
// DNS解析建议
if (!results.dnsResolution?.success) {
recommendations.push('🔍 DNS解析失败')
recommendations.push(' - 网络可能存在DNS问题')
recommendations.push(' - 尝试切换到其他WiFi网络')
}
// 目标设备连接建议
if (!results.targetDeviceAccess?.success) {
recommendations.push('🎯 目标设备连接失败:')
recommendations.push(' - 确认ESP32设备已启动')
recommendations.push(' - 确认IP地址正确')
recommendations.push(' - 确认手机和ESP32在同一WiFi网络')
recommendations.push(' - 检查ESP32的HTTP服务是否正常运行')
if (results.internetAccess?.success) {
recommendations.push(' - 互联网连接正常,问题可能在局域网层面')
}
}
// 权限相关建议
recommendations.push('📱 权限检查:')
recommendations.push(' - 确保APP有网络访问权限')
recommendations.push(' - 确保APP有位置权限获取WiFi信息需要')
recommendations.push(' - 尝试重启APP或重新安装')
return recommendations
}
/**
* 打印连通性报告
*/
function printConnectivityReport(results) {
console.log('=' * 60)
console.log('📋 网络连通性测试报告')
console.log('=' * 60)
console.log('🌐 互联网连接:', results.internetAccess?.success ? '✅ 成功' : '❌ 失败')
if (results.internetAccess?.success) {
console.log(` 站点: ${results.internetAccess.site}`)
console.log(` 耗时: ${results.internetAccess.duration}ms`)
}
console.log('🏠 网关连接:', results.gatewayAccess?.success ? '✅ 成功' : '❌ 失败')
if (results.gatewayAccess?.note) {
console.log(` 说明: ${results.gatewayAccess.note}`)
}
console.log('🎯 目标设备连接:', results.targetDeviceAccess?.success ? '✅ 成功' : '❌ 失败')
if (results.targetDeviceAccess?.success) {
console.log(` URL: ${results.targetDeviceAccess.url}`)
console.log(` 状态码: ${results.targetDeviceAccess.statusCode}`)
}
console.log('🔍 DNS解析:', results.dnsResolution?.success ? '✅ 成功' : '❌ 失败')
if (results.recommendations.length > 0) {
console.log('\n💡 修复建议:')
results.recommendations.forEach(rec => console.log(rec))
}
console.log('=' * 60)
}
export default {
runConnectivityTest
}