No se puede abrir websocket en dispositivos móviles

Estoy intentando configurar un websocket con el servidor ejecutándose en mi raspberry pi. El siguiente código está ligeramente modificado de un ejemplo que encontré aquí .

He construido una página web completa en torno a este ejemplo que me permite controlar gpio y enviar mensajes a un dispositivo serie conectado al pi. Tanto el sitio como este ejemplo funcionan perfectamente desde mi computadora portátil (Windows 10 con Chrome o Firefox).

Sin embargo, cuando me conecto desde mi teléfono (Android 5.0.1 usando Chrome para Android). Parece que nunca se abre el zócalo. En el código de ejemplo solo muestra “los mensajes van aquí.

Mi primer pensamiento fue que Chrome en Android no era compatible con websockets, pero pude conectarme y hacer eco de los mensajes en este sitio http://www.websocket.org/echo.html . Así que parece que la funcionalidad está ahí.

¿Qué más evitaría que el zócalo se abra?

pysocket.py

import tornado.httpserver import tornado.websocket import tornado.ioloop import tornado.web class WSHandler(tornado.websocket.WebSocketHandler): def check_origin(self, origin): return True def open(self): print 'New connection was opened' self.write_message("Welcome to my websocket!") def on_message(self, message): print 'Incoming message:', message self.write_message("You said: " + message) def on_close(self): print 'Connection was closed...' application = tornado.web.Application([ (r'/ws', WSHandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8888) tornado.ioloop.IOLoop.instance().start() 

pysocket.php

    WebSockets with <a href="https://www.pythond.com/py/python" title="Topics of Python" target="_blank">Python</a> & Tornado   body { text-align: center; min-width: 500px; }    $(function(){ var ws; var logger = function(msg){ var now = new Date(); var sec = now.getSeconds(); var min = now.getMinutes(); var hr = now.getHours(); $("#log").html($("#log").html() + "
" + hr + ":" + min + ":" + sec + " ___ " + msg); //$("#log").animate({ scrollTop: $('#log')[0].scrollHeight}, 100); $('#log').scrollTop($('#log')[0].scrollHeight); } var sender = function() { var msg = $("#msg").val(); if (msg.length > 0) ws.send(msg); $("#msg").val(msg); } ws = new WebSocket("ws://raspberrypi-mike:8888/ws"); ws.onmessage = function(evt) { logger(evt.data); }; ws.onclose = function(evt) { $("#log").text("Connection was closed..."); $("#thebutton #msg").prop('disabled', true); }; ws.onopen = function(evt) { $("#log").text("Opening socket..."); }; $("#msg").keypress(function(event) { if (event.which == 13) { sender(); } }); $("#thebutton").click(function(){ sender(); }); });

WebSockets with Python & Tornado

Messages go here
www.LowPowerLab.com

Para que los nombres de host de los dispositivos funcionen a través de la red, un dispositivo debe anunciar su propio nombre de host o simplemente responder a las consultas de DNS para su propio nombre de host.

Cualquiera que sea la implementación que esté utilizando la Raspberry Pi, su computadora portátil la admite, pero su teléfono no.

Por lo tanto, para poder conectarte, debes cambiar tu nombre de host raspberrypi-mike a la dirección IP de tu Raspberry Pi, dentro de tu código JavaScript.

AÑADIDO ALGÚN CÓDIGO EXTRA

Recomendaría usar node.js para eso:

 var express = require("express"); var app = express(); var http = require("http").Server(app); var path = require("path"); var io = require('socket.io')(http); var SerialPort = require('serialport'); var gpio = require('rpio'); http.listen(3000); var serialPort = new SerialPort.SerialPort("/dev/ttyAMA0", { baudrate: 115200, dataBits: 8, parity: "none", stopBits: 1, flowControl: false }); io.on('connection', function(socket){ console.log('Connected'); socket.on("WriteSerial:get",function(data){ var hex = new Buffer (data, "hex"); //be careful passing data writeSerial(serialPort, hex); io.emit("WriteSerial:response", "Data writen!"); }); socket.on("ReadGPIO:get",function(data){ var input = readPin(data.pin); io.emit("ReadGPIO:response", input); }); socket.on("WriteGPIO:get",function(data){ writePin(data.pin, data.time); io.emit("WriteGPIO:response", "Set!"); }); socket.on("unWriteGPIO:get",function(data){ unwritePin(data); io.emit("unWriteGPIO:response", "Set!"); }); } app.use(express.static(path.join(__dirname, '/'))); app.get("/home",function(req,res,next){ res.sendFile(path.join(__dirname + "/index.html")); }); function writeSerial (port, data) { port.write(data, function(err) { if (err) { return console.log('Error on write: ', err.message); } else { console.log('Data written: ' + data); } }); } function readPin(pin){ rpio.open(pin, rpio.INPUT); var read = rpio.read(pin) ? 'high' : 'low'; return read; } function writePin(pin, timeInMs){ rpio.open(pin, rpio.OUTPUT, rpio.LOW); rpio.write(pin, rpio.HIGH); if (timeInMs > 0) { setTimeout(function(){ rpio.write(pin, rpio.LOW); }, timeInMs); } //You can put 0 if You want it to be high until You shut it down } function unWritePin(pin){ if(readPin(pin) === 'high') { rpio.write(pin, rpio.LOW); } else { console.log("Pin already low!"); } } 

Asegúrese de haber instalado el node.js con la versión correcta. Si no lo hace en terminal:

sudo apt-get remove nodered && sudo apt-get remove nodejs nodejs-legacy && curl -sL https://deb.nodesource.com/setup_4.x | sudo bash – && sudo apt-get install -y nodejs

Haga una carpeta ‘servidor’ en ‘/ home / pi /’, agregue server.js a ella. Agregue el código que proporcioné a server.js. Abre esa carpeta con el terminal:

cd / home / pi / server /

Después de eso, instale todos los módulos utilizados en el servidor:

sudo npm install express && sudo npm install http && sudo npm install path && sudo npm install socket.io && sudo npm install serialport –unsafe-perm && sudo npm install rpio –unsafe-perm

Ahora todo lo que tenemos que hacer es crear parte del lado del cliente. En la carpeta ‘/ home / pi / server’, cree el archivo index.html y agregue la carpeta llamada ‘js’. En la carpeta ‘js’ agregue socket.io.js para el lado del cliente que puede encontrar en la carpeta ‘/home/pi/server/node_modules/socket.io/node_modules/socket.io-client/’ .

Incluya socket.io.js para el lado del cliente en Su index.html de esta manera:

  

También agregue el archivo main.js a la carpeta ‘js’ donde colocará su código javascript y lo incluirá en index.html:

   

No haré ningún gráfico para, pero aquí está el código de main.js:

 $(document).ready(function() { var socket = io.connect('http://your_ip_address_rpi:3000'); $( "#myButton" ).click(function(){ io.emit("WriteSerial:get", $("#myTextHolder").val()); //"FAAF531C" this is string of hex, should be added some filter to pass error when char is not part of HEX! }); $( "#myButton2" ).click(function(){ io.emit("WriteGPIO:get", {"pin" : $("#myPinHolder").val(), "time" : $("#myTimeHolder").val()}) } 

Para ejecutar el servidor en el inicio de RPI, agregue ‘sudo node /home/pi/server/server.js &’ a ‘/etc/rc.local’ antes de ‘exit 0’ con el editor ‘sudo nano’.

Funcionará realmente bien en cualquier dispositivo.