Tarafları taklit etmek

Sahte hedef

Sağ taraf — tam olarak neyin iletildiğini görün, sonra onu komutla başarısız kılın.

Her zaman evet diyen bir hedef neredeyse hiçbir şeyi kanıtlamaz. Yeniden deneme, artan bekleme ve ölü mektup kuyruğu ancak alıcı taraf bilerek başarısız olabiliyorsa gözlemlenebilir.

Sahte hedef, tam olarak bunu yapan bir yerine geçen uygulamadır. localhost:3004 üzerinde çalışır; konsolu /ui adresindedir.

Başlatın ve Merkez'i buna yöneltin

cd sink-test
npm install
cp .env.example .env
npm run start:dev

Sonra HEDEF entegrasyonunuzun uç nokta adresini şu yapın:

http://localhost:3004/sink

Entegrasyonda Test et'e basın — yeşile dönmelidir. (Sahte hedef, o düğmenin kullandığı erişilebilirlik yoklamasını HEAD /sink üzerinde yanıtlar.)

Şimdi sahte kaynakla bir şey gönderin ve düşüşünü izleyin.

Gerçekte ne geldiğini görün

localhost:3004/ui canlı bir akıştır — iletimler sorgulanarak değil, geldikçe itilir.

Üst çubuk aynı zamanda kontrol panelidir: davranış modu, yedek downlink ve etkin kurallar sayfadan çıkmadan değiştirilebilir. Sayaçlar — iletim, downlink, başarısız, tekrar, bozuk imza — bir testin beklediğinizi yapıp yapmadığını en hızlı okuma biçimidir. Burada hedef fail modundayken iki satır 503 yanıtlamış, iki satır da DUP işaretlenmiştir.

Tüm alışverişi görmek için bir satıra tıklayın: başlıklar, istek gövdesi, yanıt gövdesi ve imza kararı, boolean yerine kelimelerle yazılmış hâlde.

Üstteki şerit, bunun ack: true olan bir DATA_BIDIR olmasındandır — yanıtı yük taşıyan tek iletim türü. Altında geri dönen downlink ve onu bir kuralın mı seçtiği yoksa yedeğin mi kullanıldığı; sonra istek bilgileri — sizin tarafınızın tekrar ayıklaması gereken idempotencyKey dâhil.

İki ayrıntı bunu bir terminalden daha kullanışlı kılar:

  • Satırlar messageType ile etiketlenir — Merkez'in bir mesaj için kullandığı tek ad; Sigfox için bu callback'tir (DATA_UPLINK, DATA_BIDIR, …) — uplink — indirger; yani ona göre yapılmış bir liste hangi callback'in geldiğini söyleyemez, ki downlink söz konusu olduğunda bilmeniz gereken tam olarak budur. Satırda DATA_BIDIR (0/3) yazar.
  • awaits reply, yanıtı yük taşıyan bir iletimi işaretlerack: true olan bir DATA_BIDIR; cihazın penceresini açık tuttuğu durum.

downlinks ya da problems ile süzün; problems, temiz bir kabul olmayan her şey demektir: 2xx olmayan bir yanıt, bir tekrar veya bozuk bir imza.

Günlük HTTP üzerinden de vardır:

curl -s localhost:3004/log
curl -X DELETE localhost:3004/log

Bozuk davranmaya zorlayın

Tek bir uç nokta davranışı çalışma anında değiştirir:

curl -s localhost:3004/control                      # şu an ne yapıyor?
curl -X POST localhost:3004/control \
  -H 'content-type: application/json' \
  -d '{"mode":"fail","failStatus":503}'

Dört mod ve her birinde Merkez'den beklenen davranış:

ModSahte hedef ne yaparMerkez'den beklenen
okHer şeye 200İletildi olarak işaretlemek
failfailStatus döndürür (varsayılan 500)Artan beklemeyle yeniden denemek, sekiz denemeden sonra ölü mektuba düşürmek — gövdeyi saklayarak, yeniden gönderilebilsin diye
slowslowMs sonra yanıtlar (varsayılan 20000)Hedef adaptörünün 15sn zaman aşımına takılmak — bu bir aktarım hatasıdır ve 5xx'ten farklı bir yeniden deneme yolu izler
flakyflakyFailures kez başarısız olur, sonra başarırBirden fazla denemeyle iletildi işaretlemek — ölü mektuba düşürmemek

Mod değiştirmek flaky sayacını sıfırlar; ikinci bir flaky denemesi tükenmiş başlamaz. Mod değişikliği, belirtmediğiniz ayarları asla silmez.

Uygulamalı örnek: bir ölü mektubun oluşmasını izleyin

# 1. Hedefi her şeyi reddetmeye zorla
curl -X POST localhost:3004/control -H 'content-type: application/json' \
     -d '{"mode":"fail","failStatus":503}'

# 2. Bir mesaj gönder
curl -X POST localhost:3003/emit/bidir

