고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

오렌지보드 BLE와 채팅-안드로이드 채팅앱

2015-10-08 14:17:08

본 튜토리얼에서는 http://kocoafab.cc/k-download 에 공개된 안드로이드 채팅 어플리케이션으로 오렌지보드 BLE와 안드로이드 디바이스 간에 간단하게 메시지를 송수신 해보겠습니다. 

 

여러분은 채팅 예제를 통해, 안드로이드 디바이스에서 오렌지보드 BLE로 명령을 내려주거나, 반대로 오렌지보드 BLE 에서 전송되는 데이터를 안드로이드 디바이스에서 수신하는 등의 통신 방법을 배우실 수 있습니다. 

 

먼저 블루투스 4.0 (Bluetooth Low Energy: BLE)에 대하여 간단히 알아보도록 하겠습니다.

블루투스 4.0은 저전력 관점에서 설계되어 베터리 소모가 매우 적습니다. IoT 환경에서 짧은 베터리 수명은 항상 이슈가 되었기 때문에 이러한 문제점을 보완한 기술입니다. 

 

블루투스에 대하여 찾아보면, LOW ENERGY, SMART, SMART READY 같은 단어가 눈에 띄는데요. LOW ENERGY가 SMART로 이름이 변경되었다고 보시면 됩니다. 그리고 SMART(4.0: 싱글 모드) 또는 SMART READY(3.0 이하 + 4.0: 듀얼 모드) 는 블루투스 SIG 인증을 받은 제품에 붙일 수 있는 블루투스 브랜드로 인증 마크 정도로 보시면 됩니다.

 

블루투스 4.0 기술은 3.0 이하를 대체하는 기술이 아닙니다. 블루투스 4.0은 저전력 관점에서 재설계되어, 베터리 소모를 최소화하는 대신에 데이터 전송 효율을 낮추었습니다.  그렇게 때문에 음성이나 오디오와 같은 실시간의 빠른 데이터 전송에는 적합하지 않습니다. (단, 4.2 이상에서는 4.0 대비 수배나 빨라져 그 활용도는 더욱 높아질 것입니다.)   

 

아래 그림에서 보시는 것과 같이 기존 블루투스 클래식(3.0이하: Classic)과 블루투스 스마트(4.0: SMART or LOW ENERGY)와는 활용 범위가 다릅니다.  

 

 

오렌지보드 BLE는 주변 장치 (Peripheral) 모드로 동작하며, 안드로이드 디바이스는 중앙 장치(Central) 모드로 동작합니다.  아래 그림을 보시면 두 가지의 모드가 서로 어떻게 동작하시는지 쉽게 이해하실 수 있습니다. 

 

 


1. 중앙장치(Central)에서는 블루투스 기능이 ON으로 설정되면, 주변장치(Peripheral)로 부터 들어오는 Advertisement  메시지를 수신하여, 주변장치의 정보(이름, 장치 고유 ID, 프로파일)를 획득합니다. 여러분이 채팅 앱을 실행하고, 우측 상단의 “연결" 버튼을 누르면 동일한 동작을 수행합니다. 

 

2. 주변장치(Peripheral)에서는 블루투스 기능이 ON으로 설정되면, 중앙장치로 부터 검색될 수 있도록 Advertisement 메시지를 송신합니다. 오렌지보드 BLE에 전원이 들어오면 동일한 동작을 수행합니다. 

 

3. 중앙장치(Central)에서 주변장치가 검색되면, 연결을 요청을 할 수 있습니다. 채팅 앱에서 오렌지보드 BLE가 검색이 되면, 클릭하세요. 그러면 채팅 앱에서 오렌지보드 BLE로 연결요청을 보내고 연결이 맺어집니다. 

 

4. 연결이 되었다면 중앙장치(Central)와 주변장치(Peripheral)에서 서로 간에 데이터를 보내고 받을 수 있는 상태가 된 것입니다. 채팅 창이나 시리얼 모니터에서 메시지를 입력해보면 메시지가 전달되는 것을 확인하실 수 있습니다.

 

다음은 아두이노 소스코드 입니다. 

 

// 블루투스 통신을 위한 SoftwareSerial 라이브러리
#include <SoftwareSerial.h>

// SoftwareSerial(RX, TX)
SoftwareSerial BTSerial(4, 5);

