2014-02-27 34 views
0

我有一個設備連接到路由器後面的家庭網絡,該路由器需要接收激活某個功能的請求。發送HTTP請求到路由器後面的設備

我現在這樣做的方式是,我在路由器中設置了端口轉發,它處理這些外部請求並將它們轉發給設備。

據我所知,另一種方法是保持與服務器的開放套接字連接並不斷地收聽這些消息,但我會盡量避免這種情況,因爲數據傳輸每天都會發生一次一直保持開放連接將花費寶貴的服務器資源。

我仍然需要發送這些數據和設備在數據傳遞給它的同時被觸發。

我也考慮過每隔5分鐘左右從設備上拉新消息,但這樣我就失去了實時效果。

需要編寫一個服務器,該服務器可以通過擴展與至少10 000個這樣的設備進行通信。最好用Ruby on Rails或Node.js編寫。

一個請求平均每天發送一次,作爲一條小消息。

那麼實現這一目標的最佳選擇是什麼?考慮到不久的將來擴展,我如何從服務器「推」到設備?

編輯:

考慮通/斷開關裝置作爲一個。交換機可以在實際設備上手動翻轉或由服務器遠程觸發。當被手動觸發時,它將負責將狀態傳播到服務器,當被遠程觸發時,它應該監聽並響應來自服務器的消息,這可能在任何時候發生(所以設備無法ping通服務器的狀態,需要實時)。

+1

什麼樣的設備/操作系統的客戶端? –

+0

其微控制器。支持Http請求,我不建立它,但我很確定它可以處理套接字,不確定是否有用於websockets的庫。 – DArkO

+0

爲您寫作答案 –

回答

1

您可以使用Rails的用於數據處理系統(存儲信息等)

我在想這個確切的事情昨晚:

  1. Rails會創建一系列endpoints
  2. 當您的「設備」想要通信時,它將不得不向端點發起請求
  3. 設備將推送到Rails端點

設備

不知道該設備是什麼,我會想象它的工作方式是,它必須能夠發起一個POST請求(想象一個Rasberry Pi發送數據)時的東西發生

如果您的設備是牙刷,你得有能力(無論是在芯片或外部),它連接到網絡&將數據發送到您的(插入框架)服務器


Rails的

的Rails可以處理像這樣(這是我們的一些現場分析系統的代碼,其以相似的方式工作):

#config/routes.rb 
post "/update", to: "messages#create" 

#app/controllers/messages_controller.rb 
protect_from_forgery with: :null_session  
before_action :authenticate 

#Data 
def create 
    #create message here 
end 

private 

# have to give x a "token" 
def authenticate 
authenticate_or_request_with_http_token do |token, options| 
    user = User.exists?(public_key: token) 
    @token = token if user 
end 
end 

這將創建端點:

domain.com/update 

您必須在標題中發送您的authentication token,並且可能需要使用rack-CORS(或其他CORS策略管理器)來處理的X域交易:

#config/application.rb 
config.middleware.use Rack::Cors do 
    allow do 
     origins '*' 
     resource '/update*', :headers => :any, :methods => :post 
    end 
end 

數據

Rails的東西是MVC application(可根據您的後端服務器資源的比例)

當您想將設備集成到後端時,會出現棘手的部分。你提到你可以支持HTTP請求 - 招會「如何」

  1. 你必須要整合一些認證(可能是序列號),這將有存在於你的Rails DB
  2. 這將隨後通過該設備通過網絡發送到您的端點
  3. 一旦你有要求,Rails可以處理它在服務器上&返回響應

所以最大的問題是 - 你的設備如何與服務器通信?


交叉通信

Server -> Device通信push technology

  1. 設備將ping命令(在瀏覽器中通過JS,在別人不知道) 「現場直播」
  2. 服務器會發送數據到特定的「頻道」
  3. 如果設備訂閱了頻道,它將會l接收更新

的問題已經不再是「網絡套接字」技術,因爲它是"sub/pub"

在瀏覽器的世界裏,你基本上打開使用Javascript永久連接。這可以通過使用SSE's(榮耀long-polling)或websockets

兩者都可以通過「聽」到您的頻道上的事件進行訪問來完成:

#Pusher 
channel.bind('my-event', function(data) { 
    alert('An event was triggered with message: ' + data.message); 
}); 

#SSE's 
var source = new EventSource("demo_sse.php"); 
source.onmessage = function(event) { 
    document.getElementById("result").innerHTML + =event.data + "<br>"; 
}; 

在設備方面,我會在看您希望從服務器接收數據的頻率。當然,發送數據是「按需」服務,但接收確實像你說的,隨身攜帶的開銷

如果你每天只能預期的消息,我想看看使用某種long-polling技術每小時查找數據;如果您需要立即的消息,我想看看集成與網絡插口


服務器

在服務器上處理這種持久連接將下降到您的服務器可以有多少個併發連接如果您正在使用AWS處理

,你就可以比較簡單地規模,但每個連接將被歸類爲「併發」

+0

當談到設備 - >服務器通信時,我的思維方向是一致的。該設備完全能夠完成您所描述的內容。它是連接到傳輸射頻信號的路由器的盒子。我很好奇另一種方式。服務器如何將消息推送到路由器後面的設備。所以服務器 - >設備。據我所知,該設備需要成爲必須打開連接的設備,否則服務器無法連接。 – DArkO

+0

如果您提交POST請求,該請求的「響應」將直接發送到設備(如瀏覽器的工作方式)。然而,如果你想從服務器發送消息,你將不得不使用類似web套接字([Pusher](http://pusher.com))技術 –

+0

我可以寫一些信息關於如果你想要? –