[JAVA] Android-basierte Steuerungs- und UDP-Kommunikationsanwendungen mit Beschleunigungssensorwerten

Änderungen gegenüber dem letzten Mal

Bis zum letzten Mal wurde der Beschleunigungssensor durch Anzeigen eines Bildes gesteuert, das eine LED imitiert. Dieses Mal wurde es jedoch so geändert, dass der Beschleunigungssensor mit einem Optionsfeld und einem Drehknopf gesteuert werden kann.

Anwendungs-GUI

In dieser Anwendung werden die Werte des dreiachsigen Beschleunigungssensors (X, Y, Z) per UDP-Kommunikation gesendet. Die Steuerung über den Beschleunigungssensor kann im Terminal über das Optionsfeld und den Drehknopf erfolgen. Da die Steuerelemente mit den Optionsfeldern festgelegt werden, können Sie jeweils nur eine Achse steuern.

Anwendungs-GUI

Für ASUS Tab K013

Quellcode

Fügen Sie der Androidmanifest.xml Folgendes hinzu, da die Socket-Kommunikation durchgeführt wird.

Androidmanifest.xml


<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Um Bild- und Audiodateien zu verarbeiten, erstellen Sie als Nächstes in der App zeichnbare und rohe Res und fügen Sie die Bild- und Audiodaten darin ein. Da danach ein Spinner verwendet wird, wird Spinner.xml in Werten in res erstellt.

app
 └res
   ├drawable
   │ ├en.jpg
   │ ├en_gleen.jpg
   │ └en_red.jpg
   ├raw
   │ ├xjikum.mp3
   │ ├xjikup.mp3
   │ ├yjikum.mp3
   │ ├yjikup.mp3
   │ ├zjikum.mp3
   │ └zjikup.mp3
   └values
     └Spinner.xml

Der Quellcode von Spinner.xml lautet wie folgt

Spinner.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="items">
        <item>das ist alles</item>
        <item>Weniger als</item>
    </string-array>
</resources>

activity_main.xml


<Spinner
        android:id="@+id/spinner2"
        android:layout_width="67dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="180dp"
        android:entries="@array/items"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/y_if" />

    <Spinner
        android:id="@+id/spinner3"
        android:layout_width="67dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="128dp"
        android:entries="@array/items"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/z_if" />

    <EditText
        android:id="@+id/IP_Address"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="52dp"
        android:layout_marginEnd="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="127.0.0.1"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/Port"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="48dp"
        android:layout_marginEnd="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="8080"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/IP_Address" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="280dp"
        android:text="X:"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:text="Y:"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:text="Z:"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/X_Data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="280dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintStart_toEndOf="@+id/textView"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Y_Data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/X_Data" />

    <TextView
        android:id="@+id/Z_Data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="TextView"
        android:textSize="24sp"
        app:layout_constraintStart_toEndOf="@+id/textView3"
        app:layout_constraintTop_toBottomOf="@+id/Y_Data" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="230dp"
        android:text="Wert des Beschleunigungssensors"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/Ran"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="87dp"
        android:layout_marginLeft="87dp"
        android:layout_marginBottom="70dp"
        android:text="Starten Sie die Kommunikation"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="8dp"
        android:text="IP Adresse"
        android:textSize="24sp"
        app:layout_constraintBottom_toTopOf="@+id/IP_Address"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="8dp"
        android:text="Port-Nummer"
        android:textSize="24sp"
        app:layout_constraintBottom_toTopOf="@+id/Port"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/End"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="87dp"
        android:layout_marginRight="87dp"
        android:layout_marginBottom="70dp"
        android:text="Kommunikationsstornierung"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="300dp"
        android:layout_marginEnd="124dp"
        android:text="Delay"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/Delay"
        android:layout_width="159dp"
        android:layout_height="49dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="40dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="100"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView6" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="67dp"
        android:layout_height="32dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="248dp"
        android:entries="@array/items"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/x_if" />

    <EditText
        android:id="@+id/y_if"
        android:layout_width="66dp"
        android:layout_height="49dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="183dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="500"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/RBGroup" />

    <EditText
        android:id="@+id/x_if"
        android:layout_width="66dp"
        android:layout_height="49dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="243dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="500"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/RBGroup" />

    <EditText
        android:id="@+id/z_if"
        android:layout_width="66dp"
        android:layout_height="49dp"
        android:layout_marginStart="8dp"
        android:layout_marginBottom="123dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="500"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/RBGroup" />


    <RadioGroup
        android:id="@+id/RBGroup"
        android:layout_width="125dp"
        android:layout_height="180dp"
        android:layout_marginStart="40dp"
        android:layout_marginBottom="113dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent">


        <RadioButton
            android:id="@+id/x_button"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="Der Wert von X ist"
            android:textSize="24sp" />

        <RadioButton
            android:id="@+id/y_button"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="Der Wert von Y ist"
            android:textSize="24sp" />

        <RadioButton
            android:id="@+id/z_button"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="Der Wert von Z ist"
            android:textSize="24sp" />
    </RadioGroup>

