1 year ago
#338681
subbu Subhash
Notification is enabled but still I'm not getting any notification from BLE?
Im using python script in my ubuntu system, to connect to BLE device and get notification from device. The problem now I'm facing is I enabled the notification but still I don't get any notification. and I'm sure that I enabled notification for required UUID This is the code:
import struct
import time
import sys
import argparse
from Crypto.Cipher import AES
from bluepy.btle import Peripheral, DefaultDelegate, ADDR_TYPE_RANDOM
from pprint import pprint
from binascii import hexlify
import binascii
import os
import time
def encrypt(key, data):
key = bytes.fromhex(key)
msg = bytes.fromhex(data)
cipher = AES.new(key, AES.MODE_ECB)
msg_en = cipher.encrypt(msg)
return msg_en.hex()
def decrypt(key, data):
key = bytes.fromhex(key)
decipher = AES.new(key, AES.MODE_ECB)
# byte_data=bytes.fromhex("6f552132e2af0042ab6098c2f4e738e0")
# Decipher akzeptiert und Binary kein Hex
msg_dec = decipher.decrypt(binascii.unhexlify(data))
return msg_dec.hex()
def crc16(data: bytes):
'''
CRC-16 (CCITT) implemented with a precomputed lookup table
'''
table = [
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
]
crc = 0xFFFF
for byte in data:
crc = (crc << 8) ^ table[(crc >> 8) ^ byte]
# important, crc must stay 16bits all the way through
crc &= 0xFFFF
return hex(crc)
class MyDelegate(DefaultDelegate):
def __init__(self):
DefaultDelegate.__init__(self)
# ... initialise here
def handleNotification(self, cHandle, data):
# ... perhaps check cHandle
# ... process 'data'
print("hello 123")
return
key1 = '535a594c574c2d4d696e657754656368'
CCCD_UUID=0x2902
mac_addr="AC:23:3F:AA:3C:C7"
service_UUID="7f280001-8204-f393-e0a9-e50e24dcca9e"
handle_1d = "7f280002-8204-f393-e0a9-e50e24dcca9e"
device =Peripheral(mac_addr,addrType="public")
device.setDelegate(MyDelegate())
svc=device.getServiceByUUID(service_UUID)
print(svc)
define_char = svc.getCharacteristics(handle_1d)[0]
print(define_char)
# desc_notification = define_char.getDescriptors(forUUID=CCCD_UUID)[0]
desc_notification = define_char.getDescriptors()[0]
pprint(desc_notification)
#1. enable notification
desc_notification.write(b"\x01\x00", True)
#2.read encrypted data
enc_data=define_char.read().hex()
print("encrypted data read", enc_data)
dec_data=decrypt(key1,enc_data)
print("decrypted data read",dec_data)
#3. write encrypted data
mac_rcv=dec_data[:12]
temp=str(mac_rcv)+str(os.urandom(8).hex())
crc=str(crc16(bytes.fromhex(temp)))
print("crc for ",temp,"is",crc)
if(len(crc[2:])==3):
temp=temp+"0"+crc[2:]
else:
temp=temp+crc[2:]
enc_data=encrypt(key1,temp)
# data_to_send=struct.pack('<18s', b'\x01\x08' + _KEY)
define_char.write(bytes.fromhex(enc_data))
print("encrypted data sent",enc_data)
print("Data sent")
#4. write random number with encrypted
random_data=os.urandom(16).hex()
define_char.write(bytes.fromhex(random_data))
print("random data sent",random_data)
print("Data sent")
#5. enable notification to receive data
while True:
if device.waitForNotifications(5.0):
continue
device.disconnect()
print('Done')
as one can see I enabled notification. So what to do now? any information is needed please let me know this is the output:
Service <uuid=7f280001-8204-f393-e0a9-e50e24dcca9e handleStart=27 handleEnd=30>
Characteristic <7f280002-8204-f393-e0a9-e50e24dcca9e>
<bluepy.btle.Descriptor object at 0x7f26ace17730>
encrypted data read 1bd8f17131eb740cb25dbdcd1ea71f7f
decrypted data read ac233faa3cc77a16b0befebd2e1c0410
crc for ac233faa3cc783f5b6718e43515d is 0xc81b
encrypted data sent b6715a3b6c4ad4bfdedf4518de0847be
Data sent
random data sent 008b9adfb7d66b470d85c4451d46e6ee
Data sent
Traceback (most recent call last):
File "/home/subhash/Downloads/Visual_studio/Hack_Minew.py", line 124, in <module>
if device.waitForNotifications(5.0):
File "/usr/local/lib/python3.8/dist-packages/bluepy/btle.py", line 560, in waitForNotifications
resp = self._getResp(['ntfy','ind'], timeout)
File "/usr/local/lib/python3.8/dist-packages/bluepy/btle.py", line 407, in _getResp
resp = self._waitResp(wantType + ['ntfy', 'ind'], timeout)
File "/usr/local/lib/python3.8/dist-packages/bluepy/btle.py", line 362, in _waitResp
raise BTLEDisconnectError("Device disconnected", resp)
bluepy.btle.BTLEDisconnectError: Device disconnected
and one more thing is if my BLE device is not engaged in communication while in connection, it will terminate the connection after a few seconds.
python
python-3.x
bluetooth-lowenergy
btle
0 Answers
Your Answer