无法解决python代码的问题

无法解决python代码的问题,python,ubuntu,bluetooth,raspberry-pi3,ibeacon,Python,Ubuntu,Bluetooth,Raspberry Pi3,Ibeacon,我一直在开发一个程序,在运行UbuntuMate16.04的Pi3上通过蓝牙访问iBeacon数据,而不使用sudo,因此可以从另一个脚本调用它。当我在部分初始化类时,我的代码工作正常,如果\uuuuu name\uuuuuu==“\ uuuuuuuu main\uuuuuuuuuu”:部分??(不知道确切的名字) 问题 当我创建ibeacon类以允许使用一行代码从另一个脚本调用程序时,我似乎无法访问设备,即使就我所见,这两种设置是相同的 这是完整的代码,如果你想运行它,你需要pctrl和blu

我一直在开发一个程序,在运行UbuntuMate16.04的Pi3上通过蓝牙访问iBeacon数据,而不使用
sudo
,因此可以从另一个脚本调用它。当我在
部分初始化类时,我的代码工作正常,如果\uuuuu name\uuuuuu==“\ uuuuuuuu main\uuuuuuuuuu”:
部分??(不知道确切的名字)

问题 当我创建
ibeacon类
以允许使用一行代码从另一个脚本调用程序时,我似乎无法访问设备,即使就我所见,这两种设置是相同的

这是完整的代码,如果你想运行它,你需要
pctrl
bluepy
来安装它们,使用
sudo-apt-get-install-python-prctl
sudo-pip-install-bluepy
,最后使用
sudo-chmod 4755-bluepy-helper
来更改bluesy-helper可执行文件的权限,以消除sudo访问蓝牙的需要模块。我还将
piall=NOPASSWD:/home/pi/python/ibeacon.py
添加到了
visudo
的最后一行,但不确定这是否必要

mode=0
不起作用时,但使用
mode=1
将无法解决问题,请帮助

import time, math, datetime, prctl
import numpy as np
from os import getcwd
from threading import Thread
from bluepy.btle import Scanner, DefaultDelegate


class KalmanFilter(object):
    def __init__(self, process_variance,estimated_measurement_variance):
        self.process_variance = process_variance
        self.estimated_measurement_variance = estimated_measurement_variance
        self.posteri_estimate = 1.0
        self.posteri_error_estimate = 2.0

    def input_latest_noisy_measurement(self, measurement):
        priori_estimate = self.posteri_estimate
        priori_error_estimate = self.posteri_error_estimate + self.process_variance

        blending_factor = priori_error_estimate / (priori_error_estimate + self.estimated_measurement_variance)
        self.posteri_estimate = priori_estimate + blending_factor * (measurement - priori_estimate)
        self.posteri_error_estimate = (1 - blending_factor) * priori_error_estimate

    def get_latest_estimated_measurement(self):
        return self.posteri_estimate


class ScanDelegate(DefaultDelegate):
    def __init__(self):
        self.RSSI = self.DEV = self.dist = self.dist_kal = 0
        self.stoppped = False

        self.process_variance = 1e-3
        self.estimated_measurement_variance = 0.25 ** 2 
        self.kalman_filter = KalmanFilter(self.process_variance, self.estimated_measurement_variance)
        DefaultDelegate.__init__(self)
        self.scanner = Scanner()

    def stop(self):
        self.stopped = True

    def start(self):
        # start the thread to read frames from the device output
        Thread(target=self.update, name="iBeacon").start()
        print("Staring ibeacon")
        return self

    def distance(self, n=2.0, txpower=53):
        return (abs(self.RSSI)/(10.0*n*math.log10(math.exp(1)))) - (txpower/(10.0*n*math.log10(math.exp(1)))) # convert RSSI to Distance

    def update_file(self):
        f = open('ibeacon.txt', 'w')
        ts = time.time()
        st = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
        string = '%s\t%2.2f' % (st, self.dist_kal)
        f.write(string)
        f.close()

    def update(self):
        prctl.set_name("iBeacon")
        count = 0
        while(not self.stoppped):
            try:
                devices = self.scanner.scan(0.20)
                for dev in devices:
                    # print(dev.addr)
                    if dev.addr == '00:15:83:00:81:f0':
                        self.RSSI = dev.rssi
                        self.DEV = dev.addr
                        self.dist = self.distance()
                        self.kalman_filter.input_latest_noisy_measurement(self.dist)
                        self.dist_kal = self.kalman_filter.get_latest_estimated_measurement()
                        self.update_file()
                        count = 0
                        #print "Device %s, RSSI=%d dB" % (dev.addr,dev.rssi)
            except:
                self.dist_kal = 0
                if count >= 4:
                    print "no ibeacon found"
                    self.update_file()
                count += 1
                time.sleep(1)

