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

Обновление прошивки камеры

Camera OTA обновляет прошивку модуля камеры поддерживаемого устройства. Этот процесс выполняется отдельно от обновления основной прошивки устройства.

Приложение предоставляет совместимый локальный пакет прошивки камеры. SDK координирует весь процесс: настраивает точку доступа устройства, переводит камеру в режим OTA, запускает локальный HTTP-сервер, передаёт устройству URL прошивки, загружает пакет и прошивает модуль камеры. Показывайте текущий этап по соответствующим обратным вызовам, а окончательный результат определяйте только по финальному обработчику завершения.

Animated workflow

Путь доставки Camera OTA

Локальный пакет проходит проверку в приложении, передачу под управлением SDK, прошивку и завершается окончательным результатом.

Приложение

Проверка пакета

Проверьте целостность, совместимость с моделью камеры и доступность локального пути.

SDK + устройство

Настройка точки доступа

Подготовьте сеть устройства для процесса Camera OTA.

Устройство

Переход в режим OTA

Переведите модуль камеры в режим обновления прошивки.

SDK

Подключение к точке доступа

Подключитесь к SSID, созданному для сеанса обновления.

SDK

Запуск HTTP-сервера

Сделайте выбранный локальный пакет доступным устройству.

SDK → устройство

Передача URL прошивки

Передайте локальный HTTP-адрес, по которому устройство запросит пакет.

Этап с прогрессом

Передача прошивки

Отдавайте пакет, пока устройство загружает данные прошивки.

.transferring · 0...100
Этап с прогрессом

Прошивка камеры

Модуль камеры записывает переданную прошивку. Не прерывайте процесс.

.flashing · 0...100
Окончательный результат

Завершение

Результат обновления берите из финального обратного вызова, а не из прогресса передачи.

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

Предварительные требования

  • Устройство подключено и поддерживает DeviceCameraOtaAPI.
  • Локальный файл прошивки доступен для чтения и соответствует модулю камеры.
  • Приложение может подключиться к точке доступа устройства, работать в локальной сети и поддерживать доступность локального HTTP-сервера.
  • Не запускайте одновременно импорт медиафайлов, Camera OTA и другие процессы через точку доступа.

Реализация с помощью AI

Разработка с AI

Реализуйте этот сценарий с AI

Используйте официальный навык «Обновление прошивки камеры AIBuds» и адаптируйте сценарий к приложению.

Прочитайте и выполните инструкции https://docs-aibuds.github.io/ru/skills/update-aibuds-camera-firmware. Используйте этот навык, чтобы реализовать «Обновление прошивки камеры AIBuds» в данном iOS-проекте и проверить результат.
Открыть официальный навык

Справочник API

Фреймворк

AIBuds.xcframework

Импорт

Swift
import AIBuds
import AIBudsFoundation

Протокол

Протокол DeviceCameraOtaAPI наследует DeviceAPI и предоставляет один метод экземпляра, выполняющий весь процесс Camera OTA.

Метод экземпляра

