?>

Hard Copy World

HCW

Communication module

Home > Info >

Communication module

아두이노-안드로이드 BLE Chat 앱 (+ IoT 기능)

페이지 정보

작성자 하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-01-25 02:14 조회57,417회 댓글45건

본문

주목!!! 저전력 블루투스인 BLE 모듈의 기초와 활용에 대한 오프라인 강의가 진행중입니다. BLE 모듈을 이용한 통신, 비컨 및 웨어러블 장치 만들기의 기본을 실습을 통해 배우실 수 있습니다. 오프라인 워크샵 페이지에서 확인하세요!! 

 

아두이노와 안드로이드를 블루투스 4.0 (BLE, Bluetooth Low Energy)로 연결해서 채팅을 할 수 있도록 지원하는 앱입니다.

Classic bluetooth 용으로 작성했던 BT Chat 앱을 재활용 하는 수준으로 보고 슬슬 하려 했는데 BLE 쪽 API 와 동작방식이 완전히 틀려 꽤나 애 좀 먹었습니다. BT Chat 앱에서 지원하던 IoT 기능도 그대로 지원합니다.

  • HM-10 모듈을 기준으로 만들었습니다. 페어링 후 채팅 잘 됩니다.
  • BLE 모듈을 비컨으로 변경해서 사용하시는 분은 비컨 모드를 해제해야 합니다. AT+RENEW 날려서 공장 초기화 추천합니다;;
  • 백그라운드 서비스 지원 : 백그라운드로 서비스가 돌아가도록 수정해서(setting 탭에서 선택가능) 앱 종료 후에도 블루투스 연결이 끊어지지 않습니다. 다만 앱을 재시작하면 채팅창은 초기화 됩니다.
  • 안드로이드 시스템에 의해 강제 초기화 될 경우는 재연결이 되지 않습니다.
  • IoT 기능 추가 : 아두이노에서 특정 메시지를 보내면 HTTP request를 자동으로 보내줍니다. 현재는 thingspeak 서버만 지원. 백그라운드로 돌아가도록 설정해두면 IoT를 위한 wifi 모듈처럼 쓰실 수 있습니다. (BT Chat 앱과 동일)

연결 자체는 간단합니다. 아두이노에 블루투스 모듈을 Serial 연결하면 됩니다. 보통 SoftwareSerial을 사용하실테니...

VCC - 5V(3.3V), GND - GND, TX - D2, RX - D3

아래는 자작보드인 와두이노 보드에 연결한 모습입니다. HC-06 모듈과 HM-10 모듈이 사이즈, 핀 배치가 동일하네요. 그래서 와두이노 보드에 HC-06 대신 HM-10을 연결했습니다;;;

KakaoTalk_20150125_020640609

 

아두이노에는 릴레이 코드를 올려줍니다. 

#include 

SoftwareSerial BTSerial(2, 3); //Connect HC-06. Use your (TX, RX) settings

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

  BTSerial.begin(9600);  // set the data rate for the BT port
}

void loop()
{
  // BT –> Data –> Serial
  if (BTSerial.available()) {
    Serial.write(BTSerial.read());
  }
  // Serial –> Data –> BT
  if (Serial.available()) {
    BTSerial.write(Serial.read());
  }
}

채팅 입력 및 확인은 아두이노 IDE 에서 Serial Monitor를 이용하면 됩니다.

 

 

IoT 기능 사용법

 

BT Chat 앱 소개 때 설명했던 내용과 동일한 기능이 탑재되어 있습니다. 아두이노에서 아래와 같은 형식의 메시지를 앱으로 보내면 앱에서 메시지를 인식하고 자동으로 외부 서버로 HTTP Request를 보내줍니다.

인식하는 문자열 형식 : thingspeak:key=xxx&field1=xxx[*]

HTTP Request 변환 : http://184.106.153.149/update?key=xxx&field1=xxx

(thingspeak: ~ [*] 사이에 있는 문자열을 그대로 request parameter 로 이용합니다.)

현재는 ThingSpeak 서버만 지원합니다. http://www.thingspeak.com 에서 회원 가입 후 채널을 하나 생성하세요. 채널마다 할당되는 key 를 이용해서 주기적으로 request를 보내주면, 서버상에 시간대별 로그를 남길 수 있습니다.

