在python3中使用pygatt订阅多个ble通知

时间:2018-07-27 05:22:37

标签: python-3.x bluetooth-lowenergy myo

TLDR:有谁知道如何使用PyGATT订阅多个通知而不会造成大量数据包丢失?

一段时间以来,我一直在遇到一些BLE接口代码的问题。我正在Linux机器上的Python 3中使用PyGATT模块,以从Bluetooth LE设备(来自Thalmic Labs的MyoArmband)接收数据。由于某些原因,我无法获得任何数据流(EMG和IMU)的广告采样率。我可以很好地连接和设置设备,但是,我计算出的采样率比它们应该的慢得多。

例如,对于EMG,我应该获得200 Hz的数据速率,对于IMU,我应该获得50 Hz的数据速率,但是,使用此代码,我只能从EMG和〜17 Hz IMU获得约70 Hz。我已经测试了一些配置,并确定如果一次只订阅一个特征,则可以为该特征获得正确的采样率。这表明我的代码仅在预订了多个特征时才必须丢弃数据包。这是PyGATT的已知问题吗?如果不使用PyGATT,是否有人对我可以在Python中用于与BLE设备(最好是跨平台)接口的其他模块有建议?

注意:我已附上我的代码以供参考。

import pygatt
import time
import numpy as np

emgcount = 0
imucount = 0

def emg_handler(handle, value): 
    global emgcount 
    emgcount += 2

def imu_handler(handle, value): 
    global imucount 
    imucount += 1

def main():
   btle = pygatt.BGAPIBackend()

    btle.start()
    myo = btle.connect( 'e0:f2:99:e7:60:40' )

    try:
        # set parameters
        myo.char_write('d5060401-a904-deb9-4748-2c7f4a124842', b'\x01\x03\x00\x00\x00')   # deregister all streaming
        myo.char_write('d5060401-a904-deb9-4748-2c7f4a124842', b'\x0a\x01\x02')           # lock myo
        myo.char_write('d5060401-a904-deb9-4748-2c7f4a124842', b'\x09\x01\x01')           # don't sleep
        myo.char_write('d5060401-a904-deb9-4748-2c7f4a124842', b'\x01\x03\x02\x01\x00')   # stream filtered emg and imu

        # subscribe to everything
        myo.subscribe('d5060402-a904-deb9-4748-2c7f4a124842', callback = imu_handler)
        myo.subscribe('d5060105-a904-deb9-4748-2c7f4a124842', callback = emg_handler)
        myo.subscribe('d5060205-a904-deb9-4748-2c7f4a124842', callback = emg_handler)
        myo.subscribe('d5060305-a904-deb9-4748-2c7f4a124842', callback = emg_handler)
        myo.subscribe('d5060405-a904-deb9-4748-2c7f4a124842', callback = emg_handler)

        print( 'Streaming...' )
        t0 = time.time()
        while ( time.time() - t0 ) < 10.0: 
            time.sleep( 1.0 )

    finally:
        tf = time.time()
        btle.stop()

        print('')
        print( 'EMG SAMPLING RATE:', emgcount / ( tf - t0 ) ) # should be ~200, is returning ~70
        print( 'IMU SAMPLING RATE:', imucount / ( tf - t0 ) ) # should be ~50, is returning ~17

if __name__ == '__main__':
    main()

0 个答案:

没有答案