Swift
/// Start camera OTA upgrade.
///
/// - Parameters:
///   - filePath: The readable local path of the camera firmware file.
///   - configureHotspotStartingHandler: Called when hotspot configuration starts.
///   - hotspotConfigureCompletionHandler: Called when hotspot configuration completes.
///     - success: `true` if configuration succeeded; otherwise `false`.
///     - error: The failure information, or `nil` if configuration succeeded.
///   - enterCameraOtaModeStartingHandler: Called when entry into camera OTA mode starts.
///   - enterCameraOtaModeCompletedHandler: Called when entry into camera OTA mode completes.
///     - success: `true` if the device entered OTA mode; otherwise `false`.
///     - error: The failure information, or `nil` if entry succeeded.
///   - waitingForHotspotOpenHandler: Called while waiting for the device hotspot to open.
///   - connectDeviceHotspotStartingHandler: Called when connecting to the device hotspot starts.
///     - ssid: The SSID of the device hotspot.
///   - deviceHotspotConnectCompletionHandler: Called when the hotspot connection completes.
///     - success: `true` if the connection succeeded; otherwise `false`.
///     - error: The failure information, or `nil` if the connection succeeded.
///   - httpServerStartingHandler: Called when the local HTTP server is starting.
///   - httpServerStartCompletionHandler: Called when the HTTP server start attempt completes.
///     - success: `true` if the server started; otherwise `false`.
///     - error: The failure information, or `nil` if the server started.
///   - sendingFirmwareUrlHandler: Called before sending the firmware URL to the device.
///     - firmwareUrl: The local HTTP URL that will be sent.
///   - firmwareUrlSendCompletionHandler: Called when firmware URL delivery completes.
///     - success: `true` if the URL was sent; otherwise `false`.
///     - error: The failure information, or `nil` if delivery succeeded.
///   - startCompletionHandler: Called when the Camera OTA start command completes.
///     - success: `true` if the update started; otherwise `false`.
///     - error: The failure information, or `nil` if the update started.
///   - fileTransferStartedHandler: Called when firmware transfer starts.
///   - fileTransferCompletedHandler: Called when firmware transfer completes.
///   - waitingForFlashingHandler: Called while the device is preparing to flash.
///   - flashingStartedHandler: Called when firmware flashing starts.
///   - flashingCompletedHandler: Called when firmware flashing completes.
///   - phaseProgressHandler: Reports progress for transfer and flashing.
///     - phase: `.transferring` or `.flashing`.
///     - progress: The phase progress in the range `0...100`.
///   - completionHandler: Called when the complete Camera OTA workflow finishes.
///     - success: `true` if the upgrade succeeded; otherwise `false`.
///     - error: The failure information, or `nil` if the upgrade succeeded.
func startCameraOta(
    withFilePath filePath: String,
    configureHotspotStartingHandler: AIBudsCameraOtaConfigureHotspotStartingHandler?,
    hotspotConfigureCompletionHandler: AIBudsCameraOtaHotspotConfigureCompletionHandler?,
    enterCameraOtaModeStartingHandler: AIBudsEnterCameraOtaModeStartingHandler?,
    enterCameraOtaModeCompletedHandler: AIBudsEnterCameraOtaModeCompletionHandler?,
    waitingForHotspotOpenHandler: AIBudsCameraOtaStartingToWaitForHotspotOpenHandler?,
    connectDeviceHotspotStartingHandler: AIBudsCameraOtaConnectDeviceHotspotStartingHandler?,
    deviceHotspotConnectCompletionHandler: AIBudsCameraOtaDeviceHotspotConnectCompletionHandler?,
    httpServerStartingHandler: AIBudsCameraOtaHttpServerStartingHandler?,
    httpServerStartCompletionHandler: AIBudsCameraOtaHttpServerStartCompletionHandler?,
    sendingFirmwareUrlHandler: AIBudsCameraOtaSendingFirmwareUrlHandler?,
    firmwareUrlSendCompletionHandler: AIBudsCameraOtaFirmwareUrlSendCompletionHandler?,
    startCompletionHandler: AIBudsCameraOtaStartCompletionHandler?,
    fileTransferStartedHandler: AIBudsCameraOtaFileTransferStartedHandler?,
    fileTransferCompletedHandler: AIBudsCameraOtaFileTransferCompletedHandler?,
    waitingForFlashingHandler: AIBudsCameraOtaWaitingForFlashingHandler?,
    flashingStartedHandler: AIBudsCameraOtaFlashingStartedHandler?,
    flashingCompletedHandler: AIBudsCameraOtaFlashingCompletedHandler?,
    phaseProgressHandler: AIBudsCameraOtaPhaseProgressHandler?,
    completionHandler: AIBudsCameraOtaCompletionHandler?
)

См. startCameraOta в справочнике API.

Возвращаемое значение

Метод не возвращает значение напрямую. Запуск, переходы между этапами, прогресс и окончательный результат передаются через обработчики.

Этапы процесса

Это этапы обратных вызовов процесса Camera OTA, а не значения CameraOtaProgressPhase.

ЭтапСвязанные обработчики
Настройка точки доступаconfigureHotspotStartingHandler, hotspotConfigureCompletionHandler
Переход в режим Camera OTAenterCameraOtaModeStartingHandler, enterCameraOtaModeCompletedHandler
Подключение к точке доступа устройстваwaitingForHotspotOpenHandler, connectDeviceHotspotStartingHandler, deviceHotspotConnectCompletionHandler
Запуск локального HTTP-сервераhttpServerStartingHandler, httpServerStartCompletionHandler
Передача URL прошивкиsendingFirmwareUrlHandler, firmwareUrlSendCompletionHandler
Запуск обновленияstartCompletionHandler
Передача прошивкиfileTransferStartedHandler, fileTransferCompletedHandler
Подготовка и прошивкаwaitingForFlashingHandler, flashingStartedHandler, flashingCompletedHandler
ЗавершениеcompletionHandler

Фазы прогресса

CameraOtaProgressPhase содержит два открытых значения. Аргумент progress — целое число от 0 до 100 для указанной фазы.

SwiftObjective-CИсходное значениеЗначение
.transferringAIBudsCameraOtaProgressPhaseTransferring1Прогресс передачи файла прошивки.
.flashingAIBudsCameraOtaProgressPhaseFlashing2Прогресс прошивки камеры.

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

В примерах сохранены все обратные вызовы из демо SDK. В рабочем приложении обновляйте интерфейс в главной очереди.

Swift
guard let cameraOtaDevice = device as? DeviceCameraOtaAPI else {
    print("Camera OTA is not supported")
    return
}

