안드로이드 블루투스 연결 삽질기록

나고수·2022년 6월 26일
0

1일1공부

목록 보기
51/68
post-custom-banner

삽질기록

IOException: read failed, socket might closed

  • 오류 상황 :
    1. blDevice 찾아서 Const에 저장
    2. Const.blSocket = Const.blDevice.socket()
    3. Const.socket connect()
    4. Const.socket에 데이터 write
    5. Const.socket close()
    6. 데이터 다시 write 하려면, Const.blSocket = Const.blDevice.socket()
    7. Const.blSocket.connet()
  • 한마디로, 처음에 blDevice를 Const에 저장해놓고, 데이터 write 할때마다 동일한 device의 소켓을 찾아서 connect ->write -> close 함.
  • 그런데 이렇게 하니까 재연결 할때 계속 에러가났다.
  • 이렇게 한 이유?: 데이터 송수신을 끝낸 후 소켓을 close 안하면 리소스가 낭비될까봐, 데이터 송수신을 끝낸 후 바로 소켓을 close 했음.
  • 해결:
    1. blDevice 찾아서 Const에 저장
    2. Const.blSocket = Const.blDevice.socket()
    3. Const.socket connect()
    4. Const.socket에 데이터 write
    5. 데이터 다시 write 하려면
    6. 아까 저장된 Const.blDevice와 Const.blSocket을 그대로 이용해서 write
    7. 디바이스 해제 시에만 Const.blSocket과 Const.blDevice 모두 null 초기화.
  • 한마디로, 데이터를 write 한 후 바로 소켓을 close() 하는 것이 아니라, 디바이스 연결 해제 할때만 device와 소켓을 둘다 초기화. 디바이스 연결 해제를 안하면 같은 소켓(처음에 찾은 소켓)으로 계속 연결하는거임
    정말 며칠을 고민하다가, '소켓이 이미 close 됐다는 오류' 이니까 소켓 close 하는 부분을 지우고 빌드 해보면 어떨까 하는 생각에 시도해보다가 찾아내게됨.
  • 내 생각 : 소켓은 디바이스를 찾을때마다 달라지는거 같다.
    그러니까 디바이스 찾기 랑 소켓연결 을 세트로 생각해야함.
    소켓을 close() 했으면, 디바이스를 새로 찾아서 소켓을 새로 connet()해야함!!
    디바이스 찾기. 소켓연결 . 소켓해지. 이미 저장된 디바이스의 소켓찾아서 재연결 < 이렇게 하면 디바이스에 연결된 소켓은 이미 해지 됐는데, 이미 해지된 소켓에 연결하려 해서 오류가 나는듯
  • 디바이스 찾기. 소켓연결. 소켓해지. 디바이스 해지. 디바이스 재검색. 재검색된 디바이스의 소켓으로 재연결 . 이렇게 하면 오류가 안남.

UUID

모바일과 아두이노 연결 시 uuid는 "00001101-0000-1000-8000-00805f9b34fb"

명령어 입력 시 \r (캐리지리턴)

  • \r : Carriage Return(CR) 라는 의미를 가지며 일반적으로는 맨앞으로 이동하라는 뜻입니다.
  • 공식문서대로 정말 똑같이 따라했는데도 명령어 입력시 echo(내가 입력한 명령어가 그냥 그대로 return됨) 되길래, 왜그런지 정말 몇시간 고민했는데,
    명령어 마지막에 \r을 붙여줬어야했다.
  • 알고보니, 블루투스 릴레이 회사에서 제공해준 코드에 떡하니 \r를 적으라고 적혀있었다.. 제공된 코드를 잘 보자.....
  • ex)"ver" < 이렇게 하면 그냥 "ver" 이 리턴됨.
  • "ver\r" < 이렇게 하면 1.0.0 등 버전이 잘 리턴됨.
profile
되고싶다
post-custom-banner

0개의 댓글