컴퓨터 프로그래밍에서 SOLID란 로버트 마틴[1][2]이 2000년대 초반[3]에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다.[3] SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩토링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. 이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다.[3]

개요[편집]

두문자약어개념
SSRP
단일 책임 원칙 (Single responsibility principle)
한 클래스는 하나의 책임만 가져야 한다.
OOCP
개방-폐쇄 원칙 (Open/closed principle)
“소프트웨어 요소는 …… 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.”
LLSP
리스코프 치환 원칙 (Liskov substitution principle)
“프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.” 계약에 의한 설계를 참고하라.
IISP
인터페이스 분리 원칙 (Interface segregation principle)
“특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.”[4]
DDIP
의존관계 역전 원칙 (Dependency inversion principle)
프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.”[4] 의존성 주입은 이 원칙을 따르는 방법 중 하나다.


'Others' 카테고리의 다른 글

OOP - S.O.L.I.D  (0) 2016.03.22
[현장] 전설의 개발자 제프 딘, 한국 개발자를 만나다  (0) 2016.03.20
Bluetooth Low Energy  (0) 2016.01.26
코드 하이라이트 사용법  (0) 2015.10.26

[현장] 전설의 개발자 제프 딘, 한국 개발자를 만나다

최근 알파고와 이세돌 9단의 대국에 많은 관심이 쏠리고 있습니다. 데미스 하사비스 구글 딥마인드 최고경영자부터 에릭 슈미트 알파벳 회장까지 한국에 방문해 인간과 인공지능과의 대결에 관심을 보이고 있는데요. 지난 월요일 알파고 인기 못지 않게 유명한 구글 직원이 한국에 방문했습니다. 바로 제프 딘이라는 구글 시니어 펠로우입니다.

제프 딘은 일반인에게는 조금 생소하지만 IT 업계에서는 널리 알려진 ‘전설’같은 인물입니다. 제프 딘은 1999년 중반 구글에 합류했는데요. 구글의 대부분의 제품의 기본이 되는 구글의 크롤링, 인덱싱 및 쿼리 서빙 시스템을 비롯해 구글의 주요 초기 광고 모델과 애드센스 시스템을 공동 설계하고 구현하는 데 기여한 인물입니다. 뿐만 아니라 ‘스패너’, ‘빅테이블’, ‘맵리듀스’ 등을 개발한 엔지니어로 현재는 머신러닝을 위한 대용량 분산 시스템에 대해 연구하고 있습니다.

제프 딘은 3월7일 구글 캠퍼스에서 머신러닝에 대한 강연을 하고 한국 엔지니어들과 1시간 가량 직접 소통하는 시간을 가졌습니다. 이날 행사에는 500명이 넘는 한국 개발자가 등록 신청서를 제출했다고 합니다. 구글코리아는 사전 신청서와 질문 내용을 확인하고 200여명의 개발자만 추려 현장에 참석할 수 있는 기회를 제공했습니다. 강의는 2시부터 시작했지만, 이미 1시30분터 구글캠퍼스 강연장에는 사람이 꽉 찼습니다.  2시가 되자 발 디딜 틈이 없었습니다. 실제 참여자는 210명이 넘었다고 하네요.

jeff_dean_01

▲행사는 사전 등록해서 뽑힌 사람만 참여할 수 있었습니다

jeff_dean_02

▲행사는 사전 등록해서 뽑힌 사람만 참여할 수 있었습니다

이날 행사는 유튜브에 생중계되기도 했는데요. 영상은 현재 무료로 공개됐습니다. 2시 정각 드디어 제프 딘이 등장했습니다. 여기저기서 휴대폰을 들고 사진을 찍는 모습을 볼 수 있었습니다. 마치 연예인을 본 것처럼 말이죠. 제프 딘은 ‘텐서플로’의 로고가 들어간 티셔츠를 입고 등장해 눈길을 끌었습니다. 텐서플로는 최근 구글이 공개한 오픈소스 머신러닝 기술이죠.

