JavaScript - XMLHttpRequest для Raspberry PI в сети ip не работает на мобильном, а не на рабочем столе - PullRequest
0 голосов
/ 23 января 2020

У меня есть Raspberry PI в моей сети. Я использую WebSocket для подключения к нему и отправки команд. Я подключаюсь к нему, просто вызывая эту строку кода: window.socket = new WebSocket(rpIP) rpIP может быть ws://10.58.3.146//ws

Но IP-адрес ПИ является динамическим c, поэтому я использую клиента (javascript) сканировать PI в сети. Я настроил PI для ответа на порт 58 как единственное устройство в сети.

Мой лог c заключается в том, что если я пытаюсь сделать запрос на все возможные 255 IP-адресов в сети, только один должен отвечать. Это прекрасно работает в настольном браузере. Я нахожу ПИ и могу отправлять ему команды. Но на мобильном устройстве (я пробовал и Android, и iOS) это не удается, я получаю следующую ошибку: net :: ERR_CONNECTION_REFUSED

Код сканера:

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')
        }
    }
}

Функция addDebugMsg - это просто функция, которую я сделал, чтобы показать на странице, когда найден PI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...