Aller au contenu principal

Connecteur IoT

Le Connecteur IoT de Savitri permet aux appareils de l'Internet des Objets de soumettre des données capteurs en chaîne. Il offre la gestion des appareils, l'ingestion de données, le traitement en périphérie, l'optimisation par lots et une sécurité de niveau entreprise.

Architecture

IoT Devices (sensors, actuators, gateways)


Protocol Handlers (MQTT, CoAP)
│ parse, validate, authenticate

Edge Processing Engine
│ rules engine, anomaly detection, aggregation

Batch Processor
│ compress, aggregate, schedule

Blockchain Interface (savitri_sendRawTransaction)
│ submit batch as IoT TX (0.00005 SAVT fee)

On-chain Oracle Feed

Gestion des Appareils

Types d'Appareils

TypeDescriptionExemple
SensorProducteur de données en lecture seuleCapteur de température
ActuatorAppareil contrôlableVanne intelligente
GatewayPoint d'agrégation en périphérieHub Raspberry Pi
EdgeNodeUnité de traitement localServeur ML en périphérie
MobileAppareil mobileSmartphone
IndustrialÉquipement industrielPLC/SCADA

Enregistrement des Appareils

pub struct Device {
pub id: DeviceId,
pub owner: [u8; 32], // owner address
pub public_key: [u8; 32], // device signing key
pub device_type: DeviceType,
pub capabilities: Vec<String>,
pub status: DeviceStatus,
pub metadata: HashMap<String, String>,
}

Les appareils sont enregistrés en chaîne avec leur clé publique pour l'authentification. Les groupes d'appareils peuvent être gérés collectivement.

Statut des Appareils

StatutDescription
ActiveFonctionnement normal
InactiveTemporairement hors ligne
SuspendedSuspendu par le propriétaire/la gouvernance
BannedRévoqué définitivement

Ingestion de Données

Support des Protocoles

ProtocoleGestionnaireCas d'Usage
MQTTMQTTHandlerCapteurs basse consommation, pub/sub
CoAPCoAPHandlerAppareils contraints, UDP

Les deux implémentent le trait ProtocolHandler :

pub trait ProtocolHandler: Send + Sync {
async fn handle_connection(&self, stream: TcpStream) -> Result<()>;
fn parse_data(&self, raw: &[u8]) -> Result<IoTData>;
fn validate_device(&self, device_id: &str, signature: &[u8]) -> Result<bool>;
}

Format des Données IoT

pub struct IoTData {
pub device_id: String,
pub timestamp: u64,
pub data_type: String, // "temperature", "humidity", etc.
pub value: DataValue,
pub unit: String, // "celsius", "percent", etc.
pub quality: f64, // 0.0-1.0 (data quality score)
pub metadata: HashMap<String, String>,
}

pub enum DataValue {
Float(f64),
Integer(i64),
Boolean(bool),
String(String),
Binary(Vec<u8>),
Struct(HashMap<String, DataValue>),
Array(Vec<DataValue>),
}

Traitement en Périphérie

Le moteur de traitement en périphérie filtre, transforme et agrège les données avant soumission.

Moteur de Règles

// Example rule: alert if temperature > 40
Rule {
condition: Condition::GT("temperature", 40.0),
action: ProcessingAction::CriticalAlert,
}

// Logical operators
Condition::AND(vec![
Condition::GT("temperature", 35.0),
Condition::LT("humidity", 20.0),
])

Opérateurs : EQ, NEQ, GT, LT, GTE, LTE, CONTAINS, IN, AND, OR.

Détection d'Anomalies

Le processeur de périphérie exécute la détection d'anomalies sur les données entrantes :

  • Détection des valeurs aberrantes statistiques
  • Reconnaissance de motifs
  • Inférence de modèle ML (modèles locaux)

Les anomalies déclenchent une soumission automatique indépendamment du calendrier de traitement par lots.

Agrégation des Données

StratégieDescription
AverageMoyenne des valeurs dans la fenêtre
SumTotal des valeurs
Min / MaxValeurs extrêmes
MedianValeur médiane
Percentile(p)P-ième percentile

Traitement par Lots

Les lectures individuelles des capteurs sont regroupées par lots pour réduire les coûts de transaction :

pub struct BatchProcessor {
pub batch_size: usize, // max readings per batch
pub max_delay_ms: u64, // max time before forced submit
pub compression: bool, // compress batch payload
pub aggregation: bool, // aggregate before submit
}

Déclencheurs de Lot

DéclencheurDescription
Taille atteintebatch_size lectures accumulées
Délai maximummax_delay_ms écoulé depuis la première lecture
Priorité critiqueAnomalie ou alerte critique détectée

Le traitement par lots réduit les transactions blockchain jusqu'à 90 % par rapport à la soumission par lecture individuelle.

Sécurité

Authentification

Trois méthodes d'authentification, combinables :

MéthodeDescription
CertificatValidation de chaîne de certificat X.509
JetonJeton API avec expiration
BiométriqueVérification biométrique de l'appareil

Chiffrement des Données

  • Chiffrement AES-256 pour les données en transit et au repos
  • Hachage d'intégrité pour la détection des altérations
  • Vérification de révocation des certificats

Configuration du Connecteur

pub struct ConnectorConfig {
pub max_requests_per_second: u32,
pub timeout_ms: u64,
pub retry_attempts: u32,
}

Intégration en Chaîne

Les données IoT sont soumises comme transactions avec le tarif de frais IoT :

let tx = TransactionBuilder::new()
.oracle_call(
"iot_oracle_address",
"submit_sensor_data",
&batch_payload,
)
.nonce(nonce)
.fee(50_000_000_000_000) // 0.00005 SAVT (IoT rate)
.build_and_sign(&device_wallet)?;

Intégration avec les Flux Oracle

Les données IoT soumises deviennent disponibles en tant que flux oracle :

// Request latest sensor reading
let tx = oracle.request_data(
&iot_oracle_address,
"temperature",
b"sensor_001",
).await?;

Métriques du Connecteur

pub struct ConnectorMetrics {
pub requests_served: u64,
pub errors_count: u64,
pub average_response_time: f64,
}