2015-09-27 173 views
5

我正在使用bluepy編寫一個程序,用於偵聽由藍牙設備發送的特徵。我也可以使用任何庫或語言,唯一的約束是在Linux上運行,而不是在移動環境中(似乎廣泛用於移動設備,沒有人使用BLE與桌面)。 使用bluepy我註冊的代表,並試圖註冊通知後調用write('\x01\x00')藍牙rfc中所述。 但它不起作用,收到任何特徵通知。 也許我寫錯了訂閱的訊息。 我寫的小片段有錯誤嗎?非常感謝。BLE使用gatttool或bluepy訂閱通知

class MyDelegate(btle.DefaultDelegate): 

    def __init__(self, hndl): 
     btle.DefaultDelegate.__init__(self) 
    self.hndl=hndl; 

    def handleNotification(self, cHandle, data): 
    if (cHandle==self.hndl): 
      val = binascii.b2a_hex(data) 
      val = binascii.unhexlify(val) 
      val = struct.unpack('f', val)[0] 
      print str(val) + " deg C" 


p = btle.Peripheral("xx:xx:xx:xx", "random") 

try: 
    srvs = (p.getServices()); 
    chs=srvs[2].getCharacteristics(); 
    ch=chs[1]; 
    print(str(ch)+str(ch.propertiesToString())); 
    p.setDelegate(MyDelegate(ch.getHandle())); 
    # Setup to turn notifications on, e.g. 
    ch.write("\x01\x00"); 

    # Main loop -------- 
    while True: 
     if p.waitForNotifications(1.0): 
     continue 

     print "Waiting..." 
finally: 
    p.disconnect(); 

回答

1

看起來問題是,您正試圖將\x01\x00寫入特徵本身。您需要將其寫入客戶端特徵配置描述符(0x2902)。句柄可能比特徵大1(但您可能需要通過閱讀描述符進行確認)。

ch=chs[1] 
cccd = ch.valHandle + 1 
cccd.write("\x01\x00") 
2

我一直在爲自己掙扎,jgrant的評論確實有幫助。我想分享我的解決方案,如果它可以幫助任何人。

請注意,我需要指示,因此x02而不是x01。

如果有可能使用藍圖讀取描述符,我會這樣做,但它似乎不起作用(bluepy v 1.0.5)。服務類中的方法似乎丟失了,並且當我嘗試使用它時,外圍類中的方法卡住了。

from bluepy import btle 

class MyDelegate(btle.DefaultDelegate): 
    def __init__(self): 
     btle.DefaultDelegate.__init__(self) 

    def handleNotification(self, cHandle, data): 
     print("A notification was received: %s" %data) 


p = btle.Peripheral(<MAC ADDRESS>, btle.ADDR_TYPE_RANDOM) 
p.setDelegate(MyDelegate()) 

# Setup to turn notifications on, e.g. 
svc = p.getServiceByUUID(<UUID>) 
ch = svc.getCharacteristics()[0] 
print(ch.valHandle) 

p.writeCharacteristic(ch.valHandle+1, "\x02\x00") 

while True: 
    if p.waitForNotifications(1.0): 
     # handleNotification() was called 
     continue 

    print("Waiting...") 
    # Perhaps do something else here