lora — LoRa 모뎀 드라이버

lora 모듈은 Arduino Portenta Vision Shield에 탑재된 Murata CMWX1ZZABZ LoRa 모뎀용 드라이버를 제공합니다. 이 모듈은 모뎀 펌웨어(Arduino MKRWAN ARD-078 펌웨어 포함)에서 사용하는 AT 명령 집합을 래핑한 고수준 Lora 클래스를 노출하므로, 애플리케이션이 LoRaWAN 네트워크에 조인하고 패킷을 송수신할 수 있습니다.

예시:

import lora

modem = lora.Lora(band=lora.BAND_EU868, debug=True)
print("Device EUI:", modem.get_device_eui())
if modem.join_OTAA("0000000000000000", "00000000000000000000000000000000"):
    modem.send_data(b"hello", confirmed=True)

상수

활성화 모드

lora.MODE_ABP: int

Activation By Personalization 모드.

lora.MODE_OTAA: int

Over-The-Air Activation 모드.

RF 출력 모드

lora.RF_MODE_RFO: int

모뎀의 RFO(저전력) RF 출력을 사용합니다.

lora.RF_MODE_PABOOST: int

모뎀의 PA_BOOST(고전력) RF 출력을 사용합니다.

대역

lora.BAND_AS923: int

AS923(아시아 923 MHz) 지역 대역.

lora.BAND_AU915: int

AU915(호주 915 MHz) 지역 대역.

lora.BAND_EU868: int

EU868(유럽 868 MHz) 지역 대역.

lora.BAND_KR920: int

KR920(한국 920 MHz) 지역 대역.

lora.BAND_IN865: int

IN865(인도 865 MHz) 지역 대역.

lora.BAND_US915: int

US915(미국 915 MHz) 지역 대역.

lora.BAND_US915_HYBRID: int

US915 하이브리드(서브 대역) 지역 플랜.

장치 클래스

lora.CLASS_A: str

LoRaWAN 엔드 디바이스 Class A.

lora.CLASS_B: str

LoRaWAN 엔드 디바이스 Class B.

lora.CLASS_C: str

LoRaWAN 엔드 디바이스 Class C.

예외

exception lora.LoraError

모뎀이나 드라이버에서 반환된 모든 오류에 대해 발생하는 기본 예외.

exception lora.LoraErrorTimeout

구성된 타임아웃 내에 모뎀이 응답하지 않을 때(수신 버퍼가 비어 있을 때) 발생합니다.

exception lora.LoraErrorParam

유효하지 않은 매개변수로 AT 명령이 실행되어 +ERR_PARAM 응답이 반환될 때 발생합니다.

exception lora.LoraErrorBusy

모뎀이 이전 명령을 처리하느라 바빠서 +ERR_BUSY 응답이 반환될 때 발생합니다.

exception lora.LoraErrorOverflow

매개변수가 허용 최대 길이를 초과하여 +ERR_PARAM_OVERFLOW 응답이 반환될 때 발생합니다.

exception lora.LoraErrorNoNetwork

모뎀이 네트워크에 조인하지 않은 상태에서 +ERR_NO_NETWORK 응답이 반환될 때 발생합니다.

exception lora.LoraErrorRX

다운링크를 수신하는 중 오류가 발생하여 +ERR_RX 응답이 반환될 때 발생합니다.

exception lora.LoraErrorUnknown

+ERR_UNKNOWN 응답이 반환되거나 모뎀이 문서화되지 않은 오류를 보고할 때 발생합니다.

클래스

class lora.Lora(uart: machine.UART | None = None, rst_pin: machine.Pin | None = None, boot_pin: machine.Pin | None = None, band: int = BAND_EU868, poll_ms: int = 300000, debug: bool = False)

새 모뎀 드라이버를 생성합니다. 생성자는 UART와 리셋/부트 핀을 초기화(또는 자동 생성)하고, 모듈을 하드웨어 리셋하며, 오토보드 동기화를 수행하고, 모듈을 재부팅하며, 펌웨어 버전을 조회한 다음 요청된 지역 band를 구성합니다.