void setup() {
	Serial.begin(9600);
	Serial.println("Hello! OrangeBoard");
	
	BTSerial.begin(9600);
}

void loop() {
	// 블루투스로 부터 수신된 데이터를 읽는다.
	if (BTSerial.available()) {
		char buf[20];
		Serial.print("recv: ");
		// 블루투스로부터 데이터를 수신한다.
		byte len = BTSerial.readBytes(buf, 20);
		// 수신된 데이터를 시리얼 모니터에 출력한다.
		for (int i = 0 ; i < len ; i++) {
			Serial.write((byte)buf[i]);
		}
		Serial.println();
	}
	// 시리얼 모니터로 부터 입력 받은 데이터를 블루투스로 송신한다.
	if (Serial.available()) {
		char buf[20];
		byte len = Serial.readBytes(buf, 20);
		for (int i = 0 ; i < len ; i++) {
			BTSerial.write((byte)buf[i]);
		}
		// 입력받은 데이터 길이가 20보다 작다면 20byte를 end of text문자열로 송신 버퍼를 채워준다.
		if (len < 20) {
			for (int i = len ; i < 20 ; i++) {
				BTSerial.write(0x03);
			}
		}
		Serial.print("send: ");
		for (int i = 0 ; i < len ; i++) {
			Serial.write((byte)buf[i]);
		}
		Serial.println();
	}
}

 

 

 

코드벤더 IDE의 왼쪽 상단의 소스 이름을 클릭하면, 코드벤더 전체 IDE를 확인가능하며, 우측 상단에 시리얼모니터 버튼이 있습니다. 

이 버튼을 클릭하여 시리얼모니터를 활성화 시킵니다. 

 

 

또는 아래와 같이 아두이노 IDE의 시리얼모니터나 채팅창에서 메시지를 입력해보세요.

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

안드로이드, 아두이노, 오렌지보드, BLE, 기타

조창래 2015-10-16 17:45:25

안드로이드 어플에서 연결을 누르면 널포인트 오류가 발생하네요...ㅜㅜ

이세영 2015-10-19 16:09:10

저도 연결을 누르면 앱이 종료되어 버립니다.
안드로이드 버전은 4.4.2 입니다.

kocoafab 2015-10-20 08:42:09

수정되었습니다. 다시 다운로드 받아주세요.

김연주 2015-12-23 16:24:59

아두이노 버전(1.0.5)로 할경우 오류가 나네요. 버전 1.6.5(최신) 버전으로 하는것을 권장드립니다.

kocoafab 2015-12-23 18:34:08

@김연주님, 감사합니다.

이푸름 2016-03-14 16:16:16

앱의 APK만 따로 받을수 있나요?

장세현 2016-03-15 19:33:33

감사합니다.

박준호 2016-04-03 19:14:39

감사합니다!

주철선 2016-07-07 19:47:57

앱의 APK만 따로 받을 수 있나요?

김수현 2016-07-26 17:39:38

apk의 경우는 학습 > 다운로드에서 받으실수 있어요

정유성 2016-08-29 18:44:19

프로젝트에 참고하고 싶습니다. 혹시 앱 소스는 받을 수 없나요?

양제우 2017-01-10 23:15:01

흠 오렌지 게임컨트롤 어플은 4.3 밑에 버전에서는 실행이 안되는군요 ㅠㅠ

노형욱 2017-02-15 15:42:50

오렌지보드 BLE Chat 어플은 이제 사라져버린건가요?? 보이지가 않네요?????????????????????????????

영수잉 2017-05-13 19:31:20

오렌지 보드 uuid좀 알수 없을까요?ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

문선우 2017-05-28 18:28:05

안드로이드 전송 방식만 따로 나온곳은 없나요?

종합센터 2017-06-01 16:41:51

휴대폰 어플리케이션은 어떻게 받는 건가요?

김원진 2017-06-16 17:36:26

학습하기-apk

김준협 2017-08-16 12:09:22

정말감사합니다!

한재혁 2017-11-24 13:57:06

감사합니다

김준섭 2018-04-01 17:25:14

채팅어플은 못구하는 겁니까?

HO 2018-10-01 17:21:50

감사합니다

bjg3000 2019-03-27 12:14:23

감사합니다.

무니문 2019-07-11 01:17:07

잘 봤습니다.