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이면 원시 응답이 호출자에게 반환됩니다.