ic_launcher

# 앱 다운로드(Google Play) : https://play.google.com/store/apps/details?id=com.hardcopy.blechat

# 앱 소스 다운로드 : https://github.com/godstale/BLEChat

소스를 개선하신 분은 제게도 알려주세요. 업데이트 해서 공유될 수 있도록 하겠습니다. (godstale@hotmail.com)

 

주목!!! 저전력 블루투스인 BLE 모듈의 기초와 활용에 대한 오프라인 강의가 진행중입니다. BLE 모듈을 이용한 통신, 비컨 및 웨어러블 장치 만들기의 기본을 실습을 통해 배우실 수 있습니다. 오프라인 워크샵 페이지에서 확인하세요!! 


하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물

모든 전통이 한 때는 오해를 면치 못했다. 마찬가지로 모든 아이디어는 한 때는 비웃음을 면치 못했다. -홀브룩 잭슨 ::::: 느닷없이 떠오르는 생각이 가장 귀중한 것이며, 보관해야할 가치가 있는 것이다. -베이컨 ::::: 미리 숙고하면 힘든 일도 그저 실행에 옮기는 순간 쉬워진다. - 로버트 M. 피어식

추천 0
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

어디가는길님의 댓글

어디가는길 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

안녕하세요 HM-10 모듀을 사용하고 있는 강군입니다.
HM-10와 아두이노를 연결하려고 하는데 제 핸드폰 버전이 4.2.2 버전이라
BLE기능을 지원하지 않습니다. 이런경유 비컨 모드를 해제해야 한가고 하셨는데 어떻게 해야 하는거가요?
그리고 앱을 어떻게 제작해야 할까요??
제가 안드로이드 앱까지 제작을 해야 하는데 지금 미로속에 빠져 있습니다.

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

HM-10 모듈 또는 비컨 모드와는 상관없이 안드로이드 버전이 4.3 이상이 안되면 BLE를 쓰실수 없습니다.  먼저 폰의 안드로이드 버전과 Bluetooth 4.0 탑재 여부를 확인하세요.
앱 제작은 꽤나 넓은 범위의 SW 지식을 필요로 합니다. 아래 링크에 오픈소스로 공개된 자료들을 참고하세요.
https://github.com/Vinayrraj/Android-iBeacon-Demo

게이ㅁ님의 댓글

게이ㅁ 이름으로 검색 작성일

며칠 동안 블루투스 앱들이 HM-10을 인식 못해서 이유를 몰랐었는데 겨우 이 사이트를 찾아서 연결 할 수 있게 되었습니다. 감사합니다! 그리고 사랑합니다!

카디안님의 댓글

카디안 이름으로 검색 작성일

이 어플을 실행하고 종료를 하면 Activity www.seilbag.com.seilbag.MainActivity has leaked ServiceConnection ...
이런 메시지가 뜨는데요. 오류 메시지 안 뜨게 해결하는 방법이 없을까요?

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

seilbag 이 뭐하는 어플인지 모르겠네요. 이 앱에서 특별히 다른 앱에 영향을 미칠만한 것은 없어보이는데... 해당앱을 사용하지 않으시면 앱의 블루투스 기능을 끄시는게 어떨까 싶습니다.

graphene님의 댓글

graphene 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

블루투스를 끌수가 없어서.. 서비스만 종료를 하던가 해야할거 같은데요. 상세한 내용을 메일로 보냈습니다.
메일 확인 부탁드릴게요.

kkado2님의 댓글

kkado2 이름으로 검색 작성일

안드로이드 버전이 4.4.2인데 인식은 되지만 등록이 안되는건 어떤 이유 때문인가요..?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

글쎄요.. 저도 BLE 장치는 안보이고 Classic BT 모듈만 보이던데 제가 사용한 API가 잘못되었나 봅니다. 시간날 때 원인을 한번 찾아봐야겠어요

kkado2님의 댓글

kkado2 이름으로 검색 작성일

연결에는 성공했는데 혹시 채팅말고 압력센서값을 어플에 나타날수있게 할수있나요ㅠㅠ.....아직 초보라서 어려운점이 많네요.. 부탁드릴게요..