jeff_dean_03

▲제프 딘 구글 개발자를 소개하는 권순선 구글 APAC 개발자 플랫폼 총괄

jeff_dean_04

▲제프 딘 구글 시니어 펠로우

이날 발표 주제는 크게 2가지였습니다. 딥 뉴런 러닝이 무엇인지 이야기하고, 텐서플로를 소개했죠. 머신러닝에 대한 간략한 개론을 알고 싶은 분이라면 이번 강의가 도움이 되실 겁니다.

제프 딘 발표 영상 다시보기

현장에서 따로 통역이 지원되지 않았습니다. 현재 공개된 유튜브 영상에서도 자막이 지원되지는 않습니다. 1시간 가량 강연이 끝나고 3시부터는 약 30분간 질의응답 시간을 가졌는데요. 사전 질문을 미리 받아 답변하고, 나머지는 즉석에서 질문과 답변을 주고받았습니다. 현장에서 질문하려는 사람은 굉장히 많았는데요. 한 번에 10여명의 참가자가 동시에 손을 드는 풍경이 이어졌습니다. 참가자들 상당수는 이 질의응답 시간에서 좋은 정보들을 받았다고 후기를 남겼습니다. 제프 딘은 강연이 끝난뒤 추가 질문이 있는 10여명의 개발자들과 일일이 대화를 이어갔습니다.

jeff_dean_00

다음과 제프딘과 한국 개발자들 사이에서 진행된 일부 질의응답 내용입니다.

질문 : 인공지능과 사람의 지능과의 가장 큰 차이점은 무엇인가 ?

답변 : 인간의 지능이 인공지능보다 더 나은 점은 현상을 관찰하고 세상을 이해하는 능력이다. 인간은 다양한 상황을 관찰을 통해 이해한다. 예를 들어, 사람은 한번도 보지 못한 물건을 집어도 무엇을 해야 할지 이전의 경험과 정보를 기반으로 행동할 수 있다. 높은 수준의 언어를 이해하는 것도 비슷한 맥락이다. 컴퓨터는 이러한 능력이 부족하다. 하지만 우리는 열심히 이러한 문제를 해결하고 있는 중이다.

질문 : 알파고와 이세돌 9단의 대결에서 누가 이길 것 같은가?

답변 : 모두가 이번 대국에 관심이 많은 것 같다. 잘 모르겠다. 알파고는 지난번 유럽 챔피언 바둑 기사를 이겼다. 그 후 5개월 동안 알파고도 많이 배웠을 것이다. 알파고는 경험을 통해 배우지 않나. 승패의 핵심은 5개월 동안 알파고가 충분히 배웠는가인데, 잘 모르겠다.(웃음)

질문 : 현재 ‘CTNK’나 ‘카페’ 등 머신러닝와 관련된 오픈소스 라이브러리가 많다. 이와 비교했을 때 텐서플로만의 장점은 무엇인가?

답변 : 현재 다른 종류의 오픈소스 머신러닝 기술이 있고, 서로 다른 특징을 가지고 있다. 구글도 다른 머신러닝 기술의 장점을 가져오려고 많이 노력하고 있다. 예를 들어 자동화를 어떻게 할 것인지 등을 고민했다. 텐서플로의 장점은 유연하다는 것이다. 연구 영역에서는 더욱 그렇다. 또한 연구환경 뿐만 아니라 기업에서 실제 기술에 배포해서 쓸 수 있도록 다양한 지원을 해주고 있다. 데이터센터나 모바일 앱에 적용할 수 있다. 실제로 구글은 안드로이드 앱에 텐서플로를 적용해 활용하고 있다.

질문 : 당신과 같이 좋은 개발자가 되려면 매일 무엇을 해야 할까?