MainActivity.java


import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private TextView X_Data_TextView,Y_Data_TextView,Z_Data_TextView;
    private float data_X,data_Y,data_Z;
    private int data_x,data_y,data_z;
    private String Data;
    private Timer timer1,timer2;
    private mTimerTask1 timerTask1;
    private mTimerTask2 timerTask2;
    private Handler handler = new Handler();
    private long Delay;
    private Spinner spinner1,spinner2,spinner3;
    private int spn1,spn2,spn3;
    private int X,Y,Z;
    private String x,y,z;
    SoundPool soundPool;
    int mp3_xp,mp3_xm,mp3_yp,mp3_ym,mp3_zp,mp3_zm;
    private int xp,yp,zp,xm,ym,zm;
    private RadioGroup rg ;
    private RadioButton RBid;

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

        //Einstellungen des Beschleunigungssensors
        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

        //Festlegen des Texts zur Anzeige der Beschleunigung
        X_Data_TextView = findViewById(R.id.X_Data);
        Y_Data_TextView = findViewById(R.id.Y_Data);
        Z_Data_TextView = findViewById(R.id.Z_Data);

        //Die, die Sie benötigen, um Sound hinzuzufügen
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        } else {
            AudioAttributes attr = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(attr)
                    .setMaxStreams(5)
                    .build();
        }

        //Soundeffekt-Einstellung
        mp3_xp = soundPool.load(this, R.raw.xjikup, 1);
        mp3_xm = soundPool.load(this,R.raw.xjikum,1 );
        mp3_yp = soundPool.load(this, R.raw.yjikup, 1);
        mp3_ym = soundPool.load(this,R.raw.yjikum,1 );
        mp3_zp = soundPool.load(this, R.raw.zjikup, 1);
        mp3_zm = soundPool.load(this,R.raw.zjikum,1 );

        //Spinner-Einstellungen
        spinner1=findViewById(R.id.spinner1);
        spinner2=findViewById(R.id.spinner2);
        spinner3=findViewById(R.id.spinner3);

        //Optionsfeldgruppeneinstellungen und Werterfassung
        rg =findViewById(R.id.RBGroup);
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RBid = findViewById(checkedId);
            }
        });

        //Einstellen der Start- und Trenntasten
        Button ran = findViewById(R.id.Ran);
        Button end = findViewById(R.id.End);

        //Verarbeitung beim Drücken der Verbindungsstarttaste
        ran.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(null != timer1){
                    timer1.cancel();
                    timer1 = null;
                }

                xp=yp=zp=xm=ym=zm=0;

                //Verzögerungseinstellung
                String delay = ((EditText)findViewById(R.id.Delay)).getText().toString();
                Delay = Long.parseLong(delay);

                //Die UDP-Kommunikation wurde gestartet
                timer1 = new Timer();
                timerTask1 = new mTimerTask1();
                timer1.schedule(timerTask1,0, Delay);

                //Steuerung mit einem Beschleunigungssensor
                timer2 = new Timer();
                timerTask2 = new mTimerTask2();
                timer2.schedule(timerTask2,0,Delay);
            }
        });

        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if(null != timer1){
                    timer1.cancel();
                    timer1 = null;
                }

                //Einstellungen für IP-Adresse und Portnummer
                final String address = ((EditText) findViewById(R.id.IP_Address)).getText().toString();
                String port = ((EditText) findViewById(R.id.Port)).getText().toString();
                int Port = Integer.parseInt(port);

                //Einstellungen zum Senden von "exit"
                String exit = "exit";
                byte buf[] = new byte[exit.length()];
                try {
                    buf = exit.getBytes("SHIFT_JIS");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                //Start der UDP-Kommunikation
                InetSocketAddress inetSocketAddress = new InetSocketAddress(address, Port);
                final DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, inetSocketAddress);
                AsyncTask<DatagramPacket, Void, Void> task = new AsyncTask<DatagramPacket, Void, Void>() {
                    @Override
                    protected Void doInBackground(DatagramPacket... datagramPackets) {
                        DatagramSocket datagramSocket = null;
                        try {
                            datagramSocket = new DatagramSocket();
                            datagramSocket.send(datagramPackets[0]);
                            datagramSocket.close();
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return null;
                    }

                };
                task.execute(datagramPacket);

            }
        });

    }



    @Override
    protected void onResume(){
        super.onResume();
        //Event Listener Registrierung
        Sensor accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener((SensorEventListener) this,accel,SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause(){
        super.onPause();
        //Ereignis-Listener nicht registriert
        sensorManager.unregisterListener((SensorEventListener) this);
    }

    //Einstellungen zur Anzeige des Wertes des Beschleunigungssensors und zur Übertragung über UDP-Kommunikation
    @Override
    public void onSensorChanged(SensorEvent event){
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){

            data_X= (500+event.values[0]*25);
            data_Y= (500+event.values[1]*25);
            data_Z= (500+event.values[2]*25);

            data_x = (int)data_X;
            data_y = (int)data_Y;
            data_z = (int)data_Z;
            Data = data_x + " " +
                    data_y + " " +
                    data_z;
            X_Data_TextView.setText(String.valueOf(data_x));
            Y_Data_TextView.setText(String.valueOf(data_y));
            Z_Data_TextView.setText(String.valueOf(data_z));
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy){

    }

    //Steuerung mit dem Wert des Beschleunigungssensors
    private class mTimerTask2 extends TimerTask{
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {

                    spn1=spinner1.getSelectedItemPosition();
                    spn2=spinner2.getSelectedItemPosition();
                    spn3=spinner3.getSelectedItemPosition();

                    x=((EditText)findViewById(R.id.x_if)).getText().toString();
                    y=((EditText)findViewById(R.id.y_if)).getText().toString();
                    z=((EditText)findViewById(R.id.z_if)).getText().toString();
                    X=Integer.parseInt(x);
                    Y=Integer.parseInt(y);
                    Z=Integer.parseInt(z);

                    if(RBid==(findViewById(R.id.x_button))&&spn1==0&&data_x>=X){
                        xp += 1;
                        if (xp == 1) {
                            yp=zp=xm=ym=zm=0;
                            soundPool.play(mp3_xp, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.x_button))&&spn1==1&&data_x<=X){
                        xm += 1;
                        if (xm == 1) {
                            xp=yp=zp=ym=zm=0;
                            soundPool.play(mp3_xm, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.y_button))&&spn2==0&&data_y>=Y){
                        yp += 1;
                        if (yp == 1) {
                            xp=zp=xm=ym=zm=0;
                            soundPool.play(mp3_yp, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.y_button))&&spn2==1&&data_y<=Y){
                        ym += 1;
                        if (ym == 1) {
                            xp=yp=zp=xm=zm=0;
                            soundPool.play(mp3_ym, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.z_button))&&spn3==0&&data_z>=Z){
                        zp += 1;
                        if (zp == 1) {
                            xp=yp=xm=ym=zm=0;
                            soundPool.play(mp3_zp, 2, 2, 0, 0, 1f);
                        }
                    }
                    else if(RBid==(findViewById(R.id.z_button))&&spn3==1&&data_z<=Z){
                        zm += 1;
                        if (zm == 1) {
                            xp=yp=zp=xm=ym=0;
                            soundPool.play(mp3_zm, 2, 2, 0, 0, 1f);
                        }
                    }
                    else{
                        xp=xm=yp=ym=zp=zm=0;
                    }
                }
            });
        }

    }

    //UDP-Kommunikation
    private class mTimerTask1 extends TimerTask{
        @Override
        public void run(){

            handler.post(new Runnable() {
                @Override
                public void run() {
                    final String address = ((EditText) findViewById(R.id.IP_Address)).getText().toString();
                    String port = ((EditText) findViewById(R.id.Port)).getText().toString();
                    int Port = Integer.parseInt(port);
                    byte buf[] = new byte[Data.length()];

                    try {
                        buf = Data.getBytes("SHIFT_JIS");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                    InetSocketAddress inetSocketAddress = new InetSocketAddress(address, Port);
                    final DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, inetSocketAddress);


                    AsyncTask<DatagramPacket, Void, Void> task = new AsyncTask<DatagramPacket, Void, Void>() {
                        @Override
                        protected Void doInBackground(DatagramPacket... datagramPackets) {
                            DatagramSocket datagramSocket = null;

                            try {
                                datagramSocket = new DatagramSocket();
                                datagramSocket.send(datagramPackets[0]);
                                datagramSocket.close();
                            } catch (SocketException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                            return null;
                        }

                    };
                    task.execute(datagramPacket);
                }
            });

        }
    }
}

Recommended Posts

Android-basierte Steuerungs- und UDP-Kommunikationsanwendungen mit Beschleunigungssensorwerten
Eine Anwendung, die den Wert des Beschleunigungssensors durch UDP-Kommunikation zwischen C # und Android erfasst
Aufbau eines Autorisierungsservers mit Authlete und Kommunikation vom OAuth-Client (Webanwendung)