Rehberler

Downlink ile yanıtlayın

Cihaza, uplink'ini taşıyan alışverişin içinde yanıt verin.

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

Cihaz çift yönlü bir sözleşmede olmalı
Sigfox'ta sözleşmesi çift yönlü olmayan bir cihaz tipi downlink taşıyamaz. Sözleşme, cihaz tipi oluşturulurken sabitlenir ve sonradan değiştirilemez. Başka bir şeyi ayıklamadan önce bunu kontrol edin — hiçbir doğru yapılandırma bunu aşamaz.

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.

Sabit hex
Her seferinde aynı 8 baytlık yanıt. Bir onay veya sabit bir komut için doğrudur.
Bir alandan
Mesaj içinde bir nokta-yolu, ör. 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 gelirSonuç
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öylerAck gelirse Onaylandı; nack ya da hata gelirse LNS'in gerekçesi satırda olmak üzere Başarısız
SigfoxSERVICE_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ırdownlinkAck 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!) }
Kendi makinenizde deneyin
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.

Köprüyü hızlı tutun
Cihaz alım penceresini açık tutuyor. Düşünmesi saniyeler süren bir köprü hedefi o pencereyi kaçırır. Zaman aşımını cihazın gerçekten bekleyebileceği bir değere ayarlayın ve hedefin bunun epey içinde yanıt verdiğinden emin olun.

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:

  1. Sözleşme çift yönlü değil. Bu yanlışsa başka hiçbir şeyin önemi yok.
  2. Callback çift yönlü türde değil. Düz bir DATA_UPLINK'in yanıt kanalı yoktur.
  3. Kural eşleşmedi. Koşulları ve daha önce Dur içeren bir kuralın çalışıp çalışmadığını kontrol edin.
  4. 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).
  5. Codec'in kodlayıcısı yok ya da bu komutlar için null döndürdü. Kural önizlemesi hangi codec'lerde kodlayıcı olduğunu söyler; API günlüğü neden hiçbir şey gitmediğini.
  6. Köprü hedefi zaman aşımına uğradı ya da adlandırılmış alan olmadan yanıt verdi.

Sırada

Kurallarla süzün
Kural sırası, eşleşince durma ve diğer eylemler.
İletim başarısız olduğunda
Giden tarafı teşhis etmek.
LoRaWAN alma pencerelerini ayarlayın
LoRaWAN'ın aynı alışverişte yanıt vermesini sağlayan RX1 gecikmesi.
Copyright © 2026