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 PayloadScan 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)

 

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

 

 

About

TORTUGA

궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

25 Responses

  1. 무척 깔끔하게 BLE을 정리해 놓으셨네요.
    감사합니다.

  2. 안녕하세요. 제품 기획으로 검색을 하다가 좋은 자료를 보고 질문이 있어 글을 남깁니다.
    주변 장치에서 보내는 advertising data를 받아 센트럴(스마트폰)과 connection(페어링)을 하여 신호 송수신을 하려고 합니다. 이런 경우 주변 장치는 advertising data를 또지속적으로 쏠 수는 없는 건가요?
    서비스 상 타인의 스마트폰에서 해당 액티브 상태인 주변장치가 주변에 있는지 알려주고 싶은데~ 방법이 없을까요? 칩을 두개써야만 되는지~~~
    여기 저기 물어봐도 엄한 대답만 들려와서 이렇게 생뚱맞게 질문 올려봅니다 ~^^

    • TORTUGA

      네 제가 알기로는 페어링 이후로는 advertising이 안되는걸로 압니다. 2개 모듈을 사용해야 할 것 같습니다.

    • 가능합니다. Central/Peripheral 역할을 동시에 수행하는 형태로 만들 수 있습니다.
      얼마전 프로젝트에서, Peripheral이 Smart폰과 연결 중에도 advertising하는 것을 했었습니다.
      Nordic을 사용하신다면 softdevice 130을 사용하시면 됩니다.

      • 스마트폰이나 태블릿이 아닌 스스로 SCAN 하고 가장 신호가 강한 DEVICE와 자동으로 연결하는 것을 만들고 싶습니다.
        1. RSSI 를 측정하는 것은 CONNECTION 이 이루어지고 할 수 있는 것인지
        2. 주변 PERIPHERAL 들이 ADVERTISING 하는 것을 SCAN 할 수 있는 DEVICE를 만드려면 어떤 칩을 써야할지
        궁금합니다. 왜 스마트폰은 스캔하고 연결하는게 가능한데 AT COMMAND 에서 조차 SCAN 하는 것을 찾기가 힘든걸까요?

      • TORTUGA

        좋은 정보 감사합니다. 페어링 이후에는 안되는 줄 알았는데 펌웨어 고치면 가능한가보네요? 의외로 이런 기능 원하는 분들 많으시던데 자세한 내용을 찾아봐야겠네요.

  3. ble 제품의경우에 커넥팅 된 상태에서는 스켄으로 탐색할수 없나요??

  4. ‘peripheral 은 오로지 하나의 central 장치에만 연결될 수 있습니다. (advertising)를 중단하기 때문입니다.’

    라고 하셨는데 그러면 예를 들어 peripheral을 비콘으로 가정할 때 비콘에서 일정 장소에 모든 central 장치에 일괄적으로 팝업을 띄울 수는 없나요? 같은 공간안에 하나의 장치에만 팝업을 띄울 수 있나요?

  5. 안녕하세요?
    ble에 대해 공부하고 있는 학생입니다.
    궁금한점이 있어 질문 드려도 될까요?
    1. ble가 advertising상태이고 central이 scan request를 하였을때 ble에서는 scan response를 보내주는 것으로 알고 있습니다.
    이때 주고받는 scanA(scan address)와 advA(advertising address)가 정확히 무엇인가요? central과 peripheral의 mac address인지요?

    2. scan req, scan rsp 에서 pdu header를 보면 TxAdd와 RxAdd가 0인경우는 public이고 1인 경우는 random이라고 하는데 정확한 정의가 없네요…설명 부탁드립니다.

    3. 마지막으로 ScanRspData를 보면 peripheral의 이름이 헥사값으로 전송이 되는데 이 데이터를 다른 데이터로 바꿔서 응답 할 수 있는지요?

    감사합니다^^
    기회가 된다면 교육을 참석하고 싶습니다.

    • TORTUGA

      1. MAC address 로 알고 있는데 정확치 않습니다. 스펙을 확인해봐야 겠습니다.
      2. 이것도 좀 어렵네요.
      3. 바꿔도 되긴 하는데 블루투스 모듈의 펌웨어를 수정해야 하는 부분이라 저도 그렇게 해본적이 없습니다. 모듈이 제공하는 AT 커맨드만으로는 한계가 있더라구요. 가끔 비컨+센서 형태로 나온 BLE 모듈들이 ScanRspData를 이용하는것 같습니다.
      ==> 이미 질문의 수준이 오프라인 강좌에서 제공하는 수준을 넘어선것 같네요. 도움이 될런지;;;

  6. 제가 두 기기를 연결해서 한쪽은 scan 다른 한쪽은 advertising해 간단한 string data를 지속적으로 보내는 Application을 만들어보려고 하는데요. scan에 대한 소스는 많이 보이는데 advertising에 대한 샘플은 잘 보이지 않아서요. 혹시 advertising에 대한 샘플소스를 구할만한 곳이 있을까요? api가 L 이후로는 Android Studio에서 생성하는 gradle이나 maven쪽 밖에 안보이는 것 같은데 eclipse에서 자바로 짜는 코드도 Sample이 있을까하여 문의 드립니다. 답변좀 부탁드립니다. ^^ㅎㅎㅎ

  7. 안녕하세요! 제가 학교 연구소에 있는데 비영리 목적으로 교육자료를 만드는데
    내용을 차용 해도 될까요? 문의 드립니다.

  8. 기존 Bluetooth classic이랑의 차이점을 알 수 있어서 너무 감사합니다!
    혹시 시판되는 BLE 모듈과 classic 모듈간에도 통신이 가능한가요?

    스마트폰용 3축 짐벌을 bluetooth 리모컨으로 통신이 가능하도록 개발중이거든요
    혹시 짐벌용 보드에 BLE 모듈을 썼다가 리모컨이랑 호환이 안될까 걱정이네요 ㅠㅠ
    리모컨은 시판용을 이용해서 쓰는거라 BLE 타입이 없거든요;;

    • TORTUGA

      classic과 BLE는 완전히 다른 스펙이므로 통신 불가합니다. 다만.. 블루투스 BLE 모듈중에 classic, BLE를 동시에 지원하는 모듈이 있습니다. HM-12 던가? 그럴겁니다. 그걸 사용하면 BLE 연결과 classic 연결을 동시에 할 수 있습니다.

  9. 궁금한 점이 있어서 이쪽으로 질문 드립니다…웹사이트가 열리지 않아서…
    BLE pairing 이용한 제품을 만들려고 하는데요.
    스마트폰에서 쏴주는 data를 통해서 display를 시켜주는 제품을 만들려고 하는데
    BLE 4.0이 전송할수 있는 data량이 얼마나되는지 궁금합니다..
    ex..동영상 같이 큰 파일도 pairing를 통해서 display 할 수 있는지…
    궁금합니다..

    • TORTUGA

      BLE가 핸즈프리 제품에도 쓰이니까 음성 데이터 송수신은 가능한데, 비디오 송수신은 힘들겠네요. BLE가 오히려 Bluetooth 2.0 보다 속도는 더 느린걸로 압니다.

  10. ble 통신 시 블루투스 모듈칩과 바로 연결이 안되고 일정 시간이 흐른 후 연결되는 경우가
    있습니다.
    해당 소스 상에서 AutoConnect 상태를 true로 한 경우에 연결은 됩니다.
    mBluetoothGatt = device.connectGatt(this, true, mGattCallback);

    일정 시간동안 대기 하지 않고, 바로 연결되게 하려면, Android 소스 상에서
    컨트롤을 해야 하는 건가여
    아니면, 블루투스 모듈에 Connection Interval이 있는 것으로 알고 있습니다.
    거기서 컨트롤 하는 것인지 문의 드립니다.

  11. AutoConnect 상태를 false로 한 경우에는 연결이 되는 경우와 연결이
    되지 않은 경우가 있습니다.
    mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

  12. 와.. 전자공학전공하는 학생인데, BLE관련 자료 찾다가 여기까지 오게되었습니다.
    정리가 정말 잘 되어있는듯 합니다. 이해가 쏙쏙되네요.! 정독하고 갑니다.^^
    감사합니다~~

  13. 정말 좋은 글을 보았습니다.
    centeral과 peripheral사이의 자료송수신 쌤플을 좀 가지고 있으면 좀 주시겠습니까?

댓글 남기기

이메일은 공개되지 않습니다.