Raspberry + socket.io在本地networking上工作,但不在外部工作

我有一个Raspberry Pi服务通过一个server.js文件的HTML页面。 主线(不是所有的代码)是:

var app = require('http').createServer(handler); var io = require('socket.io').listen(app); ... app.listen(8000); ... fucntion handler(req,res) { fs.readFile(__dirname+'/../index.html' function(err,data) { ... io.sockets.on('connection', function (socket) { setInterval(function(){ ... socket.emit('tempUpd',date,temp); }, 2000); }); 

在index.html上:

 <head> ... <script src="/socket.io/socket.io.js"></script> ... </head> <body> <div id="info"></div> --- <script> var socket = io.connect('http://192.168.1.6:8000'); socket.on('tempUpd', function(date, temp){ document.getElementById("info").textContent = temp; }); ... </script> </body> </html> 

正如你所看到的,这个想法是每2秒更新一次温度测量。

当我通过本地networking(使用无线)从我的智能手机连接到我的Raspberry PI时,一切正常,我可以访问网页,看到温度值每2秒变化一次。

当我closures智能手机上的无线networking,并通过移动networking连接到树莓(已configuration我的路由器,以允许连接传递到树莓派),我可以看到网页,但通过套接字传递的所有信息是从未显示。

考虑到由于某种原因,我无法在该页面上看到dynamic元素,我添加了另一个元素,并添加了一些代码,以便每隔两秒用setInterval显示当前时间。 我看到时间在改变,但没有任何东西通过套接字得到显示。 再次,我切换到本地networking,一切都可见,包括通过套接字传递的信息。

任何想法可能会发生什么? 非常感谢你!!

192.168.1.6是本地networking地址。 您不能从本地networking外部访问该地址。 移动networking在您的本地networking之外。 从手机使用WiFi时,您将连接到本地networking内的接入点,然后您可以路由到192.168.1.6

要从公共移动networking(从您自己的本地networking以外)访问它,您必须拥有一个从本地networking外部路由到您的服务器的公共IP地址。

解决这个问题的常见方法是为您的Internet连接获取一个公共IP地址(或者使用dynamicDNS来分配DHCP地址),然后在您的Internet路由器上configuration“端口转发”。 这会将传入的数据包发送到您的公共IP地址上的特定端口,并将它们转发到内部networking上的特定设备(例如您的Raspberry Pi)。

您需要更新index.html页面以根据节点服务器的IP地址dynamic地打开您的套接字。 正如其他人指出的,当你从互联网连接到服务器,你的Pi不是在192.168.1.6。 (这是你的本地networking)

如果你能够打网页,那么你有你的路由器正确转发的东西。

在你的index.html页面上,将行改为:

 var socket = io.connect('http://192.168.1.6:8000'); 

至:

 var socket = io.connect('http://' + location.host + ':8000'); 

还要确保你的路由器上的8000端口也转发给你的Pi。

祝你好运。

–ed