답변 : 아침을 먹어라. (웃음) 내가 좋아하는 것은 내가 알지 못하는 다른 분야 전문가와 만나고 이야기하는 것이다. 다른 전문가와 함께 이야기 하면 혼자 내놓을 수 있는 결과보다 훨씬 다른 결과를 만들 수 있다. 다른 사람의 전문분야에서 무엇인가를 배울 수 있다고 본다. 그러한 경험이 다음에 무엇인가 시작할 때 도움을 받을 수 있다.

질문 : 작은 회사에서는 양질의 데이터를 대량으로 얻기 힘들다. 대학에서도 그렇다. 많은 컴퓨팅 자원을 활용하기도 힘들다. 작은 회사나 그룹에서 머신러닝을 어떻게 연구해야 하는지 조언해 줄 수 있나?

답변 : 큰 회사는 많은 데이터를 접근할 수 있다는 장점을 가진다. 작은 회사라면 외부에 공개된 데이터들도 일단 풀고 싶은 문제를 해결하기 위해 모델을 만들 수 있을 것이다. 똑같지는 않지만 비슷한 모델을 만들 수 있다. 그리고 조금씩 뜯어고치면서 더 나은 훈련을 할 수 있을 거라고 본다. 구글이 향후 새로운 데이터를 공개할 것인지는 여기서 언급할 수 없다. ‘이미지넷’ 데이터는 이미 외부에 공개했다. 이 데이터는 컴퓨터 비전 분야에 영향을 주었다. 컴퓨팅 자원 문제는 클라우드를 이용하면서 해결할 수 있을 거라고 본다.

질문 : 엔지니어로 살아오면서 저질렀던 가장 큰 실수는 무엇인가? 또 그 실수는 어떻게 해결했는가?

답변 : 아주 많다. ‘빅테이블’이라고 있다. 2004-2005년께 만든 시스템이다. 그 시스템에는 분산 트랜잭션(distributed transaction)과 관련된 도구가 없다. 많은 팀이 그 기능을 원했다. 이 기능이 없어서 제대로 동작 안 되는 부분이 있었다. 그래서 빅테이블 핵심 기술 안에 분산 트랜잭션 기능이 있었어야 하는거 아닌가라는 생각이 들었다. 향후 ‘스패너’를 만들어 보안하기도 했다.

질문 : 만약에 게임을 스스로 할 수 있는 AI를 만든다고 치자. 그 AI를 만드는 개발자는 해당 게임을 아주 전문적으로 잘 해야 하는가? 비슷한 질문으로, 알파고 연구자들은 바둑을 잘 두는가?

답변 : 질문을 조금 확장해서 이야기하자면, 당신이 만약에 특정 문제를 머신러닝으로 풀려고 한다면, 당신은 해당 문제와 관련한 분야에 전문성이 있어야 한다. 또한 관련 전문가가 함께 일한다면 도움을 받을 수 있다. 하지만 전문가가 없는 경우가 대부분이다. 예를 들어, 의학 이미지를 연구한다고 했을 때 엑스레이 사진을 해석할 수 있는 전문가가 옆에 있으면 좋을 것이다. 그렇다고 모두가 엑스레이 전문가가 될 필요는 없다. 알파고 연구원들 중에는 바둑을 둘 수 있는 사람이 몇 명 있는 걸로 알고 있다. 또한 바둑을 잘 모르는 연구원도 있다.

질문 : 당신은 그동안 많은 문제를 해결했다. 문제 해결을 보통 어떻게 하는가? 구글 검색도 하는가? 아니면 동료에게 물어보는가?

답변 : 둘 다 맞는것 같다. 검색엔진은 유용하지 않나. (웃음) 나도 검색을 한다. 동료와 토론하는 것도 아주 유용하다. 동료와 토론할 수 있는 문화는 구글 환경에서 좋아하는 부분이다. 구글에는 서로 배경이 다른 다양한 사람이 있다. 가끔씩 아주 놀라울 정도로 넓고 다양한 지식을 가진 사람이 있다. 그런 사람들에게 질문을 하고 배우기도 한다.

