2010-10-15 3 views
0

Недавно я играл с модулем pybluez для сканирования ближайших устройств Bluetooth. Теперь я хочу расширить программу, чтобы найти поблизости WiFi-клиентские устройства.разработка для модульности и повторного использования: как обращаться с True Loops?

Для сканирования монитора необходимо будет иметь петлю While True. Если бы я написал это как прямое, одно файловую программу, было бы легко.

import ... 

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

Я хочу, однако, сделать это модулем. Я хочу, чтобы иметь возможность повторно использовать его позже, и, возможно, другие используют его. Я не могу понять, как обращаться с циклом.

import mymodule 

scan() 

Предполагая, что первый пример кода был «mymodule», эта программа просто распечатала данные в стандартном режиме. Я хотел бы иметь возможность использовать эти данные в своей программе, а не распечатывать модуль ...

Как я должен код модуля?

ответ

1

Я думаю, что лучший подход заключается в том, чтобы сканер работал по отдельному потоку из основной программы. Модуль должен иметь методы, которые запускают и останавливают сканер, а другой, который возвращает текущий список точек доступа (используя блокировку для синхронизации). См. threading module.

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.

0

Если у вас есть вопрос, вы хотите, чтобы scan() в отдельном файле, чтобы его можно было повторно использовать позже.

Создать utils.py

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

Создать WiFi.py

import utils 

def scan_wifi(): 
    while True: 
     cli = utils.scan() 
    ... 
    return 
1

Два интерфейса будут полезны.

  1. сканирование(), которое вернуло список найденных устройств, чтобы я мог позвонить ему, чтобы получить мгновенный снимок доступного 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) 
    
+0

Upvoted за идею обратного вызова, это было бы очень полезно. – kindall