0

我最近一直在使用 pybluez 模块来扫描附近的蓝牙设备。我现在要做的是扩展程序以查找附近的 WiFi 客户端设备。

WiFi 客户端扫描仪需要有一个While True循环来持续监控电波。如果我把它写成一个直接的、一个文件程序,那就很容易了。

import ...

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

然而,我想要的是把它变成一个模块。我希望以后能够重复使用它,并且可能让其他人也使用它。我不知道如何处理循环。

import mymodule

scan()

假设第一个示例代码是“mymodule”,该程序将简单地将数据打印到标准输出。我希望能够在我的程序中使用这些数据,而不是让模块打印出来......

我应该如何编码模块?

4

4 回答 4

1

我认为最好的方法是让扫描仪在与主程序不同的线程上运行。该模块应该具有启动和停止扫描仪的方法,以及另一个返回当前访问点列表的方法(使用锁进行同步)。请参阅线程模块

于 2010-10-15T03:13:17.140 回答
1

一些非常简单的事情怎么样:

我的模块.py

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

其他模块.py

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

如果您想要比这更有用的东西,我还建议像@kindall 那样使用后台线程。

于 2010-10-15T03:30:56.740 回答
1

两个接口会很有用。

  1. scan() 本身,它返回一个找到的设备列表,这样我就可以调用它来获取可用蓝牙的即时快照。它可能需要一个 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 回答
0

如果我得到您的问题,您希望scan()在一个单独的文件中,以便以后可以重复使用。

创建utils.py

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

创建WiFi.py

import utils

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