매개변수:
  • uart – 모뎀과 통신하는 데 사용되는 사전 구성된 machine.UART 인스턴스입니다. None이면 드라이버가 8N2 프레이밍으로 UART(8, 19200)을 엽니다(Portenta Vision Shield 기본값).

  • rst_pin – 모뎀의 리셋 라인을 구동하는 machine.Pin입니다. None이면 "PC6"이 푸시풀 출력으로 구성됩니다.

  • boot_pin – 모뎀의 부트 선택 라인을 구동하는 machine.Pin입니다. None이면 "PG7"이 로우로 풀다운된 푸시풀 출력으로 구성됩니다.

  • band – 구성할 지역 대역입니다. BAND_* 상수 중 하나입니다.

  • poll_ms – 다운링크 윈도우를 열어두기 위해 poll()이 트리거하는 자동 빈 업링크 사이의 간격(밀리초)입니다.

  • debugTrue이면 모든 UART 트래픽이 print()를 통해 출력됩니다.

LoraErrors: dict

모뎀 오류 응답 문자열(예: "+ERR_BUSY")을 해당 예외 클래스로 매핑합니다. handle_error()에서 내부적으로 사용됩니다.

init_modem() None

self.uart, self.rst_pin, self.boot_pin이 아직 설정되지 않은 경우 이들을 Portenta Vision Shield 기본값으로 지연 초기화합니다. 생성자에서 호출되며, 일반적으로 사용자 코드에서 직접 호출하지 않습니다.

debug_print(data: str) None

생성 시 debug가 활성화되어 있으면 data를 출력하고, 그렇지 않으면 아무 작업도 하지 않습니다.

is_arduino_firmware() bool

모뎀이 Arduino MKRWAN ARD-078 펌웨어를 실행 중이면(캐시된 fw_version 문자열로 감지) True를 반환합니다.

configure_class(_class: str) None

LoRaWAN 장치 클래스를 구성합니다.

매개변수:

_classCLASS_A, CLASS_B, CLASS_C 중 하나입니다.

configure_band(band: int) bool

지역 대역을 구성하고, BAND_EU868을 사용하는 Arduino 펌웨어에서는 ETSI 듀티 사이클 제한기를 활성화합니다. 성공하면 True를 반환합니다.

매개변수:

bandBAND_* 상수 중 하나입니다.

set_baudrate(baudrate: int) None

모뎀의 UART 보드 레이트를 변경합니다(AT+UART).

매개변수:

baudrate – 새 보드 레이트(비트/초).

set_autobaud(timeout: int = 10000) bool

모뎀이 +OK로 응답하거나 timeout 밀리초가 경과할 때까지 빈 AT 명령을 전송합니다. 동기화에 성공하면 True를 반환합니다.

매개변수:

timeout – 시도에 소비할 최대 시간(밀리초)입니다.

get_fw_version() str

모뎀 장치 문자열(AT+DEV?)과 펌웨어 버전(AT+VER?)을 조회하여 공백으로 구분된 단일 문자열로 반환합니다.

get_device_eui() str

모뎀의 64비트 Device EUI를 16진수 문자열로 반환합니다.

factory_default() None

AT+FACNEW를 통해 공장 출하 기본값으로 복원합니다.

restart() None

보드 레이트를 재동기화하고, 모뎀을 재부팅하며, 펌웨어 버전을 다시 읽고, 구성된 지역 대역을 다시 적용합니다. 실패하면 LoraError를 발생시킵니다.

set_rf_power(mode: int, power: int) None

모뎀 RF 출력 단을 구성합니다(AT+RFPOWER).

매개변수:
set_port(port: int) None

이후의 send_data() 호출에 사용되는 LoRaWAN 애플리케이션 포트(1..223)를 구성합니다.

매개변수:

port – LoRaWAN FPort입니다.

set_public_network(enable: bool) None

공용 네트워크 동기화 워드를 활성화하거나 비활성화합니다.

매개변수:

enable – 공용 LoRaWAN 동기화 워드의 경우 True, 개인용의 경우 False입니다.

sleep(enable: bool) None

모뎀을 저전력 슬립 상태로 전환하거나(True) 깨웁니다(False).

format(hexMode: bool) None

