Перейти к основному содержимому

Сведения об устройстве

Читайте доступные сведения об устройстве AIBuds непосредственно из свойств объекта устройства. Единого запроса getDeviceDetails и модели результата DeviceDetails нет.

Идентификаторы, прошивка, подключение и рекламные данные доступны через DeviceConvertible. Если устройство также соответствует DeviceInfoAPI, можно прочитать состояние батареи, заявленные возможности, аппаратную конфигурацию, язык, состояние вызова, сведения о памяти и количество медиафайлов.

Предварительные условия​

Перед чтением сведений об устройстве:

  • Получите экземпляр DeviceConvertible в ходе сканирования, из сохранённых устройств или после подключения.
  • Если нужны актуальные данные от устройства, дождитесь его подключения и готовности.
  • Считайте необязательные свойства недоступными, пока SDK или устройство не передаст их значения.

:::info Текущий снимок Чтение этих свойств не отправляет Bluetooth-команду. Значения отражают текущий снимок SDK и могут поступать из данных обнаружения, сохранённых данных устройства или активного подключения. :::

Справочник API​

Фреймворк​

AIBuds.xcframework

Импорт​

В файлах, где используется SDK, импортируйте основной фреймворк:

Swift
import AIBuds

Протоколы​

Сведения предоставляют два протокола. DeviceConvertible содержит базовый снимок устройства, а DeviceInfoAPI — дополнительные свойства, если подключённое устройство поддерживает этот протокол.

Swift
/// Defines the persistent identity and capabilities of an AIBuds device.
protocol DeviceConvertible: NSObjectProtocol, NSSecureCoding

/// The protocol for device information related API.
protocol DeviceInfoAPI: DeviceAPI

Свойства​

Базовые свойства устройства​

Эти свойства доступны через DeviceConvertible.

КатегорияСвойстваПримечания
Идентификацияname, uuid, bluetoothName, macAddress, productИмя и идентификаторы устройства, известные SDK.
Аппаратная частьdeviceModel, deviceSerialNum, formatedProjNumberНеобязательные значения, сообщаемые поддерживаемыми устройствами.
ПрошивкаfirmwareVersion, formatedFirmwareVersion, coProcessorFirmwareVersionformatedFirmwareVersion — отображаемая строка основной прошивки, используемая в Demo.
ПодключениеconnectionState, deviceState, isConnectedAndReady, isBusy, lastConnectTimeПеред использованием текущего состояния проверяйте isConnectedAndReady.
ПривязкаbindUserId, userBindTime, isAlreadyUnbind, shouldAutoReconnectWhenAppLaunchСостояние привязки и повторного подключения, которое ведёт SDK.
Рекламные данныеadvertisementDataString, advertisementRawData, manufacturerData, manufacturerHexDataString, timestampOfAdvertisementDataЗначения из последних полученных рекламных данных.
Отображениеthumbnail, screenName, customContentНеобязательные значения для интерфейса приложения.

Дополнительные сведения​

После проверки соответствия DeviceInfoAPI становятся доступны следующие дополнительные значения снимка.

СвойствоТипОписание
batteryStatusInfoBatteryStatusModel?Текущие сведения о компонентах батареи устройства.
deviceCapabilitiesDeviceCapabilities?Нормализованные флаги возможностей устройства; nil, пока не получены достоверные сведения.
hardwareConfigurationDeviceHardwareConfigurationФизические средства ввода и требования к подсказкам, заявленные устройством.
languageSettingDeviceLanguageТекущий язык устройства.
supportedLanguages[NSNumber]Исходные значения DeviceLanguage, поддерживаемые устройством.
callStatusCallStatusТекущее состояние вызова.
storageInfoStorageInfoModel?Занятое и свободное пространство в МБ.
mediaCountInfoMediaCountInfoModel?Количество фото, видео и аудиофайлов.
isSupportAdjustRecordDurationBoolМожно ли настраивать максимальную длительность записи.
aiSolutionCapabilitiesAIBudsAISolutionCapabilitiesAI-возможности, заявленные устройством.
coprocessorModelCoprocessorModelМодель сопроцессора устройства.
imageEnhancementPostProcessingAlgorithmImageEnhancementPostProcessingAlgorithmТекущий алгоритм постобработки изображения; по умолчанию .general.
recommendedMaxVideoRecordingDurationOptions[NSNumber]Рекомендуемые варианты максимальной длительности видеозаписи в минутах; по умолчанию [1, 3, 9, 12].
recommendedMaxAudioRecordingDurationOptions[NSNumber]Рекомендуемые варианты максимальной длительности аудиозаписи в минутах; по умолчанию [30, 60, 120].
minimumBatteryLevelForMediaOperationsIntМинимальный заряд для фото, видео, аудио и передачи файлов; по умолчанию 30 процентов. Для OTA действуют отдельные правила.

