2015-09-27 21 views
5

Tôi đang viết một chương trình bằng cách sử dụng bluepy để nghe một đặc tính được gửi bởi thiết bị bluetooth. Tôi cũng có thể sử dụng bất kỳ thư viện hoặc ngôn ngữ nào, ràng buộc duy nhất là chạy trên Linux chứ không phải trong môi trường di động (dường như nó chỉ được sử dụng rộng rãi trong các thiết bị di động, không ai sử dụng BLE với máy tính để bàn). Sử dụng bluepy Tôi đăng ký đại biểu và sau khi cố gắng đăng ký gọi thông báo write('\x01\x00') như được mô tả trong bluetooth rfc. Nhưng nó không hoạt động, bất kỳ thông báo cho các đặc tính được nhận. Có thể tôi sai khi viết tin nhắn để đăng ký. Có lỗi trong đoạn mã nhỏ mà tôi đã viết không? Cảm ơn bạn rất nhiều.BLE đăng ký thông báo bằng cách sử dụng gatttool hoặc 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(); 

Trả lời

1

Có vẻ như vấn đề là bạn đang cố gắng viết \x01\x00 cho chính nó. Bạn cần phải viết nó vào bộ mô tả cấu hình đặc trưng của máy khách để tiến hành nó (0x2902). Tay cầm có thể lớn hơn 1 đặc tính (nhưng bạn có thể muốn xác nhận bằng cách đọc các bộ mô tả).

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

Tôi đã đấu tranh với bản thân mình và nhận xét của jgrant thực sự hữu ích. Tôi muốn chia sẻ giải pháp của tôi, nếu nó có thể giúp bất cứ ai.

Lưu ý rằng tôi cần chỉ dẫn, do đó x02 thay vì x01.

Nếu có thể đọc các bộ mô tả bằng cách sử dụng bluepy, tôi sẽ làm điều đó, nhưng nó dường như không hoạt động (bluepy v 1.0.5). Phương thức trong lớp dịch vụ dường như bị thiếu và phương thức trong lớp ngoại vi bị kẹt khi tôi cố gắng sử dụng nó.

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 
Các vấn đề liên quan