【问题标题】:How to find USB devices and communicate with them using pySerial in Android?如何在 Android 中使用 pySerial 查找 USB 设备并与之通信?
【发布时间】:2018-07-27 05:04:52
【问题描述】:

我目前正在开展一个项目,我需要将心率传感器连接到 Android 设备并在基于 Kivy 的应用上可视化数据。

尝试使用serial.tools.list_ports.comports,但它在设备上没有返回任何内容。他们已经声明该功能仅支持有限的数量。操作系统,所以我认为它不适用于 Android。

我在 buildozer.spec 和列入白名单的 termios 中包含了所有需要的要求(所以我在包含该模块时没有任何问题):

# requirements of the app
requirements = kivy==master,python3crystax,hostpython3crystax,sdl2_image,sdl2_mixer,sdl2_ttf,sdl2_six,pyjnius,pyserial,serial

我尝试编辑 AndroidManifest.xml 文件的 intent-filter 部分以使我的应用获得 USB 权限,但它也不起作用。

我已经检查了一个应用程序,该设备没有特定的名称,而是通过插入和拔出 USB 来更改名称,例如:

/dev/bus/usb/001/002 --> /dev/bus/usb/001/003 --> ...

还尝试使用其他页面中所述的通用名称/dev/ttyUSB0/,但无济于事。

返回的错误是该端口的权限被拒绝。

我如何才能列出连接到设备的 USB 设备,最终打开一个端口与之通信?

更新 #1: 我最近尝试使用一些 pyjnius 函数。这是我写的代码:

from jnius import autoclass
from jnius import cast #cast?


class Serial:
    def __init__(self):
    #Defining the variables for USB-OTG comm. in Android.
    #The strings in autoclasses are classes in Java
    #therefore classes that are used in Android programming.
    self.arrayList = autoclass('java.util.ArrayList')
    self.hashmap = autoclass('java.util.HashMap')
    self.context = autoclass('android.content.Context')
    self.usbConstants = autoclass('android.hardware.usb.UsbConstants')
    self.usbDevice = autoclass('android.hardware.usb.UsbDevice')
    self.usbDeviceConnection = autoclass('android.hardware.usb.UsbDeviceConnection')
    self.hashMap = autoclass('java.util.HashMap')
    self.usbEndpoint = autoclass('android.hardware.usb.UsbEndpoint')
    self.usbManager = autoclass('android.hardware.usb.UsbManager')
    self.usbRequest = autoclass('android.hardware.usb.UsbRequest')
    self.usbInterface = autoclass('android.hardware.usb.UsbInterface')
    self.a = 0

    #As we're using python-for-android, we'll be needing only 
    #the default PythonActivity class.
    self.PythonActivity = autoclass('org.kivy.android.PythonActivity')
    self.activity = self.PythonActivity.mActivity


    #Getting access to make the device a host for USB devices.
    self.usbMgr = cast(self.usbManager, self.activity.getSystemService(self.context.USB_SERVICE))


    self.device = self.usbMgr.getDeviceList().get("deviceName") 


def portName(self):
    return self.device         

我在main.py 中调用self.device。它返回无。

更新 #2: 我试图转换从self.usbMgr.getDeviceList() 获得的 HashMap,但不能。我只得到 <java.util.HashMap at 0xdf8a6150 jclass=java/util/HashMap jself=<LocalRef obj=0x10134a at 0xdfa69760&gt>>

更新 #3: 我找到了一种方法来返回插入的 USB 设备的名称。

values = self.usb_mgr.getDeviceList().values() #returns Collection
valuesArray = values.toArray() #returns list in python
deviceName = valuesArray[0].getDeviceName() #[0] for testing
self.device = str(deviceName)

那行得通。我目前没有 USB 传感器,我不确定 pySerial 是否在 Android 上正常工作,但会在周一进行测试。

【问题讨论】:

    标签: android python serial-port kivy pyserial


    【解决方案1】:

    所以,我找到了一个有点难看但对我有用的解决方法。

    我想自己写一个文件,但我不能,所以我上网搜索了一下,发现:

    https://github.com/frmdstryr/kivy-android-serial

    通过使用这个库,我可以连接到我的设备并进行通信。

    所以救恩一直都在,但我看不到。

    我给出的代码:

    values = self.usb_mgr.getDeviceList().values() valuesArray = values.toArray() #returns list in python deviceName = valuesArray[0].getDeviceName() self.device = str(deviceName)

    工作(以一种丑陋的方式,因为我是一个 Java 新手)来获取设备的名称。

    我意识到 pySerial 无法通过自己的端口代码连接到设备,因为在非 root 设备中您根本无法访问或更改 /dev 或其子目录。

    【讨论】:

    • 你是如何使用 Kivy-andorid-serial 连接 USB 设备的?我对“将 device_filter.xml 添加到您的 android res/xml/ 文件夹”感到困惑。您能否建议使用 Kivy-android-serial 的步骤。
    • 我也想使用 kivy-android-serial 并面临与 Prayag 相同的问题。将 device_filter.xml 放在哪里?我尝试了 ~/.buildozer/android/platform/android-sdk-20/platforms/android-19/data/res/xml 以及 ~/.buildozer/android/platform/android-sdk-20/platforms/android- 24/data/res/xml,因为我有两个目录,但我总是收到错误消息:“错误:找不到与给定名称匹配的资源(在 'resource' 处,值为 '@xml/device_filter')”
    • 答案:在第一次不成功的构建之后:在目录 /.buildozer/android/platform/build/dists/YOUR_PROJECT_NAME/src/main 添加“xml/device_filter.xml”在“res “ 文件夹。请注意,您需要手动创建“xml”文件夹。在 dir .buildozer/android/platform/build/dists/YOUR_PROJECT_NAME/templates/ 在名为 AndroidManifest.tmpl.xml 的文件的好位置添加
    • 抱歉,回复太晚了,这是我的一个实习项目,如果我没记错的话,我自己创建了 xml 文件夹,就像 Yves 提到的那样。谢谢:)
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2013-04-07
    • 2018-02-17
    • 2012-04-28
    • 1970-01-01
    • 2012-12-19
    • 2015-04-02
    相关资源
    最近更新 更多