질문 : 딥러닝은 현재 음성, 비디오, 언어 분야에 적용돼 활용되고 있다. 앞으로 구글은 어떤 애플리케이션에 딥러닝을 적용할 예정인가? 딥러닝의 수준을 어떻게 평가하는가?

답변: 로봇이나 헬스케어쪽에 딥러닝이 더 적용되지 않을까 싶다. 머신러닝을 적용하기에 유용한 분야다. 딥러닝의 수준을 파악할 때 필요한것은 기계가 이전에 풀어본적 있는 비슷한 문제를 다시 풀 수 있느냐다. 새로운 데이터를 적용해서 풀 수 있는지도 중요하다.

질문 : ‘제프 딘의 29가지 진실‘에서 진짜 내용은 얼마나 있는가?

답변 : 제프딘의 진실은 사실 동료가 만우절 장난으로 만든거다. 그게 여기저기 퍼졌다. 굉장히 나를 칭찬하는 것처럼 이야기했는데, 조금 민망하다. (웃음)

질문 : 가장 좋아하는 언어는 무엇인가?

답변 : 나는 C++와 애증 관계에 있다. (웃음) C++는 아주 유용하지만 동시에 최근 몇 년간 복잡해졌다. C++11, C++14가 나오지 않았나. 새로운 기능이 나오기도 했다. 보통 C++로 작업한다. 하지만 구글 동료들이 만든 ‘고’ 언어에 대해서도 관심이 많다. 실제로 고로 프로그래밍을 해본 적은 별로 없다. 하지만 고는 간단하고 로우 레벨 시스템을 개발하는 데 도움이 된다고 본다.

질문 : 텐서플로 티셔츠는 어떻게 얻을 수 있는가?

답변 : 오늘은 하나밖에 안 가져왔다. (웃음)

3월7일 행사 참가자 중 상당수는 향후 업무에 딥러닝을 적용할 계획을 가지고 있었습니다. 머신러닝 연구 때 사용할 수 있는 데이터에 대해 관심을 보이기도 했습니다. 고등학생, 대학생, 게임회사 개발자, 스타트업 CEO 등 다양한 출신의 개발자를 볼 수 있었습니다. 이들의 소감을 들어볼까요.

올해 18살인 이승우 학생은 “머신러닝 스터디 모임에 참여하면서 제프 딘 행사도 있다는 것을 알고 오고 싶었다”라며 “한국에도 데이터세트가 API를 통해서라도 개방돼 머신러닝 연구원들에게 많은 길이 열렸으면 좋지 않을까 생각했다”라고 밝혔습니다. 딥러닝 전문 기업을 운영하는 김선우 딥바이오 CEO는 “제프 딘은 최근에 딥러닝 분야에서 여러 발표를 하던 분이라 딥러닝 공부하는 사람으로서 그 존재를 이미 알고 있었다”라며 “데이터가 많아질수록 큰 규모의 모델과 더 많은 계산이 필요하고 이로 인해 좋은 결과를 낼 수 있다는 말이 인상적이었다”라고 소회를 밝혔습니다.

외국인이자 텀블벅에서 일하고 있는 비욘 개발자는 “제프 딘은 가장 뛰어난 컴퓨터과학자 중 한명으로 널리 알려져 있다”라며 “텐서플로우에 대한 소개와 딥러닝을 구글에서 어떻게 활용하는지 이야기하는 부분이 기억난다”라고 말하더군요. 또한 차창호 프리랜스 개발자는 “AI 엔지니어는 아니지만 최근 트렌드가 되니깐 계속 관련 논문이나 글을 찾아보고 있다”라며 “이번 발표는 아주 새로운 이야기를 하는건 아니지만 제프 딘을 통해 직접 설명을 들을 수 있다는 점이 의미가 있었다”라고 말했습니다. 서재원 서강대 대학생은 “제프 딘은 텐서플로우를 만든 사람으로 알고 있다”라며 “실제 발표를 듣고 만나니 상당히 대단한 분이라고 생각이 들더라”라고 말했고요. 길소연 대학원생은 “향후 업무에서 머신러닝을 도입할 예정”이라며 “작은 회사에서 데이터들을 어떻게 얻고 활용해야 하는지, 또 학생으로서 딥러닝 공부는 어떻게 해야되는지 대한 답을 얻을 수 있었다”라고 소감을 밝혔습니다.

