В настоящее время я работаю над проектом, где мне нужно подключить датчик сердечного ритма к устройству Android и визуализировать данные в приложении на базе Kivy.
Пытался использовать serial.tools.list_ports.comports
но ничего не получил на устройстве. Они уже заявили, что функция поддерживает только ограниченное число. операционных систем, поэтому я думал, что он не будет работать на Android.
Я включил все необходимые требования в buildozer.spec и whitelisted termios (поэтому у меня нет никаких проблем с включением модуля):
# requirements of the app
requirements = kivy==master,python3crystax,hostpython3crystax,sdl2_image,sdl2_mixer,sdl2_ttf,sdl2_six,pyjnius,pyserial,serial
Я попытался отредактировать часть фильтра намерения файла AndroidManifest.xml, чтобы получить у моего приложения разрешение USB, но оно тоже не сработало.
Я проверил приложение, что устройство не имеет определенного имени, но меняет его, введя и вставляя в него USB:
/dev/bus/usb/001/002 ->/dev/bus/usb/001/003 ->...
Также попытался использовать общее имя /dev/ttyUSB0/
указанное на других страницах, пока не получилось.
Возвращаемая ошибка заключается в том, что разрешение отклоняется порту.
Как я могу даже перечислить USB-устройства, подключенные к устройству, в конечном счете открыть порт для связи с ним?
UPDATE # 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.
UPDATE # 2: Я попытался преобразовать HashMap, который я получил из self.usbMgr.getDeviceList()
но не смог. Я получаю только <java.util.HashMap at 0xdf8a6150 jclass=java/util/HashMap jself=<LocalRef obj=0x10134a at 0xdfa69760>>>
UPDATE # 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, но это будет проверено в понедельник.
Итак, я нашел обходное решение, которое немного уродливо, но оно работает для меня.
Я попытался написать кусок файла сам, но не смог, поэтому немного искал интернет и нашел:
Используя эту библиотеку, я могу подключиться к своему устройству и сообщить об этом.
Поэтому спасение было все время, невидимое мной.
Код, который я дал:
values = self.usb_mgr.getDeviceList().values() valuesArray = values.toArray() #returns list in python deviceName = valuesArray[0].getDeviceName() self.device = str(deviceName)
работает (уродливо, так как я новичок в Java), чтобы получить имя устройства.
Я понял, что pySerial не может подключиться к устройству через свой собственный код порта, как в некорневом устройстве, которое вы просто не можете получить или изменить /dev или его подкаталоги.