diff --git a/documentazione.md b/documentazione.md index 01fb37d..59d6a24 100644 --- a/documentazione.md +++ b/documentazione.md @@ -396,8 +396,58 @@ L'applicazione, all'interno dell'architettura, svolge il ruolo di *publisher* e - ***Messaggi di contatto***: utilizzati sia nella modalità *A* che nella *B*, permettono di notificare al server un contatto tra due utenti. Nel caso della modalità *A* viene svolto un invio in *real-time*, mentre nella configurazione *B* l'invio avviene solo dopo aver eseguito l'*upload*. + Il contenuto di questi messaggi coincide con la rappresentazione JSON dei dati di contatto illustrati nel @lst:contact-data. - ***Messaggi di report***: 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. + Questi messaggi trasportano come *payload* la rappresentazione esadecimale del 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. +Sempre dal @lst:mqtt-publish è possibile notare l'utilizzo del parametro `cleanSession` impostato a `false` e l'utilizzo dei *QoS* a livello uno, ciò si è reso necessario per garantire un corretto funzionamento con il resto dell'infrastruttura. + +``` {.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 + ) + + val option = MqttConnectOptions().apply { + isCleanSession = false + } + + client.connect(option) + .actionCallback = object: IMqttActionListener { + override fun onSuccess(asyncActionToken: IMqttToken?) { + val msg = MqttMessage(payload).apply { + qos = 1 + } + + client.publish(topic, msg).apply { + actionCallback = Disconnect(client) + } + } + + override fun onFailure( + asyncActionToken: IMqttToken?, + exception: Throwable? + ) { + onFailure() + } + } +} +``` + +Le funzionalità di rete sono state testate attraverso l'impiego di un brocker pubblico e l'utilizzo del topic `untori`. +Entrambi i parametri sono stati settati tramite delle costanti e quindi possono essere modificati facilmente. # Riferimenti