Hobby님의 댓글

Hobby 이름으로 검색 작성일

안녕하십니까 이어플에서 하나의 스마트폰에 두개의 BLE 모듈을 연결시키고 싶습니다!! 조언 부탁드립니다!

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

소스코드 분석은 상당히 시간이 걸리는 작업이라 당장은 말씀하신 내용을 전해드릴수가 없네요. 주변에 프로그래밍이 가능한 분 있으면 같이 천천히 훝어보시는 것이 좋을 것 같습니다.

호랭이님의 댓글

호랭이 이름으로 검색 작성일

hm-10 으로 BLE 통신 자료 잘봤습니다. 많은 도움이 되었습니다. 감사합니다

그리고 질문이 하나  있는데....
classic bt 통신(BT CHAT)앱 을 올려 주셨는데.
hm-10 과 BT CHAT 은 채팅은 할수 없나요?
BT-Chat 앱에서 Hm-10 과 페어링 하려는데 붙지를 않네요.

제 생각으롤는  hm-10 이 BLE 통신되면
 BT(classic BT) 통신 당연히 될줄 알았는데
잘안되네요.

제가 제작하려는게 Hm-10 으로 BLE 통신과 BT(Classic BT) 전부 다 되게 만들려고 하는중입니다.
Hm-10 은 BLE 통신 전용인가요?

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

HM-10 모듈은 BLE(v4.0) 통신용 모듈입니다. BLE Chat 앱에만 연결됩니다. 따라서 classic bt(v2.x) 전용인 BT Chat 앱과는 호환되지 않습니다. BT Chat에 붙이려면 Classic BT 모듈인 HC-06을 사용하세요.
Classic BT, BLE를 다 되게 하려면 HM-12 모듈을 사용하세요.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=tech_comm&wr_id=79

호랭이님의 댓글

호랭이 이름으로 검색 작성일

답변 감사 드립니다.  많은 도움이 되었습니다.

질문이 하나더 있는데
지금은 핸드폰에서 hc-06 이나 hm-10 을 접속해서 페어링 하는데
반대로 아두이노에서 핸드폰으로 접속하는 방법은 없나요?

예를 들어 인체감지센서가 인식되면 핸드폰을 찾아 페어링을 할수 있게 만들려고 하는데
그렇게 하려면 스케치에 핸드폰 정보를 입력해서 만들어야 하는지?
이게 가능하긴 한건지 궁금합니다.

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

폰(central), 센서장치(peripheral)의 역할을 바꾸기는 힘듭니다. 폰에서 실행되는 앱에서 연결이 끊어지면 자동으로 연결되도록 만드세요. 혹은 HM-10 모듈에서 연결이 끊어지거나 특정상황에서 재연결을 시도하도록 AT 커맨드를 날려보세요. 정확하진 않지만 그런 AT 커맨드가 있을것 같네요..

이한빈님의 댓글

이한빈 이름으로 검색 작성일

좋은글 잘봤습니다 ㅎㅎ
아두이노에서 보낸 데이터가 어떠한 방법으로 수신되는지 알고싶습니다.
그를통해서 받은 데이터를 앱 소스를 통해 수정하고싶습니다.
조언 부탁드립니다!!ㅎㅎ

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

아두이노에서 serial 라인으로 데이터를 보내면 BLE 모듈이 자동으로 폰에 데이터가 있음을 알려줍니다. 다시 폰에서 데이터를 요청하면 BLE 모듈이 데이터를 보내주고 폰에서 받아 사용하게 됩니다.
폰에서 데이터 받는 부분은
https://github.com/godstale/BLEChat/blob/master/src/com/hardcopy/blechat/bluetooth/BleManager.java
파일에서 public void onCharacteristicChanged() 메서드 참고하세요.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

가급적 QnA 게시판을 이용해주세요.
BLE Chat 앱에서 데이터를 받는 부분은 service/BTCTemplateService.java 파일에서 ServiceHandler 클래스를 보시면 됩니다. 데이터를 받을 때 마다 case BleManager.MESSAGE_READ: 부분이 실행됩니다.
아래 파일에서
https://github.com/godstale/BLEChat/blob/master/src/com/hardcopy/blechat/service/BTCTemplateService.java
365 line을 참고하세요

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

