Чтение данных с устройства Bluetooth с низким энергопотреблением rfcomm python3 - PullRequest
0 голосов
/ 24 мая 2018

Столкнулся с проблемой.Есть блютуз устройство с низким энергопотреблением.BLE.Цель состоит в том, чтобы отправить команду на устройство и получить данные обратно.Например: команда - 0x ** 0x ** 0x **, где первая 0x ** - команда кода, вторая 0x - длина данных.Ответ должен быть - 0x ** 0x ** 0x **.Я не могу отправить команду на устройство.Устройство работает по RFCOMM.На самом деле код, который доступен, но он не дает результата - он говорит, что устройство выключено.

from bluetooth import * 
import socket

class Work:

    def __init__(self):
        self.rfcon = BluetoothSocket(RFCOMM)
        # self.socket = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM)
        self.server = '**:**:**:**:**:**'
        self.port = 1
        self.data = '0x01 0x00 0x00'

    def scan_device(self):
        connection = self.rfcon.connect((self.server, self.port))

        print('con ===>>> ', connection)
        senddata = self.rfcon.send(self.data)
        print('senddata ====>>>> ', senddata)
        data = self.rfcon.recv(256)
        if not data:
            print("no data!!!")
            self.rfcon.close()
        else:
            print(data)

            self.rfcon.close()

if __name__ == '__main__':
    a = Work()
    a.scan_device()
    a.rfcon.close()

Я сделал это через другую библиотеку - код:

from bluepy.btle import *

class Work:

    def __init__(self):
        self.initialize = Peripheral()

    def scan_devices(self):
        scanner = Scanner()
        devices = scanner.scan(10.0)

        for dev in devices:
            print("Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi))
            for (adtype, desc, value) in dev.getScanData():
                print("  %s = %s" % (desc, value))

    def connect_to_device(self):
        print('start con')
        connection = self.initialize.connect('**:**:**:**:**:**', 'public')
        print('initialize complite')
        return connection

    def check_device_status(self):
        print('test ====>>> ', self.initialize.getCharacteristics())
        cmd = '0x01 0x00 0x00 0x20 0x00'.encode('UTF-8')
        print(cmd)
        status_device = self.initialize.readCharacteristic(cmd)

        print('Device status => ', status_device)

    def diconnect(self):
        self.initialize.disconnect()


if __name__ == '__main__':
    a = Work()
    a.connect_to_device()
    a.check_device_status()
    a.diconnect()

Это дает соединение, но не отправляет команду и не возвращает значение, так как эта библиотека не знает, что такое RFCOMM.Возможно, кто-то сталкивался с этой проблемой в питоне и знает, как ее решить?

1 Ответ

0 голосов
/ 24 мая 2018

RFCOMM - это протокол Bluetooth Classic, BLE его не поддерживает.Невозможно использовать RFCOMM для связи с устройством BLE.

Вы должны прочитать введение в BLE, оно даст вам базовое понимание BLE.Все остальное будет угадываться, это зависит от того, как настроено устройство BLE.

Если вы используете свое собственное устройство, которое вы можете настроить, одной из возможностей является создание характеристики, которая поддерживает функции записи и индикации.Вы можете указать (чтобы получать уведомления при изменении значения признака и о том, что является новым значением) и написать команду.Ответ будет получен с указанием.

...