2015-09-27 5 views
5

Ich schreibe ein Programm mit bluepy, die auf eine Eigenschaft hören von einem Bluetooth-Gerät gesendet. Ich kann auch jede Bibliothek oder Sprache verwenden, die einzige Einschränkung besteht darin, unter Linux und nicht in einer mobilen Umgebung zu laufen (es scheint, dass es nur in mobilen Geräten weit verbreitet ist, niemand benutzt BLE mit Desktop). Mit bluepy registriere ich den Delegaten und nach dem Versuch, für die Benachrichtigung zu registrieren, die write('\x01\x00') anruft, wie im Bluetooth rfc beschrieben. Aber es funktioniert nicht, eine Benachrichtigung für das Merkmal wird empfangen. Vielleicht bin ich falsch beim Schreiben der Nachricht zum Abonnieren. Gibt es einen Fehler in dem kleinen Snippet, das ich geschrieben habe? Ich danke dir sehr.BLE abonnieren Benachrichtigung mit gatttool oder 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(); 

Antwort

1

Es ist wie das Problem sieht, ist, dass Sie versuchen, sich \x01\x00 dem Merkmal zu schreiben. Sie müssen es in den Deskriptor für die Client-Merkmalskonfiguration schreiben, der es ausführt (0x2902). Das Handle ist wahrscheinlich 1 größer als das Merkmal (aber Sie möchten vielleicht durch Lesen der Deskriptoren bestätigen).

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

Ich kämpfte mit mir selbst, und jgrants Kommentar wirklich geholfen. Ich würde gerne meine Lösung teilen, wenn sie jemandem helfen könnte.

Beachten Sie, dass ich Anzeige benötigt, daher die x02 statt x01.

Wenn es möglich wäre, die Deskriptoren mit bluepy zu lesen, würde ich das tun, aber es scheint nicht zu funktionieren (bluepy v 1.0.5). Die Methode in der Serviceklasse scheint zu fehlen, und die Methode in der peripheren Klasse bleibt stecken, wenn ich versuche, sie zu benutzen.

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