네 가능합니다. GPS 모듈을 아두이노에 달아서 아두이노가 읽은 GPS 데이터를 BLE를 통해 던져주기만 하면 됩니다.

아두이노초보자님의 댓글

아두이노초보자 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

아두이노, 안드로이드 공부하는 학생입니다. 안드로이드 예제소스중 아두이노에서 안드로이드로 데이터를 보내줄때 안드로이드쪽에서 수신받는 부분이 어디인가요... 정말 초보자라 상세하게 조언해주시면 감사하겠습니다 ㅠ

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

아래 링크의 소스에서 (BleManager.java)
https://github.com/godstale/BLEChat/blob/master/src/com/hardcopy/blechat/bluetooth/BleManager.java

public void onCharacteristicChanged() 메서드를 보시면 됩니다. BLE 장치에서 보낼 데이터가 있으면 먼저 안드로이드에 알려주고, 안드로이드가 데이터를 가져옵니다. 데이터가 안드로이드에 도착하면 public void onCharacteristicChanged() 가 호출됩니다. 여기서부터 소스를 따라가면 됩니다.

CHLTP님의 댓글

CHLTP 이름으로 검색 작성일

아두이노 블루투스 공부중입니다!. 다름아니라 제 블루투스 모듈과 BLE CHAT 을 '제외'한 다른 앱과 페어링이 되지 않습니다.. 왜 그럴까요? 유일하게 BLE CHAT 만 정상적으로 페어링되어 채팅이 가능합니다.
블루투스 컨트롤러 같은 앱은 페어링 자체가 안되네요 .. 왜그럴까요 ㅠㅠ

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

BLE는 Profile-Service-Characteristic 구조를 가지고 있고 통신을 위해서는 특정 Characteristic을 선택해서 설정해줘야 합니다. 그런데 BLE 모듈마다 이 설정이 다르기 때문에 모듈에 맞는 설정이 필요합니다. 제가 만든 앱은 HM-10/HM-11 BLE 모듈에 맞도록 작성되어 있어서 통신이 됩니다. 대신 다른 BLE 모듈을 연결하면 통신이 안될겁니다.
마찬가지로 다른 BLE 앱도 특정 모듈 / 폰 끼리는 동작하겠지만 HM-10/HM-11 과는 맞지 않아서 그런겁니다.

CHLTP님의 댓글

CHLTP 이름으로 검색 댓글의 댓글 작성일

친절한 답변 감사드립니다. 제가 알량한 지식으로 조금 더 여쭤보자면,, 앱인벤터로 블루투스 연결 앱을 만들었습니다. 지금 스마트폰의 블루투스를 키고 아두이노의 블루투스모듈과 연결및 등록은 가능합니다. 하지만 제가 만든 앱과의 연결이 되질 않네요.. 연결시도하면 pin번호 뜨는 창이 뜨고 pin번호를 입력하면 앱 자체가 멈춰버립니다. 이것은 제가 위에 말씀드린 블루투스컨트롤러를 비롯한 대다수의 앱이 그렇습니다.(유일하게 연결이 가능한게 블로그관리자님께서 제작하신 BLE CHAT 앱입니다)  실제 안드로이드 버전은 4.4.2 구요. 아두이노와 연결한 블루투스 모듈은 hm-10입니다.
'다른 BLE 앱이 HM-10을 지원 안해서 그런것이다' 라고말씀하셨는데 그렇다면 어떻게 HM-10을 지원하게 끔 만들수있을까요 ?? HM-10을 바꾸어야 하는것일까요ㅣㅠㅠ? 긴 질문 보아주셔서 감사합니다.

CHLTP님의 댓글

CHLTP 이름으로 검색 댓글의 댓글 작성일

+추가2) 이리저리 찾아보다가 오류메세지를 건질수있었습니다. ( BLUETOOTH ARDUINO ECHO라는 앱을 통해서요) 저 앱으로 연결시도시 "read failed, socket might closed or timeout, read ret: -1" 라는 글자가 나옵니다.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

