[안드로이드 - 코틀린] 안드로이드 socket 통신 - (임계치 측정 어플리케이션)

2022. 11. 21. 16:34Android

특징 : 현재 애플리케이션 기준으로 소켓 데이터는 서버에서 받아서 서버에서 앱으로 전달받는 역할을 한다 때문에 소켓을 이용해 따로 데이터를 전송하지 않고 받기만 하는 역할을 한다

 

시작 전에 build.gradle 쪽에 소켓 통신을 위한 빌드 파일을 불러와야 한다

// socket 통신
implementation ('io.socket:socket.io-client:2.0.0') {
    exclude group: 'org.json', module: 'json'
}

 

그다음으로는 소켓을 이용하려면 서버에 클라이언트를 연결해야 된다 

 

아래는 애플리케이션에서 필요한 클래스들이다 

// onCreateView 상단에 선언 해준다

lateinit var socket_data: Array<Sensor_data>
// 소켓 룸, 방에 접속하기 위한 열쇠 

data class Join_Data(

    val room : Int

)
try {
    mSocket = IO.socket("소켓 주소 입력")
    Log.d("SOCKET", "Connection success : $mSocket")

} catch (e: URISyntaxException) {
    e.printStackTrace()
}

mSocket.connect()

mSocket.on(Socket.EVENT_CONNECT) { arg: Array<Any?>? ->
	// emit을 이용해 join한다 join을 하기 위해서는 룸키가 필요하다
	mSocket.emit("join", gson.toJson(Join_Data(room = user_key)))
    	// 연결을 성공했는지 확인하는 로그 
	Log.d("Socket_join", "입장 - before")
}

 

try catch 문을 이용해 소켓 주소와 연결을 하고 connect 명령어를 이용해 소켓과 연결한다

on 명령어를 이용해 소켓과 연결하는 이벤트인데 emit을 이용해 소켓에 목적지를 정해 연결한다 

 

// 소켓에서 날아오는 데이터 형식 및 종류

data class Sensor_data(

    var sensor_key : Int,
    var user_key : Int,
    var Tc : Float,
    var DO : Float,
    var DOper : Float,
    var pH: Float,
    var Sa: Float,
    var ORP : Float,
    var TUR: Float,
    var date : String

)
mSocket.on("sensor_update", Emitter.Listener { args ->

    Log.d("Socket_on", "arg data $args")

    val data = gson.fromJson(args[0].toString(), Sensor_data::class.java)

    Log.d("Socket_on", "gson.fromJson ${data.pH}")
})

 

소켓을 연결한 것을 확인했다면 데이터를 담을 곳이 필요하다

소켓 데이터를 data 안에 담아 준다 

이제는 로그 하단에 넣고 싶은 곳에 원하는 데이터를 넣어주면 된다

ex) data.data [0] 같이 이용 가능 [0] 값은 소켓에서 날아온 0번째 idx 값이다. 각자 소켓 길이에 따라 최댓값이 다르므로 주의해서 이용

소켓에서 날아온 데이터를 입력해준 메인 화면