364 lines
9.8 KiB
JavaScript
364 lines
9.8 KiB
JavaScript
/**
|
||
* 网络连通性测试工具
|
||
* 专门用于测试移动设备的网络连接能力
|
||
*/
|
||
|
||
/**
|
||
* 全面的网络连通性测试
|
||
*/
|
||
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
|
||
}
|