diff --git a/documentazione.md b/documentazione.md index 15a64dd..aab6a0c 100644 --- a/documentazione.md +++ b/documentazione.md @@ -379,4 +379,45 @@ L'applicazione, all'interno dell'architettura, svolge il ruolo di *publisher* e utilizzati esclusivamente nella modalità *C*. Questi messaggi trasportano come *payload* il report TCN discusso nella @sec:report e vengono inviati solo quando l'*upload* è richiesto dall'utente. +Anche in questo caso si è scelto di *wrappare* la libreria utilizzata all'interno di una classe sviluppata in proprio. +Poiché l'unica funzionalità di nostro interesse è la *publish* è stato necessario scrivere un'unica funzione statica che si occupa di eseguire quest'operazione. +Questa funzione, riportata nel @lst:mqtt-publish, permette di specificare il topic e il contenuto del messaggio da pubblicare. +Inoltre attraverso una *lambda expression* è possibile specificare come comportarsi in caso di errori. + +``` {.kotlin #lst:mqtt-publish caption="Funzione wrap che consente la publicazione di un messaggio MQTT."} +fun publish( + context: Context, + topic: String, + payload: ByteArray, + onFailure: () -> Unit = LOG_ERROR +) { + val clientId = MqttClient.generateClientId() + val client = MqttAndroidClient( + context.applicationContext, + BROKER_URL, + clientId + ) + + client.connect().actionCallback = object: IMqttActionListener { + override fun onSuccess(asyncActionToken: IMqttToken?) { + val msg = MqttMessage(payload).apply { + qos = 2 + } + + client.publish(topic, msg).apply { + actionCallback = Disconnect(client) + } + + } + + override fun onFailure( + asyncActionToken: IMqttToken?, + exception: Throwable? + ) { + onFailure() + } + } +} +``` + # Riferimenti