Skip to content
isdnetworks
Go back

블루투스로 장치를 제어하는 앱을 만들며 배운 것

앱에서 블루투스로 장치를 직접 제어하는 일을 하고 있다. 서버 쪽만 하다가 이것을 하니 전제가 다른 것이 많았다.

Table of contents

Open Table of contents

연결이 기본 상태가 아니다

서버 개발에서는 요청을 보내면 가는 것이 기본이고 끊기는 것이 예외 상황이다. 블루투스는 반대로 연결되어 있는 상태가 특별하다.

장치가 꺼져 있을 수도 있고 거리가 멀어지면 끊기고 다른 앱이 이미 붙어 있을 수도 있다. 그래서 명령 하나를 보내는 코드가 확인과 검색과 연결과 전송과 재시도까지 다섯 단계가 되고 각 단계가 각각 실패한다.

오류 없이 멈추는 순서 위반

앱을 켜자마자 명령을 보내게 했더니 아무 반응이 없었다. 검색과 연결과 서비스 조회와 특성 조회를 거쳐야 읽고 쓸 수 있는 순서가 있었다.

앞 단계가 끝나기 전에 다음을 부르면 실패하는데 오류가 나지 않고 그냥 아무 일도 안 일어나는 경우가 있었다. 각 단계가 끝났는지 확인하고 다음으로 가게 고치니 코드가 길어졌지만 다른 방법을 찾지 못했다.

한 번에 보낼 수 있는 크기

명령이 길어지면 한 번에 못 보내고 그 상한이 장치마다 다르다. 협상해서 늘리는 방법이 있지만 그것이 안 되는 장치도 있었다.

그래서 작게 나눠 보내는 것을 기본으로 두고 받는 쪽에서 이어 붙이도록 순번과 전체 개수를 앞에 붙였다. 중간이 유실되면 받는 쪽이 순번으로 알 수 있는데 그 재전송 규칙을 정하는 데 시간이 꽤 걸렸다.

기기마다 갈리는 동작

같은 코드인데 기기마다 다르게 동작했다. 검색이 빠른 기기와 느린 기기가 있어서 시간 제한을 짧게 잡으면 느린 쪽에서 못 찾는다.

끊고 바로 다시 연결하면 실패하는 기기가 있어서 잠깐 기다렸다가 해야 했다. 앱을 지웠다 깔아도 예전 연결 정보가 남는 기기도 있었는데 이런 것을 미리 아는 방법을 못 찾아서 여러 기기에서 직접 해 보는 수밖에 없었다.

검색에 필요한 위치 권한

블루투스 장치를 검색하는 데 위치 권한이 필요하다는 것이 뜻밖이었다. 주변 장치 목록이 위치 추정에 쓰일 수 있어서 그렇게 묶여 있었다.

사용자에게는 이 요구가 이상하게 보이므로 이유를 설명하는 화면을 넣었는데도 거부하는 경우가 있었다. 거부하면 검색만 막히는 것이 아니라 전체가 아무 반응 없이 멈추고 그 이유가 화면에 나오지 않는다.

정리


Share this post on:

Previous Post
체인을 이긴 관계 테이블
Next Post
인용한 목록이 그 목록이 아니다