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

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

Читайте доступные сведения об устройстве 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.