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()