페이로드 바이트에 대해 UART를 통해 사용되는 데이터 형식을 선택합니다.

매개변수:

hexMode – ASCII-16진수 페이로드 형식의 경우 True, 원시 바이너리의 경우 False입니다.

set_datarate(dr: int) None

LoRaWAN 데이터 레이트 인덱스를 설정합니다(AT+DR).

매개변수:

dr – 지역별 데이터 레이트 인덱스입니다.

get_datarate() int

현재 LoRaWAN 데이터 레이트 인덱스를 반환합니다.

set_adr(adr: bool) None

적응형 데이터 레이트(Adaptive Data Rate)를 활성화하거나 비활성화합니다.

매개변수:

adr – ADR을 활성화하려면 True, 비활성화하려면 False입니다.

get_adr() int

현재 ADR 설정을 반환합니다(활성화되어 있으면 1, 그렇지 않으면 0).

get_devaddr() str

현재 32비트 DevAddr을 16진수 문자열로 반환합니다.

get_nwk_skey() str

현재 Network Session Key를 16진수 문자열로 반환합니다.

get_appskey() str

현재 Application Session Key를 16진수 문자열로 반환합니다.

get_rx2dr() int

RX2 수신 윈도우에 사용되는 데이터 레이트 인덱스를 반환합니다.

set_rx2dr(dr: int) None

RX2 수신 윈도우에 사용되는 데이터 레이트 인덱스를 설정합니다.

매개변수:

dr – 지역별 데이터 레이트 인덱스입니다.

get_ex2freq() int

RX2 수신 윈도우에 사용되는 주파수(Hz)를 반환합니다.

set_rx2freq(freq: int) None

RX2 수신 윈도우에 사용되는 주파수를 설정합니다.

매개변수:

freq – 주파수(Hz)입니다.

set_fcu(fcu: int) None

업링크 프레임 카운터를 설정합니다(AT+FCU).

매개변수:

fcu – 새 업링크 프레임 카운터 값입니다.

get_fcu() int

현재 업링크 프레임 카운터를 반환합니다.

set_fcd(fcd: int) None

다운링크 프레임 카운터를 설정합니다(AT+FCD).

매개변수:

fcd – 새 다운링크 프레임 카운터 값입니다.

get_fcd() int

현재 다운링크 프레임 카운터를 반환합니다.

change_mode(mode: int) None

활성화 모드를 전환합니다.

매개변수:

modeMODE_ABP, MODE_OTAA 중 하나입니다.

join(timeout_ms: int) bool

AT+JOIN을 실행하고 조인 수락 이벤트를 기다립니다. 모뎀이 timeout_ms 내에 +EVENT=1,1(조인 성공)을 보고하면 True를 반환합니다.

매개변수:

timeout_ms+ACK와 후속 조인 이벤트를 모두 기다리는 최대 시간(밀리초)입니다.

get_join_status() bool

모뎀이 현재 네트워크에 조인되어 있으면 True를 반환합니다.

get_max_size() int

현재 데이터 레이트에 대한 최대 LoRaWAN 페이로드 크기(바이트)를 반환합니다. Arduino 펌웨어에서는 64로 고정됩니다.

poll() None

마지막 호출 이후 poll_ms 밀리초 이상 경과한 경우, 대기 중인 다운링크를 플러시하기 위해 빈 확인 업링크를 전송합니다. 애플리케이션의 메인 루프에서 자주 호출하도록 설계되었습니다.

send_data(buff: bytes, confirmed: bool = True) bool

LoRaWAN 업링크를 전송합니다. buffget_max_size()보다 크면 LoraError를 발생시킵니다.

매개변수:
  • buff – 전송할 페이로드 바이트입니다.

  • confirmedTrue이면 확인 업링크(+CTX)를 전송하고 네트워크 서버의 +ACK를 기다립니다. False이면 비확인 업링크(+UTX)를 전송합니다.

반환:

모뎀이 패킷을 수락하면(그리고 확인 업링크의 경우 네트워크가 확인 응답하면) True, 그렇지 않으면 False입니다.

receive_data(timeout: int = 1000) dict | None

