728x90
반응형
이번 기능은 사실 이전에 생각조차 해보지 않은 기능이었다.
기존 HTTP, TCP 기반 통신에 익숙해져 있었기 때문이다.
그리고 내가 연동해야할 센서는 0으로 1바이트를 보내면 지속적으로 특정값을 형식에 맞게 보내주는 녀석이었다.
그럼 바로 코드를 공유해보도록 하겠다.
private fun fetchUdpData() = CoroutineScope(Dispatchers.Default).launch {
println("started fetch")
val socket = DatagramSocket()
val address = InetAddress.getByName(someIp.split(":")[0])
val packet = DatagramPacket(
"0".toByteArray(),
"0".toByteArray().size,
address,
someIp.split(":")[1].toInt()
)
try {
socket.send(packet)
} catch (e: Exception) {
e.printStackTrace()
return@launch
}
while (isActive) {
val buffer = ByteArray(256)
val responsePacket = DatagramPacket(buffer, buffer.size)
socket.receive(responsePacket)
val responseArray = responsePacket.data
val someData = ByteBuffer.wrap(
byteArrayOf(
responseArray[0],
responseArray[1],
responseArray[2],
responseArray[3]
)
).apply {
order(ByteOrder.LITTLE_ENDIAN)
}.getFloat()
}
}
이제 코드를 천천히 설명해보겠다.
일단 Thread를 대신해 Coroutine을 사용해 UDP 통신을 만들어봤는데 함수 하나로 뭉쳐보았다.
가장 먼저 Socket을 생성했다.
이후 Packet을 IP address, port를 사용해 만들고 Socket에 send 해주면 보내는 방식은 끝이다.
UDP Packet 수신 시에는 받을 ByteArray를 만들고 해당 배열로 Packet을 만들어 Socket에서 receive 메소드를 통해 받는다.
그렇게 받은 ByteArray로 특정 데이터를 뽑아내면 되는데 내 경우에는 Float값을 가져오는 코드이다.
여기서 추가로 고려해야할 점은 Endian인데 하드웨어에서 보내주는 엔디안이 어떤 방식인지 파악해둬야한다.
728x90
반응형
'Android' 카테고리의 다른 글
Android White Screen Before Splash Screen Resolved (0) | 2024.06.25 |
---|---|
Android APK Decompile(Proguard 적용 확인) (0) | 2024.06.12 |
Android ListAdapter submitList not refreshing (0) | 2024.04.08 |
Android Selector 사용 시 주의사항 (1) | 2024.04.06 |
Android Change TextField Cursor Color (0) | 2024.03.13 |