Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-XMLHttpRequest在网络ip上对Raspberry PI的请求在移动设备上失败,而不是在桌面上_Javascript_Websocket_Get_Raspberry Pi_Xmlhttprequest - Fatal编程技术网

JavaScript-XMLHttpRequest在网络ip上对Raspberry PI的请求在移动设备上失败,而不是在桌面上

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

我的网络上有一个树莓圆周率。我正在使用WebSocket连接到它并发送命令。我只需调用这行代码即可连接到它:
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发送之前。但是,我仍然不明白这在桌面上是如何工作的。我希望代码无论在哪里运行都会失败。