Search results for '분류 전체보기'

  1. 2015.09.09 -- [교육] 한국감정평가협회 데이터스냅 교육 (2)
  2. 2015.09.07 -- [시애틀] 안드로이드 서비스 앱을 만들 수 있습니다.
  3. 2015.09.07 -- [시애틀] 컨트롤 힌트, 윈도우 10 용 네이티브 랜더링 등 윈도우 10용 FMX!
  4. 2015.09.07 -- [시애틀] 비콘펜스(BeaconFence)등 새로운 오픈 소스와 컴포넌트 패키지를 IDE에서 직접 확보할 수 있습니다.
  5. 2015.09.07 -- [시애틀] 표준 C++11을 윈도우32에서도 적용할 수 있습니다.
  6. 2015.09.04 -- [시애틀] 내장된 FMX 스타일 디자이너가 강화되 TStyleBook 컴포넌트에서 플랫폼별 스타일을 지원합니다.
  7. 2015.09.04 -- [시애틀] 20개 이상의 IDE 생산성 기능들이 내장되어 생산성, 품질, 안정성이 향상됩니다.
  8. 2015.09.04 -- [시애틀] iOS 64bit와 유니버셜앱을 만들고 디바이스에서 디버깅할 수 있습니다.
  9. 2015.09.04 -- [시애틀] FireDAC NoSQL 드라이버로 몽고DB를 지원합니다.
  10. 2015.09.04 -- [시애틀] 개발 효율성을 극대화할 수 있도록 완벽한 개발환경 레이아웃을 구축하세요.
  11. 2015.09.02 -- [Seattle] 알림, 계약(Contract) 등의 윈도우 10 서비스 기능을 컴포넌트와 API로 쉽게 활용할 수 있습니다.
  12. 2015.09.02 -- [Seattle] VCL 스타일이 공용 대화 상자와 웹브라우저까지 적용됩니다.
  13. 2015.09.02 -- [Seattle] VCL 스타일을 적용해 1분만에 윈도우 10 최신신 룩앤필을 적용할 수 있습니다.
  14. 2015.09.01 -- [시애틀] 윈도우 10 용 새 VCL UI 컨트롤로 윈도우 10 UI를 손쉽게 적용할 수 있습니다.
  15. 2015.08.18 -- [교육] 2015.8.18 사물인터넷과 RAD Studio
  16. 2015.08.13 -- [교육] 광주/대구 모바일, 사물인터넷 교육 자료
  17. 2015.07.28 -- [따라하기] 위험지역 경보 시스템 #1 - 비콘을 이용해 위험지역 진입 경보앱 만들기 (20)
  18. 2015.07.27 -- [XE8] 모바일 앱에서 클래식 블루투스를 이용해 데이터 전송하기 (2)
  19. 2015.07.02 -- 모바일 앱 실행 시 검은화면이 표시되는 경우 조치방법
  20. 2015.06.26 -- [XE8] 코딩 중 이유없이 델파이 IDE가 응답없음 되는 경우 참고사항

[교육] 한국감정평가협회 데이터스냅 교육

2015. 9. 9. 10:40

사원정보 DB

EMPLOYEE.GDB

C:\Users\Public\Documents\Embarcadero\RAD Studio\12.0\Samples\Data



새로운기능
http://www.devgear.co.kr/products/rad-studio/featurelist/


델파이 기술문서

영어 : http://docwiki.embarcadero.com/
한글 : http://devgear.co.kr/docwiki


192.168.50.19



데브기어 교육

devgear.co.kr/edu


모바일 개발환경 설정

http://tech.devgear.co.kr/402210


FireDAC 소개

http://tech.devgear.co.kr/delphi_news/410454


데이터스냅 집중해부

http://tech.devgear.co.kr/delphi_news/405345


REST Debugger

RESTDebugger.zip


tech_devgear_jsondata.json


험프리 험프리.김현수 교육, 세미나

  1. Blog Icon
    이두용

    데이타스냅 PPT 자료 올려주세요..감사합니다.

  2. 발표자료는 팀장님을 통해 받으실수 있도록 전달해 드렸습니다.

[시애틀] 안드로이드 서비스 앱을 만들 수 있습니다.

2015. 9. 7. 11:12

안드로이드 서비스 앱을 개발하면 안드로이드 OS에서 백그라운드 작업을 실행할 수 있습니다.

안드로이드 서비스 개발

RAD Studio에서 안드로이드 서비스를 만들 수 있는 새로운 프로젝트가 추가되었습니다.

새로운 안드로이드 서비스 프로젝트에서는 다양한 종류의 서비스(로컬 서비스 및 원격 서비스 모두)를 취급하고 인텐트를 이용해 비동기 작업을 지원합니다.

안드로이드 서비스 프로젝트는 서비스 메소드와 이벤트를 만들 수 있는 데이터 모듈로 구성되며, 프로젝트를 빌드하면 선택한 서비스 종류에 따라 JAR 파일이 생성됩니다.

자세한 내용은 안드로이드 서비스와 안드로이드 서비스 만들기 문서를 참고하세요.


험프리 험프리.김현수 RAD Studio 정보

[시애틀] 컨트롤 힌트, 윈도우 10 용 네이티브 랜더링 등 윈도우 10용 FMX!

2015. 9. 7. 10:34

롤오버 되는 컨트롤 힌트, TEdit, TMemo 용 플랫폼 네이티브 렌더링, ZOrder 강화, 멀티뷰 업데이트(윈도우 10 용), 스위치 컨트롤, 이미지를 지원하는 클립보드 등

윈도우 10용 FMX 강화

컨트롤 힌트

UI 컨트롤의 Hint속성과 ShowHint 속성을 이용해 마우스 롤오버시 표시되는 힌트를 추가할 수 있습니다.

파이어몽키 네이티브 윈도우 컨트롤

TEdit, TMemo, TPresentedScrollBox(신규) 세가지 컨트롤을 파이어몽키 스타일과 네이티브로 렌더링 할 수 있습니다.

TEdit, TMemo, TPresentedScrollBox(신규) 세가지 컨트롤을 파이어몽키 스타일과 네이티브로 표시할 수 있습니다. ControlType 속성을 Styled와 Platform을 선택해 적용할 수 있습니다.

Platform 속성은 네이티브 컨트롤로 표시하며, 시스템 메뉴를 표시합니다.
Styled 속성은 파이어몽키에서 GPU를 이용해 일관된 스타일 UI로 표시합니다.

[엠바카데로 기술문서] FireMonkey Native Windows Controls

멀티뷰 - 윈도우 10용 Navigation Pane

윈도우 10의 네비게이션 메뉴를 표현할 수 있는 "Navigation Pane"모드가 멀티뷰(TMultiView)에 추가되었습니다.


멀티뷰 Mode 속성


ModeMaster Pane Presentation
DrawerDrawer (Push/Overlap)
PanelDocked panel
PlatformBehaviour(for details, see the tables below)
PopoverPopup menu
NavigationPaneNavigation pane
Custom

