카테고리: LoRa

LoRa OTA Activation

LoRA UE(단말)을 네트워크에 조인시키기 위해서는 두 가지 방법이 사용될 수 있다. ABP(Activation By Personalization)와 OTAA(Over The Air Activation)이 바로 그것이다.

조인을 위해서는 다음과 같은 준비물이 필요하다.

1. JoinEUI: IEEE EUI64 타입의 식별자로, 자신의 루트 키를 가지고 있는 조인 서버를 식별하기 위해 사용된다.
2. DevEUI: IEEE EUI64 타입의 식별자로, 단말을 식별하기 위해 사용된다.
3. AppKey: Application Key. AES-128 키로, 조인 과정에서 AppSKey(Application Session Key)를 만드는 일에 사용된다.
4. NwkKey: Network Key. AES-128키로, 조인 과정에서 FNwkSIntKey, SNwkSIntKey, NwkSEncKey를 만드는 일에 사용된다.

LoRaWAN v1.0.2로 넘어오면서 AppKey가 추가되었기 때문에, 1.0이하의 LoRaWAN을 지원하는 서버/단말을 대상으로는 NwkKey만 사용된다.

OTA 장치는 여기서 두 개의 키를 더 가진다.

1. JSIntKey: MIC Rejoin-Request Type 1메시지와 Join-Accept 메시지의 암호화에 사용됨
2. JSEncKey: Rejoin-Request에 의해 만들어진 Join-Accept 메시지의 암호화에 사용됨

JSIntKey = aes128_encrypt(NwkKey, 0x06 | DevEUI | pad16)[1]
JSEncKey = aes128_encrypt(NwkKey, 0x05 | DevEUI | pad16)

단말은 Join을 시작하면서 Join Request를 전송한다. 그리고 Join Request의 구조는 다음 그림과 같다

Join Request의 처리를 위해서는 MAC Header를 처리한 뒤 페이로드에서 JoinEUI와 DevEUI, DevNonce를 읽어오면 된다. 여기서 DevNonce는 단말이 처음 가동될 때 0으로 세트되어, Join-Request를 전송할 때마다 하나씩 증가하는 값이다.

재전송 공격을 방지하기 위하여 조인 서버는 단말의 DevNonce를 저장하고 있다가, 저장된 DevNonce보다 작은 값이 들어오면 Join Request를 거부해야 한다.

다음으로 MIC(Message Integrity Code)는 CMAC(Chiper-based Message Authentication Code)[2](RFC4493)으로부터 추출되는데, CMAC의 첫 4비트를 가지고 Join Request의 무결성을 검증하게 된다.

 

LoRaWAN 1.1에서 JoinEUI가 이전까지 AppEUI라 불리던 것을 대체하였음을 참고해야 한다.

RAKWireless RAK831 사용기

RAK831은 Semtech SX1301을 기반으로 한 LoRa Gateway 모듈입니다. 중국의 RAKWireless에서 제작되었으며, LoRaP2P와 LoRaWAN을 지원합니다.
hackster.io에서는 RPi3을 사용한 The Things Network 게이트웨이 구성 튜토리얼을 제공하고 있으나, 제 목표는 조금 다릅니다.

바로 게이트웨이 모듈과 직접 통신할 수 있는 백엔드를 구축하는 것이 목표입니다. 호스트는 RPi B+로 정하였으나, 시작하기도 전에 문제가 발생했습니다.
SPI 핀을 연결하고 라즈베리 파이를 부팅하면 ‘sh: can’t access tty; job control turned off’라는 에러 메세지와 함께 부팅이 되지 않는 문제였고, 이 문제는 Noobs 없이 Raspbian을 클린 인스톨하는 것으로 해결되었습니다.

다음 단계로 넘어가기 위해, 먼저 LoRaWAN의 구성요소를 확인해야 합니다.

LoRaWAN 네트워크의 간단한 구성도를 만들어 보았습니다. 최하단에 노드가 위치하고, 그 위에 게이트웨이, 패킷 포워더, 인터넷 망, 네트워크 서버, 애플리케이션 서버가 올라갑니다.

이번에 구매한 RAK831은 게이트웨이로써, 서버와 노드로부터의 LoRa 패킷을 송/수신하는 역할만을 수행합니다. 그러므로 게이트웨이로부터 패킷 데이터를 읽고 해석하는 애플리케이션이 필요합니다.
그리고 이미 시장에는 TTN Gateway, Loriot 등의 좋은 솔루션들이 존재합니다.

하지만 남이 만들어놓은 물건을 그대로 가져다 쓰기만 해서는 재미가 없으니, 제가 구현하고자 하는 소규모 응용에 맞춰서 패킷 포워더와 네트워크 서버를 구현하기로 결정하였습니다.

 

게이트웨이와의 통신을 위해, SX1301을 만든 Semtech사에서 제공하는 libloragw 라이브러리를 이용합니다.

RAK831은 SPI를 통한 SX1301과의 직접 통신을 지원합니다. 그리고 라즈베리 파이 또한 SPI 인터페이스를 지원하니, 이 인터페이스들을 사용할 것입니다.

참고로 Semtech에서는 고부하시 성능 문제로 인해 libloragw의 V3.2.0에서 USB-SPI 컨버터의 지원을 중단하였습니다.

 

LoRa Concentrator의 초기화는 다음과 같은 순서로 진행됩니다.

 

0. RAK831 보드 리셋(Raspberry Pi용 확장 보드 사용 기준)

1. LoRa Concentrator Board Setup

– Syncword Setup
– Clock Source Setup

2. LBT Setup

– RSSI
– LBT Channel
– Period

3. TX Gain Setup (Look Up Table 사용)

– GA, DAC, MIX, DIG Gain
– RF Power

4. RF Chain Setup

– RSSI
– Radio Interface Type(SX1255, SX1257)
– Center Frequency
– Notch Filter Frequency (FPGA가 탑재된 보드에 한함) // LBT와 연관?

5. SF Channel Setup

– RF Chain(라디오 인터페이스 번호)
– Frequency
– Bandwidth(125… 500Khz)
– Spreading Factor(7~15)

6. Standard Channel Setup

– RF Chain
– Frequency
– Bandwidth
– Data Rate

7. FSK Channel Setup

– RF Chain
– Frequency
– Bandwidth
– Data Rate

이상의 설정이 끝나고 나면 Concentrator를 시작할 수 있습니다.