Как найти устройства USB и общаться с ними, используя pySerial в Android?

1

В настоящее время я работаю над проектом, где мне нужно подключить датчик сердечного ритма к устройству 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&gt>>

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, но это будет проверено в понедельник.

Теги:
kivy
serial-port
pyserial

1 ответ

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 или его подкаталоги.

  • 0
    Как вы подключили USB-устройство с помощью Kivy-andorid-serial? Я запутался с «Добавить device_filter.xml в папку Android Res / xml /». Подскажите пожалуйста шаги по использованию Kivy-android-serial.
  • 0
    Я также хочу использовать kivy-android-serial и столкнулся с той же проблемой, что и Prayag. Где поместить device_filter.xml? Я пытался в ~ / .buildozer / Android / платформа / Android-SDK-20 / платформы / Android-19 / Data / Res / XML, а также ~ / .buildozer / Android / платформа / Android-SDK-20 / платформы / Android- 24 / data / res / xml, потому что у меня есть оба каталога, но у меня всегда появляется сообщение об ошибке: «Ошибка: не найден ресурс, который соответствует данному имени (в 'resource' со значением '@ xml / device_filter')"
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню