0

最近、近くの Bluetooth デバイスをスキャンするために pybluez モジュールをいじっています。ここでやりたいことは、近くの WiFi クライアント デバイスも検出するようにプログラムを拡張することです。

While TrueWiFi クライアント スキャナーには、電波を継続的に監視するためのループが必要です。これをまっすぐな 1 つのファイル プログラムとして書くとしたら、それは簡単です。

import ...

while True:
    client = scan()
    print client['mac']

しかし、私が望むのは、これをモジュールにすることです。後で再利用できるようにしたいし、できれば他の人にも使ってもらいたい。私が理解できないのは、ループを処理する方法です。

import mymodule

scan()

最初のサンプル コードが「mymodule」であると仮定すると、このプログラムは単純にデータを stdout に出力します。モジュールに出力させる代わりに、プログラムでこのデータを使用できるようにしたいと思います...

モジュールはどのようにコーディングすればよいですか?

4

4 に答える 4

1

2 つのインターフェイスが役立ちます。

  1. scan() 自体は、見つかったデバイスのリストを返しました。これを呼び出して、利用可能な bluetooth の瞬間的なスナップショットを取得できました。max_seconds_to_search または max_num_to_return パラメータが必要になる場合があります。
  2. コールバックを受け付けた「見つかったら通知」機能。たとえば(おそらくタイプミス、私はこれを袖口から書きました)。

    def find_bluetooth(callback_func, time_to_search = 5.0):
      already_found = []
      start_time = time.clock()
      while 1: 
        if time.clock()-start_time > 5.0: break
        found = scan()
        for entry in found:
          if entry not in already_found:
            callback_func(entry)
            already_found.append(entry)
    

    これを行うことで使用されます:

    def my_callback(new_entry):
      print new_entry    # or something more interesting...
    
    
    find_bluetooth(my_callback)
    
于 2010-10-15T03:51:11.620 に答える
1

最善の方法は、スキャナをメイン プログラムとは別のスレッドで実行することだと思います。モジュールには、スキャナーを開始および停止するメソッドと、現在のアクセス ポイント リストを返す別のメソッド (ロックを使用して同期する) が必要です。threading モジュールを参照してください。

于 2010-10-15T03:13:17.140 に答える
1

次のような非常に簡単なものはどうですか:

mymodule.py

import ...
def scanner():
    while True:
        client = scan()
        yield client['mac']

othermodule.py

import mymodule
for mac in mymodule.scanner():
    print mac

それよりも便利なものが必要な場合は、@kindall が行ったようにバックグラウンド スレッドも提案します。

于 2010-10-15T03:30:56.740 に答える
0

If I get your question, you want scan() in a separate file, so that it can be reused later.

Create utils.py

def scan():
    # write code for scan here.

Create WiFi.py

import utils

def scan_wifi():
    while True:
        cli = utils.scan()
    ...
    return
于 2010-10-15T03:35:25.433 に答える