[JAVA] Une application qui acquiert la valeur du capteur d'accélération par communication UDP entre C # et Android

Contenu approximatif

Ici, la valeur du capteur d'accélération d'Android est acquise en C #, et elle est créée pour détecter comment le terminal Android se déplace par la valeur.

Application Android

Dans cette application, les valeurs du capteur d'accélération à trois axes (X, Y, Z) sont envoyées par communication UDP. Afin de faciliter la compréhension de la direction de l'axe dans laquelle le terminal fait face, nous l'avons créé de sorte que le son soit entendu lorsque chaque axe dépasse une certaine valeur.

Interface utilisateur graphique de l'application

Pour ASUS Tab K013

Code source

Puisque la communication par socket est effectuée, ajoutez ce qui suit à Androidmanifest.xml.

Androidmanifest.xml


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

Ensuite, afin de gérer les fichiers image et audio, créez des images dessinables et brutes dans l'application, et mettez-y les données d'image et les données audio.

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

activity_main.xml


<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="0.0.0.0"
        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="32sp"
        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="32sp"
        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="32sp"
        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="32sp"
        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="32sp"
        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="32sp"
        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="Valeur du capteur d'accélération"
        android:textSize="32sp"
        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="Commencer la communication"
        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_marginLeft="16dp"
        android:layout_marginBottom="8dp"
        android:text="adresse IP"
        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_marginLeft="16dp"
        android:layout_marginBottom="8dp"
        android:text="numéro de port"
        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="Annulation de la communication"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <ImageView
        android:id="@+id/LED1"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:layout_marginStart="100dp"
        android:layout_marginLeft="100dp"
        android:layout_marginBottom="150dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@drawable/en" />

    <ImageView
        android:id="@+id/LED2"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:layout_marginEnd="100dp"
        android:layout_marginRight="100dp"
        android:layout_marginBottom="150dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:srcCompat="@drawable/en" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="352dp"
        android:layout_marginEnd="124dp"
        android:layout_marginRight="124dp"
        android:text="Delay"
        android:textSize="32sp"
        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:layout_marginRight="40dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="100"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView6" />

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.ImageView;
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;   //Valeur X du capteur d'accélération
    private TextView Y_Data_TextView;   //Valeur Y du capteur d'accélération
    private TextView Z_Data_TextView;   //Valeur Z du capteur d'accélération
    private float data_X,data_Y,data_Z;
    private int xp,yp,zp,xm,ym,zm;
    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 Handler handler1 = new Handler();
    private long Delay;
    ImageView LED1,LED2;

    SoundPool soundPool;
    int mp3_xp,mp3_xm,mp3_yp,mp3_ym,mp3_zp,mp3_zm;


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

        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        X_Data_TextView = findViewById(R.id.X_Data);
        Y_Data_TextView = findViewById(R.id.Y_Data);
        Z_Data_TextView = findViewById(R.id.Z_Data);

        LED1 = findViewById(R.id.LED1);
        LED2 = findViewById(R.id.LED2);
        LED1.setImageResource(R.drawable.en);
        LED2.setImageResource(R.drawable.en);

        //Celui dont vous avez besoin pour ajouter du son
        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();
        }

        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 );

        Button ran = findViewById(R.id.Ran);
        Button end = findViewById(R.id.End);

        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;

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

                timer1 = new Timer();
                timerTask1 = new mTimerTask1();
                timer1.schedule(timerTask1,0, Delay);

                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;
                }
                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);
                String exit = "exit";
                byte buf[] = new byte[exit.length()];

                try {
                    buf = exit.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);

            }
        });

    }



    @Override
    protected void onResume(){
        super.onResume();
        //Inscription à l'écouteur d'événements
        Sensor accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener((SensorEventListener) this,accel,SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause(){
        super.onPause();
        //Écouteur d'événement non enregistré
        sensorManager.unregisterListener((SensorEventListener) this);
    }

    @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){

    }

    private class mTimerTask2 extends TimerTask{
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {

                    if (data_X >= 700) {
                        LED1.setImageResource(R.drawable.en_gleen);
                        xp += 1;
                        if (xp == 1) {
                            yp=zp=xm=ym=zm=0;
                            soundPool.play(mp3_xp, 2, 2, 0, 0, 1f);
                        }
                    }else if (data_X <= 300) {
                        LED1.setImageResource(R.drawable.en);
                        xm += 1;
                        if (xm == 1) {
                            xp=yp=zp=ym=zm=0;
                            soundPool.play(mp3_xm, 2, 2, 0, 0, 1f);
                        }
                    }else if (data_Y >= 700) {
                        LED2.setImageResource(R.drawable.en_red);
                        yp += 1;
                        if (yp == 1) {
                            xp=zp=xm=ym=zm=0;
                            soundPool.play(mp3_yp, 2, 2, 0, 0, 1f);
                        }
                    } else if (data_Y <= 300) {
                        LED2.setImageResource(R.drawable.en);
                        ym += 1;
                        if (ym == 1) {
                            xp=yp=zp=xm=zm=0;
                            soundPool.play(mp3_ym, 2, 2, 0, 0, 1f);
                        }
                    }else if (data_Z >= 700) {
                        LED1.setImageResource(R.drawable.en_gleen);
                        LED2.setImageResource(R.drawable.en_red);
                        zp += 1;
                        if (zp == 1) {
                            xp=yp=xm=ym=zm=0;
                            soundPool.play(mp3_zp, 2, 2, 0, 0, 1f);
                        }
                    }else if (data_Z <= 300) {
                        LED1.setImageResource(R.drawable.en);
                        LED2.setImageResource(R.drawable.en);
                        zm += 1;
                        if (zm == 1) {
                            xp=yp=zp=xm=ym=0;
                            soundPool.play(mp3_zm, 2, 2, 0, 0, 1f);
                        }
                    }
                }
            });
        }

    }
    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);
                }
            });

        }
    }
}