Основные значения состояния​

batteryStatusInfo может содержать любой компонент, поддерживаемый устройством:

BatteryComponentЗначение
.glassКорпус очков
.leftEarbud / .rightEarbudЛевый или правый наушник
.chargingCaseЗарядный футляр
.mainSpeaker / .sideSpeakerОсновной или боковой динамик
.headphonesПолноразмерные наушники
.unknownКомпонент недоступен или не распознан

Используйте поля deviceCapabilities, чтобы включать TWS, пространственный звук, многоточечное подключение, ANC, встроенного голосового помощника, усиление басов, потоковое видео, Ximalaya и тестовый сигнал. Не определяйте эти функции только по product. Значение nil означает, что достоверные сведения ещё не получены, а не отсутствие поддержки всех функций.

hardwareConfiguration описывает способы управления устройством:

СвойствоЗначение
hasTouchInputЕсть сенсорная поверхность ввода.
hasPhysicalButtonInputЕсть физические кнопки.
requiresOnDeviceVoiceAssistantGuidanceПриложение должно показать инструкции для встроенного голосового помощника.

Для callStatus используется CallStatus:

ЗначениеОписание
.notInCallАктивного вызова нет.
.ringingПоступает входящий вызов.
.inCallВызов активен.
.threeWayRingingПоступает трёхсторонний вызов, если он поддерживается.
.aiChatУстройство сообщает об AI-диалоге как о текущей активности канала вызова.
.unknownСостояние вызова недоступно или не распознано.

Примеры использования​

Чтение сведений​

Примеры повторяют подход DeviceInfoDetailsController из Demo SDK: сначала читаются базовые свойства, затем при поддержке добавляются свойства DeviceInfoAPI.

Swift
import AIBuds

typealias DeviceDetail = (label: String, value: String)

func formattedDate(_ date: Date?, unavailable: String) -> String {
    guard let date else { return unavailable }

    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .medium
    return formatter.string(from: date)
}

func deviceDetails(for device: DeviceConvertible) -> [DeviceDetail] {
    let unavailable = "N/A"
    var details: [DeviceDetail] = [
        ("Device Name", device.name),
        ("UUID", device.uuid.uuidString),
        ("Bluetooth Name", device.bluetoothName ?? unavailable),
        ("MAC Address", device.macAddress ?? unavailable),
        ("Product", String(describing: device.product)),
        ("Device Model", device.deviceModel ?? unavailable),
        ("Serial Number", device.deviceSerialNum ?? unavailable),
        ("Firmware Version", device.formatedFirmwareVersion ?? unavailable),
        ("Co-processor Firmware", device.coProcessorFirmwareVersion ?? unavailable),
        ("Project Number", device.formatedProjNumber ?? unavailable),
        ("Last Connection", formattedDate(device.lastConnectTime, unavailable: unavailable)),
        ("Auto Reconnect", device.shouldAutoReconnectWhenAppLaunch ? "Yes" : "No"),
        ("Advertisement Data", device.advertisementDataString ?? unavailable),
        ("Manufacturer Data", device.manufacturerHexDataString ?? unavailable),
        (
            "Advertisement Timestamp",
            formattedDate(device.timestampOfAdvertisementData, unavailable: unavailable)
        ),
        ("Screen Name", device.screenName ?? unavailable),
        ("Custom Content", device.customContent ?? unavailable),
    ]

    guard let info = device as? DeviceInfoAPI else {
        return details
    }

    let supportedLanguages = info.supportedLanguages
        .compactMap { DeviceLanguage(rawValue: $0.intValue) }
        .map { String(describing: $0) }
        .joined(separator: ", ")

    details.append(contentsOf: [
        ("Battery Status", info.batteryStatusInfo?.description ?? unavailable),
        ("Device Capabilities", info.deviceCapabilities?.description ?? unavailable),
        ("Hardware Configuration", info.hardwareConfiguration.description),
        ("Language", String(describing: info.languageSetting)),
        ("Supported Languages", supportedLanguages.isEmpty ? unavailable : supportedLanguages),
        ("Call Status", String(describing: info.callStatus)),
        ("Storage", info.storageInfo?.description ?? unavailable),
        ("Media Count", info.mediaCountInfo?.description ?? unavailable),
        ("Adjustable Recording Duration", info.isSupportAdjustRecordDuration ? "Yes" : "No"),
        ("AI Capabilities", String(describing: info.aiSolutionCapabilities)),
        ("Co-processor Model", String(describing: info.coprocessorModel)),
        (
            "Image Enhancement",
            String(describing: info.imageEnhancementPostProcessingAlgorithm)
        ),
        ("Recommended Video Duration Options", info.recommendedMaxVideoRecordingDurationOptions.description),
        ("Recommended Audio Duration Options", info.recommendedMaxAudioRecordingDurationOptions.description),
        ("Minimum Media Battery", "\(info.minimumBatteryLevelForMediaOperations)%"),
    ])

    return details
}