다운링크를 기다립니다. timeout 밀리초 내에 +RECV 이벤트가 수신되지 않으면 None을 반환하고, 그렇지 않으면 FPort와 페이로드 바이트를 포함하는 딕셔너리 {"port": str, "data": str}를 반환합니다.

매개변수:

timeout – 기다리는 최대 시간(밀리초)입니다.

receive(delimiter: str | list | None = None, max_bytes: int | None = None, timeout: int = 1000) str

저수준 UART 읽기입니다. 구분 기호가 일치하거나, max_bytes개의 문자를 읽었거나, timeout 밀리초가 경과할 때까지 모뎀에서 문자를 읽은 다음, 후행 \r이 제거된 누적 문자열을 반환합니다.

매개변수:
  • delimiter – 버퍼 끝에서 일치시킬 단일 문자, 트리밍된 전체 버퍼와 비교할 다중 문자 문자열, 또는 그러한 문자열의 리스트 중 하나입니다.

  • max_bytes – 설정된 경우, 정확히 이 바이트 수를 읽는 즉시 반환합니다.

  • timeout – 전체 읽기 타임아웃(밀리초)입니다.

available() int

모뎀의 UART 수신 버퍼에 현재 사용 가능한 바이트 수를 반환합니다.

join_OTAA(appEui: str, appKey: str, devEui: str = None, timeout: int = 60000) bool

모뎀을 OTAA 모드로 전환하고, 제공된 키와 EUI를 프로그래밍한 다음, 네트워크 조인을 시도합니다. 조인에 성공하면 True를 반환합니다.

매개변수:
  • appEui – 64비트 Application/Join EUI(16진수 문자열)입니다.

  • appKey – 128비트 Application Key(16진수 문자열)입니다.

  • devEui – 선택적 64비트 Device EUI(16진수 문자열)입니다. None이면 공장에서 프로그래밍된 Device EUI가 사용됩니다.

  • timeout – 조인 타임아웃(밀리초)입니다.

join_ABP(nwkId: int, devAddr: str, nwkSKey: str, appSKey: str, timeout: int = 60000) bool

모뎀을 ABP 모드로 전환하고, 제공된 주소와 키를 프로그래밍한 다음, 조인을 시도합니다. get_join_status()의 결과를 반환합니다.

매개변수:
  • nwkId – 네트워크 식별자입니다(현재 펌웨어에서 무시됨).

  • devAddr – 32비트 Device Address(16진수 문자열)입니다.

  • nwkSKey – 128비트 Network Session Key(16진수 문자열)입니다.

  • appSKey – 128비트 Application Session Key(16진수 문자열)입니다.

  • timeout – 조인 타임아웃(밀리초)입니다.

handle_error(command: str, data: str) None

모뎀 응답을 검사하고, 오류를 나타내는 경우 일치하는 LoraError 하위 클래스를 발생시킵니다. 오류가 아닌 응답에 대해서는 아무 작업도 하지 않습니다.

매개변수:
  • commanddata를 생성한 AT 명령(AT 접두사 제외)입니다.

  • data – 모뎀이 반환한 응답 문자열입니다.

send_command(cmd: str, *args, delimiter: str = '\\r', data: bytes = None, timeout: int = 1000, raise_error: bool = True) str

cmdargs로 AT 명령을 만들고, 선택적으로 원시 data 페이로드를 추가하여 전송한 다음, 모뎀의 응답을 반환합니다. ?로 끝나는 쿼리 명령의 경우, 값 부분(= 뒤의 부분 문자열)만 반환됩니다.

매개변수:
  • cmd – AT 명령 접미사(예: "+JOIN", "+DR=")입니다. "AT" 접두사와 후행 \r은 자동으로 추가됩니다.

  • args – 문자열 변환 후 cmd에 연결되는 추가 인수입니다.

  • delimiterreceive()로 전달되는 구분 기호입니다.

  • data – AT 명령 직후에 기록되는 선택적 원시 바이트입니다(바이너리 업링크 페이로드에 사용됨).

  • timeout – 응답 타임아웃(밀리초)입니다.

  • raise_errorTrue이면 오류 응답이 LoraError 예외로 변환되고, False이면 원시 응답이 호출자에게 반환됩니다.