Gelin projemizin android ayağına bakalım. Hatırlayacağınız üzere arduino'ya bağladığımız bir sensör aldığı dataları mqtt üzerinden telefonumuza gönderecekti. Bugün android kodlarının yazımı açıklayacağım. İlk olarak internetten, kullanacağımız paho kütüphanesini indirin. Buradan indirebilirsiniz veya internetten bulabilirsiniz. Daha sonra açtığınız projeye import edin. Android programlama kısımlarından çok paho kütüphanesinin üzerinde yoğunlaşacağım. Ama öncesinde ekran tasarımına bakalım. Eğer ki android studio kullanıyorsanız bu sizin için 2 saniyelik bir iş olacak çünkü design kısmında sürükle bırakla sadece bir adet listview koyacağız. Layout kısmından activity_main.xml dosyasını açın. Gelen pencerenin altında design ve text tabları olacak. İster design'dan sürükle bırakla listview koyun isterseninz text kısmından listview kodlarını yazın. Bunları yaptıktan sonra çalıştırırsanız aşağıdaki görüntüyü elde edeceksiniz.
Boş gibi görünebilir ancak üzerinde bir adet listview barındıryor veri gönderdiğimiz zaman göreceksiniz.Gelin kodları bir bütün olarak vereyim ve kodlar üzerinden anlatımda ilerleyelim.
package com.example.seda.myapplication;import android.content.ContextWrapper;import android.os.Handler;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.app.Activity;import android.app.ActivityManager;import android.content.Context;import android.content.Intent;import android.view.View;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.Toast;import org.eclipse.paho.client.mqttv3.MqttCallback;import org.eclipse.paho.client.mqttv3.MqttClient;import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;import org.eclipse.paho.client.mqttv3.MqttException;import org.eclipse.paho.client.mqttv3.MqttMessage;import org.eclipse.paho.client.mqttv3.MqttTopic;import org.eclipse.paho.client.mqttv3.internal.MemoryPersistence;import static android.R.layout.simple_list_item_activated_1;//Burada kullanacağımız tüm kütüphaneleri import ettik.public class MainActivity extends Activity { // main classımızpublic static final String BROKER_URL = "tcp://10.42.0.1:1883";// Brokerımızın ip adresini ve kulllanacağımız portu tanımladık//Parametre olarak kullancağız.public static final String clientId = "android-client"; public static final String TOPIC = "topic"; private MqttClient mqttClient;//client id, topic belirledik ve mqtt kütüphanesinden nesne oluşturduk.private ListView listView; private ArrayAdapter<String> adapter; private Handler handler = new Handler();/*listview ve adapter tanımladık. adapterin amacı gelen verileri üzerinde tutacak ve listviewin ekrana basmasını sağlayacak. Handler isebir çeşit thread. Android user interface tek thread üzerinde çalışır. Siz ağa bağlanmaya çalışırken görsel ekrana yansıtılamayacak ve hata verecek. Bu çakışmayı önlemek amacıyla ağa bu handlerın içinden bağlanacağız.*/public class PushCallback implements MqttCallback { private ContextWrapper context; public PushCallback(ContextWrapper context) { this.context = context; }/* Mqtt interfacesini implement ettik. Bu sayede kütüphane içindeki metotları görebileceğiz. Constructera da verimizi tutacak bir ContextWrapper koyduk.*/@Override public void connectionLost(Throwable cause) { /* implement ettiğimizde kütüphanedeki tüm metotlar otomatik olarak göründü. Bağlantı kopması durumunda ne yapması gerektiğini yazmamız gerek. Ama projenin sadeliği için boş bıraktım.*/ }@Override public void messageArrived(MqttTopic topic, final MqttMessage message) throws Exception { handler.post(new Runnable() { @Override public void run() { try { adapter.add(new String(message.getPayload())); adapter.notifyDataSetChanged(); } catch (MqttException e) { e.printStackTrace(); } } }); }/* Bu metotda topic ve message değerlerini alacağız. handlerın içine yazdığımız run metotduyla mesaj geldiğinde adaptere ekleyeceğiz.getpayload gönderilmiş veriyi telefona almayı sağlar. */ Try catch ise herhangi bir hata ihtimaline karşı yazıldı. Catch gelirse hatanın türünü toast olarak ekrana yansıtacak.*/@Override public void deliveryComplete(MqttDeliveryToken token) { // implement edildiği için yazılmak zorunda demiştik. Biz boş bıraktık. Çünkü telefon subscriber olarak çalışacak} }@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1); listView.setAdapter(adapter); }/* Klasik android metodu. adapterdeki veriyi listviewe ile ekrana yazdırdık*/@Override protected void onResume() { super.onResume(); try { mqttClient = new MqttClient(BROKER_URL, clientId, new MemoryPersistence()); mqttClient.setCallback(new PushCallback(this)); mqttClient.connect(); //Subscribe to all subtopics of homeautomation mqttClient.subscribe(TOPIC); } catch (MqttException e) { Toast.makeText(getApplicationContext(), "hata!" + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } }/* On resume metodu program açıldığında mqtt bağlantısını da açacak. Bunun için kütüphaneden oluşturduğumuz nesneye yukarıda tanımlamış olduğumuz parametreleri gönderiyoruz. Broker ip bilgileri ve topic bilgileri gelecek. setcallback'e Pushcallbacki tanıtıyoruz. mqtt bağlantısını kuruyoruz.subscribe ediyoruz.*/@Override protected void onPause() { super.onPause(); try { mqttClient.disconnect(0); } catch (MqttException e) { Toast.makeText(getApplicationContext(), "hata!" + e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } }//Program kapatıldığında mqtt bağlantısı da sona erecek.Evet arkadaşlar gördüğünüz gibi hiç zor değil. Gelin programı çaıltırıp sonucu görelim. Mosquitto publisherımız üzerinden bir veri gönderelim.Mosquitto_pub ile "test" ve "mesajı" mesajlarını gönderdik.Yazdığımız programımızdaki görüntüsü. Bir sonraki yazımda programı test etmek amacıyla bir bash script yazacağım. Bu script ile bir sensör similasyonunu amaçlıyorum. Sanki verileri sensör okumuşta gönderiyormuş gibi belirlediğim saniye aralıklarında telefona veri gönderecek. Şimdilik hoşçakalın.



Hiç yorum yok:
Yorum Gönder