0

我在 Python 和 ANT+ 技术方面都是全新的。我想知道这是否不是一些基本问题,但是我已经为此苦苦挣扎了几天,已经浏览了论坛但没有运气..

所以我正在尝试使用 Python OpenANT 库(https://github.com/Tigge/openant)来访问我插入 USB 端口(WINDOWS 10 PRO)的 ANT 加密狗。我的目标是通过它访问我的 Garmin 并从中获取一些数据。但是,我一开始就试图初始化 ANT 节点。我的代码是这样的:

from ant.easy.node import Node
node=Node()

为此,我得到了例外:

  File "C:/Users/Edgars/Desktop/untitled-5.py", line 2, in <module>
    pass
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\ant\easy\node.py", line 56, in __init__
    self.ant = Ant()
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\ant\base\ant.py", line 68, in __init__
    self._driver.open()
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\ant\base\driver.py", line 193, in open
    cfg = dev.get_active_configuration()
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pyusb-1.1.0-py3.8.egg\usb\core.py", line 909, in get_active_configuration
    return self._ctx.get_active_configuration(self)
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pyusb-1.1.0-py3.8.egg\usb\core.py", line 113, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pyusb-1.1.0-py3.8.egg\usb\core.py", line 250, in get_active_configuration
    bConfigurationValue=self.backend.get_configuration(self.handle)
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pyusb-1.1.0-py3.8.egg\usb\backend\libusb0.py", line 519, in get_configuration
    ret = self.ctrl_transfer(
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pyusb-1.1.0-py3.8.egg\usb\backend\libusb0.py", line 601, in ctrl_transfer
    return _check(_lib.usb_control_msg(
  File "C:\Users\Edgars\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pyusb-1.1.0-py3.8.egg\usb\backend\libusb0.py", line 447, in _check
    raise USBError(errmsg, ret)
usb.core.USBError: [Errno None] b'libusb0-dll:err [control_msg] sending control message failed, win error: A device which does not exist was specified.\r\n\n'

我已关闭 Garmin 代理,因此没有其他程序同时使用我的 ANT 加密狗。当我运行我的代码时,每次都会出现特定的声音 - 我们通过从下拉菜单中选择“弹出”来分离 USB 设备时听到的声音(声音与异常消息同时发生),所以我猜USB 有时会被访问。

在异常之前,我得到这样的打印输出:

Driver available: [<class 'ant.base.driver.SerialDriver'>, <class 'ant.base.driver.USB2Driver'>, <class 'ant.base.driver.USB3Driver'>]
 - Using: <class 'ant.base.driver.USB3Driver'>
Could not check if kernel driver was active, not implemented in usb backend

我看到其他用户的线程打印输出显示Using ... USB1DriverUsing ... USB2Driver,但他们没有收到此消息。我已经安装了各种 python 库,试图做到这一点,现在我担心它们可能会妨碍彼此。有人可以帮我解决这个问题吗?一个只有两行代码的程序会变得如此复杂,这真是令人沮丧..:D

!!!编辑!!!

好的,我发现了问题——在“driver.py”文件中有一行dev.reset()在尝试访问它之前断开了我的 USB 加密狗。我不知道为什么那里应该存在这样的一条线。我试图评论这条线,现在我不再收到上述错误了。但是,现在发生的是连续超时..

所以我的代码已经演变成这样(尽管实际上我最初的 2 行长程序也会发生相同的超时):

from ant.easy.node import Node
from ant.easy.channel import Channel
from ant.base.message import Message

import threading

NETWORK_KEY=[0xb9,0xa5,0x21,0xfb,0xbd,0x72,0xc3,0x45]

def on_data(data):
    print("Data received")
    print(data)
    
def back_thread(node):
    node.set_network_key(0x00,NETWORK_KEY)
    channel=node.new_channel(Channel.Type.BIDIRECTIONAL_RECEIVE)
    channel.on_broadcast_data=on_data
    channel.on_burst_data=on_data
    channel.set_period(16070)
    channel.set_search_timeout(20)
    channel.set_rf_freq(57)
    channel.set_id(0,120,0)
    
    try:
        channel.open()
        node.start()
    finally:
        node.stop()
        print("ANT Node Shutdown Complete")

node=Node()
x=threading.Thread(target=back_thread,args=(node,))
x.start()

现在我永远打印出这个错误行:

<class 'usb.core.USBError'>, (None, b'libusb0-dll:err [_usb_reap_async] timeout error\n')

当我的 Garmin 代理处于活动状态时,我收到错误“ANT 资源已在使用”而不是超时,所以我确定我的代码正在访问 ANT 加密狗。但是,现在(关闭了 Garmin 代理)我有不知道如何摆脱超时以及如何与我的 Garmin 设备建立简单的握手..

4

2 回答 2

0

好的,现在我发现我的 Garmin Forerunner 310XT 不能充当数据源,因此无法使用 ANT+ 协议访问。相反,我应该使用文件共享的 ANT-FS 协议。低着头试一试……

于 2021-01-21T09:34:44.470 回答
0

我发布了一个PR,其中做了一些更改,以使 Tigge 的开放式库正常工作。基本上,我在您上面提到的重置行之后暂停并绕过了 udev_rules 的使用,因为它不适用于 Windows。您可以使用 libusb,但安装有点不同。我已在 PR 的自述文件中添加了 Windows 安装说明,其中详细说明了对我有用的内容。

于 2021-05-09T03:18:21.007 回答