이번 행사를 총괄한 권순선 구글 APAC 개발자 플랫폼 총괄은 “오늘 이렇게나 많은 질문이 나올지 몰랐다”라며 “참여 개발자들의 열정과 관심에 놀랐다”라고 행사에 만족감을 표시했습니다.

출처: https://www.bloter.net/archives/251561


'Others' 카테고리의 다른 글

OOP - S.O.L.I.D  (0) 2016.03.22
[현장] 전설의 개발자 제프 딘, 한국 개발자를 만나다  (0) 2016.03.20
Bluetooth Low Energy  (0) 2016.01.26
코드 하이라이트 사용법  (0) 2015.10.26
Bluetooth 4

BLE(Bluetooth Low Energy) 이해하기

 

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

 

BLE 블루투스 모듈을 이용해서 다양한 앱과 장치를 만들기 위해서는 먼저 BLE 의 구조와 컨셉, 스펙에 대해서 이해할 필요가 있습니다. 국내외의 자료 중 비교적 이해가 쉬운 자료들을 정리했습니다.

 

Bluetooth Low Energy(BLE)

BLE는 종종 Bluetooth Smart 로도 불리며 classic bluetooth의 경량화 버전을 목표로 블루투스 4.0의 일부로 발표되었습니다. Classic bluetooth와 겹치는 부분이 존재하지만 BLE는 완전히 다른 표준으로 블루투스 표준화 그룹인 Bluetooth SIG에 의해서 개발되기 전까지 Nokia의 사내 프로젝트(Wibree)로 시작하였습니다.

BLE 지원 플랫폼

iOS5+ (iOS7+ preferred)
Android 4.3+ (numerous bug fixes in 4.4+)
Apple OS X 10.6+
Windows 8 (XP, Vista and 7 only support Bluetooth 2.1)
GNU/Linux Vanilla BlueZ 4.93+

 

# GAP

GAP는 Generic Access Profile의 약자로 블루투스에서 게시(advertising)와 연결(connection)을 제어합니다. GAP은 특정 장치가 다른 장치들에게 어떻게 보여지도록 할 것인가와 어떻게 두 장치를 연결할 것인가를 결정합니다. GAP은 장치들이 맡을 수 있는 다양한 역할들에 대해 정의합니다. 그 중 가장 핵심이 되는 컨셉은 Central장치와 Peripheral 장치입니다.

Peripheral 장치는 주로 작고, 저전력으로 동작하고, 제한된 리소스를 가진 장치들로 보다 리소스가 풍부한 Central 장치에 연결되어 동작하도록 설계된 장치입니다. Heart Rate Monitor(심박측정기), BLE 근접센서 태그 등이 해당됩니다. 이하 글에서는 이해의 편의를 위해 Peripheral 장치를 [센서 장치]로 표현합니다.

Central 장치는 폰이나 태블릿과 같이 충분한 전원과 메모리 등의 리소스를 갖춘 장치입니다. 이하 글에서는 이해의 편의를 위해 [폰] 등으로 표현합니다.

 

# Advertising and Scan Response Data

