[XE8] 모바일 앱에서 클래식 블루투스를 이용해 데이터 전송하기

2015.07.27 18:16

지난 7월 24일 사물인터넷 앱 개발 with RAD Studio 교육을 진행했습니다.

교육이 끝나고 한 교육생분이  "클래식 블루투스로 데이터 전송이 잘되지 않아요."라는 질문을 받고 테스트한 내용 공유합니다.


클래식 블루투스 기능 테스트는 RAD Studio 기본 샘플 중 "Classic Bluetooth Basic app"으로 진행했습니다.

Classic Bluetooth Basic app

RAD Studio XE8 사용자는 다음 경로에서 샘플을 확인할 수 있습니다.

C:\Users\Public\Documents\Embarcadero\Studio\16.0\Samples\Object Pascal\Mobile Samples\Device Sensors and Services\Bluetooth\Classic Bluetooth Basic app


이 샘플은 다음 기능을 포함하고 있습니다.

  • 하나의 앱에서 서버(서비스 생성)와 클라이언트 역할을 모두 제공합니다.
  • 장비를 탐색하고, 페어링하고, 서비스를 탐색합니다.
  • 연결된 서비스로 데이터를 전송하고, 서비스는 데이터를 수신합니다.

❑ 다른 서비스에 접속 시 주의할 점과 처리방법

이 샘플은 문자열 전송 서비스를 목적으로 구현되어 있습니다.(클라이언트 소켁 생성 시 문자열 전송 서비스의 GUID(상수)를 이용해서 클라이언트 소켓을 생성합니다.)

다른 서비스와 접속하도록 하려면 선택한 서비스의 GUID를 이용해 클라이언트 소켓을 생성하도록 수정해야 합니다..


위 내용을 적용하기 위해 아래와 같이 샘플 코드를 변경했습니다.


1, 선택한 서비스의 GUID를 보관하기 위한 변수 선언

서비스 콤보박스(ComboBoxService)에서 선택한 서비스의 GUID를 보관하기 위해 private 영역에 변수를 선언

FServiceGUID: string;


2, 서비스 콤보박스 변경 시 변수에 서비스 GUID 할당

ComboBoxService의 OnChange 이벤트에 선택한 서비스의 GUID를 변수에 할당하도록 구현

procedure TForm1.ComboBoxServicesChange(Sender: TObject);
var
  itemText: string;
begin
  if ComboBoxServices.ItemIndex >= 0 then
  begin
    itemText := ComboBoxServices.Items[ComboBoxServices.ItemIndex];
    FServiceGUID := Copy(itemText,
                          Pos('--> ', itemText) + Length('--> '),
                          Length(itemText));
  end;
end;


3, 선택한 서비스의 GUID로 클라이언트 소켓 생성하도록 수정

상수(ServiceGUI)로 선언된 문자열 전송 서비스 GUID 대신 선택한 서비스의 GUID로 클라이언트 소켓을 생성하도록 아래와 같이 수정

procedure TForm1.SendData;
var
  ToSend: TBytes;
  LDevice: TBluetoothDevice;
begin
  if (FSocket = nil) or (ItemIndex <> ComboboxPaired.ItemIndex) then
  begin
    if ComboboxPaired.ItemIndex > -1 then
    begin
      LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice;
      // [데브기어] 상수로 정의된 서비스 GUID 대신 ComboServices의 GUID 값으로 변경
//      DisplayR.Lines.Add(GetServiceName(ServiceGUI));
      DisplayR.Lines.Add(GetServiceName(FServiceGUID));
      DisplayR.GoToTextEnd;
      // [데브기어] 상수로 정의된 서비스 GUID 대신 ComboServices의 GUID 값으로 변경
//      FSocket := LDevice.CreateClientSocket(StringToGUID(ServiceGUI), False);
      FSocket := LDevice.CreateClientSocket(StringToGUID(FServiceGUID), False);
      if FSocket <> nil then
      begin
