[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로 데이터를 수신할 수 있습니다.




저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Firemonkey/기능제어 XE8, 블루투스, 클래식 블루투스

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

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

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

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

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

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

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

2015.06.04 10:32

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


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



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


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Firemonkey/UI / UX / 디자인 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 속성으로 내용을 수정할 수 있습니다.)


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



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 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)을 개발할 수 있는


관련 글

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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