2017-05-29 72 views
4

我有一個網頁來控制樹莓派上的恆溫器,並且在嘗試從遠程客戶端獲取websockets時遇到了困難。但是在局域網上看起來工作正常。我明顯錯過了一些東西(可能是基本的東西),但我似乎無法弄清楚它是什麼。websocket將無法連接遠程服務器

該pi的本地ip是192.168.1.134。該網頁(由Apache服務器提供)具有URL http://192.168.1.134:8010/thermostat.html。該頁面啓動一些JavaScript,然後嘗試通過ws://192.168.1.134:9000使用websockets連接到pi的主程序。 (pi上的服務器正在運行libwebsockets)。 websocket出現了,它似乎工作正常。然後,我嘗試通過遠程客戶端(一個手機,其中WiFi關閉)從http:\\23.239.99.99:8010\thermostat.html進行連接。 html/js文件加載正常,但Web套接字嘗試連接到uri ws:\\23.239.99.99:9000和這個樣本。

據我所知道的,NAT似乎是正確配置:

name   ext  ext protocol int  int  ip addr  interface 
       port port    port port 
       start end    start end 

Thermostat3  8010 8010 TCP  8010 8010 192.168.1.134 eth3.1 
Thermostat5  8000 8000 TCP/UDP 80  80  192.168.1.134 eth3.1 
Thermostat_ws 9000 9000 TCP/UDP 9000 9000 192.168.1.134 eth3.1 

我檢查,路由器沒有設置任何防火牆,同樣沒有我的調制解調器。我沒有在pi上安裝防火牆(我查了一下,沒有奇怪的iptables規則)。有誰知道我錯過了什麼?

---編輯---

我仍然停留在此。我打電話給我的ISP,他們向我保證他們的服務器上沒有防火牆。有沒有什麼辦法可以判斷9000端口是否被阻塞?

+1

兩種思想訪問:你_sure_的WS連接使用外部腹腔? (比如它在你的html中沒有被硬編碼並且沒有被更新?)更有用 - 嘗試使用443端口可能是值得的,因爲它通常比其他端口更「開放」(但是假設8010正在工作,那可能是伸展)。 – GregHNZ

+0

對不起,我已經離開了幾天,很慢回到這個。這些都是有效的點。 js代碼使用'ws_uri + =「//」+ window.location.host.replace(/\:.*$/,'')+「:9000」;'作爲uri,我打印出來正確顯示。我嘗試了443,但它具有相同的行爲(作品來自lan,而不是來自wan ...) – user2766918

回答

1

嘗試使用該工具來確定端口是無法訪問(使用自定義端口):http://www.whatsmyip.org/port-scanner/

其他的一切看起來不錯。作爲一個完整的檢查,我會嘗試將ws端口設置爲8010,以查看是否可行。我還建議使用像Advanced Web Client這樣的工具來隔離網絡問題。

0

這很有趣。我曾經有過類似的問題。我設置了一個WebSocket(我使用的是nodejs ws),並且一旦我嘗試從遠程客戶端訪問它,我無法通過ws://yourip:port訪問它,但我不得不使用http://yourip:port。我不知道你是否有同樣的問題,我的是由於我正在使用的代理。

我仍然有一個建議,你可能會如何解決你的問題。我不知道你對安全有多擔心,但據我瞭解你的想法,你基本上通過WebSocket連接到你的樹莓派,並告訴它改變溫度。
回來的時候做了一個類似的項目,我發現它很難保證我的WebSocket連接。我基本上是通過WebSocket發送密碼加命令到我的服務器,然後檢查密碼是否正確。否則,互聯網上的每個人都會爲你的房子加熱不爽...
但是,因此,我不得不通過https隧道連接來防止中間件攻擊。
我很快扔了毛巾,並決定採用完全不同的解決方案。基本上我建立了一個nodejs express服務器(可以很容易地配置一個自簽名證書來使用https或在一個nginx/apache https服務器後面使用)並使用用戶名和密碼進行身份驗證。當有人通過溫度請求向/ api/thermostats?id = 0發出POST請求時,服務器會檢查用戶是否已通過身份驗證,然後從節點內執行終端命令。
也許這個想法也符合你的要求。

+0

是的,這是我計劃繼續前進的內容。該網頁將通過https/wss提供,用戶將默認能夠查看狀態,但爲了更改溫度,js應用程序將不得不發送其憑證。憑據可以生成密碼驗證,或者可以將它們存儲/加載到設備上的cookie中。 – user2766918

2

將您的apache服務器綁定到0.0.0。0地址,使其從遠程計算機

+0

它可以從其他機器(即任何通過LAN連接的計算機)訪問,但不能通過路由器。理論上,路由器應該NAT外部訪問,所以它看起來像請求來到192.168.1.134,所以Apache應該不能看到差異... – user2766918

0

我認爲你需要配置Apache服務器允許外部訪問

相關問題