Отображайте полученные строки через собственную модель представления и локализацию приложения. Demo использует таблицу и преобразует значения перечислений в локализованные строки.

Обновление сведений о памяти и медиафайлах​

storageInfo и mediaCountInfo — свойства снимка. Если экрану нужны актуальные значения, сначала запросите обновление, а после успешной операции прочитайте соответствующее свойство.

Swift
guard let info = device as? DeviceInfoAPI else { return }

info.requestQueryStorageInfo { success, error in
    guard success else {
        print(error?.localizedDescription ?? "Storage query failed")
        return
    }

    print(info.storageInfo?.description ?? "Storage information is unavailable")
}

Используйте requestQueryMediaCountInfo(_:) в Swift или requestQueryMediaCountInfoWithCompletion: в Objective-C, когда требуется обновить mediaCountInfo.

Обработка ошибок​

Само чтение свойств не возвращает асинхронную ошибку. Явные операции обновления сообщают сбои через обработчики завершения. При недоступных данных:

  1. Проверяйте device.isConnectedAndReady, если нужны текущие значения.
  2. Перед чтением свойств DeviceInfoAPI проверяйте соответствие протоколу.
  3. Обрабатывайте необязательные свойства, не предполагая, что каждая модель сообщает все значения; считайте nil в deviceCapabilities неизвестным состоянием, а не отсутствием поддержки.
  4. Считайте рекламные поля последним полученным снимком рекламных данных.
  5. Для явных обновлений, например запросов памяти или количества файлов, обрабатывайте success и error.

Рекомендации​

  1. Проверяйте соответствие протоколу: перед чтением расширенных свойств убедитесь в поддержке DeviceInfoAPI.

  2. Используйте заявленные значения: отдавайте приоритет флагам deviceCapabilities, рекомендуемым длительностям и minimumBatteryLevelForMediaOperations, а не названию продукта или жёстко заданным ограничениям.

  3. Воспринимайте значения как снимок: свойства могли обновляться в разное время.

  4. Обрабатывайте необязательные значения: показывайте недоступность, а не выдуманные данные.

  5. Обновляйте только при необходимости: запрашивайте память и количество файлов, когда экрану нужны актуальные значения.

  6. Локализуйте отображаемые значения: преобразуйте продукты, языки, состояния вызова и другие перечисления в понятный пользователю текст.

Примечания​

  • Возможности и доступные поля зависят от продукта и версии прошивки. DeviceProduct.headphones обозначает полноразмерные наушники, а BatteryComponent.headphones — их батарею.
  • supportedLanguages содержит значения NSNumber, соответствующие DeviceLanguage.rawValue.
  • StorageInfoModel предоставляет usedSpaceInMB и freeSpaceInMB.
  • MediaCountInfoModel предоставляет photoCount, videoCount и audioCount.
  • Если интерфейсу нужны отдельные значения, используйте свойства модели, а не разбор description.