JavaScript-XMLHttpRequest在网络ip上对Raspberry PI的请求在移动设备上失败,而不是在桌面上
我的网络上有一个树莓圆周率。我正在使用WebSocket连接到它并发送命令。我只需调用这行代码即可连接到它:JavaScript-XMLHttpRequest在网络ip上对Raspberry PI的请求在移动设备上失败,而不是在桌面上,javascript,websocket,get,raspberry-pi,xmlhttprequest,Javascript,Websocket,Get,Raspberry Pi,Xmlhttprequest,我的网络上有一个树莓圆周率。我正在使用WebSocket连接到它并发送命令。我只需调用这行代码即可连接到它:window.socket=newwebsocket(rpIP) 但是PI的IP是动态的,所以我使用客户端(javascript)在网络上扫描PI。我已将PI设置为在端口58处响应,作为网络上唯一的设备 我的逻辑是,如果我试图向网络上所有可能的255个IP发出请求,只有一个IP应该响应。这在桌面浏览器上非常有效。我找到PI,我可以向它发送命令。但是在一个移动设备上(我已经尝试了Androi
window.socket=newwebsocket(rpIP)
但是PI的IP是动态的,所以我使用客户端(javascript)在网络上扫描PI。我已将PI设置为在端口58处响应,作为网络上唯一的设备
我的逻辑是,如果我试图向网络上所有可能的255个IP发出请求,只有一个IP应该响应。这在桌面浏览器上非常有效。我找到PI,我可以向它发送命令。但是在一个移动设备上(我已经尝试了Android和iOS),失败了,我得到了以下错误:net::ERR\u CONNECTION\u拒绝
扫描程序代码:
let myIp = '10.58.3.33';
let ipToCheck = 0;
let targetPort = 58;
let rpIP;
checkIp();
function checkIp() {
callError = false
if(ipToCheck < 255 && !rpIP) {
let ipArray = myIp.split('.');
ipArray[3] = ipToCheck;
addDebugMsg('Trying to connect to: ' + ipArray.join('.') + ':' + targetPort);
let loading = setInterval(function() {
addDebugMsg('.', false)
}, 500);
let request = new XMLHttpRequest();
request.open('GET', location.protocol + '//' + ipArray.join('.') + ':' + targetPort, true);
request.timeout = 1000;
request.onload = function(e) {
clearInterval(loading);
console.log(e)
if(request.status == 404) {
addDebugMsg('nope! - Pi\'s not here');
ipToCheck++;
checkIp();
} else {
addDebugMsg('YAY! - We found the Pi');
rpIP = protocol + '//' + ipArray.join('.') + '//ws';
ipToCheck++;
checkIp();
}
};
request.ontimeout = function() {
clearInterval(loading);
addDebugMsg('nope! - Pi\'s not here');
clearInterval(loading);
ipToCheck++;
checkIp();
}
request.send();
} else {
addDebugMsg('Scan done!');
if(rpIP) {
addDebugMsg('Found Rasberry PI at: ' + rpIP);
window.socket = new WebSocket(rpIP);
window.socket.onmessage = function(e) {
handleSocketMessage(e.data);
}
} else {
addDebugMsg('No Pi on network')
}
}
}
让myIp='10.58.3.33';
设ipToCheck=0;
设targetPort=58;
让rpIP;
checkIp();
函数checkIp(){
callError=false
if(ipToCheck<255&&!rpIP){
设ipArray=myIp.split('.');
ipArray[3]=ipToCheck;
addDebugMsg('正在尝试连接到:'+ipArray.join('.')+':'+targetPort);
让加载=设置间隔(函数(){
addDebugMsg('.',false)
}, 500);
let request=new XMLHttpRequest();
请求.open('GET',location.protocol+'/'+ipArray.join('.')+':'+targetPort,true);
request.timeout=1000;
request.onload=函数(e){
清除间隔(装载);
控制台日志(e)
if(request.status==404){
addDebugMsg('不!-Pi不在这里');
ipToCheck++;
checkIp();
}否则{
addDebugMsg('YAY!-我们找到了Pi');
rpIP=protocol+'/'+ipArray.join('.')+'//'/ws';
ipToCheck++;
checkIp();
}
};
request.ontimeout=函数(){
清除间隔(装载);
addDebugMsg('不!-Pi不在这里');
清除间隔(装载);
ipToCheck++;
checkIp();
}
request.send();
}否则{
addDebugMsg('Scan done!');
if(rpIP){
addDebugMsg('在:'+rpIP处找到Rasberry PI);
window.socket=新的WebSocket(rpIP);
window.socket.onmessage=函数(e){
handleSocketMessage(如数据);
}
}否则{
addDebugMsg('网络上没有Pi')
}
}
}
addDebugMsg
函数只是我制作的一个函数,当is找到PI时,它会显示在页面上。当然它会。它遇到了一个错误,而您没有处理该错误。需要澄清的是,mobile上的代码确实找到了正确的IP,但在window.socket=new WebSocket(rpIP)时失败代码>,对吗?(然而,我真的很惊讶这一切都能起作用,因为当你试图从非服务器获取404时,没有什么可以返回的)@ChrisG。当呼叫(在手机上)遇到IP时,请求没有超时。发送()失败并给出错误。请尝试添加request.onerror=request.ontimeout代码>发送之前。但是,我仍然不明白这在桌面上是如何工作的。我希望代码无论在哪里运行都会失败。当然会。它遇到了一个错误,而您没有处理该错误。需要澄清的是,mobile上的代码确实找到了正确的IP,但在window.socket=new WebSocket(rpIP)时失败代码>,对吗?(然而,我真的很惊讶这一切都能起作用,因为当你试图从非服务器获取404时,没有什么可以返回的)@ChrisG。当呼叫(在手机上)遇到IP时,请求没有超时。发送()失败并给出错误。请尝试添加request.onerror=request.ontimeout代码>发送之前。但是,我仍然不明白这在桌面上是如何工作的。我希望代码无论在哪里运行都会失败。