Tarafları taklit etmek

Sahte kaynak

Sol taraf — gerçek Sigfox callback'lerini istediğinizde uç noktanıza POST eder.

Bir uç noktayı test etmek genelde bir cihazın iletim yapmasını beklemek demektir. Sahte kaynak bu beklemeyi ortadan kaldırır: gerçek bir Sigfox arka ucunun göndereceği callback gövdelerinin aynısını, kaynağınızın uç noktasına, siz istediğinizde POST eder.

localhost:3003 üzerinde çalışır; konsolu /ui adresindedir.

Bir test aracı, ürünün parçası değil
Sahte kaynak ve sahte hedef test araçlarıdır. Varsayılan olarak kendi makinenizde çalışırlar; üretimdeki Merkez'in yanına da dağıtılabilirler — bkz. Bulutta. Hiçbir şey onlara bağımlı değildir.

Merkez'de hangi kaynağa ihtiyaç duyar

Taklit, kendi başına bir teknoloji değildir: gerçek bir arka ucu — konsolda ilk seçilen Sigfox Backend, The Things Stack ya da ChirpStack — taklit eder ve o arka ucun göndereceği gövdelerin aynısını POST eder. Dolayısıyla Merkez'de beslediği kaynak, o teknolojide sıradan bir kaynaktır: taklit Sigfox modundayken Sigfox, TTN modundayken The Things Stack seçin. Callback'leri Merkez'in gerçek adaptörü ayrıştırır; amaç da zaten budur — bir "taklit" teknolojisi onu yalnızca atlardı. İkisini de denemek istiyorsanız her teknoloji için bir kaynak oluşturun ve taklidi test ettiğinize yöneltin.

Başlatın

cd source-test
npm install
cp .env.example .env
npm run secret        # kaynağın webhook gizli anahtarını yazdırır
# çıktıyı .env içine WEBHOOK_SECRET olarak yapıştırın
npm run start:dev

npm run secret, test ettiğiniz kaynak entegrasyonunun paylaşılan gizli anahtarını doğrudan yerel veritabanınızdan çözer. Hiçbir şey makineden çıkmaz.

WEBHOOK_SECRET olmadan callback'ler kimlik doğrulamasız gider ve Merkez 401 yanıtı verir — bu da kendi başına faydalı bir testtir, yalnızca genelde ilk istediğiniz test değildir.

Bir şey göndermeden önce neye yöneltildiğini kontrol edin:

curl -s localhost:3003/health

Bu; POST edeceği uç nokta adresini, taklit edeceği cihazı, bir gizli anahtarın tanımlı olup olmadığını ve bildiği callback'leri döndürür.

Tek bir mesaj gönderin

curl -X POST localhost:3003/emit/bidir

Bu, kaynağınızın uç noktasına eksiksiz ve düzgün biçimli bir DATA_BIDIR callback'i POST eder. Merkez'de Analitik'i izleyin — Alınan artar — ya da sahte hedefin iletimi almasını izleyin.

Adres hem kısa adı hem de Sigfox messageType değerini kabul eder:

Kısa admessageTypeSigfox anahtarı
uplinkDATA_UPLINK0/2
bidirDATA_BIDIR0/3
statusSERVICE_STATUS1/0
acknowledgeSERVICE_ACKNOWLEDGE1/4
repeaterSERVICE_REPEATER1/5
advancedSERVICE_DATA_ADVANCED1/6
errorERROR2

Yani POST /emit/DATA_BIDIR ile POST /emit/bidir aynı işi yapar.

Gerçekte ne POST ediliyor

Bir bidir çağrısı şu gövdeyi gönderir — Merkez'in gerçek Sigfox cihaz tipine kaydettiği alanların aynısı, aynı sırayla:

{
  "messageType": "DATA_BIDIR",
  "device": "1A2B3C",
  "deviceTypeId": "6a78e0b0ec27932950396541",
  "time": 1755265665,
  "seqNumber": 18,
  "data": "00018d460000300040e12402",
  "ack": true,
  "rssi": -103.41,
  "station": "0A1B"
}

Önemli olan ack: true: cihazın bir downlink istediği ve alım penceresini açık tuttuğu anlamına gelir. Bkz. Downlink ile yanıtlayın.

İstediğiniz alanı değiştirin

Denetim anahtarı olmayan her üst düzey anahtar callback gövdesine birleştirilir. Yani yük çerçevesini değiştirmek şu kadar basittir:

curl -X POST localhost:3003/emit/bidir \
  -H 'content-type: application/json' \
  -d '{"data": "00018d460000300040e12402"}'

Gövdeyi değil sahte kaynağı yöneten denetim anahtarları şunlardır:

Anahtarİşlevi
typesYalnızca POST /emit: bu iletimin ürettiği callback'ler
delayScaleGerçekçi gecikmeleri çarpar. 0 hepsini aynı anda gönderir
waitGeç gelen callback'ler de çıkana kadar bekler
deviceFarklı bir cihaz kimliğini taklit eder
seqNumberSıra numarasını sabitler (0–4095)
countBu kadar mesajı sırayla gönderir (en fazla 200)
overridesEn son birleştirilir — bir alan adı denetim anahtarıyla çakışırsa
omitSecretGizli anahtar başlığını atar; Merkez 401 vermelidir

Denemeye değer üç test

Tekrar ayıklama çalışıyor mu?

Merkez en az bir kez iletir ve hedefinizin tekrarı tanıması beklenir. Bir sıra numarasını yeniden kullanarak zorlayın:

curl -X POST localhost:3003/emit/bidir -H 'content-type: application/json' -d '{"seqNumber": 42}'
curl -X POST localhost:3003/emit/bidir -H 'content-type: application/json' -d '{"seqNumber": 42}'