GAP을 이용해서 게시(Advertising)를 할 때 Advertising Data Payload와 Scan Response Payload 를 포함할 수 있습니다. 
두 가지는 서로 구분되며 31바이트까지 데이터를 포함할 수 있습니다. 하지만 Advertising Data Payload 가 필수인데 반해 Scan Response Payload는 선택적입니다. Advertising Data Payload 는 Central 장치가 인식할 수 있도록 peripheral 장치(센서장치)에서 계속 송출되는 데이터입니다. Scan Response Payload 는 central 장치(폰)에서 장치 이름과 같이 추가적인 정보를 요구하기 위해 정의된 것으로 선택적으로 구현됩니다.

# Advertising Process

Advertising 과정이 어떻게 동작하는지는 아래 그림을 참고하세요.

microcontrollers_Advertising2

먼저 센서장치는 특정한 게시 주기(advertising interval)를 가지고, 이 주기마다 advertising packet을 전송합니다. 주기가 길어질수록 전력소모를 줄여주지만 Central 장치에서의 반응이 느려집니다. 만약 수신 장치(central 장치)에서 Scan Response Data 에 관심이 있다면 추가로 요청을 보낼 수 있고 peripheral 이 여기에 데이터와 함께 응답할 것입니다.

 

# Broadcasting, Beacon

Peripheral 장치는 31바이트 정도의 작은 데이터를 실어서 게시(advertising)를 함으로써 낮은 비용으로 주변의 central 장치에 자신의 존재를 알릴 수 있습니다. BLE에서는 이것을 Broadcasting 이라고 부릅니다. 그리고 오로지 advertising 역할만을 하는 Peripheral 장치가 바로 비컨(Beacon) 입니다. 애플의 iBeacon은 advertising packet 의 custom payload 내용을 특정한 형식으로 작성하도록 정의하고 있습니다.

일단 Central, Peripheral 두 장치가 연결되면 advertising 은 종료되어 외부 장치에서 scan 되지 않습니다. 이제 GATT 서비스와 특성(characteristic)을 사용하여 양방향으로 통신하게 됩니다.

 

# 주요 용어와 컨셉

자세한 설명이 이어지기 전에 곧 언급될 주요 용어들과 컨셉을 소개합니다.

GATT (Generic Attribute Profile) : GATT는 두 BLE 장치간에 Service, Characteristic 을 이용해서 데이터를 주고 받는 방법을 정의한 것입니다.
Attribute Protocol (ATT) : GATT는 ATT의 최상위 구현체이며 GATT/ATT로 참조되기도 합니다. 각각의 속성(Attribute)은 UUID를 가지며 128비트로 구성됩니다. ATT에 의해 부여된 속성은 특성(characteristic)과 서비스(Service)를 결정합니다.
Characteristic : 하나의 특성(characteristic)은 하나의 값과 n개의 디스크립터를 포함합니다.
Descriptor : 디스크립터는 특성의 값을 기술합니다.
Service : 하나의 서비스는 특성들의 집합입니다. 예를 들어 “Heart Rate Monitor”라고 불리는 서비스를 가지고 있다면 그 서비스는 “heart rate measurement”같은 특성을 포함합니다.

GATT-based profile의 리스트와 서비스는 bluetooth.org 에서 확인할 수 있습니다.

 

# 역할에 따른 구분 (복습)

Central / Peripheral

BLE 로 연결되기 위한 서로의 역할을 구분한 것입니다. central 은 scan, 게시검색(looking for advertisement)을 담당합니다. 그리고 peripheral 은 게시(advertisement)를 만듭니다. 예를들어 폰과 센서장치가 있다면 폰이 주변의 센서장치를 스캔하는 역할을 할 것이므로 central 이 됩니다. 반대로 센서장치가 peripheral 이 됩니다. 중요한 점은 peripheral 은 오로지 하나의 central 장치에만 연결될 수 있습니다. peripheral 이 central 에 연결되면 게시(advertising)를 중단하기 때문입니다. 따라서 다른 central 장치는 peripheral의 연결이 해제될 때 까지 찾을 수 없습니다.

GATT server(slave) / GATT client(master)

