Notification is enabled but still I'm not getting any notification from BLE?

458 views Asked by At

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.

0

There are 0 answers