Yeni: Yapay zekâ güvenlik duvarı her modülü izliyor ve her olayı sade bir dille açıklıyor. Nasıl çalıştığını görün

Firmware ve cihaz ayarları API’si

İmzalı firmware yükleyin, atayın, yayınları dalgalar halinde çalıştırın ve yönetin; lisanslı cihazların ayarlarını REST üzerinden okuyun ve değiştirin – rotalar, gövdeler ve hatalar.

Bu sayfa iki rota ailesini kapsar: firmware güncellemeleri (OTA) ve uzaktan cihaz ayarları. İkisinin kullanıcılar için nasıl çalıştığı Firmware güncellemeleri (OTA), Firmware yayın dalgaları ve Uzaktan cihaz ayarları bölümlerinde anlatılır. Yollar https://<your host>/tenant/<tenantId> altındadır.

Firmware rotaları

YöntemYolYetkiİşlev
GET/api/iot/ota/packagesiot_ota.readPaketleri listele (status, title)
POST/api/iot/ota/packagesiot_ota.packages.managePaket yükle (multipart)
GET/api/iot/ota/packages/{packageId}iot_ota.readGüncelleme sayılarıyla tek bir paket
PATCH/api/iot/ota/packages/{packageId}iot_ota.packages.manageYayın notları veya durum DEPRECATED, yeniden READY, REVOKED
DELETE/api/iot/ota/packages/{packageId}iot_ota.packages.manageKullanılmayan bir paketi sil
GET, POST/api/iot/ota/assignmentsokuma: iot_ota.read; atama: iot_ota.assignAtamaları listele veya oluştur
DELETE/api/iot/ota/assignments/{assignmentId}iot_ota.assignBir atamayı kaldır
GET/api/iot/ota/rolloutsiot_ota.readDalgalar halinde yayınlar (packageId, status)
GET, POST/api/iot/ota/rollouts/{rolloutId}okuma; iot_ota.assignOku; { "action": "pause" \| "resume" \| "abort" }
GET/api/iot/ota/statesiot_ota.readGüncelleme denemeleri (packageId, state, limit en fazla 500)
GET, POST/api/iot/ota/devices/{deviceId}okuma; iot_ota.assignBir cihazın güncellemesi; { "action": "retry" }
GET, PUT/api/iot/ota/settings/{profile\|device}/{id}okuma; iot_ota.assignBir profilin OTA ayarları veya bir cihazın ölçülü bağlantı geçersiz kılması
GET, POST/api/iot/ota/signing-keysokuma; iot_ota.keys.manageİmza genel anahtarlarını listele veya ekle
DELETE/api/iot/ota/signing-keys/{keyId}iot_ota.keys.manageBir anahtarı iptal et

İmzalama anahtarı ekleme ve iptal etme bir Owner yetkisidir, bu yüzden bir API anahtarı bunu yapamaz.

Paket yükle

POST /api/iot/ota/packages iki bölümlü multipart/form-data alır: file (imaj) ve meta (JSON metni). Sağlama toplamı hiçbir şey saklanmadan önce denetlenir ve imza kayıtlı anahtarlarınıza karşı doğrulanır.

curl -s -X POST "https://$HOST/tenant/$TENANT/api/iot/ota/packages" \
  -H "Authorization: Bearer $HERMETRY_KEY" \
  -F "file=@router-fw-2.5.0.bin" \
  -F 'meta={"title":"router-fw","version":"2.5.0","checksum":"<sha256 of the file>","signatureScheme":"usign-ed25519","signature":"<text of the .sig file>","profileId":"a1b2…","releaseNotes":"Fixes LTE reconnect."}'
meta alanıKurallar
title1 ila 128; harfler, rakamlar, ., _, +, -
version1 ila 64; harfler, rakamlar, ., _, +, ~, -
checksumDosyanın SHA-256 değeri, 64 onaltılık karakter
signatureSchemeusign-ed25519 (signature içinde ayrık imza), paketin uygun olduğu cihaz ailesinin güvenli açılış şeması veya none (yalnızca profilin imzasız imajlara izin verdiği yerde)
typeFIRMWARE veya SOFTWARE
profileId, hardwareModels (en fazla 50), minFromVersionHangi cihazlara uyduğu
releaseNotesen fazla 4.000 karakter