인벤터는 사용해보질 않아서 잘 모르겠네요. BLE 연결 후 데이터 통신을 위해서는 BLE에서 통신용으로 개방해둔 characteristic을 찾아 연결하도록 안드로이드에서 미리 설정을 해줘야 합니다. BLE가 제공하는 characteristic을 모두 출력한 후에 하나씩 테스트를 해봐야 합니다.

rukawa님의 댓글

rukawa 이름으로 검색 작성일

CC41-A 칩과 스마트폰 어플에서 통신을 하려고 합니다.
소스 상에서 onCharacteristicChanged에서
byte[] data = characteristic.getValue();
로 받아서 처리하는데, data.length가 정상적으로 다 들어오지 현상이 있습니다.
1에서 10까지 출력되고 있는데, 블루투스 통신 칩에서 컨트롤 해야 하는 부분인지
문의 드립니다. 아니면 App 내 onCharacteristicChanged 메소드 안에서
처리를 해야 하는 것인가요.
Write 시에도 동일하게 처리해야 하는지 문의 드립니다.
추가로 Read와 Write 시에 20byte까지 제한된다고 하는데,
초과해서 사용이 가능한지 문의 드립니다.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

같은 칩으로 Hands free 같은 블루투스 모듈도 나오는 걸로 봐서는 데이터 전송 용량이 20byte로 제한되는건 아닌것 같습니다. 한번에 블루투스 모듈에서 읽어오는 (안드로이드 버퍼에 들어오는) 용량이 잘게 쪼개져서, 여러번에 걸쳐 들어올 수는 있습니다.
onCharacteristicChanged  에서 데이터를 수신하면 버퍼를 복사해서 앱 어디서 사용하든 상관이 없습니다. 제 경우에는 블루투스 연결이 안되는 경우는 있어도 연결 후에는 데이터가 누락되는 현상은 없었느데요..
모바일 폰이 안드로이드 5.0 이상이라면 다른 BLE 관련 소스를 구해서 사용해보세요. 여기 소스는 5.0 이상에서는 제대로 테스트가 안되어 있습니다.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

보통 블루투스 모듈의 GPIO 중 하나가 말씀하신 LED 상태등으로 사용할 목적으로 할당되어 있습니다. 이 핀을 사용하면 LED로 상태 표시가 가능합니다. 혹은 아두이노에서 이 핀의 출력 상태를 읽으시면 됩니다.
BLE 모듈의 경우 AT 커맨드로 연결 상태를 확인할 수도 있을겁니다.

comex2님의 댓글

comex2 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

안녕하세요, hm-10 모듈을 이용해서 스마트폰과 통신하는 방법을 찾다가 들렀습니다.

Ble chat앱은 잘 쓰고 있는데요, 혹시 태스커 플러그인 형태로는 만드실 생각이 없으신지 알고 싶어서요.

https://ilias.giechaskiel.com/posts/bluetooth_serial/index.html

위 링크는 hc-05나 hc-06을 이용한 모듈에 특정 커맨드를 보내는 태스커 플러그인 소스입니다.

혹시 같은 방법으로 hm-10의 특정 mac address에 특정 문자열을 보낼 수 있는 태스커 플러그인은 없을까해서 글 남깁니다.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

좋은 정보 감사합니다. HM-10을 비컨으로 만들어서 비컨과 연동하는 플러그인을 요청받은 적이 있는데 아직 손을 못대고 있네요;;; 시간되면 제작을 고려해보겠습니다. ㅜㅜ

안드로이드에미쳐님의 댓글

안드로이드에미쳐 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

이 프로그램 소스에 대해 문의 드릴게 있어서 댓글을 남겨요..
AndroidManifest.xml 의
 <!-- Broadcast receiver -->      <receiver android:name="com.hardcopy.blechat.service.ServiceMonitoring$ServiceMonitoringBR" />
를 통해서 블루투스 정보를 받는 것 같은데..

MainActivity가 아닌 다른 곳 Activity를 보고 있을때도 연결 상태를 확인할 수 있는 방법 없나요..?

안드로이드도 초짜에다가 아두이노 조차.. 처음 만지니 정말 어렵네요.. 부탁드립니다... (꾸벅..)