본문 바로가기
IoT

[IoT] BLE 개념과 프로토콜 스택

by 태크민 2023. 8. 30.

블루투스란 무엇인가?

1994년에 에릭슨이 최초로 개발한 디지털 통신 기기를 위한 개인 근거리 무선 통신 산업 표준이며,

2.4~2.485GHz의 전파를 이용하여 전자 장비 간의 짧은 거리의 데이터 통신을 할 수 있게 하는 기술이다.

블루투스 버전 역사

블루투스 1.0(1999년): 블루투스 모듈은 있으나 기기의 제조사가 다르면 호환 안되는 문제 있음

블루투스 2.0(2004년): 속도 개선, 장치 간 호환성 많이 개선

블루투스 3.0(2009년): 속도, 안정성 향상됨. 블루투스 간에 사진, 그림, 동영상을 주고 받을 수 있음

블루투스 4.0(2010년): 전력소모면에서 아주 많이 개선되고 LTE통신이 나오면서 블루투스와의 간섭이 심해지는 문제 개선, 거리가 멀어져서 서로 연결이 해제 됐을 때 자동으로 다시 연결하는 기술이 포함됨

블루투스5.0(2016년): 전송속도, 통신거리 등이 IoT시대에 초점이 맞춰져서 업데이트됨


BLE란?

Bluetooth Low Energy)의 약자로 저전력으로 통신하는 블루투스 기술

과거 블루투스의 가장 큰 문제점은 배터리 소모가 크다는 것이었다. 블루투스를 오래 연결하고 있으면 배터리가 많이 닳아서 사용하지 않을 땐 꺼두어야 한다는 인식이 있었는데 블루투스 4.0 이후부터는 이 문제를 해결하여 저전력으로 근거리 무선 통신이 가능하게 되었다. 블루투스4.0 이후부터를 BLE 통신이라고 부른다.

BLE의 통신 방법

: BLE를 지원하는 디바이스들은 기본적으로 Advertise(Brodcast)과 Connection이라는 방법으로 외부와 통신한다.

 

1. Advertise Mode(=Broadcast Mode)

주로 자신의 존재를 알리거나, 적은양의 User data를 보낼 때 사용한다.

Advertise 관점에서, 디바이스의 역할은 다음과 같이 구분된다.

  • Advertiser(=Brodcaster): 일정한 주기로 Non-Connectable Advertising Packet을 보내는 디바이스
  • Observer: Advertiser에게 Non-Connectable Advertising Packet 신호를 받기 위해 주기적으로 Scanning을 하는 디바이스

기존 Classic 방식은 Master가 주변 Slave에게 요청을 날리고, Slave가 그에 응답한 뒤 페어링을 시도하는 방식이었다.

반면, BLE는 Slave가 일정 간격으로 Advertise를 하고 Master가 이 스캔에 성공함으로서 페어링을 하게 된다.

 

2. Connection Mode

양방향으로 데이터를 주고 받거나, Advertise 만으로는 많은 양의 데이터를 주고 받을 수 없을 때 사용한다. 1대1 통신이다.

Advertise Mode에서 알게 된 기기 중에 하나를 선택해서 1:1로 연결하는 것이 Connection Mode이다. 디바이스가 일대일로 연결을 해서 디바이스 간에 데이터를 주고 받는 형태이다.

  • Slave: 디바이스와 Connection을 맺기 위해 Advertise 신호(Connectable Advertising Packet)를 주기적으로 보내다가, Master 디바이스가 연결 요청을 보내면, 이를 수락해 연결한다.
  • Master: 디바이스와 Connection을 맺기 위해 Advertise 신호(Connectable Advertising Packet)를 주기적으로 스캔하다가, 디바이스에 연결을 요청한다.

 

Connect 과정

Connecting Mode의 Connect과정을 핸드폰(Master), 디바이스(Slave)를 예를 들어 알아보자.

  1. 디바이스가 Advertising Channel을 Hopping하며 Advertising Packet을 보낸다.
  2. 핸드폰은 Advertising Channel을 Hopping하며 Advertising Packet을 Scan한다. 디바이스를 찾은 경우에 그 디바이스에 대한 추가 정보를 얻기 위해 Scan Request를 보낸다.
  3. Scan Request를 받은 디바이스가 Scan Response를 보낸다.
  4. 핸드폰은 그 Scan Response를 파싱하고 그 데이터를 봤을 때 연결을 하고자 하면 Connect Request를 보낸다.
  5. Connect 완료
  6. 데이터 교환 시작

 

BLE 프로토콜 스택

Application-Host-Controller 2개의 계층 구조를 이루며 동작한다.

1. Controller 계층

Controller 계층은 물리적인 부분과, 물리적인 요소를 제어하는 Low level 소프트웨어를 의미한다.

Link Layer, LE Physical Layer로 구성되며, 블루투스 모듈이 바로 Controller 계층에 해당된다.

Physical Layer(PHY)

PHY 는 RF 시스템 및 무선 전파(radio) 신호를 송수신하기 위한 하드웨어로 구성된다.