Varsayılan en büyük boyut 64 MiB’tir. Yanıt 201 { "package": {...} }.

Retİleti
400 file_missingFirmware dosyasını ekleyin.
413 too_largePaket izin verilenden büyük.
413 quotaBu paket için yeterli depolama alanı kalmadı.
422 checksum_mismatchYüklenen dosyanın SHA-256 değeri verilenle eşleşmiyor.
422İmajın imzası kayıtlı bir anahtara karşı doğrulanamıyor.
409 package_existsBu başlık ve sürüme sahip bir paket zaten var.

Ata ve yayınla

POST/tenant/{tenantId}/api/iot/ota/assignments

Bir READY paketini bir PROFILE veya bir DEVICE‘a (targetId içinde) ya da bir GROUP‘a (deviceIds, en fazla 5.000, veya selector.profileId, ikisi de şimdi sabitlenir) atayın. dryRun: true sayıları yanıtlar ve hiçbir şey yazmaz. waves (1 ila 20) bir profili veya grubu dalgalar halinde yayınlar; tek bir cihaz asla dalgalar halinde yayınlanmaz.

İstek gövdesi application/json

{
    "packageId": "f00d…",
    "targetType": "PROFILE",
    "targetId": "a1b2…",
    "waves": [
        {
            "size": {
                "percent": 5
            },
            "soakMin": 60,
            "minSuccessPct": 95,
            "maxFailurePct": 2,
            "maxDurationMin": 1440
        },
        {
            "size": {
                "percent": 100
            },
            "soakMin": 0,
            "minSuccessPct": 95,
            "maxFailurePct": 2,
            "maxDurationMin": 2880
        }
    ]
}

Örnek curl

curl -X POST 'https://<your-host>/tenant/{tenantId}/api/iot/ota/assignments' \
  -H 'Content-Type: application/json' \
  -d '{"packageId":"f00d…","targetType":"PROFILE","targetId":"a1b2…","waves":[{"size":{"percent":5},"soakMin":60,"minSuccessPct":95,"maxFailurePct":2,"maxDurationMin":1440},{"size":{"percent":100},"soakMin":0,"minSuccessPct":95,"maxFailurePct":2,"maxDurationMin":2880}]}'

Yanıtlar

201Oluşturuldu
{
    "assignment": {
        "…": "…"
    },
    "preview": {
        "…": "…"
    },
    "result": {
        "…": "…"
    }
}
200Tamam
{
    "assignment": null,
    "preview": {
        "…": "…"
    }
}
409Çakışma
{
    "message": "Only a ready package can be assigned.",
    "code": "CONFLICT"
}

Bir dalganın size değeri { "percent": 0–100 } veya { "count": 1–100000 }; son dalga kalanı alır. soakMin 0 ila 10.080, minSuccessPct ve maxFailurePct 0 ila 100, isteğe bağlı maxFailures, maxDurationMin 5 ila 43.200.

Yayın durumları: RUNNING, PAUSED, COMPLETED, ABORTED. Başarısız bir kapı yayını duraklatır; resume devam ettirir, abort sonlandırır.

Güncelleme durumları

Bir cihazın güncellemesi QUEUED, INITIATED, WAITING, DOWNLOADING, DOWNLOADED, VERIFIED, UPDATING durumlarından geçer ve UPDATED, FAILED, TIMEOUT, ROLLED_BACK, SKIPPED veya CANCELLED ile biter. Yalnızca FAILED, TIMEOUT ve ROLLED_BACK yeniden denenebilir ({ "action": "retry" }), deneme sınırına kadar.

OTA ayarları

PUT /api/iot/ota/settings/profile/{profileId} şunları alır: otaEnabled, allowMetered, allowUnsigned, downloadTimeoutMin (5 ila 1.440), updateTimeoutMin (2 ila 240), maxAttempts (1 ila 10); null varsayılana döndürür. Bir cihaz için (/settings/device/{deviceId}) yalnızca allowMetered alınır: “Bir cihaz yalnızca ölçülü bağlantı ayarını alır.”

Webhook olayları: ota.update.* ve ota.rollout.*, bkz. Webhook olay başvurusu.

