11.3. 무선과 링크 계층¶
BLE 스택의 최하위 두 계층은 Python의 관점에서 거의 전적으로 자동입니다 – 무선 실리콘과 그 위에서 MicroPython이 동작하는 계층들이 채널 선택부터 손실된 패킷의 재전송까지 모든 것을 처리합니다. 그럼에도 그들이 내리는 선택 중 세 가지는 사용자 대상 API로 드러납니다: 전력, 거리, 처리량입니다.
11.3.1. 무선 통신(radio)¶
BLE는 Wi-Fi, 전자레인지, 그리고 대부분의 다른 근거리 무선과 같은 2.4 GHz 산업-과학-의료(ISM) 대역을 사용합니다. 이 대역은 폭 2 MHz의 40개 채널로 나뉩니다.
40개 채널 중 세 개는 광고(advertising) – 자신의 존재를 듣고 있는 누구에게나 알리는 짧은 브로드캐스트 – 를 위해 예약되어 있습니다. 이들은 대역 전체에 걸쳐 분산 배치되어, 청취자가 셋 모두를 빠르게 훑을 수 있고 어느 한 채널의 간섭만으로 장치가 완전히 통신 불능이 될 가능성이 낮습니다.
서른일곱 개는 데이터 채널입니다. 두 장치가 연결되면 이 채널들에서 패킷을 교환하며, 연결 시점에 양쪽이 합의한 의사 난수 시퀀스에 따라 채널 사이를 도약(hop)합니다. 적응형 주파수 도약(adaptive frequency hopping)은 어느 쪽이든 채널을 나쁜 채널(심한 Wi-Fi 간섭, 전자레인지, 이웃 BLE 네트워크)로 표시하여 시퀀스가 그 채널을 건너뛰게 할 수 있습니다.
2.4 GHz 대역의 40개 BLE 채널. 셋은 광고용이고, 나머지는 열린 연결에서 트래픽을 운반합니다.¶
무선은 짧은 패킷 – 길어야 몇 밀리초 – 을 전송하고 그 사이에는 잠듭니다. 그 잠듦이 바로 이 기술을 저에너지(low energy)로 만드는 요소입니다. 일반적인 BLE peripheral은 실제로 전송하는 시간이 전체의 1퍼센트에 훨씬 못 미치며, 나머지 시간에는 예정된 이벤트 사이에 무선이 전원 차단 상태로 있습니다.
11.3.2. 링크 계층¶
링크 계층은 다른 장치의 상대편과 통신하는 BLE의 최소 단위입니다. 이것은 네 가지 일을 처리합니다.
패킷 프레이밍. 각 패킷은 짧은 헤더(채널 액세스 주소, 패킷 길이, 제어 비트), 페이로드, 그리고 CRC를 운반합니다. 수신자는 CRC를 확인하고 손상된 것은 무엇이든 버립니다.
주소 지정. 모든 BLE 장치는 무선상에서 자신을 식별하는 48비트 장치 주소(device address)를 가집니다. 일부는 공용(public)입니다 – 제조사가 할당한 하드웨어 식별자로, 영구적으로 추적 가능합니다. 일부는 무작위(random)입니다 – 장치에서 생성되어 주기적으로 교체되며, 도청자가 두 전송을 동일한 물리 하드웨어에 연결하지 못하도록 선택적으로 암호화됩니다. 주소는 광고와 스캔에서 다시 다룹니다.
연결 스케줄링. 두 장치가 연결되면 링크 계층은 도약 시퀀스에서 주기적인 무선 이벤트를 – 고정된 연결 간격(connection interval) 만큼 떨어뜨려 – 스케줄링하고, 위쪽 GATT 계층에서 대기 중인 데이터를 각 이벤트에 채워 넣습니다. 양쪽은 이벤트 사이에 다시 잠듭니다. 연결 간격은 애플리케이션이 요청할 수 있는 조정 항목입니다(연결 참조).
신뢰성. 연결상의 각 패킷은 상대방에 의해 확인 응답(acknowledge)됩니다. 링크 계층은 응답을 받지 못한 것은 무엇이든 재전송하므로, 위쪽 계층들은 순서가 보장되고 손실 없는 바이트 스트림을 보게 됩니다. 네트워킹 측의 UDP – 패킷을 보내고 잘 되기를 바라기와 달리, BLE는 정상 사용 시 별도의 비신뢰 모드를 갖지 않습니다 – 열린 연결상의 모든 패킷은 도착하거나 링크가 끊긴 것으로 선언될 때까지 재시도됩니다.
링크 계층은 또한 한 쌍의 장치가 페어링 중에 키에 합의하고 나면 암호화가 실행되는 곳이기도 합니다(페어링 및 본딩 참조). 암호화된 링크상의 모든 패킷은 위쪽 계층들이 보기 전에 수신측에서 복호화됩니다.
11.3.4. Python이 이 모든 것에서 보는 것¶
거의 아무것도 없습니다. bluetooth와 aioble API는 채널, 도약 시퀀스, 패킷 CRC, 재전송 타이머를 노출하지 않습니다. 이들은 모두 BLE 포트와 무선 내부에서 처리됩니다. 실제로 드러나는 부분은 연결 시점 협상이 노출하는 것들 – 연결 간격, MTU, 주소 유형 – 입니다.