// 생략


테스트 환경과 결과

❑ 테스트 환경

테스트는 아래 그림과 같이 블루투스 모듈과 블루투스 모듈을 USB로 연결할 수 있는 USB-TTL 모듈을 이용해 블루투스 데이터를 ComPort로 읽어 오도록 구성했습니다.(관련 장비는 다모아 시스템(www.dma.kr)의 최낙구 대표님께서 제공해 주셨습니다.)


테스트에 사용한 모듈은 아래와 같습니다.

❑ 모바일 앱 - 블루투스 장비와 연결, 데이터 전송


블루투스 장비와 페어링

블루투스 장비와 연결하기 위해서는 페어링 과정이 필요합니다.

[Discover devices] 버튼으로 주변의 장비를 탐색하고, 탐색한 장비 선택 후 [Pair] 버튼으로 페어링 시도합니다.


이미 페어링 되어 있는 장비라면 위 과정을 생략할 수 있습니다.(위 페어링 과정은 OS에서 제공하는 페어링 기능을 이용할 수도 있습니다.)

블루투스 장비로 데이터 전송

페어링된 장비를 선택 후 [Services] 버튼을 누르면 장비에서 제공하는 서비스를 가져올 수 있고, 서비스를 선택 후 [Service Demo] 탭에서 [Send text to] 버튼으로 서비스로 문자열을 전송할 수 있습니다.

COM Port 소프트웨어

위 과정을 통해 모바일에서 전송한 데이터는 블루투스 모듈을 통해 ComPort로 데이터를 수신할 수 있습니다.




험프리.김현수 파이어몽키 XE8, 블루투스, 클래식 블루투스

  1. 베를린 기준 샘플 컴파일 시 Permission Denied.
    pm에서 블루투스 권한이 하나 안들어가 있어서 다시 부여하고..
    컴파일해서 페어링, 서비스 탐색까지 확인되나
    시리얼 전송 시 Java.IOException 나옵니다.
    해당 샘플에 문제가 있어 보입니다.

    다른 아두이노, 라즈베리, AVR 같은 임베디드 단말이나 마켓에 있는 다른 앱으로는 BT와 시리얼 통신이 잘 이루어집니다.

    테스트 환경은 안드로이드 4.4.2 6.0.1 두가지 입니다.

  2. 글쎄요. 샘플에 문제가 있다고 단정지으면 답이 없어질것 같습니다.(단, 어느 지점이 문제가 있다고 정확한 지적은 발전될 수 있습니다^^)

    저도 처음 시도할때 시행착오를 많이 겪었는데요. 결과적으로 보면 페어링과 연결(GUID)이 잘못된 부분을 찾아내서 해결하니 정상 연결 및 데이터 송수신을 확인할 수 있었습니다.

    문제가 있으시다고 보시면 디버그 모드로 실행하셔서 문제를 확인하고, 문제를 해결하거나 피해가는 형태로 개발해 보시면 반드시 해결할 수 있을 겁니다.

[XE8] 스피드버튼의 이미지를 크게 표시할 수 있습니다.

2015.06.04 10:32

파이어몽키에 이미지리스트가 추가(XE8~)되어 스피드버튼에 이미지 표시가 아주 편리해졌습니다.


하지만, 이미지의 기본크기가 너무 작다고 느끼신 경우 다음 글을 통해 스타일을 수정해 큼지막한 이미지를 표시해 보세요.



중국인 개발자(龟山阿卍)의 블로그입니다. 


험프리.김현수 파이어몽키 Imagelist, Speedbutton, XE8

[XE8] TAppAnalytics 컴포넌트로 앱의 사용량 수집, 분석해 사용성을 이해할 수 있습니다.

2015.04.27 13:17

RAD Studio XE8에는 애플리케이션 사용량 분석할 수 있는 TAppAnalytics 컴포넌트가 추가되었습니다.


