3

Bluetooth経由でデバイスに接続するためにPyBluezを使用しています。それはうまくいっています。デバイスは SPP を使用しており、BluetoothSocket (RFCOMM) を使用して接続します。

基本的なやり取りは次のとおりです。init コマンドの送信 -> 確認の受信。開始コマンドを送信 -> 連続データを受信; 停止コマンドを送信 -> ...

別のアプリからアプリケーションを制御できるようにする必要があります: 開始、停止... ZeroMQ またはおそらく Tornado と HTTP/REST ifc を考えていました。

私はこれをマルチスレッド アプリにすることにあまり熱心ではありません。私は C#/.NET でスレッドとそれらのプールを使って多くの作業をしてきましたが、ここでは実際には必要ないという予感があります。それどころか、かなりぐちゃぐちゃになると思います。

ただし、ZeroMQ/REST/ ... を介してコマンド (「開始」、「停止」など) を処理できる必要があり、データを継続的に受信し、時折パケットを送信します。

私はPythonに非常に慣れていないため、これを実装する方法がわかりません。BluetoothSocket を ZeroMQ/Tornado IOLoop に接続できますか?

私は Twisted を使ってほとんど何でも達成できると思っていますが、Twisted が提供するものすべてが本当に必要なわけではありません。Twisted を引き込む必要がある場合は、それを行います。私は実際に BluetoothSocketの Twisted実装を見つけました。繰り返しになりますが、Twisted は必要ですか?

Tornado IOLoop を使ってみました。例外はスローされませんが、データは送受信されません。

def eventhandler(s, events, error = None):
    if events & ioloop.IOLoop.READ:
        print 'Socket read: %r' % s.recv(1024)
    elif events & ioloop.IOLoop.ERROR:
        print 'Socket error!'

events = ioloop.IOLoop.READ | ioloop.IOLoop.ERROR
self._loop.add_handler(self._socket.fileno(), eventhandler, events)

私は今何をしているのかよくわかりません。最終的には方法を見つけますが、進むべき方向についてのヒントが必要です。

大規模な Google-fu ではあまり有用な情報が得られなかったので、ここで質問します。

編集:現在「gevent」を見ています。少なくとも Twisted よりも単純に思えます。

4

2 に答える 2

3

Twisted を使用する必要があります。あなたの本当の質問は、Twisted のサイズとリソースの使用率についてのようです。API の複雑さ、メモリ、ディスク上のパッケージ サイズ、展開の煩わしさ、または使用する可能性のある他のライブラリとの競合などの点で、それを使用するためにアプリケーションに不当なコストを支払うかどうか。

あなたはしません。

  1. API の複雑さ: Twisted の API は単純です。特定の FUD とは対照的に、それを効果的に使用するために何千もの API を学習する必要はありません。Twisted のコアには、いくつかの個別のレイヤーと、各レイヤー間の多くの明確に文書化された正式なインターフェースを持つ非常に無駄のない API があります。知りたいことがわかっている場合 (そしてわかっているように思われる場合) は、少しのガイダンスで簡単に理解できます。また、成熟したプロジェクトとして、コミュニティにはユーザーがスピードアップするのを助けることができる人がたくさんいます。
  2. メモリ使用量: Twisted は実行時の依存関係を管理し、必要なものだけをインポートするよう常に細心の注意を払ってきました。リアクターをロードしても IMAP 実装はロードされないため、必要なものをインポートするだけで、心配する必要はありません。
  3. パッケージサイズ: Twisted は 2 メガバイトです。さらに、一般的な UNIX-y OS (Linux、OS X、FreeBSD) を使用している場合は、おそらく Twisted のオペレーティング システム パッケージを既に入手しているでしょう。多くのディストリビューションでは、すでにインストールされています。
  4. 展開の煩わしさ: 何か問題を心配する場合は、これを考慮する必要がありますが、展開に関連する問題は実際には非常に小さなものです。「pip install Twisted」は正常に動作します (現時点では、C コンパイラがあれば)。Twistedは py2exe、 py2app 、および Debian パッケージで動作し、Python で動作する範囲で動作します。実際、誰もが問題を抱えているのはプラグイン システムだけであり、多くのアプリケーションではそれを無視することができます。
  5. ライブラリの競合: まったく問題ありません。Twisted は、GUI であろうとイベント ループであろうと、他のイベント ループ ライブラリがこれまでに思いついたすべての頭脳明晰なアイデアと互換性を保つために最善を尽くしています。ZMQを使いたいですか? 頑張れ。 竜巻? 確かに、何でも; 統合は双方向に行われます。 Tornado 自体は、このような統合をサポートしています。Twisted のブロッキング ライブラリを使用したいが、メイン スレッドを使用していてブロックしたくないですか? deferToThreadでカバーできます。ブロッキング ライブラリの Twisted 関数を使用したいのですが、ブロックする必要がありますか? わかりました、スレッドからブロッキング呼び出しを行うだけです。

これにより、Twisted が「やり過ぎ」であるという誤解が解消されることを願っています。

于 2012-11-30T15:05:46.093 に答える
2

これは直接的な経験の観点ではありませんが、私は少し調べました。選択する際に考慮する必要があるのは、ブロッキングIOと非ブロッキングIOです。

クイックリードから、PyBluezモジュール(ライブラリ)は非同期IOをサポートしていません。つまり、TornadoまたはTwistedのいずれかで読み取り/書き込みビットをすべて正しく処理するには、ライブラリを深く掘り下げる必要があります。

それが私のプロジェクトだった場合、おそらく私が行うことは、PyBluezライブラリをそれ自体のスレッドに入れてから、トルネードに戻るために相互作用するいくつかのキューを用意することです(私はトルネードファンです)。これで、BlueToothイベントをメインのIOLoopに配信する方法が問題になります。IOLoopは通常、選択でブロックされるため、実際には2つの選択肢があります。ソケットを自分自身に接続します。または、タイマーを設定して100ミリ秒ごとにコールバックし、Bluetoothキューに処理する必要のあるアクティビティがあるかどうかを確認します。

于 2012-11-30T15:56:35.240 に答える