web-dev-qa-db-ja.com

WebSocketからHTTPメソッドにデータを転送するためのアプリケーション

ConBee 2(ZigBee)インターフェイスが接続されたRaspberry Piを持っています。 ConBeeは、センサーの変更に関するプッシュ通知を取得するために接続できるWebソケットを提供します。そして、HTTPメソッドのURLを使用してこれらの通知を転送したいと考えています。

現在のステータスは、ConBee(Phoscon)が動作していることです。たとえば、 SocketWrenchアプリケーション。 Websocketメッセージのペイロード(およびメタデータの一部)をJSONオブジェクトとしてフォーマットし、HTTPメソッド要求(POST)として送信したい。

すぐに、起動時にRaspberry Piで小さなC(またはPython)アプリケーションを実行することを考えています。しかし、これを行うより良い方法はありますか?

2
Oystein

「シリアルポート」の代わりに用語websocketを使用していて、HTTP経由でデータを転送(公開)する方法を指定していない。ほとんどの場合、RPIから「3番目」のデバイスにhttp呼び出しを行う予定ですが、RPIデバイスで実行されているWebインターフェースを介してデバイスを公開することもできます。だからあなたの質問は少し紛らわしく見えるかもしれません。おそらくそれが反対票の理由です。

1)phosconが提供するRPI SDカードイメージを試してみてください。このようにして、デバイスを操作可能にします。これにより、シリアルコンソールでデータの転送に使用されるプロトコルをリバースエンジニアリングすることもできます。 2)本当にDIYになりたい場合は、node.jsを使用してプロトタイプを作成することをお勧めします-転送の両方のオプションを実装できます(Webクライアントvs Webサーバー)。 RPIデバイスの1つを実行しているnode.jsサーバーがあります。稼働時間は40日で、ノードプロセスのフットプリントはわずか100Mbです。そのため、プロトタイピングだけでなく「プロダクション」バージョンにも使用できます。 3)アプリケーションのフットプリントを削減したい場合は、C、Go、またはRustでやり直すことができます。Go/ Rustを実行することをお勧めします。

PS:私はJavaScriptが楽しくありませんが、プロトタイプを作成するときに達成できる速度が好きです。

PDATE:したがって、シリアルポートからデータを読み取り、接続されているすべてのWebクライアントへのメッセージストリームに変換するソフトウェアがすでにあります。

次に、RPIとZigBeeに関する情報は、「あるサーバーからのWebSocketメッセージを消費し、プレーンHTTPリクエストを介して別のサーバーにデータを再送信するにはどうすればよいですか」という実際の質問とは無関係です。

おそらく次のスニペットがあなたのために働くでしょう:

#!/usr/bin/env node
var WebSocketClient = require('websocket').client;

var request = require('request');


var client = new WebSocketClient();

client.on('connectFailed', function(error) {
    console.log('Connect Error: ' + error.toString());
});

client.on('connect', function(connection) {
    connection.on('error', function(error) {
        console.log("Connection Error: " + error.toString());
    });
    connection.on('close', function() {
        console.log('echo-protocol Connection Closed');
    });
    connection.on('message', function(message) {
//forward data to the server2
       console.log("Received: '" + message.utf8Data + "'");
    request.post('http://server2/api-end-point',  { json: message },
        function (error, response, body) {
            if (!error && response.statusCode == 200) {
                console.log(body);
            }
            }
    );
    });

});

client.connect('ws://localhost:80/', 'uri-to-ws-endpoint');
3