Документация
ОС Аврора 5.1.7

USB API

Доступ к USB-устройствам для приложений предоставляется через D-Bus API. Каждое устройство представляет собой объект на системной D-Bus-шине сервиса ru.auroraos.DeviceWarden1. Для использования данного D-Bus API необходимо указать разрешение Serial.

Путь до объекта определяется подсистемой Usb, которой принадлежит устройство. Стандартный интерфейс org.freedesktop.DBus.ObjectManager предоставляет сигналы InterfacesAdded/ InterfacesRemoved и позволяет приложениям мониторить появляние/исчезновение объектов устройств. Также можно использовать его метод GetManagedObjects для получения текущего списка объектов устройств.

Альтернативно разработчики могут использовать библиотеку libusb как модуль своего проекта. Использование системного libusb1 запрещено валидатором по требованиям безопасности.

Устройства, которые доступны для взаимодействия, помещены в белый список. Белый список включает в себя 3 типа устройств:

  1. Глобальный — устройства в данном белом списке разрешены всем пользователям и приложениям.
  2. Пользователь — устройства в данном белом списке разрешены всем приложениям определённого пользователя.
  3. Приложение — устройства в данном белом списке разрешены конкретному приложению.

D-Bus API

D-Bus API предоставляет для работы с устройствами интерфейсы:

  • UsbManager позволяет узнать правила из текущего белого списка и включить/отключить доступ к USB;
  • UsbDevice позволяет узнать свойства USB-устройства;
  • SerialManager позволяет узнать правила из текущего белого списка и включить/отключить доступ к последовательным устройствам;
  • UsbSerialDevice позволяет получить данные USB-устройства;
  • PlatformSerialDevice позволяет узнать имя платформенного последовательного устройства.

Примеры

Пример работы с последовательным устройством:

int setupSerial() {
    auto usbProxy = sdbus::createProxy(sdbus::createSystemBusConnection(),
                                       sdbus::ServiceName{"ru.auroraos.DeviceWarden1"},
                                       sdbus::ObjectPath{"/ru/auroraos/DeviceWarden1/Serial/Device_9"}));

    int result;
    m_proxy->callMethod("open")
        .onInterface(sdbus::InterfaceName{"ru.auroraos.DeviceWarden1.SerialDevice"})
        .storeResultsTo(result);
    
    struct termios2 tty;
    ioctl(result, TCGETS2, &tty);
 
    tty.c_cflag &= ~CBAUD;
    tty.c_cflag |= CBAUDEX;
    tty.c_ispeed = 123456; 
    tty.c_ospeed = 123456;
 
    ioctl(result, TCSETS2, &tty);
    return result;
}

Пример работы с USB-устройством:

void getProduct() {
    auto usbProxy = sdbus::createProxy(sdbus::createSystemBusConnection(),
                                       sdbus::ServiceName{"ru.auroraos.DeviceWarden1"},
                                       sdbus::ObjectPath{"/ru/auroraos/DeviceWarden1/Usb/Device_9"}));
 
    int result;
    m_proxy->callMethod("open")
        .onInterface(sdbus::InterfaceName{"ru.auroraos.DeviceWarden1.UsbDevice"})
        .storeResultsTo(result);
 
    libusb_context* context;
    libusb_device_handle *devh;
    libusb_device_descriptor desc;
    libusb_set_option(context, LIBUSB_OPTION_NO_DEVICE_DISCOVERY, nullptr);
    libusb_init(&context);
    
    libusb_wrap_sys_device(context, (intptr_t)result, &devh);
    auto device = libusb_get_device(devh);
    libusb_get_device_descriptor(device, &desc);
    
    auto data = new uint8_t[255];
    libusb_get_string_descriptor_ascii(devh, desc.iProduct, data, 255);
    delete[] data;
}

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.