Application C

Dans cette application, la valeur du capteur d'accélération Android reçu par la communication UDP est enregistrée dans richTextBox, et la valeur de chaque axe est affichée dans TextBox.

Interface utilisateur graphique de l'application

Code source

Form1.cs


using System;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;

namespace UDP_Server
{
    public partial class Form1 : Form
    {
        int i;
        int[] d;
        string[] D;
        private UdpClient udpClient = null; //Réception du client
        public string rcvMsg = null;//Pour stocker les messages reçus
        
        public Form1()
        {
            InitializeComponent();

        }

        //Que se passe-t-il lorsque vous cliquez sur un bouton
        private void button1_Click(object sender, EventArgs e)
        {
            //Si vous appuyez sur le bouton lorsqu'il y a une connexion UDP
            //Rendre le processus absent (légèrement différent)
            if (udpClient != null)
            {
                return;
            }
            ((Button)sender).Enabled = false;

            string IPString = "127.0.0.1";
            IPAddress IPAdd = IPAddress.Parse(IPString); //Spécifiez l'adresse IP
            int Port = 8080;    //Spécifiez le numéro de port

            //Créez UdpClient et liez-vous au numéro de port spécifié
            IPEndPoint EP = new IPEndPoint(IPAdd, Port);
            UdpClient udp = new UdpClient(EP);

            richTextBox1.BeginInvoke(
                    new Action<string>(ShowReceivedString1), "Commencer à recevoir");

            //Démarrer la réception asynchrone
            udp.BeginReceive(UdpServer, udp);
            ((Button)button1).Enabled = true;
        }

        //Traitement lors de la réception des données
        private void UdpServer(IAsyncResult ar)
        {
            UdpClient udp = (UdpClient)ar.AsyncState;
            for (;;)
            {
                //Arrêter une fois la réception asynchrone
                IPEndPoint remoteEP = null;
                byte[] rcvBytes = udp.Receive(ref remoteEP);


                //Convertir les données reçues en chaîne de caractères
                string rcvMsg = System.Text.Encoding.UTF8.GetString(rcvBytes);

                //"exit"Quittez lorsque vous recevez
                if (rcvMsg == "exit")
                {
                    break;
                }

                D = rcvMsg.Split(' ');
                for(i=0;D[i]== null; i++)
                {
                    d[i] = int.Parse(D[i]);
                }


                //Afficher les données reçues dans TextBox
                string displayMsg = string.Format("{0}", rcvMsg);
                richTextBox1.BeginInvoke(
                    new Action<string>(ShowReceivedString1), displayMsg);
                X_Data.BeginInvoke(
                    new Action<string>(ShowReceivedString_x), D[0]);
                Y_Data.BeginInvoke(
                    new Action<string>(ShowReceivedString_y), D[1]);
                Z_Data.BeginInvoke(
                    new Action<string>(ShowReceivedString_z), D[2]);
            }

            rcvMsg = "Fini";
            //Fermer UdpClient
            udp.Close();

            richTextBox1.BeginInvoke(
                   new Action<string>(ShowReceivedString1), rcvMsg);
        }

        private void ShowReceivedString1(string str)
        {
            if (richTextBox1.Text == "")
            {
                richTextBox1.Text = str;
                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                richTextBox1.Focus();
                richTextBox1.ScrollToCaret();
            }
            else {
                richTextBox1.Text = richTextBox1.Text + "\r\n" + str;
                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                richTextBox1.Focus();
                richTextBox1.ScrollToCaret();
            }

        }

        private void ShowReceivedString_x(string str)
        {
            X_Data.Text = str;

        }
        private void ShowReceivedString_y(string str)
        {
            Y_Data.Text = str;

        }
        private void ShowReceivedString_z(string str)
        {
            Z_Data.Text = str;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Fermer UdpClient
            if (udpClient != null)
            {
                udpClient.Close();
            }
        }
    }
}

Objectifs futurs

Je pense ajouter une image qui imite une LED qui peut être contrôlée par la valeur du capteur d'accélération sur C #, mais pour cela, je dois pouvoir faire fonctionner la PictureBox avec plusieurs threads, donc je vais me concentrer sur cela.

Recommended Posts

Une application qui acquiert la valeur du capteur d'accélération par communication UDP entre C # et Android
L'histoire de la création d'une application Android capable d'ajuster la fréquence d'échantillonnage du capteur d'accélération
Le contenu de la valeur de retour de executeBatch est différent entre 11g et 12c
Applications de contrôle et de communication UDP basées sur Android utilisant des valeurs de capteur d'accélération
Je vais expliquer la différence entre le développement d'applications Android et le développement d'applications iOS du point de vue des ingénieurs iOS
Envoyer la valeur du capteur d'accélération d'Android au PC par UDP
Ceci et cela de JDK
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Lecture et écriture ligne par ligne à partir du tampon avec communication TCP entre C et Ruby