Une stack complète pour émuler un réseau Sigfox depuis n'importe quel cluster Kubernetes, avec un dongle SDR physique.
**Cas d'usage** : recevoir en direct les messages Sigfox de tes devices (Sens'it, capteurs custom, etc.) sans passer par le backend public Sigfox, décoder les payloads, et transférer les données vers n'importe quel service (API, base, webhook, etc.).
---
## Sommaire
1. [Vue d'ensemble](#vue-densemble)
2. [Hardware — le dongle Sigfox SDR](#hardware--le-dongle-sigfox-sdr)
3. [Software — SNEK](#software--snek)
4. [Déploiement](#déploiement)
5. [Configuration des devices](#configuration-des-devices)
6. [Réception de messages (uplink)](#réception-de-messages-uplink)
7. [Décodage des payloads](#décodage-des-payloads)
8. [Callbacks HTTP (intégration avec autres services)](#callbacks-http-intégration-avec-autres-services)
- **Zone RC1** pour l'Europe (868 MHz), autres zones (RC2 US, RC3 Asie, etc.) configurables dans SNEK
**Le firmware n'est pas persistent** : à chaque unplug ou reboot du dongle, il repart en mode DFU. Le script `entrypoint.sh` du container reflashe automatiquement au démarrage via `foxctl`.
---
## Software — SNEK
**SNEK 2.3.4** (Sigfox Network Emulator) est le logiciel officiel Sigfox qui :
- Pilote le dongle SDR
- Émule le réseau Sigfox localement
- Enregistre les devices (up to 5 par défaut, extensible à 10 via config)
- Reçoit et décode les messages uplink
- Envoie des messages downlink
- Expose une interface web (port 8085)
- Envoie des callbacks HTTP en JSON à des URL externes
**Dépendances système** (pré-installées dans l'image Docker) :
- Ubuntu 20.04 (obligatoire — `libgtk2-perl` n'existe pas en 22.04+)
- Namespace `snek` avec label `pod-security.kubernetes.io/enforce=privileged`
- PVC `snek-data` (2 Gi, persistance de la config `/root/Snek`)
- Deployment `snek` avec `securityContext.privileged=true` + `hostPath /dev/bus/usb`
- Service LoadBalancer sur port 8085
### Vérification
```bash
kubectl get pods -n snek
kubectl logs -n snek -l app=snek --tail=30
```
Tu dois voir dans les logs :
```
==> Dongle detected
==> Flashing firmware (foxctl)...
==> Starting SNEK main_sigfox on port 8085...
INFO - SNEK Software Version : "2.3.4"
INFO - Server started at http://0.0.0.0:8085
INFO - Frequence RX : 868130000
INFO - Frequence TX : 869525000
```
### Accès UI
- **Depuis ton LAN** : `http://<LoadBalancer-IP>:8085/staticv234/index.html`
- **Depuis un autre pod K8s** : `http://snek.snek.svc.cluster.local:8085`
---
## Configuration des devices
Chaque device Sigfox a un **identifier hex 6 caractères** (ex: `B440C7`).
Tu le trouves :
- Sur l'autocollant du device
- Ou dans le backend Sigfox → Device details
- Ou sur les Sens'it via l'app mobile
Dans SNEK → onglet **Configuration** → Devices → ajoute jusqu'à 5 devices (10 avec la modif `MAX_DEVICES` du fichier `/root/Snek/snek.conf`).
**Important** : SNEK décode les messages **seulement des devices enregistrés**. Un message d'un ID inconnu apparaît dans les logs mais n'est pas persisté.
---
## Réception de messages (uplink)
Une fois un device configuré, dès qu'il émet un message Sigfox (bouton double-clic, réveil périodique, alerte capteur…) :
1.**Réception RF** par le dongle SDR
2.**Décodage bas-niveau** par le firmware
3.**Traitement** par SNEK (auth, dedup, décodage payload)
4.**Affichage** dans l'onglet **Messages** de la web UI
5.**Envoi callback** vers ton service si configuré (voir section suivante)
Format d'un message dans la UI SNEK :
```
Date Device Payload RSSI SNR
2026-07-03 15:23 B440C7 b60dc86e -85 dBm 12 dB
```
**Debug** : si un device n'apparaît pas, vérifie dans les logs :
- **Body** : template avec variables SNEK (voir doc SNEK)
### Exemple de body template
```json
{
"device":"{device}",
"time":"{time}",
"data":"{data}",
"rssi":{rssi},
"snr":{snr},
"seqNumber":{seqNumber}
}
```
Variables disponibles :
-`{device}` : ID hex du device
-`{time}` : timestamp Unix
-`{data}` : payload en hex
-`{rssi}` : force du signal reçu
-`{snr}` : rapport signal/bruit
-`{seqNumber}` : compteur de séquence
### Cas d'usage
- **Ingester dans une base** : POST vers une API Node/Go/Python qui insert dans Postgres/InfluxDB
- **Alertes** : POST vers Telegram bot API pour notification instantanée
- **Bus de messages** : POST vers Kafka REST proxy, RabbitMQ HTTP plugin, etc.
- **Dashboard live** : POST vers un WebSocket relay (Socket.io, Server-Sent Events)
---
## Downlink (messages serveur → device)
Sigfox permet 4 downlinks max par device par jour. Envoi depuis SNEK :
1. Web UI → onglet **Devices** → sélectionner un device
2. Zone **Downlink** → 8 bytes hex à envoyer
3. Le message sera envoyé lors du prochain uplink (le device demande un downlink en cours d'émission)
**Note** : le downlink est utilisé pour reconfigurer un Sens'it (changer de mode, ajuster seuils, etc.) via le format Config payload documenté dans le PDF Sens'it.
---
## Persistance & backups
Le PVC `snek-data` (2 Gi, `local-path`) monté sur `/root/Snek` contient :
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.