İkisi de aynı idempotencyKey ile gelir. Sahte hedef ikincisini DUP olarak işaretler.

Uç nokta gerçekten korunuyor mu?

curl -X POST localhost:3003/emit/bidir -H 'content-type: application/json' -d '{"omitSecret": true}'

Merkez 401 vermelidir. 2xx veriyorsa kaynağınız kimlik doğrulamasız yükleri kabul ediyor demektir — bkz. Bir kaynak bağlayın.

Yük altında nasıl görünüyor?

curl -X POST localhost:3003/emit/bidir -H 'content-type: application/json' -d '{"count": 50}'

Elli mesaj, sırayla gönderilir. Analitik'i ve hedefin iletim listesini izleyin.

Gerçeği gibi zamanlanmış tam bir iletim

Bir cihaz iletimi birden fazla callback üretir ve bunlar birlikte gelmez. POST /emit bunu yeniden üretir:

curl -X POST localhost:3003/emit \
  -H 'content-type: application/json' \
  -d '{"types": ["DATA_BIDIR", "SERVICE_ACKNOWLEDGE", "SERVICE_DATA_ADVANCED"]}'

Her biri gerçekte sahip olduğu gecikmeyle planlanır:

CallbackGelme süresiNedeni
DATA_BIDIR0–1snÇerçeve anında çözülür
ERROR1–3snAğ mesajı neredeyse anında reddeder
SERVICE_ACKNOWLEDGE20–25snDownlink penceresi uplink'ten ~20sn sonra açılır
SERVICE_DATA_ADVANCED25–32snÇerçeveyi duyan tüm baz istasyonlarını bekler
Asıl mesele aradaki boşluk
Bir oturumu tek seferde göndermek, bir sahte aracın gerçek hataları gizleyecek biçimde yanlış yapabileceği tek şeydir — sıralama varsayımları, ilişkilendirme pencereleri ve saniye başına tekrar anahtarları yalnızca callback'ler yayıldığında bozulur. Gerçekten beklemek istemiyorsanız "delayScale": 0 kullanın ve gerçeklikten daha kolay bir şeyi test ettiğinizi bilin.

Türleri elle seçmek yerine canlı kaynağınızda etkin olanların aynısını oynatmak için:

curl -X POST localhost:3003/emit-enabled

Son gönderdiğinizi tekrarlamak için:

curl -X POST localhost:3003/replay-last

Konsol

localhost:3003/ui camın cihaz tarafıdır. Sahte hedef uygulamanın ne aldığını gösterir; bu ise cihazın ne yaşadığını — bir hedefin size asla söyleyemeyeceği tek şey dâhil: sunulan downlink gerçekten geri geldi mi?

Her oturum bir gidiş-dönüş paneli alır: cihaz downlink istedi, Merkez bir downlink ile yanıtladı ve ulaşıp ulaşmadığı burada yazar.

Üstte bir oturum kurarsınız — cihaz, çerçeve, hangi callback'ler, ne hızda — sonra send session. Sağdaki panel, hiçbir hedefin size gösteremeyeceği kısımdır: 3. satır, downlinkAck: true taşıyan SERVICE_ACKNOWLEDGE'dir; yani downlink'in cihaza ulaştığının bayt bayt onayı.

Ham günlük HTTP üzerinden de vardır:

curl -s localhost:3003/log          # son gönderimler
curl -s localhost:3003/runs         # oturumlar
curl -X DELETE localhost:3003/log   # temizle

Sigfox'a dokunmadan sağlamayı test etmek

Sahte kaynak, Merkez'in sağlama sırasında çağırdığı Sigfox v2 REST API'sini de yanıtlar. Merkez'i buna yöneltin:

SIGFOX_API_BASE=http://localhost:3003/v2
SIGFOX_LIVE=true
SIGFOX_READONLY=true

Artık apply gerçekten çalışır — cihaz tipleri oluşturur, callback kaydeder, cihaz yaratır — gerçek bir hesap yerine bellekteki bir taklide karşı. Cihaz tipleri, callback'ler, cihazlar, gruplar, sözleşmeler ve api-user'ları uygulanmıştır; bunların dışındakiler başarılı taklidi yapmak yerine 404 verir.

POST /v2/_reset cihazları ve callback'leri temizler; aynı sağlama akışını sıfırdan tekrar çalıştırabilirsiniz.

Bunu yalnızca bir geliştirme Merkez'ine yöneltin
SIGFOX_LIVE=true, Merkez'in bir Sigfox arka ucuna gerçekten yazmasını sağlayan anahtardır. Burada güvenli olmasının tek sebebi temel adresin sahte kaynağa bakmasıdır. SIGFOX_API_BASE değeri gerçek API olan bir Merkez'de, o yazmaları bilerek istemiyorsanız ikisini birden açmayın.

Bulutta

Aynı düzenek Dokploy üzerinde source.iot.una.center adresinde çalışır ve gerçek bir arka ucun yapacağı gibi HTTPS üzerinden üretimdeki Merkez'e POST eder. Bu sayfadaki her şey, ana makine adı değiştirilerek orada da geçerlidir — konsol /ui adresindedir. Uç nokta adresi ve webhook gizli anahtarı ortama yazılmak yerine konsolun bağlantı paneline yapıştırılabilir; konsol bunları yeniden başlatmalarda korur. Herkese açık adresi olan bir test aracıdır: kimse test etmiyorken uygulamayı durdurun.

Sırada

Sahte hedef
Diğer taraf: hedefinizin ne aldığını görün ve onu bozuk davranmaya zorlayın.
Tüm döngüyü çalıştırmak
İki uç birden: gidiş-dönüş, bir ölü mektup, bir yeniden gönderim.
Copyright © 2026