Physical Layer(PHY)에는 실제로 블루투스 아날로그 신호와 통신할 수 있는 회로가 구성되어 있어서, 아날로그 신호를 디지털 신호로 바꾸어주거나 디지털 신호를 아날로그 신호를 바꾸어주는 역할을 한다.

Link Layer

하드웨어와 소프트웨어 사이에서 동작하며, PHY Layer과 직접적으로 상호 작용하는 계층이다.

하드웨어 단에서는 복잡하고 처리하는데 비용이 많이 드는 작업들(Preamble, Access Protocol framing, CRC generation and verification 등)이 처리하고

소프트웨어 레벨에서는 블루투스 기기 간 통신 및 연결 상태를 관리한다.

Link Layer는 통신하는데 있어서 디바이스의 Role을 정의하고 이에 따라 변경되는 State를 가지고 있다.

Role

  • Mater: 연결을 시도하고 연결 후에 전체 connection을 관리하는 장치
  • Slave: Mater의 연결 요청을 수락하고, Master장치가 보내준 timing(호핑규칙)을 따르는 장치
  • Advertiser: Advertising packet을 보내는 장치
  • Scanner: Advertising Packet을 Scanning하는 장치

State

  • Standby State: Signal Packet을 보내지도, 받지도 않는 상태
  • Advertising State: Advertising Packet을 보내고, 해당 Advertising Packet에 대한 상대 디바이스의 Response를 받을 수 있고 이에 응답할 수 있는 상태
  • Scanning State: Advertising Channel에서 Scanning 하고 있는 상태.
  • initiating State: Advertiser의 Connectable Advertising Packet을 받고 난 후 Connection Request를 보내는 상태
  • Connecton State: Connection 이후의 상태

2. Host 계층

이 계층은 개발자가 구현하는 부분이 아니라 블루투스 모듈을 만든 회사가 이미 만들어두었다. 구성요소는 SMP, L2CAP,  GAP, GATT, ATT가 있다.

HOST 계층은 Controller 계층인 블루투스 모듈과 연결되어 블루투스 모듈을 제어하고 어플리케이션을 수행한다.

SMP(Security Manager Protocol)

SMP는 BLE연결의 암호화 및 보안을 관리하는데 사용되며, SM은 두 장치간에 암호화 통신을 할 때 필요한 key를 생성 및 교환할 수 있도록 보안 알고리즘을 제공한다.

이를 위하여 SM은 통신하는 디바이스에게 3단계의 절차를 요구한다.

  • Pairing: 연결을 활성화하기 위해 두 장치 간에 임시적으로 사용할 보안 키를 생성하고 나눠 갖는다.
  • Bonding: Pairing 과정을 마치고 나면 현재 사용중인 키를 저장해서 다음에 다시 연결할 때 Key 값을 재사용하도록 설정하는 단계이다.
  • Encryption Re-establishment: Bonding을 마치면 공유키가 두 장치에게 각각 저장된다. 다음에 연결했을 때 저장된 공유키를 사용하여 Pairing-Bonding 과정을 생략하고 바로 연결되도록 한다.

L2CAP(Logical Link Control and Adapton Protocol)

L2CAP는 소프트웨어적인 상위 계층과 하위 물리적인 계층 사이에 존재하여, 데이터를 어떤 규칙으로 전송할 것 인가에 대한 규약을 정의한다.

L2CAP는 패킷 전송을 하기 위해 세가지 특징을 가진다.

  • 재전송 금지
  • 전송 성공 or 통신 불능 시까지 시도
  • 일정 시간 동안 패킷이 승인되지 않으면 그 패킷을 버리고 다음 패킷을 전송

GAP(Generic Access Profile)

GAP는 Generic Access Profile의 약자로, 다양한 제조사에서 제작된 BLE 장치들이 서로 연동될 수 있도록 프레임워크를 제공한다.

GAP는 어떻게 디바이스가 서로를 인지하고 데이터를 advertising 하고 connection을 맺을지에 대한 프레임워크를 제공한다.

이때 각각의 장치는 GAP에서 정의한 하나 이상의 역할(role)을 맡게 된다.

Role

  • Central : Central 역할은 다른 디바이스의 Advertising Packet을 듣고 Connection을 시작할 때 시작된다. (Link Layer의 Master 역할과 상응)
  • Peripheral : Advertising Packet을 보내서 Central 역할의 디바이스가 Connection을 시작할 수 있도록 하게끔 유도한다. (Link Layer의 Slave 역할과 상응)
  • Broadcaster : 주기적으로 Advertising Packet을 보낸다. (Link Layer의 Advertiser 역할에 상응)
  • Observer : Broadcaster가 뿌리는 Advertising Packet에서 data를 얻는다. (Link Layer에서 Scanner 역할에 상응)

 

GATT(Generic Attribute Profile)

BLE 데이터 교환을 관리하는 GATT는 디바이스들끼리 데이터를 교환할 때, 데이터를 발견하고, 읽고, 쓰는 것을 규격화하고 데이터의 구조를 정의해 놓은 Profile이다.

