2) Connection
Connection 요소는 크게 Initializing - Connection Parameters - Whitelisting - Connection Terminating 으로 나눌 수 있는데, 어떻게 진행되는지, API 요구사항은 뭔지 알아본다.
IoT와 밀접한 연관을 가지는 블루투스가 어떤 구조를 목표로 했는지를 먼저 본다. 아래 그림과 같다. 하나의 Central (Master)가 여러개의 Peripheral과 연결될 수 있는 구조이다. BR/EDR은 Bluetooth Classic 을 뜻하며 Nordic Softdevice 는 이를 지원하지 않는다. 기술이 진화할수록 여러 형태의 Topology가 생길 수 있다고 한다.

Initializing
Central이 Advertising Packet을 받고 원하는 기기라고 판단되어 Connect Request를 보낼때 시작된다. Advertiser가 Advertising Packet을 보내고 난 후의 RX 기간동안만 Connect Request를 받을 수 있다.
Connect Request를 승락하기 위한 조건은 Connectable Mode 의 Advertiser 이어야 하며,
- whitelist 없이 Advertising 또는
- whitelist 존재하지만 initiator의 주소가 whitelist에 있거나
- Directed Advertising이며 initiator의 주소와 맞아야 한다.
Connect Request가 승락된다면 다음 사이클에는 Advertising을 중지하고 Connect Request Packet의 인자가 정의한 행동양식에 따라야 한다. 이전 포스팅에서 간략히 다뤘던 Procedure를 다시 보시면 이해가 더 잘 간다. Channel 38에 Connection Request를 받게 될 때의 반응은 다음 그림과 같다.

첫 Connection Packet (Connect Event)는 transmit window 안에서 일어나야 하며 trasnmit window는 size 와 offset 이 정의되어 있어야 한다. 이후 다음과 같은 변화가 일어난다.
Advertiser → Slave
Initiator → Master
Master는 Connection interval 마다 Connect Event Packet을 내보내고, Slave는 이에 맞게 RX Windows를 첫 Connection Event 이후 계속 Connection Interval 마다 열어준다. 이 Connection Event Packet은 Data Payload를 포함하거나 포함하지 않을 수 있다.
Advertiser는 여섯 Connection Interval동안 Connection Packet이 오지 않으면 Connection을 Termination 한다. Master는 Connect Request가 Advertiser에 의해 받아들여졌는지 알 수 없기 때문에 Connection Termination이 일어날 때까지 Connection Event Packet을 지속적으로 보낸다.
Connection Paramters
Connection이 이루어지려면 Master와 Slave의 소통 방식을 결정하는 Connection Parameter가 정확히 설정되어 있어야 한다. Parameter에 대한 자세한 명세는 위 참고 링크를 참고한다.

When in Connection
linklayer 에는 Advertising Data Packet 과 Data Channel Packet을 위한 format은 하나 뿐이다. 형태는 다음과 같다. Access Address는 CONNECT REQ 패킷에 포함된 address 이다.


transmitSeqNum = sn
nextExpectedSeqNum = nesn
Master와 Slave 모두 Packet을 받을 때 Packet의 NESN은 device의 sn 과 비교된다. 같다면 NAK 이며 이전의 TX 데이터를 다시 보내고 다르다면 sn 으로, 새로운 데이터를 보낸다.
Nordic Softdevice를 이용해 연결하는 방법
- Advertising Packet을 Scan하고 Receive하면 알림
sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params))
- Advertising Packet을 Scan하고 주소가 일치하면 Connect Request 보냄
sd_ble_gap_connect( ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params))
- Terminate Connection
sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code))
- Stop Scanning
sd_ble_gap_scan_stop()
Initiate / Terminate 시 받을 수 있는 GAP Event
각각의 Event는 ble_evt_t 구조체의 Parameter에 정의되어 온다.
BLE_GAP_EVT_ADV_REPORT
BLE_GAP_EVT_CONNECTED
BLE_GAP_EVT_DISCONNECTED
'EE > Embedded Systems' 카테고리의 다른 글
[nRF52BLE][4]C Development with SoftDevice API (5) | 2021.01.04 |
---|---|
[nRF52BLE][3]Components for Data Transfer (0) | 2021.01.04 |
[nRF52BLE][1]Bluetooth Communication Scheme (0) | 2021.01.04 |
Nordic nRF52 UART 통신 (0) | 2020.12.23 |
nRF52328(PCA10040) Project Initiation / Basics (0) | 2020.12.23 |