Implementación del monitor Android

Implementación del monitor Android

Una vez montado el sistema de broker, el siguiente paso es implementar un sistema donde mostrar la información del parking a modo de monitoreo. Para ello se ha decidido crear una app en android con Android Studio que se conectará al broker público y se suscribirá a la información enviada por los sensores de forma que se visualizará por pantalla cuando un coche entra o sale del parking. A su vez, también se visualizará el número de coches que hay en el parking y el número de plazas libres.

MainActivity

public class MainActivity extends AppCompatActivity {
   public static final String MQTT_SERVER = "tcp://broker.hivemq.com:1883";
   public static final String PUB_TOPIC = "PARKING_IOT_MONITOR";
   public static final String SUB_TOPIC = "PARKING_IOT";
   private static final Integer LIMIT_COCHES = 2;

   private Integer NUM_PLAZAS = LIMIT_COCHES;
   private MqttClient mqttClient;

   @BindView(R.id.plazas)
   TextView plazas;
   @BindView(R.id.consola)
   TextView consola;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       ButterKnife.bind(this);

       refreshPlazas();
       initializeMQTT();
   }

   private void initializeMQTT() {
       try {
           mqttClient = new MqttClient(
                   MQTT_SERVER,
                   MqttClient.generateClientId(),
                   new MemoryPersistence()
           );

           mqttClient.connect();
           mqttClient.subscribe(SUB_TOPIC, 1);

           mqttClient.setCallback(new MqttCallback() {
               @Override
               public void connectionLost(Throwable cause) {
               }

               @Override
               public void messageArrived(String topic, MqttMessage message) throws Exception {
                   final String recibido = message.toString();

                   if (recibido.equals("ENTRA")) {
                       NUM_PLAZAS = (NUM_PLAZAS > 0) ? NUM_PLAZAS - 1 : 0;
                   } else if (recibido.equals("SALE")) {
                       NUM_PLAZAS = (NUM_PLAZAS < LIMIT_COCHES) ? NUM_PLAZAS + 1 : LIMIT_COCHES;
                   }

                   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           refreshPlazas();
                           SimpleDateFormat format = new SimpleDateFormat("HH:mm");
                           String hour = format.format(new Date());
                           consola.setText(consola.getText().toString()+hour+" 
:::: "+recibido+" un Coche :::: Plazas: "+NUM_PLAZAS+"/"+LIMIT_COCHES+"\n");
                       }
                   });

                   byte[] encodedPayload = String.valueOf(NUM_PLAZAS).getBytes("UTF-8");
                   MqttMessage msg = new MqttMessage(encodedPayload);
                   msg.setId(320);
                   msg.setRetained(false);
                   msg.setQos(1);
                   mqttClient.publish(PUB_TOPIC, msg);
               }

               @Override
               public void deliveryComplete(IMqttDeliveryToken token) {//Called when a outgoing publish is complete
               }
           });
       } catch (MqttException e) {
           Log.e(this.toString(), e.getMessage());
       }

   }

   private void refreshPlazas() {
       plazas.setText(NUM_PLAZAS+" / "+LIMIT_COCHES);
   }
}

 Layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/colorPrimary"
   tools:context=".MainActivity">

   <TextView
       android:id="@+id/dataReceived"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginBottom="8dp"
       android:text="PLAZAS DISPONIBLES"
       android:textAppearance="@android:style/TextAppearance.Material.Large"
       android:textColor="@android:color/white"
       android:textSize="30sp"
       app:layout_constraintBottom_toTopOf="@+id/guideline"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintTop_toTopOf="parent"
       app:layout_constraintVertical_bias="0.25" />

   <TextView
       android:id="@+id/plazas"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginBottom="8dp"
       android:layout_marginEnd="8dp"
       android:layout_marginStart="8dp"
       android:layout_marginTop="8dp"
       android:textStyle="bold"
       android:textAppearance="@android:style/TextAppearance.Material.Large"
       android:textColor="@android:color/white"
       android:textSize="36sp"
       app:layout_constraintBottom_toTopOf="@+id/guideline"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toBottomOf="@+id/dataReceived"
       tools:text="0 / 2" />

   <android.support.constraint.Guideline
       android:id="@+id/guideline"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       app:layout_constraintGuide_percent="0.5" />

   <TextView
       android:id="@+id/consola"
       android:layout_width="0dp"
       android:layout_height="0dp"
       android:layout_marginBottom="32dp"
       android:layout_marginEnd="32dp"
       android:layout_marginStart="32dp"
       android:layout_marginTop="32dp"
       android:background="@android:color/white"
       android:inputType="textMultiLine"
       android:padding="2dp"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toTopOf="@+id/guideline" />

</android.support.constraint.ConstraintLayout>

Comentarios

Entradas populares de este blog

Clasificador Difuso del sistema

Cliente MQTT del ESP8266

I2C