따라서, 어떤 장치와 연결되더라도 일관된 방식으로 데이터를 주고 받을 수 있다.

GATT Server/Client

무선 연결된 디바이스 중 데이터를 가지고 있는 디바이스가 GATT server가 되고, 데이터를 요청하는 디바이스가 GATT client가 된다.

GATT server는 자신이 제공하는 서비스와 데이터를 아래와 같은 계층 구조로 만들어서 보관하고 있으며, 프로파일(Profile), 서비스(Service), 특성(Characteristic)로 구성된다.

  • Profile는 GATT server 역할을 하는 BLE 장치가 어떤 일을 하는 장치 인지를 나타내는 개념적인 구분이다. 블루투스 공식 홈페이지에서 GATT Specification 페이지를 보면 프로토콜에서 정의한 표준 profile들이 있는데, 혈압 profile, 심박 profile 등이 있다.
  • Service는 특정한 기능과 관련이 있는 데이터들의 집합이다. 서로를 구분하기 위해 고유한 UUID값을 가지는데, 블루투스 표준에 정의된 Service인 경우 이미 정의된 16Bit UUID 값을 가진다.
  • Characteristic은 실질적인 데이터를 담고 관리한다. 센서 장치가 Characteristic에 설정된 값을 변경하면 GATT client가 Read 요청을 보냈을 때 읽어가는 값도 변경이 된다. 혹은 GATT client에서 Characteristic에 값을 쓸 수도 있다.Broadcast, Read, Write, Notify, indicate
    • Broadcast : 이 값을 설정하면 Characteristic value 값이 advertising packet에 포함되어 전송된다. 즉, BLE 연결 없이 advertising packet 만 scanning 해서 값을 받을 수 있다.
    • Write : GATT client는 value 에 값을 기록할 수 있다.Characteristic Properties를 통해 GATT client는 어떤 데이터를 읽고 쓸 수 있는지 알 수 있다.
    • Notify : value 값에 변경되면 GATT client 에 알려주는 기능이다.
    • Read : GATT client는 value 값을 읽을 수 있다.
    • Broadcast : 이 값을 설정하면 Characteristic value 값이 advertising packet에 포함되어 전송된다.
  • Characteristic Propertites는 다음 값들을 가질 수 있다.

ATT(Attribute)

BLE 프로토콜 스택에서 Attribute protocol(ATT)은 서버(Server)와 클라이언트(clinet)사이의 데이터 교환에 대한 규칙을 정의한다.

어플리케이션 단에서의 데이터 교환은 ATT를 기반으로 이뤄지며 각각의 데이터 구조는 GATT에 의해 정의되는 데이터 구조를 따른다.

ATT는 GATT에서 정의한 Service, Characteristic의 개념들을 데이터 형태로 저장하기 위한 스펙이라고 할 수 있다. ATT는 Client ↔ Server 관계에 기반을 두며, 서버는 센서의 값과 같은 정보를 갖고 있고, 이 정보는 table에 정리되어있는데 이를 Attribute Table이라 한다. Table의 각 Attribute는 여러 속성(Property)으로 연관되어 있다.

 


안드로이드에서 BLE 사용

[Bluetooth 연동 순서]

  1. Bluetooh Scanning
  2. Choose Device
  3. Bluetooth Connect (GATT)
  4. Read/Notify Value

1. Service UUID & WRITE & READ Characteristic UUID 정보


2. Bluetooth Scanning


3. Scan Callback 선언


[Log] 검색된 Device

 

4. GATT 서버 Connection

 

5. GATT Callback 선언


6. GATT 서버에서 제공하는 Service 검색

onServicesDiscovered는 기기의 Service, Characteristic이 업데이트(발견)되었을 때 실행된다. 이곳에서 원하는 Service를 찾거나 해당 Service에 대한 작업을 수행한다.


특정 bluetooth device에 연결하여 read, wrtie해야할 경우,

read,wrtie에 필요한 Characteristic을 onServicesDiscovered에서 찾을 수 있다.

service에서 포함하고 있는 characteristic을 검색하여 propertiy가 WRITE or WRITE_NO_RESPONSE 의 경우 write,

NOTIFY일 경우 read할 수 있는 characteristic이다.

 

그리고 검색한 characteristic을 Gatt서버에 연결시켜주고 추가적으로 Characteristic 특성의 하위에 있는 descriptor를 설정함으로써 GATT notification setting을 처리한다.

 

7. GATT Read/Write Callback

onCharacteristicWrite : 클라이언트가 특성(characteristic)에 데이터를 쓸 때 호출

onCharacteristicRead : 서비스안의 특성을 읽었을때 호출됨. 즉, 클라이언트가 BluetoothGatt.readCharacteristic() 메서드를 사용하여 특성에서 데이터를 읽을 때 호출

onCharacteristicChanged : 서비스안의 특성의 값이 바뀔 때 호출
즉, 다른 디바이스 또는 클라이언트가 해당 특성의 값을 업데이트하면 이 콜백이 호출된다.

 

[Log] 검색된 Service, Characteristic 

 

[Log] Device 제어(Send) 후 응답(Noti)