2010-10-15 35 views
0

我一直在玩最近的pybluez模塊來掃描附近的藍牙設備。我現在想要做的是擴展程序,以找到附近的WiFi客戶端設備。爲模塊化和可重用性而開發:如何處理True循環?

WiFi客戶端掃描器將需要有一個While True循環來持續監控電波。如果我把它寫成一個簡單的文件程序,那很簡單。

import ... 

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

但是,我想要的是讓這個模塊。我希望能夠稍後重用它,並且可能還有其他人也使用它。我無法弄清楚的是如何處理循環。

import mymodule 

scan() 

假設第一個示例代碼是'mymodule',這個程序只是將數據輸出到stdout。我希望能夠在我的程序中使用這些數據,而不是將模塊打印出來......

我該如何對模塊進行編碼?

回答

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. 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) 
    
+0

Upvoted回調的想法,那將是非常有用的。 – kindall 2010-10-16 06:27:05