For details, see Custom Mode description.


멀티뷰 컴포넌트로 메뉴뷰(Alternative View) 표시하기

이미지를 지원하는 클립보드

파이어몽키 클립보드에서 이미지를 포함해 복사하고 전달할 수 있습니다. 자세한 내용은 샘플을 통해서 확인하세요.

  • C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Delphi\Multi-Device Samples\User Interface\CopyPaste
  • C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\CPP\Multi-Device Samples\User Interface\CopyPaste


관련 글



험프리 험프리.김현수 RAD Studio 정보

[시애틀] 비콘펜스(BeaconFence)등 새로운 오픈 소스와 컴포넌트 패키지를 IDE에서 직접 확보할 수 있습니다.

2015. 9. 7. 10:27

비콘펜스(BeaconFence)등 새로운 오픈 소스와 컴포넌트 패키지를 IDE에서 직접 확보할 수 있습니다.

겟잇(GetIt) 라이브러리 확장


Tools > Getit Package Manager... 메뉴로 이용할 수 있습니다.


험프리 험프리.김현수 Delphi/C++Builder

[시애틀] 표준 C++11을 윈도우32에서도 적용할 수 있습니다.

2015. 9. 7. 10:10

여러분의 기존 윈도우 앱을 C++11으로 가져오세요. C++11을 준수하는 새 32-bit 윈도우 컴파일러와 클래식 bcc32 컴파일러를 같은 윈도우 프로젝트에서 손쉽게 바꾸어 반영할 수 있습니다.

표준 C++11이 Win32에도 적용


Project > Options > C++ Compiler 메뉴에서 "Use 'classic' Borland compiler" 항목을 체크해 볼랜드 컴파일러로 체크해제로 CLANG 기반 C++11 컴파일러를 이용해 개발할 수 있습니다.


험프리 험프리.김현수 RAD Studio 정보

[시애틀] 내장된 FMX 스타일 디자이너가 강화되 TStyleBook 컴포넌트에서 플랫폼별 스타일을 지원합니다.

2015. 9. 4. 14:03

내장된 FMX 스타일 디자이너가 강화되 TStyleBook 컴포넌트에서 플랫폼별 스타일을 지원합니다.

내장된 스타일 디자이너 강화

스타일 디자이너가 새롭게 태어났습니다. 

그 중 스타일북 컴포넌트에 플랫폼 별로 스타일을 다르게 등록할 수 있어 기존과 같이 스타일북 컴포넌트를 여러개 등록하지 않아도 됩니다.

더 자세한 내용은 엠바카데로 기술문서에서 확인하세요.


FireMonkey Style Designer 엠바카데로 기술문서



험프리 험프리.김현수 RAD Studio 정보

[시애틀] 20개 이상의 IDE 생산성 기능들이 내장되어 생산성, 품질, 안정성이 향상됩니다.

2015. 9. 4. 13:26

20개 이상의 IDE 생산성 기능들이 내장되어 생산성, 품질, 안정성이 향상됩니다.

IDE 생산성 기능 추가


오브젝트 인스펙터 필터링

오브젝트 인스펙터에 필터링 기능이 추가되었습니다. 속성과 이벤트를 필터링해서 빠르게 찾고 설정할 수 있습니다.


논비주얼 컴포넌트 감추기/보이기 버튼

폼-디자이너 위의 논비주얼 컴포넌트를 감추고, 보여줄 수 있어, 화면 디자인이 더 편리해졌습니다.


아래와 같이 논비주얼 컴포넌트를 감추고 표시할 수 있습니다.

Structure View 아이콘 표시

Structure View의 컴포넌트들에 해당 아이콘이 표시되어 손쉽게 식별할 수 있습니다.


Castalia 기능 IDE에 통합



험프리 험프리.김현수 RAD Studio 정보

[시애틀] iOS 64bit와 유니버셜앱을 만들고 디바이스에서 디버깅할 수 있습니다.

2015. 9. 4. 13:17

iOS 64-bit와 유니버설 앱을 만들고 디바이스에서 디버깅할 수 있습니다.

iOS 64-bit 디버깅



험프리 험프리.김현수 RAD Studio 정보

[시애틀] FireDAC NoSQL 드라이버로 몽고DB를 지원합니다.

2015. 9. 4. 11:02

몽고DB는 가장 인기 있는 NoSQL 데이터베이스입니다. FireDAC 기능 향상에는 API 맵핑, 데이터 처리, JSON과 BSON 포맷 지원 (새 RTL) 등이 있습니다.

FireDAC NoSQL 드라이버로 몽고DB 지원

몽고DB 연결과 사용에 대한 자세한 내용은 엠바카데로 기술자료를 통해 확인하세요.

Connect to MongoDB Database (FireDAC)

  • http://docwiki.embarcadero.com/RADStudio/Seattle/en/Connect_to_MongoDB_Database_(FireDAC)

What's New - Support for the NoSQL MongoDB Database

  • http://docwiki.embarcadero.com/RADStudio/Seattle/en/What%27s_New#Support_for_the_NoSQL_MongoDB_Database

RAD Studio 10 시애틀의 기본 샘플을 통해 확인하세요.

  • 샘플 경로: C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Database\FireDAC\Samples\DBMS Specific\MongoDB
    (온라인 : http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RADStudio_Seattle/Object%20Pascal/Database/FireDAC/Samples/DBMS%20Specific/MongoDB/)
    • BatchMove
    • DataSet
    • Explore
    • General
    • Restaurants


험프리 험프리.김현수 RAD Studio 정보

[시애틀] 개발 효율성을 극대화할 수 있도록 완벽한 개발환경 레이아웃을 구축하세요.

2015. 9. 4. 10:46

이제 여러개의 모니터를 활용해 개발환경 레이아웃을 구축해 개발 효율성을 극대화 할  수 있습니다.


멀티-모니터 지원 강화

오브젝트 인스팩터, 프로젝트 매니저, 툴 팔래트와 같이 IDE에 도킹(Docking)할 수 있는 팬(Pane)이 최대화, 최소화 메뉴가 포함된 크기조정가능(Sizeable)한 창으로 제공합니다.

이제 멀티-모니터를 이용해 원하는 레이아웃으로 개발환경을 구축하고 효율성을 높여보세요.


험프리 험프리.김현수 RAD Studio 정보

[Seattle] 알림, 계약(Contract) 등의 윈도우 10 서비스 기능을 컴포넌트와 API로 쉽게 활용할 수 있습니다.

2015. 9. 2. 18:28

알림, 계약(Contract) 등의 윈도우 10 플랫폼 서비스 기능을 컴포넌트와 API로 쉽게 활용할 수 있습니다.

윈도우 10 서비스 활용


새롭게 추가된 TNotificationCenter, TSharingContract 컴포넌트를 이용해 윈도우 10의 알림과 계약(Contract) 기능을 구현할 수 있습니다.