BLE 장치가 연결된 이후 어떻게 서로 통신하는지에 대해 정의합니다. 일반적으로 peripheral 장치(센서장치)가 GATT server 역할을 하며 ATT lookup data, service, characteristic 에 대한 정의를 가지고 있습니다. GATT client(폰, 태블릿 등)에서는 GATT server 로 데이터 요청을 보냅니다. 모든 동작(transaction)은 GATT client 에서 시작되어 GATT server로 부터 응답을 받게 됩니다.

두 장치가 연결될 때 peripheral(센서장치) 은 연결간격(connection interval)을 전달합니다. Central(폰)은 이 시간만큼 간격을 두고 새로운 데이터가 있는지 재연결을 시도할 수 있습니다. 하지만 이것은 필수 사항은 아닙니다.

 

# 전체 구조

BLE에서 사용하는 GATT 기반 동작구조는 프로파일(Profile), 서비스(Service), 특성(Characteristic) 에 기초합니다. 아래 이미지와 같은 수직 구조를 이룹니다.

microcontrollers_GattStructure

프로파일(Profile)

프로파일은 BLE peripheral(센서장치) 에 실제로 존재하는 것은 아닙니다. 이것은 Bluetooth SIG(블루투스 표준 개발그룹) 혹은 peripheral(센서장치) 디자이너에 의해서 만들어진, 미리 정의된 서비스의 묶음입니다. 

Heart Rate Profile (HRP)을 예로 들어보겠습니다. 이 프로파일은 Heart Rate Service(필수)와 Device Information Service(선택)를 결합한 것입니다. 이 두 서비스를 묶어서 Heart Rate Profile 이라고 정의했으며 논리적인 구분이라고 보시면 됩니다.

서비스(Service)

서비스는 데이터를 논리적인 단위로 나누는 역할을 하며 특성(characteristic)이라 불리는 데이터 단위를 하나 이상 포함하고 있습니다. 각 서비스는 UUID라 불리우는 16bit(for officially adopted BLE Services) 혹은 128bit(for custom services) 구분자를 가지고 있습니다. 표준 그룹에서 제정한 공식 서비스 리스트는 [링크]에서 확인할 수 있습니다.

이 중 Heart Rate Service 를 확인해보면 16-bit UUID – 0x180D 를 사용함을 알 수 있습니다. 그리고 이 서비스는 3개의 특성(Heart Rate Measurement, Body Sensor Location, Heart Rate Control Point) 을 가지고 있고 이 중 Heart Rate Measurement 만 필수임을 알 수 있습니다.

특성(Characteristic)

GATT 기반 동작구조에서 가장 하위 단위는 특성입니다. 특성은 단 하나의 데이터만을 포함합니다. 가속도 센서처럼 X, Y, Z 축 값이 한 쌍을 이루는 경우 일련된 값의 나열(배열)도 하나의 데이터로 간주합니다. 

서비스와 유사하게 특성도 16-bit 또는 128-bit UUID 를 가지고 있고 표준 특성 리스트를 제공합니다. 혹은 본인의 목적에 맞게 특성을 정의해도 됩니다. 

예를들어 Heart Rate Measurement 특성은 Heart Rate Service 의 필수 특성으로 UUID – 0x2A37 을 사용합니다. 이 특성은 데이터의 첫 8bit 중 첫 1bit 가 Heart Rate Measurement(HRM) 데이터 타입을 표시합니다. 데이터 타입이 0일 경우 이어지는 HRM 데이터는 UINT8 타입이고 1일 경우는 UINT16 입니다. 이와같이 BLE에서 특성은 peripheral(센서장치)와 데이터를 주고 받는데 핵심 역할을 합니다. 특성은 또한 Central(폰) 장치에서 peripheral(센서장치)로 데이터를 전송할 때도 사용됩니다.

 

