본문 바로가기

🎟Esp32

연구실 프로젝트 - Esp32 BLE Server

반응형

BLE 통신을 위해 BLE에 대한 자료를 많이많이 연구했다..

BLE의 이론에 대한 자세한 글들은 구글링 하면 한글 자료도 많이 나오니 참고하길 바란다.(중요한데 나도 잘 모름 ㅠㅠ)

 

먼저 BLE란 Bluetooth Low Energy의 약자로 

적은 전력으로 데이터를 전송하는 Bluetooth 통신의 한 종류이다.

나는 Esp32에서 스마트폰으로 데이터를 전송해야했기 때문에 

Esp32를 Server로 스마트폰을 Client로 해서 데이터를 전송했다.

 

ble_notify와 ble_server 예제를 응용하였다.

 

내가 만들고 있지만 회사 제품이라

BLE부분만 잘라 붙여서 설명하겠다. (변수 선언이 없는것도 있을 수 있음) 

 

 

헤더파일 선언과 변수, 콜백 함수

선언부는 BLE 헤더파일인데 라이브러리를 따로 추가를 안해도 Esp32 자체적으로 사용 할 수 있는 헤더파일이다.

UUID는 기기에 맞는 UUID값에 대한 여러 자료가 있으니 다른 블로그에서.. 확인해주길 바란다.. 

 

MyCallbacks class는 클라이언트(스마트폰) 단에서 콜백 해주는값이 "ack"와 일치하면

blep_bit를 올려준다. >> ble_send() 함수를 실행시키는 역할을 한다.

 

MyServerCallbacks class는

Server와 Client가 연결이 되어있을때 deviceConnected 비트를 true로 반환하고

연결이 끊어지면 deviceConnected를 false로 반환한다.

나는 discon_bit를 추가해서 true로 처리했다.

>> 클라이언트(스마트폰)단에서 서버(Esp32)와의 연결을 임의로 연결을 종료시킬때 저 비트가 반환된다. 

ble 준비 함수

 

반응형

 

ble_ready()함수는 원래 예제에서는 setup에 들어가는 함수인데,

나는 제품의 블루투스 기능을 사용하는 모드에 들어갈때만 사용하기 위해서 따로 함수로 불러와 사용했다.

다른 블로그들의 설명과 다른 특별한건없고, setup에있는걸 함수로 옮겨서 따로 불러 사용했다정도??이다.  

ble send 함수

ble_send()함수는 내 파일시스템의 데이터를 불러서 전부 전송시키는 함수인데,

원래는 한번에 전송시키고 싶었으나, 해보니 BLE가 최대 512Byte밖에 전송이 되지 않는 관계로

504Byte씩 잘라서 전송시켰다.

특별한건 없고 Characteristic에 setValue를 분할시킨 데이터를 넣고 notify시켰다.

1개의 Characteristic에도 저렇게 notify해주고 덮어씌워서 또 notify해주면 문제없이 데이터가 전송이 잘 된다!

저 response_bit는 UI를 위한 비트이므로 신경 안써도 되고, 

blep_bit를 통해 ble_send를 실행시켰으니 blep_bit를 다시 0으로 내려서 한번 전송하고 말도록 처리한다.

(이렇게 안하면 notify를 했을때 무한정 전송시키기 때문에.. 나는 한번만 전송하려고 저렇게 비트를 내렸다.)    

 

setup은 없고

그냥 loop함수 내에서 bit로 함수를 제어했다.

저 scan_bit가 내 프로젝트에서 통신을 시작하는 비트이기때문에 저렇게 설정했고,

 cancle_bit 조건절이 이 글의 핵심인듯!

cancle_bit는 내가 서버단에서도 클라이언트와의 연결을 종료하고 싶을때 사용하기위해 저렇게 넣어뒀고,

(밑의 명령을 안넣으면 임의로 서버단에서는 연결 종료할 수 없음,,

이건 어떠한 example에 없어서 라이브러리를 많이 뒤졌다ㅠ)

우선 GATT(통신 프로토콜 이라고 생각하면 됨)의 Layer가 이렇게 되어있는데

우리는 Service의 Characteristic의 Value에 데이터를 담아 advertisment 방식으로 Characteristic을 전송시킨다.

그래서 전부 종료를 시켜줘야하는데 

Pservice -> stop()은 서비스를 종료시킨다는 의미이고

getAdvertising() -> stop()은 advertising을 종료시킨다는 의미이다.

deinit(true)는 Profile 디바이스를 종료시킨다는 의미이고 

deviceScan = 0은 이제 클라이언트 스캔을 그만한다는 뜻이다.

cancle_bit를 꺼서 함수를 종료시킨다.

설명은 여기까지 하고 데이터를 확인해보겠다.

 

 

이거.. 안드로이드 애플 둘다 있음

데이터 확인은 Nordic Semiconductor ASA 사의 nRF Connect for Mobile 어플리케이션을 통해서 하면 된다.

반응형