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öntem | Yol | Yetki | İşlev |
|---|---|---|---|
| GET | /api/iot/ota/packages | iot_ota.read | Paketleri listele (status, title) |
| POST | /api/iot/ota/packages | iot_ota.packages.manage | Paket yükle (multipart) |
| GET | /api/iot/ota/packages/{packageId} | iot_ota.read | Güncelleme sayılarıyla tek bir paket |
| PATCH | /api/iot/ota/packages/{packageId} | iot_ota.packages.manage | Yayın notları veya durum DEPRECATED, yeniden READY, REVOKED |
| DELETE | /api/iot/ota/packages/{packageId} | iot_ota.packages.manage | Kullanılmayan bir paketi sil |
| GET, POST | /api/iot/ota/assignments | okuma: iot_ota.read; atama: iot_ota.assign | Atamaları listele veya oluştur |
| DELETE | /api/iot/ota/assignments/{assignmentId} | iot_ota.assign | Bir atamayı kaldır |
| GET | /api/iot/ota/rollouts | iot_ota.read | Dalgalar halinde yayınlar (packageId, status) |
| GET, POST | /api/iot/ota/rollouts/{rolloutId} | okuma; iot_ota.assign | Oku; { "action": "pause" \| "resume" \| "abort" } |
| GET | /api/iot/ota/states | iot_ota.read | Güncelleme denemeleri (packageId, state, limit en fazla 500) |
| GET, POST | /api/iot/ota/devices/{deviceId} | okuma; iot_ota.assign | Bir cihazın güncellemesi; { "action": "retry" } |
| GET, PUT | /api/iot/ota/settings/{profile\|device}/{id} | okuma; iot_ota.assign | Bir profilin OTA ayarları veya bir cihazın ölçülü bağlantı geçersiz kılması |
| GET, POST | /api/iot/ota/signing-keys | okuma; iot_ota.keys.manage | İmza genel anahtarlarını listele veya ekle |
| DELETE | /api/iot/ota/signing-keys/{keyId} | iot_ota.keys.manage | Bir 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 |
|---|---|
title | 1 ila 128; harfler, rakamlar, ., _, +, - |
version | 1 ila 64; harfler, rakamlar, ., _, +, ~, - |
checksum | Dosyanın SHA-256 değeri, 64 onaltılık karakter |
signatureScheme | usign-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) |
type | FIRMWARE veya SOFTWARE |
profileId, hardwareModels (en fazla 50), minFromVersion | Hangi cihazlara uyduğu |
releaseNotes | en fazla 4.000 karakter |
Varsayılan en büyük boyut 64 MiB’tir. Yanıt 201 { "package": {...} }.
| Ret | İleti |
|---|---|
400 file_missing | Firmware dosyasını ekleyin. |
413 too_large | Paket izin verilenden büyük. |
413 quota | Bu paket için yeterli depolama alanı kalmadı. |
422 checksum_mismatch | Yü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_exists | Bu 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öntem | Yol | Yetki | İşlev |
|---|---|---|---|
| GET | /api/iot/devices/{deviceId}/settings | iot_device_settings.read | Her bölüm: istenen ve bildirilen değerler, durum, sapma |
| GET | /api/iot/devices/{deviceId}/settings/schema | .read | Cihazın modelinin ve firmware’inin manifestosu |
| GET | /api/iot/devices/{deviceId}/settings/history | .read | Geçmiş değişiklikler (section, page 0’dan başlar, sort=at:desc) |
| GET | /api/iot/devices/{deviceId}/settings/{section} | .read | Tek bir bölüm; ETag onun revizyonudur |
| PUT | /api/iot/devices/{deviceId}/settings/{section} | .operate ve değişen sınıflar | Bir bölümü değiştir: { values, confirm? } |
| PATCH | /api/iot/devices/{deviceId}/settings/{section} | .operate ve değişen sınıflar | Birleş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= | .read | Modelleriniz ve bir modelin bölümleri |
| GET, POST | /api/iot/device-settings/baselines | .read; .baselines.manage | Taban çizgilerini listele veya oluştur |
| GET, PUT, DELETE | /api/iot/device-settings/baselines/{baselineId} | .read; .baselines.manage | Oku, değiştir, sil |
| GET, POST | /api/iot/device-settings/jobs | .read; .jobs.manage | Toplu işleri listele veya başlat |
| GET | /api/iot/device-settings/jobs/{jobId}, .../targets | .read | Bir iş, dalgaları ve cihazları |
| POST | /api/iot/device-settings/jobs/{jobId}/pause, /resume, /cancel | .jobs.manage | Bir 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-Matchgereklidir: olmadan428“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=truedoğrular ve neyin değişeceğini listeler, hiçbir şey saklamaz.- Birleştirme yaması nesneleri birleştirir,
nullile 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.

