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
Publicar un comentario