私は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