Downlink ile yanıtlayın
Trafiğin çoğu soldan sağa akar. Downlink geri gider: cihaz uplink'iyle bir soru sorar, yanıt da aynı callback'in cevabında evine ulaşır.
İşleme hattının tersten çalıştığı tek yer burasıdır ve zamana duyarlıdır — cihaz beklemektedir.
Önce doğru olması gerekenler
Ayrıca uplink'in yanıt bekleyen türde olması gerekir. Sigfox için bu, bir
DATA_BIDIR callback'idir.
Kuralı kurun
Akış → Kurallar → Yeni kural. Yanıtlanması gereken uplink'leri eşleştirin —
genelde messageType üzerinden — ve Downlink ile yanıtla'yı seçin.
Sonra yanıtın nereden geleceğini seçin.
Yanıt nereden gelir
Merkez hesaplasın
Merkez, sizin tanımladığınız bir downlink döndürür: ya bir sabit ya da mesajdaki bir alandan okunan bir değer.
decoded.cmdHex. Çözücünün, cihazın
gönderdiğinden yanıtı üretmesini sağlar.Alandan okumak ikisinden daha kullanışlıdır: çözücünüz uplink'i inceleyip doğru yanıtı üretebilir, kural da onu iletir.
Codec komutları kodlasın
Üçüncü kaynak sorunu tersine çevirir. Kural bayt yerine komutlar taşır — yanıtın anlamını:
[{ "name": "valveOpen", "args": { "value": false } }, { "name": "toggleProtocol" }]
ve cihazın codec'i bunları çerçeveye çevirir. Codec, profile zaten
bağladığınız çözücüdür; decodeUplink'in yanında ikinci bir işlev taşır:
function encodeDownlink(input: EncodeInput): EncodeOutput | null {
const frame = new Array(8).fill(0)
for (const c of input.commands) {
if (c.name === 'valveOpen') frame[0] = c.args?.value ? 0x01 : 0x02
if (c.name === 'toggleProtocol') frame[1] |= 0x01
}
return { bytes: frame }
}
Çözücüler → codec → Kodlayıcı altında yazın ya da kuralın Kodlayan
codec alanında codec'i seçip Kodlayıcıyı yaz'a basın — kural bir codec
adlandırmadıkça cihazın kendi codec'i kullanılır. Bu yanıt için tüm komutları,
yanıtlanan uplink'i (input.uplink, çözücünüzün döndürdüğü decoded ile),
radyoyu ve bayt sınırını alır; tek bir çerçeve döndürür — ya da bu turda hiçbir
şey göndermemek için null. Komutlarla test et paneli onu sunucuda, gerçek
bir yanıtla birebir aynı şekilde çalıştırır.
Neden bunu tercih etmeli: kural okunur kalır (sayaç ödenmemişse vanayı kapat), bayt düzeni aynı cihazı anlayan çözücünün yanında tek bir yerde yaşar ve kodlayıcı kuralları birleşir — aynı uplink'e iki kodlayıcı kuralı eşleşirse komutları aynı çerçeveye girer. Diğer downlink kuralları ilk-eşleşen-kazanır mantığını korur; hangi downlink kuralı önce eşleşirse hangi türün çalışacağını o belirler.
Daha sonrası için bir komut kuyruğa alın
Bir kural o anda bildiğiyle yanıt verir. Bir operatörün daha sonra göndermek istediği komutlar — "bu cihaz bir dahaki dinleyişinde protokolü değiştir" — cihazın downlink kuyruğundan geçer: cihaz sayfasını açıp Downlink kuyruğu kartında Komut kuyruğa al'a basın ya da cihazlar listesinde birkaç cihaz seçip seçim üzerinde Komut kuyruğa al'ı kullanın. Kuyruğa alınan komutun bir adı, isteğe bağlı JSON argümanları, bir önceliği, isteğe bağlı bir son geçerliliği ve bir notu vardır.
Kuyruktaki hiçbir şey kendiliğinden gönderilmez. Cihazın bir sonraki yanıt
fırsatında, kuyruktaki komutları dahil et seçili bir kodlayıcı kuralı,
bekleyen satırları kendi komutlarının yanında encodeDownlink'e verir
(source: 'queue', id'leriyle). Çerçeve gider ve taşıdığı satırlar, onları
taşıyan mesajla birlikte Gönderildi olarak işaretlenir; kodlayıcının
applied dışında bıraktıkları bir sonraki sefer için Kuyrukta kalır. Son
geçerliliğini geçmiş bir komut Süresi doldu, geri çektiğiniz biri İptal
edildi olur — kart hepsini geçmiş olarak tutar.
Gönderildi satırı orada kalmaz. Ağ, çerçeveye ne olduğunu bildirir ve Merkez o çerçevenin taşıdığı satırları sonuçlandırır:
| Ağ | Onay nereden gelir | Sonuç |
|---|---|---|
| LoRaWAN (The Things Stack) | LNS'in kendi downlink_ack, downlink_nack ve downlink_failed olayları — projenin webhook'u uplink'lerin yanında bunlara da abonedir ve her biri hangi çerçeveden söz ettiğini söyler | Ack gelirse Onaylandı; nack ya da hata gelirse LNS'in gerekçesi satırda olmak üzere Başarısız |
| Sigfox | SERVICE_ACKNOWLEDGE callback'i. Bir çerçeve adlandırmaz; bu yüzden cihazın son on beş dakikada gönderilen satırlarını sonuçlandırır | downlinkAck doğruysa Onaylandı, değilse Başarısız |
LoRaWAN'da cihazı yalnızca onaylı (confirmed) bir çerçeve onay vermeye zorlar; Onaylandı durumuna ihtiyacınız varsa kuralın downlink tanımında bunu isteyin.
Bu LNS olayları işleme hattına kendi başlarına birer mesaj olarak da ulaşır —
JOIN, DOWNLINK_QUEUED, DOWNLINK_SENT, DOWNLINK_ACK, DOWNLINK_NACK,
DOWNLINK_FAILED — yükleri yoktur. Asla çözülmezler; bir Sigfox servis
callback'i gibi kurallardan ve hedeflerden geçerler ve işleme hattı süzgecinde
ve Ölü mektuplar'da mesaj türüne göre seçilebilirler. Hiçbiri bir yanıt
fırsatı değildir: LoRaWAN'da bir downlink kuralını yalnızca UPLINK
tetikleyebilir.
// Yalnızca sığanı döndürün: gerisi bir sonraki fırsatı bekler.
return { bytes: frame, applied: input.commands.filter(c => c.source === 'queue' && used.has(c.name)).map(c => c.id!) }
api/ içinde npm run db:seed:example, center kiracısında eksiksiz bir örnek
kurar — Downlink example projesi, hem çözen hem kodlayan bir codec, bir
cihaz, yukarıdaki iki kural ve kuyrukta bir komut. Sahte kaynağı
(localhost:3003/ui) Generic HTTP moduna alın, yazdırılan ingest URL'sine
ve gizli anahtara yöneltin ve gönderin: yanıt 8 baytlık cevabı taşır, sahte
hedef (localhost:3004/ui) çözülmüş iletimi gösterir ve cihaz sayfasının
Downlink kuyruğu kartı komutu gönderildi olarak gösterir.Bir hedefe köprüle
Merkez uplink'i seçtiğiniz bir hedefe iletir, JSON yanıtını bekler ve o yanıttaki adlandırılmış alandan hex'i döndürür.
Bu, yanıta kendi sisteminizin karar verdiği durumlar içindir — sayacın programını bilen bir sunucu ya da bekleyen komut kuyruğu tutan bir servis.
Bir zaman aşımı ile gelir. Hedef zamanında yanıt vermezse downlink döndürülmez ve cihaz bir şey almaz.
Biçim
Bir Sigfox downlink'i 16 hex karakterdir — 8 bayt. Ne fazla ne eksik.
İster sabit olsun, ister bir alandan okunsun, ister köprü hedefinden dönsün, çıkması gereken budur. Yanlış uzunlukta bir değer tutan alan, "kural eşleşti ama bir şey gelmedi" durumunun yaygın sebebidir.
İlk eşleşme kazanır
Birden fazla kural downlink üretebiliyorsa, onu ilk eşleşen kural sağlar. O mesaj için sonraki downlink kuralları yok sayılır.
Bu yüzden downlink kurallarını, diğer kurallarda olduğu gibi en özelden en genele doğru sıralayın.
İletim yine olur
Downlink ile yanıt vermek, uplink'in hedeflerinize iletilmesini durdurmaz. İkisi bağımsızdır: cihaz yanıtını alır, sistemleriniz de ölçümü.
Downlink'i iletim yerine istiyorsanız, downlink kuralından sonra mesajı atan bir kural ekleyin.
Hiçbir şey dönmediğinde
Olasılık sırasıyla:
- Sözleşme çift yönlü değil. Bu yanlışsa başka hiçbir şeyin önemi yok.
- Callback çift yönlü türde değil. Düz bir
DATA_UPLINK'in yanıt kanalı yoktur. - Kural eşleşmedi. Koşulları ve daha önce Dur içeren bir kuralın çalışıp çalışmadığını kontrol edin.
- Değer 16 hex karakter değil. Kuralın okuduğu alanı ya da kodlayıcının döndürdüğünü kontrol edin (Komutlarla test et paneli bayt sayısını gösterir).
- Codec'in kodlayıcısı yok ya da bu komutlar için
nulldöndürdü. Kural önizlemesi hangi codec'lerde kodlayıcı olduğunu söyler; API günlüğü neden hiçbir şey gitmediğini. - Köprü hedefi zaman aşımına uğradı ya da adlandırılmış alan olmadan yanıt verdi.