Cihaz ayarları rotaları

Uzaktan ayarlar, modeli bir ayar manifestosu yayınlayan lisanslı cihazlar içindir.

YöntemYolYetkiİşlev
GET/api/iot/devices/{deviceId}/settingsiot_device_settings.readHer bölüm: istenen ve bildirilen değerler, durum, sapma
GET/api/iot/devices/{deviceId}/settings/schema.readCihazın modelinin ve firmware’inin manifestosu
GET/api/iot/devices/{deviceId}/settings/history.readGeçmiş değişiklikler (section, page 0’dan başlar, sort=at:desc)
GET/api/iot/devices/{deviceId}/settings/{section}.readTek bir bölüm; ETag onun revizyonudur
PUT/api/iot/devices/{deviceId}/settings/{section}.operate ve değişen sınıflarBir bölümü değiştir: { values, confirm? }
PATCH/api/iot/devices/{deviceId}/settings/{section}.operate ve değişen sınıflarBirleştirme yaması: { patch, confirm? }
POST/api/iot/devices/{deviceId}/settings/{section}/reapply.operateİstenen bölümü yeniden gönder
GET/api/iot/device-settings/models, /model-schema?model=.readModelleriniz ve bir modelin bölümleri
GET, POST/api/iot/device-settings/baselines.read; .baselines.manageTaban çizgilerini listele veya oluştur
GET, PUT, DELETE/api/iot/device-settings/baselines/{baselineId}.read; .baselines.manageOku, değiştir, sil
GET, POST/api/iot/device-settings/jobs.read; .jobs.manageToplu işleri listele veya başlat
GET/api/iot/device-settings/jobs/{jobId}, .../targets.readBir iş, dalgaları ve cihazları
POST/api/iot/device-settings/jobs/{jobId}/pause, /resume, /cancel.jobs.manageBir işi yönet

Bir yazma neyi değiştirebilir, değişen her ayarın sınıfına bağlıdır: çalışma ayarları iot_device_settings.operate gerektirir, yapılandırma ayarları iot_device_settings.write, tehlikeli ayarlar iot_device_settings.dangerous.write (yalnızca Owner, yani asla bir API anahtarı değil) ve "confirm": true.

Bir bölümü değiştir

GET  /api/iot/devices/{deviceId}/settings/network        → ETag: "7"
PATCH /api/iot/devices/{deviceId}/settings/network
If-Match: "7"
{ "patch": { "lte": { "apn": "iot.example" } } }
  • If-Match gereklidir: olmadan 428 “If-Match gerekli: okuduğunuz rev’i gönderin.”
  • Bölüm okuduğunuzdan beri değiştiyse: 412 “Bölüm okunduğundan beri değişti; yeniden okuyun.” (rev_mismatch).
  • ?dryRun=true doğrular ve neyin değişeceğini listeler, hiçbir şey saklamaz.
  • Birleştirme yaması nesneleri birleştirir, null ile siler ve listeleri bütün olarak değiştirir.
  • Yazmalar kuruluş başına dakikada 600 ile sınırlıdır.
  • Gizli bilgiler asla döndürülmez: gizli bir ayar { "set": true } olarak okunur.

Bölümlere göre ayar almayan bir cihaz 409 “Bu cihaz bölümlere göre ayar almıyor.” yanıtını verir; manifestosu henüz kataloğda olmayan cihaz ise “Bu cihazın modeli ve firmware’inin ayar manifestosu henüz kataloğda değil.”

Toplu işler

Idempotency-Key başlığıyla POST /api/iot/device-settings/jobs: name (en fazla 80), baselineId veya sections, selector (deviceIds, profileId veya models), isteğe bağlı waves ({ "percent": [1, 10, 100] } veya { "count": [...] }, en fazla 10), gates (minApplied, maxReverted 0 ila 1 arasında oranlar olarak), onConflict (queue veya skip), offlineExpiryDays (1 ila 90), waveTimeoutMin (1 ila 1.440), confirm. Tekrarlanan bir Idempotency-Key ilk işi yanıtlar (200). ?dryRun=true planı yanıtlar. Redler: 409 too_many_jobs; 422 confirm_required, invalid_sections, no_devices, too_many_devices; 403 class_forbidden.