首页 > 解决方案 > bluepy.btle.BTLEManagementError:无法执行管理命令“le on”(代码:20,错误:权限被拒绝)

问题描述

我利用并修改了下面显示的代码,来自https://www.instructables.com/Monitor-and-Record-Temperature-With-Bluetooth-LE-a/

我遇到的问题是该设备似乎阻止我访问它的值,尽管我不确定这一点。

这是我的代码:

from bluepy.btle import Scanner, DefaultDelegate
import time
import struct


SENSOR_ADDRESS = [""ec:fe:4e:12:b8:72""]

class DecodeErrorException(Exception):
     def __init__(self, value):
         self.value = value
     def __str__(self):
         return repr(self.value)

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if isNewDev:
            print("Discovered device", dev.addr)
        elif isNewData:
            print("Received new data from", dev.addr)


scanner = Scanner().withDelegate(ScanDelegate())

ManuDataHex = []
ReadLoop = True
try:
    while (ReadLoop):
        devices = scanner.scan(2.0)
        ManuData = ""

        for dev in devices:

            entry = 0
            TempData = 0

            for saddr in SENSOR_ADDRESS:

                entry += 1

                if (dev.addr == saddr):

                
                    CurrentDevAddr = saddr
                
                    for (adtype, desc, value) in dev.getScanData():
                   
                        if (desc == "Manufacturer"):
                            ManuData = value

                    if (ManuData == ""):
                        print("No data received, end decoding")
                        continue

                    print(ManuData)
                    for i, j in zip(ManuData[::2], ManuData[1::2]):
                        ManuDataHex.append(int(i+j, 16))

                
                    if ((ManuDataHex[0] == 0x85) and (ManuDataHex[1] == 0x00)):
                        print("Header byte 0x0085 found")
                    else:
                        print("Header byte 0x0085 not found, decoding stop")
                        continue


                    idx = 7

                    print("TotalLen: " + str(len(ManuDataHex)))
                    while idx < len(ManuDataHex):

                          if (ManuDataHex[idx] == 0x43):

                              idx += 1
                              TempData = ManuDataHex[idx]
                              TempData += ManuDataHex[idx+1] * 0x100
                              TempData = TempData * 0.0625
                              idx += 2
                          else:
                              idx += 1

                    print("Device Address: " + CurrentDevAddr) 
                    print("Temp Data: " + str(TempData))
                 
                    ReadLoop = False


except DecodeErrorException:
    pass

例外情况如下:

回溯(最后一次调用):文件“/home/pi/Desktop/lameteo/print.py”,第 31 行,设备 =scanner.scan(2.0) 文件“/usr/local/lib/python3.7/dist -packages/bluepy/btle.py”,第 852 行,扫描 self.start(passive=passive) 文件“/usr/local/lib/python3.7/dist-packages/bluepy/btle.py”,第 790 行,在 start self._mgmtCmd("le on") 文件 "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py",第 312 行,在 _mgmtCmd 中引发 BTLEManagementError("未能执行管理命令' %s'" % (cmd), rsp) bluepy.btle.BTLEManagementError: 无法执行管理命令 'le on' (代码: 20, 错误: > Permission Denied)

如果您在这方面有任何专业知识,我将非常感谢您的帮助。

标签: pythonbluetoothraspberry-pi

解决方案


推荐阅读