본문 바로가기

[Flutter] 플러터 블루투스 연결 구현 #3 아두이노 코드 분석

I'm 영서 2023. 3. 3.
반응형

1. 블루투스를 연결하기 위해 필요한것.

   - 블루투스 용어정리

   - 블루투스 라이브러리 

2. 블루투스 연결

    - 아두이노 코드분석

    - 모바일(플러터)에서 확인

3. 데이터 송수신

 

** 이미 완성된 아두이노 코드를 가지고 있으나 블루투스 서비스와 캐릭터리스틱의 UUID와 데이터 송수신을 어떻게 하는지에  대해 참고할 만 한 자료를 만들어 보려고 한다.

 

라이브러리도 정했다. 이젠 아두이노 코드 분석을 해야한다.

 

물론 이 게시글을 보고 조금 활용하면 코드를 작성하는것도 가능하다..

 

아두이노 코드를 확인하는 이유

 

1. 어떤 서비스의 캐릭터리스틱을 통해 데이터 송수신해야하는지를 알아야 하며

2. 데이터 송수신시 어떻게 처리되는지 알아야 하기 때문.

 

c++로 코드가 작성되어있는데, 아주아주 간략하고 기본적인 내용만 설명하자면

c++은 method를 부를때 -> 를 사용한다. 

 

Call by Reference에 대해서는... 여기서 굳이 알 필요는 없으므로 넘어가도록 하겠다. * 붙어있으면 대충 해당타입이 저장되어있는 주소값 이라고 생각하면 된다.

 

가장 먼저 봐야할 것은 setup()메서드이다.

 

아두이노가 실행될 때 setup메서드를 통해 실행되므로 반드시 확인해야한다.

 

지금과같은 경우엔 BluetoothSetup이라는 메서드가 있어 해당 메서드를 확인해보았다.

기초 변수들

간략히 설명하자면

  1. BLEServer, BLECharacteristic 초기화
  2. UUID들 최초정의
  3. BLEDevice의 이름 설정 (여기선 Ctrl)로 이름을 부여했다.
  4. Server 초기화 콜백함수 등록
  5. 개발자가 설정한 서비스UUID를 기준으로 하는 서비스 추가
  6. 해당 서비스에 NOTIFY 속성을 가진 캐릭터리스틱 추가,
  7. 해당 캐릭터리스틱에 디스크립터로 BLE2902 등록
  8. WRITE 캐릭터리스틱 및 콜백함수 추가
  9. 서비스 시작 
  10. advertising 시작

 

이렇게 정리할 수 있다.

 

이 중 전 글들에서 설명되지 않았던 부분들

BLEServer, BLEDevice, 콜백, BLE2902, Advertising 에 대해서 짚고 넘어가도록 해보자.

 

BLEServer, BLEDevice

BLEDevice.h 에 정의되어 있는 함수로서 서버역할을 수행하기 위한 클래스이다.

 

BLE2902

Bluetooth SIG 에서 정의한 디스크립터 UUID 중하나로서 캐릭터리스틱에 대한 클라이언트 구성을 지정하는데 사용하며 Notification, Indication이 활성화 되었는지 여부를 나타낸다. 

 

Advertising 

블루투스 장치가 다른 장치들에게 자신의 존재를 알리기 위해 사용하는 기술. 일정한 주기로 자신의 존재를 알린다. 데이터 패킷으로 이루어져 있다.

 

콜백 

일반적인 의미에서 콜백은 다른 함수에게 인자로 전달되어 함수내에서 특정한 조건이 성립되는 함수로, 함수가 함수내에서 실행될때 해당 함수의 일부로서 실행되는 함수를 말한다.

블루투스에서의 콜백은 

BLE 장치들간 이벤트가 발생할 때마다 등록된 콜백 함수를 호출하도록 구현한다. 예를들어 다른 장치로부터 데이터를 수신하면 이벤트가 발생하고 등록된 콜백 함수가 호출된다. 해당 콜백 함수는 수신된 데이터를 처리하는 로직을 포함한다.

 

이렇게 받은 데이터를 기반으로 콜백함수 내에서 작업한다.

 

해당 코드를 보면 rxValue에 따라 bleData 값을 변경하는데 rxValue에 start, stop, pause, time= 을 사용하면 뭔가 될것처럼 보이고, bleData를 확인했을때 미리 정의된 함수가 있는것을 확인할 수 있었다. 자 이렇게 Write에 대해서는 정리가 끝났다. 아쉽게도 해당 업체에서 제작한 코드에는 Notify는 구현되어있지 않아 해당 부분은 직접 작업하고 업데이트할 예정입니다.

 

 

 


여기서 중요한건 변수명, 메서드 명이 아니라.

 

아두이노에서의 절차인데.

아두이노는 실행되면 setup()을 실행시킨다는 것과

그 setup에서 블루투스 모듈을 실행시킨다는 점이다. 

 

반응형

댓글