참고:
첫 포스팅에서는 간략한 BLE 작동을 보았고, 이번에는 모든 프로세스와 관련된 개발에 대해 더 자세히 알아보려 한다. BLE를 이용하기 위한 Nordic의 SW Stack은 API로만 접근할 수 있으며 5개의 Link Layer 상태가 존재한다
Standby - Advertising - Scanning - Initiating - Connection
따라서 다음 순서로 설명을 이어나가도록 하겠다.
- Advertising
- Connection (outdated as some info written in 2016 but gives some basic ideas)
- Components for Data Transfer (Service / Characteristics)
1) Advertising
Advertising(Broadcasting data)은 Device Discovery 와 Data Publishing을 위해 존재.
이 때문에 두 가지의 Data Packet이 있다. Packet은 31바이트 Payload까지 가질 수 있으며 advertiser address 는 payload와 함께 broadcasting data라는 큰 틀에 포함된다. 정의된 두 가지의 Data Packet은 다음과 같다
- Advertising Packet
- Scan Response Packet
Advertiser는 시간차를 가지고 위 패킷을 broadcast 하게 된다. 이 시간차는 조정될 수 있지만, 최대 시간차와 최소 시간차는 존재한다.
최대 : 20 [ms] / 최소 : 10.24 [s]
Scanner에게 Scan Request를 받으면 Advertiser는 Scan Response Packet을 내보낸다. Advertiser 는 Scan Request를 받기 위해 RX Period에 돌입해야 하며, 이 기간은 Connect Request를 받기 위해서도 존재한다.
Advertising Packet을 내보내다 Scan Request에 반응하는 Peripheral의 방식은 다음과 같다.
BLE는 ISM Band(2.4GHz)에 있는 40개의 RF채널을 쓴다. 이 채널들은 Center Frequency 가 2402 + k * 2 [MHz]로, k 는 0에서 39까지의 값을 가진다. Advertising에 쓰이는 채널은,
ch.37 = 2402[MHz], ch.38 = 2426[MHz], ch.39 = 2480[MHz]
와이파이에서 쓰이는 채널들과의 간섭을 피하기 위해 위 값으로 정해졌다고 한다. 아래 그림에서 보이는 노란색 부분이 와이파이에서 쓰이는 채널이다.
Peripheral → Advertise
Central → Scan
저번 포스팅에서 설명한 것과 같이, Advertiser가 Advertising Packet을 내보낼 때마다 3 채널 모두를 이용한다. 반대로 Scanner가 내보낼 수 있는 Packet은 Scanner Address만을 포함하는 Scan Request Packet (Not Scan Response) 뿐임이 보인다. 블루투스 통신 프로토콜에는 4가지의 Advertising이 존재한다. Packet을 보내는 대상에 따라 나뉘는데,
- ADV_IND: connectable undirected advertising
- ADV_DIRECT IND: connectable directed advertising
- ADV_SCAN_IND: scannable undirected advertising
- ADV_NONCONN_IND: non-connectble undirected advertising (Beacon에서 자주 쓰임)
세부 내용을 설명하기보단 connectable undirected advertising 이 어떤 디바이스던 scan response를 보낼 수 있는 형식이고 가장 자주 쓰인다는 정도만 알고 넘어가도록 한다.
Whitelist 란?
화이트리스트에 없는 Scanner/Central Device 에서 Packet을 보내면 무시하게끔 한다. 필터의 역할과 같다. nRF에서는 SoftDevice에서 제공하는 API를 통해 Advertising 을 한다. 아래 그림을 보면 더 명확이 세팅하는 값이 무엇인지 이해하기 쉽다.
- Advertising과 Scan Response Data 세팅: 이 과정은 어플리케이션마다 할 지 안 할지가 나뉨.
- sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)
- 인자를 받아 Advertising: advertising interval, timeout, types, peer address(optional), whitelist(optional), filter policy, using whitelist, channels to use
- sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params)
GAP : (Generic Acess Profile) 는 다음 두 가지가 어떻게 실행될지를 정의.
- Device Discovery
- Device Connections
Device가 Broadcaster - Observer Role 또는 Peripheral Central Role 인지를 설명하는 방법이라고 보면 된다.
Roles, modes, advertising parameters, security 를 정의하여 GAP를 구성할 수 있으며 GAP Mode는 어떠한 목적을 도달하기 위한 일시적인 상태를 뜻한다. Broadcast, Discoverability, Connectability, Bonding, Periodic Advertising 이 있다.
Event는 기기가 받는 notification 으로 볼 수 있으며, Advertising 시에 받을 수 있는 GAP event 는 다음과 같다.
- BLE_GAP_EVT_TIMEOUT: Advertising 시간을 초과해 Sleep mode로 갈 지를 정할때 사용 가능
- BLE_GAP_EVT_SCAN_REQ_REPORT : Advertiser가 Scan Request를 받았는지를 알립니다. Event는 PEER Device 와 RSSI 값과 함께 옵니다. API에서 sd_ble_opt_set()로 enable 시켜야만 해당 이벤트를 받을 수 있다.
- BLE_GAP_EVT_CONNECTED: Central Device 에서 Connect Request를 보내 연결되었을 때를 알린다.
보통 Advertising 시 API 와 Soft Device Level에서 일어나는 과정은 다음과 같다. 여태 API에 업데이트된 사항이 많아 자세한 코드보단 어떻게 돌아가는지만 본다...
'EE > Embedded Systems' 카테고리의 다른 글
[nRF52BLE][3]Components for Data Transfer (0) | 2021.01.04 |
---|---|
[nRF52BLE][2]Connection and Softdevice (0) | 2021.01.04 |
Nordic nRF52 UART 통신 (0) | 2020.12.23 |
nRF52328(PCA10040) Project Initiation / Basics (0) | 2020.12.23 |
Segger Embedded Studio - IDE Tips (0) | 2020.12.23 |