0

私はGPSロガーからのデータを受け入れるアプリを実行しています。このデータはSMS、HTTP、またはTCPを介して送信されます。私はHTTP接続を使用してデータを送信していましたが、これはRailsアプリのGETリクエストを介して簡単に受信できました。

バッテリーを節約するために、接続を純粋なTCPに変更しましたが、nginxは現在これらのリクエストを受け付けていません。

nginxのaccess.logから:

HTTP:

xx.xx.xx.xxx - - [03/Mar/2013:20:17:45 -0500] "GET /?imei=123456789012345&rmc=$GPRMC,035106.000,A,4145.1451,N,08506.8784,W,1.56,176.49,010213,,*13,3656mV,AUTO HTTP/1.1" 302 247 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22"

TCP:

xx.xx.xx.xxx - - [03/Mar/2013:18:31:22 -0500] "imei=123456789012345&rmc=$GPRMC,233012.000,A,4221.6614,N,07106.1014,W,17.25,218.94,030313,,*21,4102mV,AUTO,310,260,ADB7,13EF,057,310,260,0000,0000,044,310,260,0000,0000,055,310,260,0000,0000,05A,310,260,0000,0000,059,310,260,0000,0000,05E,0,0,0000,0000,000,2" 400 172 "-" "-"

NginxでこれらのTCPリクエストをフィルタリングし、Railsアプリから利用できるHTTP GETリクエストとして処理する方法を知っている人はいますか?

前もって感謝します

答え:

em-proxyとfaradayを使用して、カスタムプロキシを作成することで、これを実現できました。

require 'em-proxy'
require 'faraday'

Proxy.start(:host => "0.0.0.0", :port => 8080, :debug => false) do |conn|

  conn.on_data do |data|
    http = Faraday.new(:url => 'http://example.com') do |faraday|
      faraday.request  :url_encoded             # form-encode POST params
      faraday.response :logger                  # log requests to STDOUT
      faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
    end
    http.get "/upload?#{data}"
  end
end
4

2 に答える 2

0

WebSocketを確認する必要があります。Nginxは現在、それらをネイティブでサポートしていますが、同様に機能するNginx用の古いモジュールがあります。

これは、両方のソリューションが提供されている、これに関する古い質問です。

于 2013-03-04T01:48:51.173 に答える
-2

NginxはHTTPサーバーであるため、クライアントがHTTPを話すことを期待しています。あなたが説明している方法でクライアントに非HTTPプロトコルをnginxに話させることはできません(それを行うためのカスタムモジュールを書くこともできますが、それはばかげているようです)。

私はあなたがする必要があるのは生のTCPプロトコルをHTTPリクエストに変換するあなた自身のプロキシサーバーを書くことだと思います。GPSロガーはプロキシと通信し、プロキシはnginxと通信します。TCPペイロードは単にurlencoded文字列であるように見えるので、これはかなり単純なはずです。したがって、それらを直接使用することができます。

于 2013-03-04T01:47:40.630 に答える