간략하게 실제 폰에서의 동작과정을 요약하면 Central(폰) 장치는 아래와 같은 순서를 거쳐 데이터를 받아 처리합니다.

  • 먼저 폰은 주변의 BLE 장치를 스캔합니다. (GAP profile 이 정의하는 것이 이 과정. 주기적으로 advertising 이 되는 데이터가 어떻게 이루어져 있는지를 정의)
  • 폰은 스캔 결과에서 원하는 peripheral(센서장치)가 보이면 연결 (두 장치가 연결되면 센서장치는 advertising을 종료, Central(폰)은 GATT client 역할을 하고 GATT server에 연결하는 것)
  • 이제 이후부터는 안드로이드, iOS 프레임웍에서 GATT client를 운영하고 데이터 수신, 연결 상태의 변화 등 각종 이벤트가 발생 할 때 앱에 알려주게됩니다. (이 과정을 운용하기 위해 필요한 내용들이 GATT/ATT에 정의됨)
  • 먼저 연결된 장치의 GATT 정보와 Service  정보를 수신 (Service UUID 정보로 확인)
  • Characteristic 정보 수신 (UUID 값으로 실제 처리할 데이터를 추출)

 

 

 

참고 : android Bluetooth LE programming(BLE) , Adafruit(BLE Tutorial)

Bluetooth Core Specification
Bluetooth Developer Portal 
Officially Adopted BLE Profiles 
Officially Adopted BLE Services 
Officially Adopted BLE Characteristics 

Mobile Development Resources: Application Accelerator Kit (Sample BLE code for iOS, Android or Windows Phone)

출처 : http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1132

'Others' 카테고리의 다른 글

OOP - S.O.L.I.D  (0) 2016.03.22
[현장] 전설의 개발자 제프 딘, 한국 개발자를 만나다  (0) 2016.03.20
Bluetooth Low Energy  (0) 2016.01.26
코드 하이라이트 사용법  (0) 2015.10.26

- 코드 하이라이트(Syntax Highlighter) 사용하기

  • 코드 하이라이트를 사용하기 위해서는 편집 화면 오른쪽위의 HTML 편집으로 전환해야 한다. 그리고 pre 태그의 class 속성에 "brush:브러쉬명"을 입력하고, pre 태그 안 쪽에 코드를 입력하면 된다.
1
2
3
<pre class="brush:브러쉬명">
    코드 기입
</pre>
  • 언어 JS파일과 브러쉬명은 아래와 같다.
    언어[브러쉬명]파일명
    ActionScript3as3, actionscript3shBrushAS3.js
    Bash/shellbash, shellshBrushBash.js
    ColdFusioncf, coldfusionshBrushColdFusion.js
    C#c-sharp, csharpshBrushCSharp.js
    C++cpp, cshBrushCpp.js
    CSScssshBrushCss.js
    Delphidelphi, pas, pascalshBrushDelphi.js
    Diffdiff, patchshBrushDiff.js
    Erlangerl, erlangshBrushErlang.js
    GroovygroovyshBrushGroovy.js
    JavaScriptjs, jscript, javascriptshBrushJScript.js
    JavajavashBrushJava.js
    JavaFXjfx, javafxshBrushJavaFX.js
    Perlperl, plshBrushPerl.js
    PHPphpshBrushPhp.js
    Plain Textplain, textshBrushPlain.js
    PowerShellps, powershellshBrushPowerShell.js
    Pythonpy, pythonshBrushPython.js
    Rubyrails, ror, rubyshBrushRuby.js
    ScalascalashBrushScala.js
    SQLsqlshBrushSql.js
    Visual Basicvb, vbnetshBrushVb.js
    XMLxml, xhtml, xslt, html, xhtmlshBrushXml.js


'Others' 카테고리의 다른 글

OOP - S.O.L.I.D  (0) 2016.03.22
[현장] 전설의 개발자 제프 딘, 한국 개발자를 만나다  (0) 2016.03.20
Bluetooth Low Energy  (0) 2016.01.26
코드 하이라이트 사용법  (0) 2015.10.26

+ Recent posts