Today
-
Total
-
  • [안드로이드] 자이로 센서 값 자바 서버와 연동하기
    Coding/Android 2019. 6. 4. 19:29

    안드로이드 기본 센서중에는 자이로 센서가 있습니다

    이를 간단한 자바 서버를 이용하여 이 서버로 센서 값을 전송해보는 코드를 짜보았습니다

     

     

    MainActivity.java // 안드로이드 스튜디오

    package com.example.finalterm;
    
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.LinkedList;
    
    public class MainActivity extends AppCompatActivity {
        SensorManager sm;
        SensorEventListener accL;
        Sensor accSensor;
        SocketClient client;
        SendThread send;
        Socket socket;
        LinkedList<SocketClient> threadList;
        private float x,y,z;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sm = (SensorManager)getSystemService(SENSOR_SERVICE);
            accSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            accL = new accListener();
            client = new SocketClient("192.168.0.162", "90");
            threadList.add(client);
            client.start();
        }
    
        private class accListener implements SensorEventListener
        {
    
            @Override
            public void onSensorChanged(SensorEvent event) {
                x = event.values[0];
                y = event.values[1];
                z = event.values[2];
    
                send = new SendThread(socket); // 전송 스레드 시작
                send.start();
            }
    
            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
            }
        }
    
        class SocketClient extends Thread {
            boolean threadAlive;
            String ip;
            String port;
            DataOutputStream output = null;
            public SocketClient(String ip, String port) {
                threadAlive = true;
                this.ip = ip;
                this.port = port;
            }
            @Override
            public void run() {
                try {
                    socket = new Socket(ip, Integer.parseInt(port)); //ip주소와 port로 연결 (ip는 string, port 는 integer)
                    output = new DataOutputStream(socket.getOutputStream()); // 출력 스트림 오픈
                } catch (Exception e) {
                    //error
                }
            }
    
        }
        class SendThread extends Thread {
            Socket socket;
            String sendmsg = Integer.toString((int)x) + " " + Integer.toString((int)y) + " " + Integer.toString((int)z);
            PrintWriter socket_out;
            public SendThread(Socket socket) {
                this.socket = socket;
                try {
                    socket_out = new PrintWriter(socket.getOutputStream(), true);
                } catch (Exception e) {
                    //error
                }
            }
            @Override
            public void run() {
                try {
                    if (sendmsg != null) {
                        socket_out.println(sendmsg);
                    }
                } catch (Exception e) {
                    //error
                }
            }
        }
    }
    

     

    따로 텍스트뷰나 버튼을 이용하지 않고 모든 것이 OnCreate안에 있기 때문에

    액티비티가 실행되자마자 바로 서버로 전송할 겁니다.

    ip와 port번호는 현재 내가 사용하는 와이파이와 포트명 기준이므로 재사용할때는 본인의 환경에 맞게 사용해주어야 합니다.

    최대한 간단하게 코드를 짜기위해 불필요한 과정은 최대한 축소하였습니다.

     

     

    Server.java // 자바 서버 쪽 코드

    package finaltermserver;
    
    import java.io.*;			
    import java.net.*;			
    import java.sql.*;			
    import java.awt.event.*;	
    
    public class server {
    	static String x;	
    	static String y;	
    	static String z;	
    	static int    asum;
    
    	public static void main(String[] args) {
    		ServerSocket serverSocket = null;			// port, client accept
    		Socket socket = null;						
    		try {
    			serverSocket = new ServerSocket(90);
    			socket = serverSocket.accept();
    			System.out.println("서버 연결");
    			BufferedReader ain = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			OutputStream out = socket.getOutputStream();
    			while(true)
    			{
    				String str = ain.readLine();		// android send data receive
    				String ar[] = str.split(" "); // " " 기준으로 파싱
    				x = ar[0];	// x
    				y = ar[1];	// y
    				z = ar[2];  // z
    				System.out.println(x);
    				System.out.println(y);
    				System.out.println(z);
    			}
    
    		} catch (Exception e) {
    			e.printStackTrace();
    
    		} finally {
    			try {
    				socket.close();
    
    			} catch (Exception ignored) {
    
    			}
    			try {
    				serverSocket.close();
    
    			} catch (Exception ignored) {
    
    			}
    		}
    	}
    }
    
    

     

    위의 코드를 활용하면

     

    클라이언트는 자이로 센서값을

    x y z

    이런 메시지로 보낼 것이고,

    서버는 이 메시지를 한줄씩 받아

    " ", 즉 공백을 기준으로 파싱하여 

    x

    y

    z

    이렇게 한줄씩 출력할 것입니다.

     

    원래는 액티비티를 닫을때 리스너를 닫아주는 처리를 해주어야 하지만 최대한 간소하게 하기 위해

    이마저도 생략하였습니다.

     

    혹시라도 이 코드를 사용하여 빌드하셨을 때는 센서값을 무한히 계속 받아오면서 핸드폰에 과부하를 걸 테니

    꼭 삭제해 주셔야 합니다!

     

    댓글