이제 애플리케이션의 사용빈도, 사용자수, 오류 발생빈도를 수집, 분석 해 사용성을 이해할 수 있습니다.

TAppAnalytics

TAppAnalytics 컴포넌트는 사용자의 사용정보와 오류 발생 정보를 웹서비스(엠바카데로 제공)에 수집 후 분석해 사용성을 분석할 수 있는 컴포넌트입니다.

❑ 수집정보

TAppAnalytics는 다음 정보를 수집할 수 있습니다.

  • 애플리케이션 사용 빈도

  • 애플리케이션 활성 사용자 수

  • 애플리케이션 크래쉬 발생빈도

  • 애플리케이션에서 사용자가 폼과 컨트롤 사용빈도

 TAppAnalytics 컴포넌트는 동일한 컴포넌트 명으로 설계되었지만 내부 구현은 VCL과 파이어몽키가 다르게 구현되어 있습니다.


FMX TAppAnalytics 속성


VCL의 TAppAnalytics 속성


컴포넌트의 주요 속성은 다음과 같습니다.

  • ApplicationID : AppAnalytics 웹서비스에 회원가입 후 발급받는 ID를 입력
  • Options : 수집/추적할 항목을 선택
  • CacheSize : 내부 캐쉬의 크기
  • UpdateInterval : 웹서버에 제출할 주기
  • PrivacyMessage : 개인정보보호 안내 메시지

엠바카데로에서는 TAppAnalytics 컴포넌트에서 수집한 정보를 분석할 수 있도록 웹서비스(http://appanalytics.embarcadero.com/)를 제공합니다.(사용량만큼만 과금하는 SaaS방식으로 제공합니다.)



수집하는 데이터에는 사용자의 개인정보 수집 및 전송하지 않습니다. 정보는 완전하게 익명으로되어 있습니다. 사용자정의 이벤트로 정보를 수집하는 경우에도 개인정보를 수집하지 않도록 주의 하기 바랍니다.


수집을 시작하면 아래와 같은 개인정보보호 안내 메시지가 표시됩니다.(PrivacyMessage 속성으로 내용을 수정할 수 있습니다.)


☞ 앱 분석에 대한 자세한 정보는 엠바카데로 기술문서를 참고하기 바랍니다.



험프리.김현수 RAD Studio 정보 App Analytics, TAppAnalytics, XE8

[XE8] 버전관리 시스템 IDE 통합(Mercurial 지원)

2015.04.14 18:39

RAD Studio XE8 IDE에서 SubVersion(XE 이후), Git(XE7 이후), Mercurial(XE8 이후) 3종의 버전 컨트롤 시스템이 통합되었습니다.


이제 SVN, Git, Mercurial으로 관리하는 프로젝트를 별도의 클라이언트 도구 없이 IDE에서 직접 체크아웃하고 커밋할 수 있습니다.

버전관리 시스템 IDE 통합

❑ 체크아웃

메인메뉴에서 File -> Open From Version Control... 메뉴를 선택합니다.


버전 컨트롤 시스템을 선택하면 체크아웃 대화상자가 나오고, 저장소의 주소와 소스코드를 저장할 경로 지정 후 OK 버튼을 누르면 체크아웃이 실행됩니다. 완료되면 바로 프로젝트를 열수 있습니다.

❑ 커밋, 업데이트

체크아웃된 프로젝트는 프로젝트 매니저의 팝업메뉴를 통해 커밋(Commit), 업데이트, 되돌리기(Revert)기능을 사용할 수 있습니다.


다음링크는 RAD Studio 최신 데모 소스코드를 위 기능으로 다운로드 받는 방법을 설명합니다. 실습겸 IDE에서 최신 데모 소스코드를 받아보세요.


한번에 윈도우, 맥, iOS, 안드로이드, 사물인터넷(IoT)을 개발할 수 있는


관련 글

험프리.김현수 RAD Studio 정보 git, Mercurial, Subversion, Version Control System, XE8