如何在Android中使用pySerial查找USB设备并与之通信?

时间:2018-07-27 05:04:52

标签: android python serial-port kivy pyserial

我目前正在从事一个项目,该项目需要将心率传感器连接到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         

我在self.device中叫main.py的地方。它返回None。

更新#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上正常运行,但是将在周一进行测试。

1 个答案:

答案 0 :(得分:0)

因此,我发现了一种解决方法,该方法有点难看,但对我有用。

我尝试自己写一个文件,但不能,所以我在互联网上搜索了更多内容,发现:

  

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无法通过其自己的端口代码连接到设备,因为在无根设备中,您根本无法访问或更改/ dev或其子目录。