Posted by : MC
28 Mart 2015 Cumartesi
Daha önce C# ile socket programlama üzerinden tcp bağlantısı kullanarak ethernet üzerinden arduinomuzu kontrol etmiştik.
Okuyamayan arkadaşlar için adım adım C# ile ethernet üzerinden arduino kontrolü yazımız.
Bu yazımızda aslında yapacağımız C# ile gerçekleştirmiş olduğumuz kodlardan farklı olmayacak Neden?
Neler yapacağız?
Daha önce .net framework içerisindeki socket sınıflarını kullandık bu sefer ise java kütüphaneleri içerisindeki socket sınıfı üzerinden arduinomuz ile tcp bağlantısı kurmayı deneyeceğiz.
Android tarafında en önemli konulardan biri manifest doyasının düzenlenmesi.
Bu kısımda kullanıcının cihazında kullanmak istediğiniz kaynaklar için izin almak durumundasınız.Örnek olarak biz projemizde tcp üzerinden arduino ile haberleşeceğimiz için internete erişim iznini manifest doyası içerisinde tanımlamlıyız
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.toshiba.arduino" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ArduinoRemoteControl"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
</manifest>
İşimiz bununla bitmiyor tabii ki :)
sonrasında görsel arayüzümüzü oluşturmalıyız.Nasıl bir görsel arayüz oluşturduk.iki adet imagebutton u üst üste getirerek birine on digerine off resmi yerleştirdik.Hemen ardından herbir butonumuz için tıklama fonksiyonu oluşturduk.Java kısmında ise butonların tıklanma durumları gore gorsellik durumlarını değiştirerek bir aksiyon elde etmiş olduk.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ArduinoRemoteControl">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/buttonon"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:onClick="onbutton" // java içerisinde kullanacagımız fonksiyon olusturuldu
android:background="@null"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton2"
android:src="@drawable/buttonoff"
android:layout_above="@+id/textView"
android:layout_centerHorizontal="true"
android:onClick="offbutton" // java içerisinde kullanacagımız fonksiyon olusturuldu
android:background="@null"/>
<TextView // ısıkların durumu için bir adet ekledik
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textView"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Gelelim can alıcı noktamıza java kodlarımıza :)
package com.example.toshiba.arduino;
import android.os.StrictMode;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import java.io.DataOutputStream; // veri gonderebilmek için output buffer kutuphanesi
import java.net.Socket; // java da ki socket sınıfımızı ekledik
public class ArduinoRemoteControl extends ActionBarActivity {
ImageButton off; // off butonunu javaya çekmek için off değişkeni
ImageButton on; // on butonunu javaya çekmek için on değişkeni
Socket client_socket; // socket değişkenimiz
TextView txt; // textview i javaya çekme değişkenimiz
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_arduino_remote_control);
off=(ImageButton)findViewById(R.id.imageButton2);//off değişkenimizle görseldeki off butonu ilişkilendi
on=(ImageButton)findViewById(R.id.imageButton);//on değişkenimizle görseldeki on butonu ilişkilendi
off.setVisibility(View.INVISIBLE);//off butonunu başlangıçta görünmez kıldık
txt=(TextView)findViewById(R.id.textView);//txt ile gorseldeki textview elemanını eşledik
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();// threadlere izin veriyoruz
StrictMode.setThreadPolicy(policy);
try {// baglantıdaki sıkıntıları yakalamak için try catch yapısı kullandık
bagla(); // bagla fonksiyonumuzu çağırıyoruz
} catch (Exception e) {
e.printStackTrace();// bağlantı olmaması durumundaki hatayı alıyoruz
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_arduino_remote_control, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void onbutton(View view)//on butonuna basıldıgında donecek olan fonksiyonumuz
{
on.setVisibility(View.INVISIBLE);//on butonunu gorunmez kıl
off.setVisibility(View.VISIBLE);//off butonunu gorunur kıl
try {
if(!client_socket.isClosed()) {//socket acık mı ? acıksa
DataOutputStream out = new DataOutputStream(client_socket.getOutputStream());//out adı alrında output kanalı olustur ve socket ile ilişkilendir
out.writeBytes("a");// tcp üzerinden 'a' gönder
txt.setText("ısıklar yandı");// textview e ısıklar yandı yaz
}
else
{
bagla();// baglantı giderse tekrar bagla fonksiyonunu cagır ve baglanmayı dene
}
}
catch (Exception a)
{
}
}
public void offbutton(View view)// off butonuna basıldıgında donecek olan fonksiyon
{
off.setVisibility(View.INVISIBLE);// off butonunu gorunmez kıl
on.setVisibility(View.VISIBLE);//on butonunu gorunur kıl
try {
if(!client_socket.isClosed()) {//socket acık mı ? acıksa
DataOutputStream out = new DataOutputStream(client_socket.getOutputStream());//out adı altında cıkıs kanalı olustur ve socket ile ilişkilendir
out.writeBytes("A");//tcp üzerinden 'A' yaz
txt.setText("ısıklar söndü");//textview e ısıklar sondu yaz
}
else {// baglantıda sıkıntı yakalarsan
bagla();//bagla fonksiyonunu cagır ve tekrar baglanmayı dene
}
}
catch (Exception a)
{
System.out.print(a); // hata mesajını alıyoruz
}
}
public void bagla() throws Exception {// baglanma fonksiyonumuz
try {
client_socket = new Socket("192.168.1.177", 23);// arduino ip miz ve 23 nolu port uzerinden android tarafı ile arduino arasında client_socket ile tcp baglantısı olusturuyoruz
Toast.makeText(this, "baglantı saglandı", Toast.LENGTH_SHORT).show();//baglantı saglandıgı takdirde ekranda baglantı saglandı yazacak ve sonecek
} catch (Exception a) {// baglantı hatasını yakalıyoruz
Toast.makeText(this, "baglantı yok", Toast.LENGTH_SHORT).show();//baglantı saglanamadı ise baglantı yok yazısı bir sure ekranda yanacak ve sonecek
txt.setText(a.toString());//baglantı hatasını net gorebilmek acısından birde textview e yazdırıyoruz
client_socket.close();//socketimizi kapatıyoruz.
}
}
}
gelelim dipnotlarımıza :)
arduino tarafındaki kodları paylasmadım lakin c# ile yaptıgımı örnekteki kodlarımız birebir aynı o kodlara buradan ulasabilirsiniz.
Diğer önemli bir husus bu program ile arduinoyu kontrol edebilmeniz için arduino ile telefonunuzun aynı ağ içerisinde olduğundan emin olun ya da arduinonuzu sabit bir ip ile internete açabiliyorsanız o ip ile projedeki ip değerini değiştiriniz.
Benzer Konular :
- Ana Sayfaya Dön »
- android ile arduino kontrol , android ile arduino nasıl haberlesir , android üzerinden arduinoya baglanmak , arduino ile android haberlesmesi »
- ADIM ADIM ANDROID ILE ARDUINO KONTROLU
Emeğinize sağlık çok çok yararlı bir yazı olmuş. Bu konu hakkında proje çalışmam var bu yazınız çok işime yaradı çok teşekkürler.
YanıtlaSilAcaba Arduino'ya bağlı olan sensör bilgilerini Androide nasıl çekebiliriz? Yardımcı olursanız çok sevinirim.
getMenuInflater().inflate(R.menu.menu_arduino_remote_control, menu);
YanıtlaSilif (id == R.id.action_settings) {
Bu iki bölümde hata alıyorum. Bi türlü bulamadım sebebini. Yardım ederseniz sevinirim. Action_settings ile menu.menu_program adı, menu kısmı kırmızı oluyor.
kaynak kodlarınızı net olarak incelemeden bir sonuca varmam zor
Silancak tahminim seçmiş olduğunuz program template ile alakalı olabilir seçmiş olduğunuz template te android ekranı sağ üst köşede bulunan settings menu bulunmuyor olabilir
Diğer bir çözm yolu ise belirtilen id ler uyuşmuyor ve sizin programınız farklı bir id ile o menüyü oluşturmuş olabilir
menu dosyası içinde xml i kontrol ederek id sini ya da gerçektende template in bir menuye sahip olup olmadığını kontrol edebilirsiniz
bunların bir çözüm olmaması durumunda bana size ulasabilecegim bir mail adresi verebilirseniz uygun oldugum bir zaman en azından uzaktan bağlanarak size yardımcı olmayı deneyebilirim
Kolaylar gelsin