또한, 컴포넌트로 제공되지 않는 기능은 라이브러리(Winapi.winrt, System.Win.Winrt 등)를 통해 API를 직접 호출해 구현할 수 있습니다.

샘플 경로

 - Notification : (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\Windows 10 Notifications

 - SharingContract : (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\Windows 10 SharingContract

 - Calendar(API 이용) : (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\Windows 10 Calendar



험프리 험프리.김현수 RAD Studio 정보

[Seattle] VCL 스타일이 공용 대화 상자와 웹브라우저까지 적용됩니다.

2015. 9. 2. 17:23

VCL 스타일이 공용 대화 상자와 웹브라우저에도 적용됩니다.

공용 대화 상자와 웹브라우저에도 VCL 스타일 적용


RAD Studio 10 Seattle에서는 VCL 스타일이 공용 대화 상자과 웹브라우저의 스크롤에까지 적용되어 더욱 일관된 외관을 제공할 수 있습니다.



험프리 험프리.김현수 RAD Studio 정보

[Seattle] VCL 스타일을 적용해 1분만에 윈도우 10 최신신 룩앤필을 적용할 수 있습니다.

2015. 9. 2. 16:13

VCL 스타일을 적용해 1분만에 윈도우 10 최신신 룩앤필을 적용할 수 있습니다.

윈도우 10 스타일 지원


Application Appearance(Project > Options > Application > Appearance) 옵션에서 윈도우 10 스타일을 추가하고 선택할 수 있습니다.


관련 글




험프리 험프리.김현수 RAD Studio 정보

[시애틀] 윈도우 10 용 새 VCL UI 컨트롤로 윈도우 10 UI를 손쉽게 적용할 수 있습니다.

2015. 9. 1. 18:17

윈도우 10 용 새 VCL 컨트롤을 이용해 윈도우 10 UI를 손쉽게 적용할 수 있습니다.

VCL Windows 10 컨트롤

TSplitView

윈도우 10 스타일의 메뉴(일명 햄버거 메뉴)를 구현할 수 있습니다.

CloseStyle 속성으로 메뉴의 아이콘만 표시하거나, 완전히 감추도록 설정할 수 있습니다.

 - 샘플 경로: (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\SplitView

TActivityIndicator

윈도우 10 스타일로 작업 진행 중임을 표시할 수 있습니다.

3종류의 Indicator Type을 지원하며, 지연시간(Frame Delay), Indicator크기, 색상(흑/백)을 지정할 수 있습니다.

 - 샘플 경로: (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\ActivityIndicator

TToggleSwitch

윈도우 10 룩앤필의 스위치입니다. TToggleSwitch와 TCheckBox를 화면에 맞게 적절히 사용할 수 있습니다.

On/Off 캡션과 캡션위치, 색상등을 설정할 수 있습니다.

 - 샘플 경로: (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\ToggleSwitch

TRelativePanel

RelativePanel은 자식 컨트롤을 다른 자식 컨트롤 또는 부모 패널을 기준으로 위치하고 정렬할 수 있는 레이아웃 패널입니다.

 - 샘플 경로: (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\RelativePanel

TSearchBox

검색 버튼을 제공하는 Edit입니다. 검색 버튼을 누르거나 엔터키를 누르면 OnInvokeSearch 이벤트가 발생됩니다.

- 샘플 경로: (RAD Studio 10 Seattle 기본 샘플 경로)\Object Pascal\VCL\SearchBox



험프리 험프리.김현수 RAD Studio 정보

[교육] 2015.8.18 사물인터넷과 RAD Studio

2015. 8. 18. 09:19


준비사항

모바일 개발환경 설정 : http://tech.devgear.co.kr/402210


소스코드 : https://github.com/devgear/RADStudioIotEdu

소스 받는 방법 : http://tech.devgear.co.kr/delphi_news/404452


비콘

UUID : {E2C56DB5-DFFB-48D2-B060-D0F5A71096E0}

major id : -1, 100

minor id : -1, 1~4


비콘 구매


안드로이드 블루투스 활성화 조회와 설정하기

http://tech.devgear.co.kr/delphi_news/409472



REST Client

스마트 조명 인터페이스

http://www.developers.meethue.com/documentation/getting-started



hue_api_registration.json


hue_api_lights.json


tech_devgear_jsondata.json


URL

http://192.168.50.10

Resource

/api/{username}/lights/1/state


블루투스

const

  ScaleDeviceName = 'Wahoo';


  WEIGHT_SERVICE: TBluetoothUUID          = '{00001901-0000-1000-8000-00805F9B34FB}';

  WEIGHT_CHARACTERISTIC: TBluetoothUUID   = '{00002B01-0000-1000-8000-00805F9B34FB}';


기타

델파이(2005~XE8) 주요 기능 정리

발표자료

기술문서(자동번역)

험프리 험프리.김현수 교육, 세미나

[교육] 광주/대구 모바일, 사물인터넷 교육 자료

2015. 8. 13. 12:53



개발환경 설정 : http://tech.devgear.co.kr/402210


소스코드 : https://github.com/devgear/RADStudioMobileIoTEdu

받는 방법 : http://tech.devgear.co.kr/delphi_news/404452


대구 WIFI

강의실 뒷편을 참고하세요

❑ 1일차

한 번에 개발하는 안드로이드&iOS 앱

  • 델파이, 파이어몽키, 멀티 플랫폼 개발 이해하기
    • 파이어몽키 특징과 VCL과 차이점을 알아봅니다.
      • 멀티 디바이스 앱 개발 프레임워크의 출현 배경
    • 멀티 디바이스 앱 개발을 위한 IDE 기능을 알아봅니다.
      • 멀티 디바이스 디자이너(프리뷰)
      • 프로젝트 매니저
      • 안드로이드 개발환경 설정
  • [실습] 사원 정보 앱 만들기 #1 (화면 만들기)
  • : 목록 화면, 상세보기 화면, 화면 전환, 효과 적용
    • 자주 사용하는 컴포넌트 익히기
      • 탭 컨트롤, 폼, 프레임: 여러개의 화면 구성
      • 기본 컨트롤(에디트, 버튼, 스위치 등) 속성 살펴보기
      • 화면 꾸미기: 스타일, Shape
      • ListBox(디자인타임, 동적), ListView(ItemAppearance), ScrollBox
    • 애니메이션, 효과 컴포넌트 살펴보기
  • [실습] 사원 정보 앱 만들기 #2 (사진 찍고 사용하기, 전화 걸기)
    • 미리 정의된 기능(액션)으로 사진 찍고 사용하기
    • 플랫폼 서비스 활용해 전화걸기



❑ 2일차

한 번에 개발하는 안드로이드&iOS 앱

  • [실습] 사원 정보 앱 만들기 #3 (임베디드 DB적용)
    • SQLite(임베디드 디비)와 연동하기
  • [시연] 모바일 앱에서 원격 데이터 연결하는 방법 (원격DB서버와 웹 서비스 연결)
    • 데이터 스냅
    • REST Client
    • EMS(Push)
    • BaaS(Push)

사물인터넷

  • 사물인터넷과 통신 기슬 이해하기 (블루투스, 블루투스LE 등)
  • [실습] 위험 지역 경보 시스템 구축하기 #1 (비콘 스캔, 근접 탐지, 위험 경고)
    • 비콘 컴포넌트로 위치기반 서비스 구현하기
    • 애니메이션을 이용해 화면경보 효과 구현하기
    • 사운드 파일을 배포해 경보음 구현하기
  • [실습] 위험 지역 경보 시스템 구축하기 #2 (스마트 조명으로 경고하기)
    • REST API를 제공하는 사물인터넷 기기(조명) 제어 구현하기


사원정보 따라하기

SQLite DB


EMPLOYEE.db


SQLite 클라이언트 프로그램 : http://sqlitebrowser.org/


전화걸기 소스

procedure TForm1.Label6Click(Sender: TObject);

var

  PhoneDlrSvc: IFMXPhoneDialerService;

begin

  if TPlatformServices.Current.

    SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDlrSvc)) then

  begin

    PhoneDlrSvc.Call(Label6.Text);

  end;

end;


REST Debugger

URL
 - http://ajax.googleapis.com/ajax/services/feed
Resource
 - load?v=1.0&num={num}&q={url}
Param
 - http://tech.devgear.co.kr/rss

Open URL(외부 웹브라우저로 웹사이트 열기)

uses

  Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers,

  Androidapi.JNI.Telephony, Androidapi.JNI.JavaTypes, Androidapi.JNIBridge;



procedure OpenURL( AUrl : string );

var

  Intent: JIntent;

begin

  TThread.CreateAnonymousThread( procedure ()

  begin

    Intent := TJIntent.Create;

    Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);

    Intent.setData( StrToJURI( AUrl ) );

    SharedActivity.startActivity(Intent);

  end).Start;

end;


// 호출


리스트(ListView, ListBox) 동적으로 생성하기

procedure TForm1.FillListBox;

var

  Item: TListBoxItem;

begin

  PrototypeBindSource1.First;

  while not PrototypeBindSource1.Eof do

  begin

    Item := TListBoxItem.Create(ListBox1);

    Item.Parent := ListBox1;

    Item.Text := PrototypeBindSource1.Members['ContactName1'].ToString;

    Item.ItemData.Bitmap := nil;

    Item.ItemData.Detail := '';


    PrototypeBindSource1.Next;

  end;

end;


procedure TForm1.FillLlistView;

var

  Item: TListViewItem;

begin

  PrototypeBindSource1.First;

  while not PrototypeBindSource1.Eof do

  begin

    Item := ListView1.Items.Add;

    Item.Bitmap := nil;

    Item.Detail := '';

    Item.Text := PrototypeBindSource1.Members['ContactName1'].ToString;


    PrototypeBindSource1.Next;

  end;

end;



데이터셋에 이미지 적용


uses Data.DBl


procedure TForm1.Button4Click(Sender: TObject);

var

  ImageBitmap, Thumbnail: TBitmap;

  ImgStream, ThumbStream: TMemoryStream;

begin

  ImgStream := TMemoryStream.Create;

  ThumbStream := TMemoryStream.Create;

  try

    ImageBitmap := Image2.Bitmap;

    ImageBitmap.SaveToStream(ImgStream);


    Thumbnail := ImageBitmap.CreateThumbnail(100, 100);

    Thumbnail.SaveToStream(ThumbStream);


    (dmData.FDQuery1.FieldByName('IMAGE') as TBlobField)

        .LoadFromStream(ImgStream);

    (dmData.FDQuery1.FieldByName('THUMB') as TBlobField)

        .LoadFromStream(ThumbStream);

  finally

    ImgStream.Free;

    ThumbStream.Free;

  end;


  dmData.FDQuery1.Post;


  ChangeTabAction1.Tab := TabItem2;

  ChangeTabAction1.ExecuteTarget(nil);

end;


비콘

UUID : {E2C56DB5-DFFB-48D2-B060-D0F5A71096E0}

major id : -1, 100

minor id : -1, 1~4


REST API

Philipse hue

기타 참고

참고 사이트
델파이 기술문서 : http://docwiki.embarcadero.com/


전화번호 가져오기

  • http://tech.devgear.co.kr/delphi_news/405491

ListView ItemAppearance 추가방법 소개


[XE7] 안드로이드 5.0(롤리팝) 지원 핫픽스

당겨서 새로고침 관련자료

E2597 ... arm-linux-androideabi-ld.exe: error: cannot find –ldl

나의 도서관 앱 따라하기

갤럭시 기어 연결 참고링크

카메라 & GPS(Sensor)
사물인터넷 발표자료

자체 푸쉬 전송
http://blog.hjf.pe.kr/293
클라우드 이용 푸쉬 전송
https://translate.googleusercontent.com/translate_c?depth=1&hl=ko&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=ko&u=http://docwiki.embarcadero.com/RADStudio/XE8/ja/%25E3%2583%25A2%25E3%2583%2590%25E3%2582%25A4%25E3%2583%25AB_%25E3%2583%2581%25E3%2583%25A5%25E3%2583%25BC%25E3%2583%2588%25E3%2583%25AA%25E3%2582%25A2%25E3%2583%25AB%25EF%25BC%259A%25E3%2583%25AA%25E3%2583%25A2%25E3%2583%25BC%25E3%2583%2588%25E9%2580%259A%25E7%259F%25A5%25E3%2582%2592%25E4%25BD%25BF%25E7%2594%25A8%25E3%2581%2599%25E3%2582%258B%25EF%25BC%2588iOS_%25E3%2581%258A%25E3%2582%2588%25E3%2581%25B3_Android%25EF%25BC%2589&usg=ALkJrhiBzUGCVKiw_kVNfv5T5ReRBKsfxQ

다국어 지원 & 포맷 순서
http://tech.devgear.co.kr/delphi_news/408214

참고링크



험프리 험프리.김현수 교육, 세미나

[따라하기] 위험지역 경보 시스템 #1 - 비콘을 이용해 위험지역 진입 경보앱 만들기

2015. 7. 28. 18:03

업데이트 내역


2019-05 : 안드로이드 권한 모델 변경(런타임 시 권한 요청)이 적용되도록 업데이트

2019-10 : 안드로이드 권한 모델에 위치(ACCESS_FILE_LOCATION) 항목 추가



위 동영상(위험 지역 경보 시스템 데모) 중 위험 지역 진입 시 경보를 발생하는 앱을 따라하기를 통해 만들어 봅니다.

위험지역 진입 경보앱 만들기

❑ 앱 소개

앱 소개

이 앱은 위험지역에 진입 시 화면과 경고음으로 위험지역에 진입을 경고해 주는 (프로토 타입)앱입니다.


따라하기의 목적

따라하기를 통해 비콘을 이용한 위치기반 앱 개발을 시작합니다.


이 따라하기에서는 다음 내용을 다룹니다.

  • 비콘 컴포넌트를 이용해 비콘과의 거리를 활용합니다.
  • UI 컨트롤의 투명도에 애니메이션 효과를 적용해 화면경고 기능을 구현합니다.
  • 사운드 파일(*.mp3)을 앱과 배포해 경보음으로 사용합니다.

따라하기

0, 사전 준비사항

1, 빈 멀티-디바이스 애플리케이션 프로젝트를 생성하고 저장합니다.

2, 메인 UI를 만듭니다.

3, 위험 경보 UI를 추가합니다.

4, 위험경고 화면 효과, 경고음 기능을 추가합니다.

5, 비콘 컴포넌트 추가 후 이벤트를 만듭니다.

6, 비콘과 거리를 기반으로 위험지역 경보 이벤트를 발생합니다.

7, 블루투스 권한설정

8, 디바이스에 배포하고 테스트합니다.

0, 사전 준비사항

개발 도구 준비하기

델파이(또는 RAD Studio)를 실행합니다.(이 실습은 델파이 XE8 버전으로 작성되었습니다.)

만약, 델파이가 설치되지 않았다면 아래의 페이지에서 델파이를 다운로드 받아 설치 후 진행하시기 바랍니다.

따라하기에서 사용할 리소스 다운로드

DangerZoneAlertRes.zip


위 파일을 다운로드 후 적당한 위치에 압축해제하시기 바랍니다.

비콘 준비하기

비콘을 준비합니다.(시중에서 다양한 비콘을 판매하고 있습니다. 저는 Beacon B1을 이용해 진행했습니다.)
시중에서 판매되는 (표준을 지키는)대부분의 비콘과 연동됩니다.

비콘 정보 확인/설정하기

비콘의 UUID와 Major Id, Minor Id를 알아야 합니다. 제조사 사이트 또는 비콘 스캐너 앱을 통해 파악할 수 있습니다.
보통 같은 제품의 비콘은 동일한 UUID, Major Id, Minor Id로 설정되어있습니다. 비콘 별로 구별하기 위해 Major Id, Minor Id를 변경해야 하는데, 제조사의 안내에 따라 Major Id, Minor Id를 다르게 설정하기 바랍니다.(대부분 제조사에서 전용 앱을 제공합니다.)

1, 빈 멀티-디바이스 애플리케이션 프로젝트 생성

  1. File > New > Multi-Device Application - Delphi 메뉴를 선택 하고, Blank Application을 선택해 프로젝트를 생성합니다.
  2. File > Save all 메뉴를 선택 해 유닛이름을 "MainForm.pas"로 프로젝트 이름을 "DangerZoneAlert"으로 저장합니다.

2, 메인 UI를 만듭니다.

모바일 앱 스타일로 화면 구성하기 위해 폼디자이너 스타일을 Android로 변경합니다.


다음화면과 표를 이용해 위험지역 경보 앱 메인 UI를 개발합니다.
(이 따라하기는 비콘 활용 기능에 집중하기 위해 최소한의 UI로 구성했습니다.)


상위 오브젝트

오브젝트

속성

값(또는 설명)

 Form1

 ToolBar1

 

 

 ToolBar1

 Label1

 Align

 Client

 Text

 위험지역 경보 앱

 TextSettings.HorzAlign

 Center

 Switch1

 Align

 Right

 Form1

 Image1

 MultiResBitmap

 "factory.png 선택"

 StatusBar1

 Height

 32

 StatusBar1

 Label2

 Align

 Client

 Text

 위험지역과의 거리: 

3, 위험 경고 UI를 추가합니다.

위험 지역 진입 시 화면으로 경고를 주기위한 UI를 추가합니다. 붉은색 배경에 안내문구를 표시하고, 화면을 깜빡이게 합니다.

화면을 깜빡이는 기능은 다음 단계에서 진행합니다.


다음화면과 표를 이용해 위험 경보 UI를 추가합니다.


상위 오브젝트 

 오브젝트

 속성

 값(또는 설명)

 Form1

 Rectangle1

 Align

 Client

 Fill.Color

 Red

 Opacity

 0.8

 Rectangle1

 Layout1

 Align

 Center

 Width/Height

 228/186(적당히)

 Layout1

 Label3

 Align Text
 Text

 위 그림 참고(위험지역에 ...)

 lblDistance Align Bottom
 Name lblDistance

 TextSettings.Font.Size

 24
 TextSettings.HorzAlign Center

4, 위험경고 화면 효과, 경고음 기능을 추가합니다.

위험지역 진입을 알리기위해 경고음을 발생하고, 경고화면을 표시 후 화면을 깝빡여주는 기능을 구현합니다.


경고음을 실행하기위해 TMediaPlayer 컴포넌트를 경고화면을 깜빡이기 위해 TFloatAnimation 컴포넌트를 추가합니다.


Rectangle1의 FloatAnimation은 Opacity 속성 추가 메뉴(Create New TFloatAnimation)를 선택해 생성합니다.


상위 오브젝트

오브젝트

속성

값(또는 설명)

 Form1

 MediaPlayer1

 

 

 Rectangle1

 FloatAnimation1

 Autoreverse

 True

 Duration

 1

 Loop

 True

 PropertyName Opacity

 StartValue/StopValue

 0.8/0.2

경고음 사운드 파일 배포등록하기

구현에 앞서 경고음으로 사용할 사운드파일을 배포관리자에 등록힙니다.

  1. 메인메뉴에서 Project > Deployment 메뉴를 선택해 Deployment 윈도우를 표시합니다.
  2. Add files 버튼을 누르고 "alert.mp3"파일을 선택해 추가합니다.
  3. 배포 플랫폼 선택 콤보박스를 Android platform과 iOS Device platform으로 선택하고, 아래를 참고해 Remote Path를 수정합니다.

    • Android platform - assets\internal\
    • iOS Device platform - StartUp\Documents\

경고 기능 구현하기

private 영역에 아래 코드를 참고해 4개의 메소드를 선언합니다.

  private
    { Private declarations }
    procedure StartWarning; // 위험지역 진입 경고 시작
    procedure StopWarning;  // 위험지역 진입 경고 중지

    procedure StartSiren;   // 사이렌 시작
    procedure StopSiren;    // 사이렌 중지
  public

Ctrl + Shift + C 단축키(Complete Class at Cursor)를 이용해 메소드의 구현부를 자동완성합니다.

아래 코드를 참고해 구현부를 완성합니다.

procedure TForm1.StartSiren;
begin
  MediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, 'alert.mp3');
  MediaPlayer1.Play;
end;

procedure TForm1.StopSiren;
begin
  MediaPlayer1.Stop;
end;

procedure TForm1.StartWarning;
begin
  Rectangle1.Visible := True;
  FloatAnimation1.Enabled := True;

  StartSiren;
end;

procedure TForm1.StopWarning;
begin
  Rectangle1.Visible := False;
  FloatAnimation1.Enabled := False;

  StopSiren;
end;

사운드파일 경로 설정을 위해 사용한 TPath가 선언된 System.IOUtils 유닛을 유즈절에 추가합니다.

5, 비콘 컴포넌트 추가 후 이벤트를 만듭니다.

비콘 컴포넌트(TBeacon)는 안드로이드, iOS, OSX를 지원합니다. 타겟 플랫폼을 안드로이드로 변경 후 폼위에 비콘 컴포넌트를 추가합니다.


모니터링 대상 비콘 등록

비콘을 모니터링하기 위해 비콘 정보를 등록합니다.

  1. Beacon1 컴포넌트의 MonitorizedRegions 속성을 선택 후 확장 버튼을 클릭합니다.
  2. 편집창에서 Add new 버튼을 눌러 항목을 추가합니다.
  3. 대상 비콘의 UUID, Major, Minor 값을 입력합니다.

(만약, Major, Minor 값을 -1로 설정하면 UUID만 이용해 대상을 탐색합니다.)


비콘 인스턴스 할당하기

비콘 변수를 선언하고, BeaconEnter, BeaconExit 이벤트에서 비콘 인스턴스를 할당해줍니다.


private 영역에 변수를 선언합니다.

  private
    { Private declarations }
    FBeacon: IBeacon;

 비콘 컴포넌트의 OnBeaconEnter, OnBeaconExit 이벤트 핸들러를 만들고 비콘 인스턴스를 할당합니다.

(이벤트 핸들러는 이벤트의 우측 영역을 더블클릭하면 생성됩니다.)


procedure TForm1.Beacon1BeaconEnter(const Sender: TObject;
  const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
  FBeacon := ABeacon;
end;

procedure TForm1.Beacon1BeaconExit(const Sender: TObject;
  const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
begin
  FBeacon := nil;
end;

비콘 컴포넌트 동작을 활성화하기

안드로이드 권한 모델 변경으로 10.3 이상의 버전은 런타임 시 권한 요청하도록 변경이 필요합니다.

10.2 이전 버전
스위치(Switch1)를 키면 비콘이 동작하도록 Switch1의 OnSwitch 이벤트 핸들러 생성 후 아래 코드를 입력합니다.
procedure TForm1.Switch1Switch(Sender: TObject);
begin
  Beacon1.Enabled := Switch1.IsChecked;
end;

10.3 이상 버전(런타임 시 권한 요청)
구현부 uses 절에 필요한 유닛을 추가합니다.

implementation

uses
  System.Permissions,
{$IFDEF ANDROID}
  Androidapi.JNI.Os,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
{$ENDIF}
  FMX.DialogService;

{$R *.fmx}

스위치(Switch1)를 키면 권한을 요청하고, 비콘이 동작하도록 Switch1의 OnSwitch 이벤트 핸들러 생성 후 아래 코드를 입력합니다.(2019-10-23: 위치(ACESS_FINE_LOCATION) 권한이 없어 비콘이 실행되지 않아 추가)

procedure TForm1.Switch1Switch(Sender: TObject);
begin
{$IFDEF ANDROID}
  if Switch1.IsChecked then
  begin
    PermissionsService.RequestPermissions(
      [
        JStringToString(TJManifest_permission.JavaClass.BLUETOOTH),
        JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_ADMIN), 
        JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION)
     ],
      procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
        begin
          if (Length(AGrantResults) = 3)
          and (AGrantResults[0] = TPermissionStatus.Granted)
          and (AGrantResults[1] = TPermissionStatus.Granted)
          and (AGrantResults[2] = TPermissionStatus.Granted) then
            { activate or deactivate the location sensor }
            Beacon1.Enabled := True
          else
          begin
            Switch1.IsChecked := False;
            TDialogService.ShowMessage('블루투스 권한이 없습니다.');
          end;
        end);
  end
  else
    Beacon1.Enabled := False;
{$ELSE}
  Beacon1.Enabled := Switch1.IsChecked;
{$ENDIF}
end;

6, 비콘과 거리를 기반으로 위험지역 경보 이벤트를 발생합니다.

이제 모든 준비는 완료되었고, 비콘과의 거리를 계산해 위험지역 진입 경보 이벤트를 발생하면 됩니다.

위험지역 진입에 대한 경보는 아래와 같은 기준으로 시작하고 중단합니다.

위험지역 진입 경보 기준

  1. 비콘과의 거리가 1.0미터 이하인 경우 위험지역으로 간주한다.
  2. 경보가 아닌 상태에서 위험지역에 3초이상 연속으로 머무른 경우 경보를 시작한다.
  3. 경보가 발생중인 상태에서 위험지역을 3초이상 연속으로 벗어난 경우 경보를 중단한다.

비콘과 거리를 주기적으로 확인하기 위해 타이머 컴포넌트(Timer1)를 폼에 추가합니다.


아래 변수를 private 영역에 선언합니다.

    FIsWarning: Boolean;          // 경고 중인가?
    FDangerAreaStaySecs,          // 위험지역에 머무른 시간(초)
    FDangerAreaOutSecs: Integer;  // 위험지역에서 벗어난 시간(초)


Timer1의 OnTimer 이벤트 핸드러를 생성하고, 아래 코드를 추가합니다.

procedure TForm1.Timer1Timer(Sender: TObject);
var
  InDangerArea: Boolean;  // 위험지역에 있는가?(비콘과의 거리가 1m 이내인가?)
begin
  if Assigned(FBeacon) then
  begin
    InDangerArea := FBeacon.Distance <= 1;

    // 경고 중 아님
      // 위험지역에 3초간 머무른 경우 경고 시작
    if not FIsWarning then
    begin
      if InDangerArea then
        Inc(FDangerAreaStaySecs)
      else
        FDangerAreaStaySecs := 0
      ;

      if FDangerAreaStaySecs >= 3 then
      begin
        FIsWarning := True;
        StartWarning;
        FDangerAreaStaySecs := 0
      end;
    end
    // 경고 중
      // 위험지역을 3초 이상 벗어난 경우 경고 중단
    else if FIsWarning then
    begin
      if not InDangerArea then
        Inc(FDangerAreaOutSecs)
      else
        FDangerAreaOutSecs := 0;

      if FDangerAreaOutSecs >= 3 then
      begin
        FIsWarning := False;
        StopWarning;
        FDangerAreaOutSecs := 0;
       end;
    end;

    // 위험지역과의 거리를 표시
    lblDistance.Text := FBeacon.Distance.ToString;
    Label3.Text := '위험지역과의 거리: ' + FBeacon.Distance.ToString + ' m';
  end;
end;

7, 블루투스 권한설정

(이 과정은 안드로이드 플랫폼을 사용하지 않는 경우 생략할 수 있습니다.)

비콘은 블루투스 LE(Low Energy) 기반으로 통신합니다.  블루투스 사용권한을 설정합니다.

Project > Options 메뉴를 선택 후 Uses Permissions 화면으로 이동합니다.


Bluetooth와 Bluetooth admin 두개의 권한을 사용하도록 설정합니다.

8, 디바이스에 배포하고 테스트합니다.

처음 디바이스에 배포하는 경우 먼저 모바일 개발환경 설정하고 진행하기 바랍니다.


개발을 완료했습니다. 이제 준비된 개발환경으로 플랫폼을 선택 후 Run > Run Without Debugging 메뉴를 이용해 실행하고 테스트 합니다.



테스트 방법 : 

  • 앱을 실행 후 비콘과 1미터 이내로 접근 후 3초이상 머무르면 경고가 발생
  • 경고 발생 중 1미터 초과 거리로 이동 후 3초이상 머무르면 경고 중단


참고자료



험프리 험프리.김현수 파이어몽키 Beacon, IOT, 비콘, 사물인터넷

  1. Blog Icon

    비밀댓글입니다

  2. 이번 따라하기에는 로그로 기록하고, 관리자에게 보고하는 내용이 포함되지 않았습니다.

    영상에서 사용된 앱에서는 주기적으로 클라우드에 위험지역과의 거리를 기록하고, 위험지역에 머무른 경우 관리자에게 푸쉬메시지(GCM)을 전송했습니다.

    이 내용에 관심이 있으시다면 제가 진행하는 세미나에서 자세한 이야기를 들어보세요.(8월 11일은 이미 신청완료 됐고, 9월 3일에 앵콜세미나가 진행됩니다.)
    http://tech.devgear.co.kr/board_in1/413343

  3. Blog Icon

    비밀댓글입니다

  4. 비콘은 XE8에서 추가된 컴포넌트입니다.

    업데이트 또는 트라이얼 버전으로 진행해주세요^^

  5. Blog Icon
    김태규

    그럼 따로 비콘 업체에서 제공해주는 api 가져다가 만들어야하나요?

    비콘 컴포넌트 없이도 제작은 가능하죠??

  6. 네 비콘 표준을 기반으로 직접 구현할 수 있습니다.(iBeacon, AltBeacon을 필요한 플랫폼 별로 구현해야 합니다.) 하지만 쉽지 않습니다.ㅠㅜ

    트라이얼로 테스트 해보시고 최신버전으로 업그레이드하셔서 컴포넌트 이용하는 것을 추천드립니다.

    그리고 모바일 개발 하시려면 잦은 모바일 OS업데이트로 델파이 버전도 빠르게 올라가기 때문에 업데이트 서브스크립션을 구매하시는 것이 아주 좋습니다.
    http://www.devgear.co.kr/products/rad-studio/update-subscription/

  7. Blog Icon
    정재용

    비콘과 미디어플레이어 경고 알람 기능이 포함된 소스는 구할 수 없을까요?

    비콘만 구현하면 잘 돌아가고,

    미디어만 구현해도 잘 돌아가는데,

    간단하게 섞을라 치면 어플이 안드로이드핸드폰에서 실행하자마자 꺼지네요.

    휴대폰 리소스 문제일까요?

    비교해보고싶어서 그런데 사용예제를 git으로 얻을 수 있을까 여쭤봅니다.

  8. 이 따라하기가 비콘과 미디어플레이어를 이용하고 있습니다.
    혹시 따라하기로 잘 안되시면 아래 깃헙링크에서 다운로드받아 테스트해보세요.
    (단, 배포: Project > Deployment 부분에서 파일 배포 부분을 잘 검토해 보세요.)
    https://github.com/devgear/RADStudioMobileIoTEdu/tree/master/20150828/BeaconDemo3

  9. Blog Icon
    박문수

    안녕하세요 이번에 비콘을 구매하여서 위험지역 경보 앱을 따라 제작하며

    추천해주신 비콘중에 Gimbal 제품을 구매하여 테스트 하는데 이 제품은 UUID가 따로 없는데

    혹시 이 제품으로 연동하는 방법을 알 수 있을까요?

  10. 제조사 홈페이지에서 찾아보시거나,
    모바일에서 Beacon Scan 기능을 제공하는 앱을 다운받아 비콘을 스캔해 보시기 바랍니다.
    안드로이드인 경우 Beacon Scanner, 아이폰인 경우 Locate 앱을 이용하면 됩니다.

  11. Blog Icon
    박문수

    답변 감사드립니다.
    이야기 해주신 어플은 스캔이 안되어서 다른 어플(BeaconFinder)로 하니깐 나와서 UUID를 입력 후 어플을 돌리면 비콘이 안잡히고 있습니다.
    그래서 다시 UUID 확인을 하면 특정위치 한자리가 변경이 되고 있습니다.
    혹시 이게 왜 이런지 아시는거 있으신가요??

  12. 이 현상은 비콘 스캐너 앱을 의심해봐야 할것 같네요.
    다양한 앱으로 시도해보시기 바랍니다.

    그리고 비콘 제조사 홈페이지에서 UUID를 확인해보시구요.
    제조사에서 제공하는 전용 앱이 있다면 해당 앱으로도 탐색해보세요.

  13. Blog Icon
    이원진

    안녕하세요? 좋은 자료 감사합니다.
    제가 하고자 하는것은 비콘을 자동으로 인식 하고자 하는데..
    보편적으로 매장내에서 비콘을 활용하고자 할경우에 uuid를 입력하는 절차가 있으면 곤란하고요
    uuid를 직접 입력하지 않고 uuid정보를 가져올수 있는 방법은 없을까요?

  14. Blog Icon
    MG

    다음 강의도 올려주세요~

  15. Blog Icon
    박한수

    안녕하세요 이 글을 읽고 비콘이 멀어질때 알람이 울리는 식으로 응용을 해보았습니다. 그리고 비콘을 하나에서 세개로 늘려서 해보았는데

    각 비콘에 동일하게 스위치를 따로 달아서 진행하였고 추가되는 비콘들은

    procedure TForm1.Beacon2BeaconEnter(const Sender: TObject;
    const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList);
    begin
    GBeacon :=ABeacon;
    end;

    이처럼 GBeacon이나 HBeacon으로 선언하여 이벤트를 만들었습니다. 알람부분에서도 타이머를 추가하여 변수 (FIsWarning, StopWarning,FDangerAreaOutSecs 등)도 GBeacon을 위한 새로운 변수(GIsWarning, GDangerAreaOutSecs 등)로 따로 선언을 해 두었습니다.

    이렇게 하니 하나의 스위치를 켜서 할때는 각각 모두 잘 되는데 스위치를 여러개를 켜면 하나의 비콘만 인식을 하고 다른것은 인식을 못하였습니다. 혹시 어디가 잘못되었는지 알 수 있을까요?

  16. Blog Icon
    EH

    4번 항목에
    'lblDistance'라는 오브젝트가 없어서 그러는데요.
    그걸 추가하려면 어떻게 해야하나요?

  17. lblDistnace는 TLabel의 이름(Name)을 lblDistance라고 변경한 것입니다.

  18. Blog Icon
    정진희

    안녕하세요 안드로이드 스튜디오 환경 또는 이클립스에서 어플을 제작하려고 합니다.
    비콘은 아두이노를 이용하여 제작하였고, 이제 제작한 비콘에서 거리 정보를 핸드폰으로 받아오는게 지금 해결해야하는 단계입니다.
    근데 어플을 만들어보는게 처음이라...
    위에 글을 읽어보니까 개발도구로 델파이를 사용하셨고 비콘 컴포넌트라는 것을 사용하셨다고 나와있는데
    혹시 저기 나와있는 비콘 컴포넌트는 델파이에서만 사용할 수 있는건가요?
    아니면 안드로이드 스튜디오 또는 이클립스에서 동일하게 사용할 수 있는건가요?
    감사합니다!

  19. 위 글에서 설명하는 비콘 컴포넌트는 델파이에서 사용해야 합니다.

    델파이 앱개발도 한번 검토해 보세요^^

    데브기어 사물인터넷 1일 교육과정에서 비콘 연동 등을 포함한 실습위주 교육을 진행하고 있습니다.
    하루만에 완성된 앱을 돌려보고 가져갈 수 있습니다.
    http://devgear.co.kr/edu

  20. Blog Icon
    박은정

    따라하기로 어플을 만들어보았는데요
    정확하게 다 한거같은데 어플에서 비콘을 인식을 못하는거 같아요 이런경우에는 어떻게 해야하죠?

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

2015. 7. 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)이 잘못된 부분을 찾아내서 해결하니 정상 연결 및 데이터 송수신을 확인할 수 있었습니다.

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

모바일 앱 실행 시 검은화면이 표시되는 경우 조치방법

2015. 7. 2. 16:39

모바일 기기에 앱을 넣고 실행해보면 가끔 어찌된 영문인지 앱 실행 시 검은화면이 표시되고 더이상 구동되지 않는 경우가 발생합니다. 

검은화면은 앱 실행 시 오류가 발생한 경우 표시됩니다.


실행 시 발생하는 오류는 다양하지만 자주 발생하는 이슈는 아래와 같습니다.

  • FormCreate, FormShow 이벤트에 작성한 코드에서 오류 발생
  • 컴포넌트 Enable(또는 Active) 속성을 True로 설정 후 실행하면 실행 시 활성화 되고 활성화 시 오류 발생 가능
  • 필요한 라이브러리가 함께 배포되지 않은 경우
  • (안드로이드 경우)권한이 없는 기능을 사용한 앱이 구동 시 오류 발생

위 내용의 조치방법은 아래와 같습니다.

1, FormCreate(또는 FormShow) 이벤트에 작성한 코드에서 오류 발생

FormCreate 또는 FormShow 이벤트핸들러에 작성한 코드에서 오류가 발생하면 구동 시 검은 화면이 발생합니다.

오류가 발생하지 않도록 코드를 점검하고, 예외처리(try..except)를 추가하기 바랍니다.


또, 라이프사이클 이벤트를 이용해 앱 완전 구동 후 작업을 수행할 수 있습니다.

2, 컴포넌트 Enable(또는 Active)속성을 True로 설정 후 실행하면 실행 시 활성화 되고 활성화 시 오류 발생 가능

폼위에 올려놓은 컴포넌트도 내부적으로는 앱이 실행될때 코드가 실행됩니다. 특히 Enable과 Active 속성을 갖는 컴포넌트의 경우 앱 실행 시 활성화됩니다. 이때 컴포넌트 활성화에 필요한 정보가  설정되지 않은 경우 오류가 발생합니다.

예를 들어 DB 연결 시 DB의 경로가 플랫폼의 경로로 설정되지 않았다면, 오류가 발생할 수 있습니다.


이 경우, 앱이 구동된 이후 Enabled, Active 속성을 True로 변경하도록 처리하기 바랍니다.

3, 필요한 라이브러리가 함께 배포되지 않은 경우 오류가 발생할 수 있습니다.

데이터 연결 등 외부 라이브러리를 이용하는 경우, 외부 라이브러리 배포를 하지 않고 앱을 실행하면 구동 시 오류가 발생합니다.


이 경우, 배포관리자(Project > Deployment) 화면에서 필요한 라이브러리를 추가하기 바랍니다.

그리고, 플랫폼별 배포경로를 다음 링크에서 확인해 Remote Path를 설정하기 바랍니다.

팁으로 데이터 엑세스 관련된 라이브러리 파일은 Add Featured Files 기능을 이용해 추가할 수 있습니다.


4, (안드로이드 경우)권한이 없는 기능을 사용한 앱이 구동 시 오류가 발생할 수 있습니다.

블루투스 컴포넌트를 폼에 올리고 안드로이드에서 앱을 실행하려면 블루투스 권한을 설정해야 합니다.


사용 권한은 프로젝트 옵션(Project > Option > Uses Permissions)에서 설정할 수 있습니다. 


권한에 대한 자세한 정보는 엠바카데로 기술문서를 참고하세요.

5, 기타 오류가 발생할 수 있는 경우

멀티-디바이스 뷰를 추가 후 추가한 뷰에 설정 값을 잘 못 넣은 경우

위 그림과 같이 멀티-디바이스 디자이너는 여러가지 플랫폼과 해상도에 맞는 디바이스 뷰를 추가해 폼 디자인을 다르게 구성할 수 있습니다.


간혹, 디자인 뿐 아니라 연결 컴포넌트 등의 속성을 추가한 뷰(위 그림에서 Android 5" Phone)에 잘못된 설정을 하고, Master 뷰에서 원인을 찾을 경우 쉽게 못찾는 경우가 있습니다.


위 문제의 해결책은 되도록, 연결 등의 Non-visual 컴포넌트는 데이터모듈에 추가하도록 합니다. 부득이 폼에 추가한 경우 Master 뷰에서 속성을 변경 해 추가한 뷰에서 Master의 속성을 상속받아 실행되도록 합니다.

험프리 험프리.김현수 파이어몽키

[XE8] 코딩 중 이유없이 델파이 IDE가 응답없음 되는 경우 참고사항

2015. 6. 26. 14:54

코딩 중 특별한 이유없이 IDE가 응답없음 되면 카스탈리아 기능을 끄고 진행해 보세요.

(저도 안드로이드 타겟으로 개발 시 특정 라인에서 꺽쇠주석({})을 추가할 때 델파이 IDE가 응답없음이 발생했고, 카스탈리아 기능을 끄니 재현되지 않네요.)


아래 그림과 같이 바로가기 뒤에 /NOCASTALIA 옵션을 추가하면 카스텔리아 기능이 동작하지 않습니다.

(파이어몽키 카페에서 오실장님 글을 참고했습니다. - http://cafe.naver.com/delphifmx/983)



험프리 험프리.김현수 Delphi/C++Builder