class iBeacon():
    def __init__(self):
        self.scan = ScanDelegate()
        self.scanner = self.scan.scanner.withDelegate(self.scan)
        self.scan.start()

if __name__ == "__main__":


    beacon = iBeacon()

    while(1):
        print "address:", beacon.scan.DEV, "RSSI:", beacon.scan.RSSI, "distance:", beacon.scan.dist, "kalman distance:", beacon.scan.dist_kal
        time.sleep(0.5)
终端输出-模式=0

pi@pi:~/python$ python ibeacon.py
Staring ibeacon
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
no ibeacon found
address: 0 RSSI: 0 distance: 0 kalman distance: 10
address: 0 RSSI: 0 distance: 0 kalman distance: 10
^\^\^\^\|Quit (core dumped)
终端输出-模式=1

pi@pi:~/python$ python ibeacon.py
Staring ibeacon
address: 0 RSSI: 0 distance: 0 kalman distance: 0
address: 0 RSSI: 0 distance: 0 kalman distance: 0
address: 00:15:83:00:81:f0 RSSI: -65 distance: 1.3815510558 kalman distance: 1.36999450577
address: 00:15:83:00:81:f0 RSSI: -65 distance: 1.3815510558 kalman distance: 1.36999450577
address: 00:15:83:00:81:f0 RSSI: -65 distance: 1.3815510558 kalman distance: 1.36999450577
address: 00:15:83:00:81:f0 RSSI: -65 distance: 1.3815510558 kalman distance: 1.36999450577
address: 00:15:83:00:81:f0 RSSI: -63 distance: 1.1512925465 kalman distance: 1.26143036974
address: 00:15:83:00:81:f0 RSSI: -64 distance: 1.26642180115 kalman distance: 1.26312146783
^\Quit (core dumped)

ScanDelegate.update
方法正在尝试访问名为
scanner
的全局变量。当模式为0时,此项不存在


您之所以看不到这一点,是因为您将该方法包装在一个空白的except中,它捕获了所有错误,包括将在此处引发的NameError。这就是为什么你永远不能做那件事;您应该只捕获您希望能够处理的特定异常。

您还没有真正说明问题所在。什么是失败,在哪里?你有错误吗?你看到了什么?而且,Python不是Java;实际上不需要像“包装类”这样的东西。现在更清楚了吗?当使用ibeacon类初始化程序时,它似乎无法访问蓝牙输出。但是当mode==0时,您会得到什么输出?发生了什么?我看不到你桌面上的屏幕截图。。。在任何情况下,都没有理由发布图片、复制输出并将其作为文本粘贴到您的问题中。是的,这就是我在添加您的建议后遇到的错误-我将从现在开始添加我期望的例外情况。对于如何更好地设置代码,使我能够在mode=0显示时从一行调用此程序,您有什么建议吗?您需要某种方法将scanner对象传递到update方法中。然而,我不知道Scanner和ScanDelegate类是如何工作的,所以我无法提供更多帮助。问题解决了!您为我提供了正确的错误以供跟踪,解决方案已添加到代码中,以允许其他任何人将此代码用于自己的用途。