cameraOtaDevice.startCameraOta(
    withFilePath: filePath,
    configureHotspotStartingHandler: {
        print("Configuring device hotspot")
    },
    hotspotConfigureCompletionHandler: { success, error in
        print(
            success
                ? "Hotspot configured"
                : "Hotspot configuration failed: \(error?.localizedDescription ?? "Unknown error")")
    },
    enterCameraOtaModeStartingHandler: {
        print("Entering Camera OTA mode")
    },
    enterCameraOtaModeCompletedHandler: { success, error in
        print(
            success
                ? "Camera OTA mode ready"
                : "Could not enter Camera OTA mode: \(error?.localizedDescription ?? "Unknown error")"
        )
    },
    waitingForHotspotOpenHandler: {
        print("Waiting for device hotspot")
    },
    connectDeviceHotspotStartingHandler: { ssid in
        print("Connecting to \(ssid)")
    },
    deviceHotspotConnectCompletionHandler: { success, error in
        print(
            success
                ? "Device hotspot connected"
                : "Hotspot connection failed: \(error?.localizedDescription ?? "Unknown error")")
    },
    httpServerStartingHandler: {
        print("Starting local HTTP server")
    },
    httpServerStartCompletionHandler: { success, error in
        print(
            success
                ? "HTTP server ready"
                : "HTTP server failed: \(error?.localizedDescription ?? "Unknown error")")
    },
    sendingFirmwareUrlHandler: { firmwareURL in
        print("Sending firmware URL: \(firmwareURL)")
    },
    firmwareUrlSendCompletionHandler: { success, error in
        print(
            success
                ? "Firmware URL sent"
                : "URL delivery failed: \(error?.localizedDescription ?? "Unknown error")")
    },
    startCompletionHandler: { success, error in
        print(
            success
                ? "Camera OTA started"
                : "Camera OTA could not start: \(error?.localizedDescription ?? "Unknown error")")
    },
    fileTransferStartedHandler: {
        print("Firmware transfer started")
    },
    fileTransferCompletedHandler: {
        print("Firmware transfer completed")
    },
    waitingForFlashingHandler: {
        print("Waiting for flashing")
    },
    flashingStartedHandler: {
        print("Firmware flashing started")
    },
    flashingCompletedHandler: {
        print("Firmware flashing completed")
    },
    phaseProgressHandler: { phase, progress in
        switch phase {
        case .transferring:
            print("Transfer: \(progress)%")
        case .flashing:
            print("Flashing: \(progress)%")
        }
    },
    completionHandler: { success, error in
        if success {
            print("Camera OTA completed successfully")
        } else {
            print("Camera OTA failed: \(error?.localizedDescription ?? "Unknown error")")
        }
    }
)

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

Ошибки Camera OTA используют AIBudsSDK.CameraOtaErrorDomain и SdkCameraOtaErrorCode. Открытое перечисление охватывает проверку локального файла, сбои сети и точки доступа, жизненного цикла задачи, перехода в режим OTA и передачи URL прошивки.

КодыТипичная причина
unknown, networkRequestFailed, networkTimeoutSDK не может точнее классифицировать ошибку либо произошёл сетевой сбой.
cameraOtaFileNotFound, invalidCameraOtaFile, cameraOtaTaskCreateFailedDueToFileNotFoundЛокальный файл не найден или пакет прошивки недействителен.
hotspotDisconnectedDuringTransfer, invalidHotspotConfigТочка доступа устройства работает нестабильно или настроена неверно.
stageTwoTimeout, interruptedByShutdownOrLowBatteryПрошивка зависла близко к завершению либо устройство прервало обновление.
cameraOtaTaskAlreadyRunningУже выполняется другая задача Camera OTA.
4003...4009Ошибка подключения, тайм-аут, сбой настройки точки доступа, перехода в OTA, HTTP-сервера или передачи URL.
5001...5010Устройство отклонило переход в OTA или URL из-за команды, хранилища, разрешений, канала или текущего состояния.

Показывайте этап, на котором произошла ошибка, а не общее сообщение об обновлении. После начала прошивки не выполняйте автоматический повтор, отключение, выключение или другой процесс через точку доступа. SDK пока не задаёт безопасные границы повтора: прежде чем предложить другой пакет, проверьте состояние восстановления и версию прошивки камеры.

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

  1. До вызова API проверьте наличие локального файла; подлинность пакета и совместимость с моделью камеры проверяет приложение.
  2. Не запускайте одновременно импорт медиафайлов, Camera OTA и другие процессы через точку доступа.
  3. До финального завершения сохраняйте приложение активным, а локальный HTTP-сервер — доступным.
  4. Обновляйте интерфейс в главной очереди: обратные вызовы могут поступать из другой очереди.
  5. startCompletionHandler сообщает только о запуске OTA, а не об окончательном результате обновления.
  6. Окончательный результат берите из completionHandler, а после повторного подключения проверяйте состояние прошивки камеры.

Примечания

  • Camera OTA использует локальный файл; SDK не обращается к удалённому сервису обновлений и не загружает пакет.
  • phaseProgressHandler сообщает только о передаче и прошивке. Для остальных этапов предусмотрены отдельные обратные вызовы.
  • Значение 100 для передачи ещё не означает завершение Camera OTA: далее выполняется прошивка и приходит финальный результат.
  • Безопасное автоматическое повторение операции пока не определено открытым контрактом SDK.