如何在 Android 中使用 pySerial 查找 USB 设备并与它们通信?
How to find USB devices and communicate with them using pySerial in Android?
我目前正在进行一个项目,我需要将心率传感器连接到 Android 设备并在基于 Kivy 的应用程序上可视化数据。
尝试使用 serial.tools.list_ports.comports
,但 return 在设备上什么也没用。他们已经声明该功能仅支持有限的号码。操作系统,所以我认为它不适用于 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/
但无济于事。
错误return是端口权限被拒绝。
我怎样才能列出连接到该设备的 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
的地方。它 returns None.
更新#2:
我试图转换从 self.usbMgr.getDeviceList()
获得的 HashMap 但不能。我只得到
<java.util.HashMap at 0xdf8a6150 jclass=java/util/HashMap jself=<LocalRef obj=0x10134a at 0xdfa69760>>>
更新#3:
我找到了 return 插入的 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 上正常工作,但会在星期一进行测试。
所以,我找到了一个有点难看但对我有用的解决方法。
我试着自己写一个文件,但是我不能,所以我在网上搜索了一下,发现:
通过使用这个库,我可以连接到我的设备并与它通信。
所以救恩一直在那里,只是我看不见。
我给出的代码:
values = self.usb_mgr.getDeviceList().values()
valuesArray = values.toArray() #returns list in python
deviceName = valuesArray[0].getDeviceName()
self.device = str(deviceName)
可以获取设备名称(因为我是 Java 新手,所以方式很丑陋)。
我意识到 pySerial 无法通过它自己的端口代码连接到设备,因为在非根设备中你根本无法访问或更改 /dev 或其子目录。
我目前正在进行一个项目,我需要将心率传感器连接到 Android 设备并在基于 Kivy 的应用程序上可视化数据。
尝试使用 serial.tools.list_ports.comports
,但 return 在设备上什么也没用。他们已经声明该功能仅支持有限的号码。操作系统,所以我认为它不适用于 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/
但无济于事。
错误return是端口权限被拒绝。
我怎样才能列出连接到该设备的 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
的地方。它 returns None.
更新#2:
我试图转换从 self.usbMgr.getDeviceList()
获得的 HashMap 但不能。我只得到
<java.util.HashMap at 0xdf8a6150 jclass=java/util/HashMap jself=<LocalRef obj=0x10134a at 0xdfa69760>>>
更新#3: 我找到了 return 插入的 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 上正常工作,但会在星期一进行测试。
所以,我找到了一个有点难看但对我有用的解决方法。
我试着自己写一个文件,但是我不能,所以我在网上搜索了一下,发现:
通过使用这个库,我可以连接到我的设备并与它通信。
所以救恩一直在那里,只是我看不见。
我给出的代码:
values = self.usb_mgr.getDeviceList().values()
valuesArray = values.toArray() #returns list in python
deviceName = valuesArray[0].getDeviceName()
self.device = str(deviceName)
可以获取设备名称(因为我是 Java 新手,所以方式很丑陋)。
我意识到 pySerial 无法通过它自己的端口代码连接到设备,因为在非根设备中你根本无法访问或更改 /dev 或其子目录。