# 3. Analitik'i izleyin: denemeler tekrarlandıkça Başarısız artar.
#    Sekizden sonra iletim Ölü mektuplar'a düşer.

# 4. "Kesintiyi" düzelt
curl -X POST localhost:3004/control -H 'content-type: application/json' -d '{"mode":"ok"}'

# 5. Merkez'de Ölü mektuplar'ı açıp Yeniden gönder'e basın — artık başarılı olur.

Bu döngü, beş komutta iletim sözleşmesinin tamamıdır: en az bir kez, artan bekleme, ölü mektup, yeniden gönderim.

Uygulamalı örnek: yeniden denemenin veri kaybı olmadığını kanıtlayın

curl -X POST localhost:3004/control -H 'content-type: application/json' \
     -d '{"mode":"flaky","flakyFailures":2}'
curl -X POST localhost:3003/emit/bidir

İlk iki deneme başarısız olur, üçüncüsü başarır. Mesaj ölü mektuba düşmez, iletilir — ve iletim kaydı birden fazla deneme gösterir. Gerçekte bir sorun yokken kısa bir hedef kesintisinin görünüşü budur.

`slow`, `fail` ile aynı test değildir
5xx bir yanıttır; zaman aşımı ise yanıtın yokluğudur. Yeniden deneme mantığında farklı yollardan geçerler ve üretimde takılıp kalan bir hedef, temiz biçimde 500 dönenden çok daha yaygındır. İkisini de test edin.

Bir downlink'i yanıtlamak

İletilen bir mesaj downlink istediğinde, cihaza yanıt veren şey o aynı isteğe verilen cevaptır. Bu yüzden sahte hedef, ek bir bağlantı gerekmeden bir downlink köprüsünün uzak ucu gibi davranabilir.

Bir yedek yanıt tanımlayın:

curl -X POST localhost:3004/control -H 'content-type: application/json' \
     -d '{"downlinkHex":"deadbeef00000001"}'

Hex tam olarak 16 karakter olmalıdır — Sigfox downlink'leri 8 bayttır — yoksa Merkez onu atar.

Kararı mesaja bırakın

Gerçek bir uygulama sabit bir yanıt vermez; sayacın ne bildirdiğine bakar. Kurallar bunu modeller: bu koşulların tümü sağlanıyorsa şu hex ile yanıtla. İlk eşleşme kazanır.

curl -X POST localhost:3004/control -H 'content-type: application/json' -d '{
  "downlinkRules": [
    { "name": "low battery", "downlinkHex": "deadbeef00000001", "when": [
      { "path": "messageType", "op": "eq", "value": "DATA_BIDIR" },
      { "path": "ack", "op": "eq", "value": true },
      { "path": "payload.alarms.LowBattery", "op": "eq", "value": true }
    ]}
  ]
}'

Operatörler eq, neq, gt, lt, contains, exists ve missing. Değerler tip bakımından gevşek karşılaştırılır; yani true boolean'ı true metniyle eşleşir.

Yollar çıktı yapınıza bağlıdır
Aynı alarm payload.alarms.LowBattery altında da, telemetry.alarms.LowBattery altında da gelebilir ya da hiç gelmeyebilir — bu, o kaynak → hedef çiftinde ayarlanan çıktı yapısına bağlıdır. Tahmin edilmiş bir yola göre yazılan kural hiç çalışmaz. Konsol, gerçekten aldığı her yolu kaydeder ve her birinin son değeriyle birlikte önerir; kuralları ezberden değil o listeden yazın.

Bunların tümünü konsoldan da düzenleyebilirsiniz — downlink rules → edit — davranış modu ve yedek hex de üst çubuktan değiştirilebilir.

Her konsol nerede durur

Sahte hedef size uygulamanın ne aldığını söyler. Sunduğu bir downlink'in cihaza gerçekten ulaşıp ulaşmadığını söyleyemez — bunu gösteren, gidiş-dönüşü cihazın tarafından gösteren sahte kaynağın konsoludur.

İkisini birlikte kullanın: bir uç ne gönderildiğini, diğeri ne geri geldiğini kanıtlar.

Bulutta

Aynı düzenek Dokploy üzerinde sink.iot.una.center adresinde çalışır: üretimdeki Merkez'in teslimat işçileri, bir müşterinin uç noktasına yapacakları gibi https://sink.iot.una.center/sink adresine POST eder; konsol /ui adresindedir. Günlüğü bellekte tutulur — yeniden dağıtım onu boşaltır. Her şeye ok yanıtı veren, herkese açık bir uç noktadır: kimse test etmiyorken uygulamayı durdurun.

Sırada

Sahte kaynak
Diğer taraf: donanım olmadan işleme hattınızı çalıştırmak.
Tüm döngüyü çalıştırmak
İki uç birden: gidiş-dönüş, bir ölü mektup, bir yeniden gönderim.
Copyright © 2026