LoRaWAN
LoRaWAN 드라이버 참고 자료입니다. 내장 Basics Station 네트워크 서버, 게이트웨이 인증서, 센서와 집중기 등록, 그리고 페이로드 주소 지정.
LoRaWAN 드라이버는 Ganter Lab을 작은 LoRaWAN 네트워크 서버로 만듭니다. 관계의 방향이 다른 대부분의 드라이버와 뒤집힙니다. 스테이션이 센서에 손을 뻗는 것이 아니라 게이트웨이가 Ganter Lab으로 접속해 오고, 센서는 그 게이트웨이를 거쳐 업링크로 읽은 값을 보냅니다. Ganter Lab은 Semtech의 LoRa Basics Station 프로토콜을 말하는 네트워크 서버를 안에 담고 있으므로, Basics Station 펌웨어를 돌리는 게이트웨이라면 어느 것이나 이 스테이션을 자기 LNS로 쓸 수 있습니다.
내장 서버는 앱이 부팅할 때가 아니라 켜진 첫 LoRaWAN 장치가 실행 중인 커넥터에 올라올 때 시작하고, 마지막 장치가 없어지거나 꺼질 때 멈춥니다. 센서도 집중기도 설정되어 있지 않으면 그 포트에서는 아무것도 듣지 않습니다. 하나를 추가하면 애플리케이션을 다시 시작하지 않고도 되살아납니다.
이 드라이버 아래의 장치는 저마다 두 가지 등록 가운데 하나이며, 그 패널에서 고릅니다.
- 센서는 자기 DevEUI로 구별되고 애플리케이션 키로 들어옵니다. 그 태그가 업링크 페이로드를 해독합니다.
- 무선 집중기(게이트웨이)는 자기 Station EUI로 구별되고, 목록에서 고른 무선 지역으로 등록됩니다. 자기 태그는 가지지 않습니다.
센서뿐 아니라 집중기도 등록하십시오. Basics Station 집중기는 접속하자마자 자기 무선 구성을 묻고, 답을 받기 전에는 아무것도 중계하지 않습니다. 그래서 그 Station EUI를 한 번도 본 적 없는 스테이션은 연결 자체가 멀쩡해 보이는 동안에도 그 뒤의 모든 센서를 값 없이 남겨 둡니다. 그 답은 여기에서 고른 지역으로 만들어집니다. 붙여 넣을 구성 문구는 없습니다.
네트워크 서버와 포트
| 무엇 | 값 |
|---|---|
| 프로토콜 | LoRa Basics Station(WebSocket, JSON) |
| 수신기 | 모든 인터페이스, TCP 포트 5001, TLS 전용 |
| 게이트웨이 주소 | wss://<station-address>:5001 |
| 검색 엔드포인트 | Basics Station의 router-info 요청도 같은 수신기에서 처리합니다 |
| 데이터 연결 | WebSocket 경로의 마지막 조각에 놓인 게이트웨이의 Station EUI로 주소가 매겨집니다 |
수신기는 언제나 TLS입니다. 암호화를 끄는 설정은 없습니다. 평문 HTTP 수신기는 루프백을 뺀 어디에서도 거부되며, 루프백은 공장 네트워크에서 닿을 수 없고 인프로세스 테스트를 위해서만 있습니다.
인증서
들어오는 자격은 상호 TLS로 가립니다. 서버는 자기 인증서로 자기가 누구인지 증명하고, 모든 게이트웨이는 클라이언트 인증서로 자기가 누구인지 증명해야 합니다.
서버 인증서. 처음 시작할 때 저절로 만들어지고 앱 데이터 폴더의 ua\pki\own\private 아래에 저장됩니다.
GanterLabOPCUAServer-with-san.pfx는 개인 키입니다. 무작위 암호로 암호화되어 있고 그 암호 자체가 Windows 사용자별로 보호되므로(DPAPI), 다른 곳으로 복사한 파일 쌍은 아무에게도 열리지 않습니다.GanterLabOPCUAServer-with-san.pem은 공개 인증서입니다. 게이트웨이가 이 스테이션을 신뢰하도록 게이트웨이에 설치하는 파일이 이것입니다.
이 인증서는 자체 서명이며 만료되지 않습니다. 그 공개 절반을 집중기마다 한 번씩 손으로 설치하므로, 만료되는 인증서라면 그 기념일에 센서 네트워크 전체를 쓰러뜨릴 것입니다. 이 스테이션에는 아무것도 보이지 않는 채로 집중기에서 거부되고, 되살리려면 집중기마다 찾아가야 합니다. 만료 경고도 갱신 명령도 없습니다. 갱신할 것이 없기 때문입니다. 드라이버 페이지는 인증서가 담고 있는 날짜를 읽기 표시로 보여 줍니다.
다시 쓰이는 경우는 둘뿐이며, 둘 다 진단 로그에 그렇게 적힙니다.
- 저장된 파일을 더 이상 열 수 없을 때입니다. 예를 들어 다른 Windows 계정이 그것을 썼을 때입니다.
- 이 애플리케이션의 이전 버전이 발급한 것일 때입니다. 그때는 유효 기간을 12개월로 주었습니다.
어느 쪽이든 드라이버 페이지는 모든 집중기에 새 GanterLabOPCUAServer-with-san.pem을 주어야 한다고 한 번 말합니다. 그 전까지 집중기는 접속할 수 없습니다.
게이트웨이 클라이언트 인증서. 모든 게이트웨이는 TLS 핸드셰이크 동안 클라이언트 인증서를 제시해야 합니다. 그것 없는 핸드셰이크는 데이터가 흐르기 전에 끊깁니다. 그 인증서는 이래야 합니다.
- 이 Windows 기기에서 유효한 체인을 이루어야 합니다(신뢰하지 않는 루트 같은 체인 오류는 연결을 거부하며, 어느 검사가 실패했는지 진단 로그가 기록합니다).
- 주체 일반 이름이나 DNS 주체 대체 이름에 게이트웨이의 Station EUI를 담아야 합니다. 이 식별자는 값으로 읽으므로
AABBCCDDEEFF0011과AA-BB-CC-DD-EE-FF-00-11과AA:BB:CC:DD:EE:FF:00:11은 모두 같은 스테이션을 가리킵니다. - 데이터 연결이 주장하는 것과 같은 스테이션을 밝혀야 합니다. 연결 주소에 있는 것과 다른 게이트웨이를 밝히는 인증서는 거부됩니다.
연결 칸
LoRaWAN 장치에는 자기 호스트도 포트도 없습니다. 센서에는 그 무선 통신을 실어 나르는 집중기를 거쳐 닿고, 집중기는 이 스테이션에 닿습니다. 패널은 등록 선택기를 먼저 보여 주고, 그다음에 그 등록이 필요로 하는 칸을 보여 줍니다.
| 칸 | 무엇인가 | 형식 | 기본값 |
|---|---|---|---|
| 등록된 이름 | 이 장치가 두 등록 가운데 무엇인지입니다. 센서 또는 무선 집중기입니다. 이것을 바꾸면 아래 칸이 비워집니다. 애플리케이션 키와 지역은 같은 것이 아니기 때문입니다. | 센서 / 무선 집중기 | 센서 |
| DevEUI(센서) | 센서의 DevEUI이며, 조인 요청에서 제시하는 신원입니다. | 16진수 열여섯 자리이며, 그대로(8899AABBCCDDEEFF) 적거나 붙임표(88-99-AA-BB-CC-DD-EE-FF)나 쌍점을 넣어 적습니다. |
비어 있음 |
| 애플리케이션 키(센서) | 센서의 OTAA 애플리케이션 키(AppKey)입니다. 조인을 인증하고 세션 키를 이끌어 냅니다. | 구분 기호 없이 정확히 16진수 32자리. | 비어 있음 |
| Station EUI(집중기) | 집중기의 Station EUI이며, 그 클라이언트 인증서가 담아야 하는 것이자 집중기가 자기 연결 주소에 넣는 것과 같은 식별자입니다. | 16진수 열여섯 자리이며 위의 어느 표기로도 적을 수 있습니다. | 비어 있음 |
| 무선 지역(집중기) | 집중기가 서 있는 곳입니다. 이 스테이션이 접속할 때 건네주는 채널과 데이터 전송률과 수신 창을 정합니다. 목록에서 고르며 자유 입력은 없습니다. | 유럽 868 MHz, 미국 915 MHz, 호주 915 MHz, 아시아 923 MHz, 중국 470 MHz(개정 1), 중국 470 MHz(개정 2) | 유럽 868 MHz |
| 전송 없이 지날 수 있는 최대 시간 (s)(센서) | 이 센서가 조용히 있어도 저장된 값이 읽은 값으로 계속 세어지는 초입니다. 0은 만료를 끕니다. 아래를 보십시오. | 0 이상 | 3600 |
식별자를 비워 두면 다듬은 장치 이름으로 되돌아가는데 그것이 올바른 EUI인 경우는 거의 없으므로, 채워 넣으십시오.
애플리케이션 키는 비밀이며 스테이션도 그렇게 다룹니다. 패널은 그것을 점 뒤에 감추고, 방금 입력한 것을 확인하는 동안 보여 주는 비밀번호 표시 확인란을 함께 둡니다. 설정 데이터베이스는 그것을 입력한 Windows 계정 아래에 보호된 채로 보관합니다. 그리고 그것은 진단 로그에도, 드라이버가 읽는 주소에도 나타나지 않습니다. 그 주소는 DevEUI만 담습니다. 다른 Windows 계정으로 같은 설정을 열면 키는 함께 열리지 않습니다. 칸은 비어서 돌아오며 "이 Windows 계정에서는 읽을 수 없습니다. 입력한 컴퓨터와 그 Windows 계정에서만 열립니다. 여기에 다시 입력하십시오."라고 말하고, 키를 다시 입력할 때까지 센서는 조인하지 않습니다. 백업으로 옮긴 설정은 키를 지킵니다. 백업은 여러분이 준 비밀번호로 봉인되기 때문입니다.
조인은 OTAA만 씁니다. 센서는 집중기를 거쳐 무선으로 조인하고, 네트워크 서버는 설정된 AppKey로 그것에 답합니다. 설정된 어떤 장치도 가지고 있지 않은 DevEUI에서 온 조인 요청은 거부되고 기록됩니다. 개인화에 의한 활성화(ABP, 미리 넣어 둔 세션 키)는 지원하지 않습니다.
장치를 끄거나 지우면 다시 시작을 기다리지 않고 곧바로 네트워크 서버에서 빠집니다. 그 키는 등록부를 떠나고, 어느 집중기가 그 장치를 위해 잡고 있던 세션도 놓여나며, 다음 조인은 거부됩니다. 서버가 받아들이지 않는 등록, 곧 잘못 입력한 DevEUI나 애플리케이션 키나 Station EUI나 지역은 그 장치를 연결되지 않음으로 읽히게 두며, 어느 칸이 거부되었는지 진단 로그가 밝힙니다.
집중기에 무엇이 보내지는가
등록된 집중기가 버전 핸드셰이크를 마치면, 이 스테이션은 그 지역의 무선 구성으로 답합니다. 주파수 범위, 데이터 전송률과 그 가운데 다운링크 전용인 것, 그리고 그 지역의 기본 채널 계획입니다. Station EUI가 여기에 등록되어 있지 않으면 아무것도 보내지 않고, 어느 스테이션이 물었으며 그것이 등록되어 있지 않다는 사실을 진단 로그가 적습니다. 집중기는 접속하는데 그 뒤의 센서가 끝내 값을 알려 오지 않을 때 찾아볼 항목이 바로 그것입니다.
읽기 주기 칸은 없습니다. LoRaWAN은 밀어 넣는 방식입니다. 언제 업링크할지는 센서가 정하고, 서버는 장치마다 가장 최근에 해독한 페이로드를 간직하며, 태그 값은 1초 고정 주기로 그 캐시에서 다시 읽힙니다.
그러므로 아직 업링크하지 않은 센서에는 실패한 읽기가 아니라 읽기가 없습니다. 태그는 비어 있는 채로 있고, 장치는 오프라인이 되는 대신 아직 아무것도 관찰되지 않았다고 알리며, 실패는 기록되지 않습니다. 첫 업링크를 기다리는 것은 프로토콜이 제대로 도는 모습입니다. 센서가 실제로 보낸 페이로드 안에서 아무것도 가리키지 못하는 주소는 다른 이야기이며, 있는 그대로 읽기 실패로 알려집니다.
센서가 조용해질 때
아무것도 센서를 주기적으로 묻지 않으므로, 센서가 마지막으로 보낸 페이로드는 다음 것을 보낼 때까지 그 캐시에 남습니다. 그대로 두면 배터리가 다한 센서가 스테이션이 도는 내내 같은 숫자를 정상 읽기로 계속 공개하며, 참이기를 그친 값으로 차트와 이력과 경보를 먹일 것입니다.
그래서 센서는 저마다 자기 패널에 초 단위의 전송 없이 지날 수 있는 최대 시간을 가집니다. 기본값은 3600초, 곧 한 시간이며, 흔한 센서의 10분에서 30분 주기를 여유 있게 넘깁니다. 더 드물게 알려 오는 센서는 자기 값을 올리십시오. 그 기한이 지나면 이렇게 됩니다.
- 그 태그는 값을 담기를 멈추고, 마지막 업링크를 되풀이하는 대신 품질이 나쁜 것으로 공개합니다.
- 장치 패널은 센서가 마지막으로 전송한 때를 알려 주므로, 얼마나 오래 조용했는지 볼 수 있습니다.
이 칸을 0으로 두면 그 센서의 만료가 꺼집니다. 마지막 업링크가 언제까지나 정상으로 읽힙니다. 그 밖에 달라지는 것은 없고, 저장된 페이로드도 버려지지 않습니다.
태그 주소 지정
LoRaWAN 태그는 해독된 업링크 페이로드 안의 바이트를 가리킵니다. 자유 입력 주소는 없습니다. 신호원 카드는 형식 있는 칸을 두 방식으로 내놓으며, Cayenne LPP 채널/형식으로 주소 지정 확인란이 그 둘을 바꿉니다.
| 칸 | 하는 일 | 값 | 기본값 |
|---|---|---|---|
| Cayenne LPP 채널/형식으로 주소 지정 | 꺼짐이면 채널 칸이 그냥 바이트 위치입니다. 켜짐이면 페이로드에서 Cayenne LPP 채널/형식 쌍을 찾습니다. | 켜짐 / 꺼짐 | 꺼짐 |
| 채널 / 페이로드 오프셋 | 오프셋 방식에서는 값이 시작되는 0부터 세는 바이트 위치입니다. LPP 방식에서는 찾을 LPP 채널 번호입니다. | 0 이상 | 0 |
| LPP 형식 코드 | LPP 방식에서만 씁니다. 채널 바이트 뒤에 오는 Cayenne LPP 데이터 형식 바이트입니다(예를 들어 온도는 103입니다). 값 바이트는 맞는 채널/형식 쌍 바로 뒤에서 읽으며, 맞는 페이로드가 여럿이면 가장 새 것이 이깁니다. | 0 이상 | 0 |
| 읽기 길이 (바이트, 비우면 자동) | 값을 이루는 페이로드 바이트 수입니다. 비우면 데이터 형식에서 이끌어 냅니다. Boolean과 Byte는 1, Int16은 2, Int32와 Float은 4, String은 16입니다. | 1 이상, 또는 비움 | 비어 있음 |
| 비트마스크 (16진수, 비우면 없음) | 다른 무엇보다 먼저 원시 바이트에 AND로 씌우는 16진수 마스크입니다(예를 들어 상태 비트를 떨어뜨리려면 0x0FFF입니다). 0x 앞머리는 붙여도 되고, 길이가 홀수인 마스크는 앞을 채웁니다. 마스크는 읽기 길이와 정확히 같은 바이트 수를 덮어야 하며, 그렇지 않으면 읽기가 오류를 냅니다. |
16진수 문구 또는 비움 | 비어 있음 |
| 최상위 바이트 먼저 | 페이로드가 값을 빅 엔디언으로 담고 있다고 선언합니다. 읽은 바이트는 변환 전에 뒤집힙니다. 여기에는 워드 순서 상자가 없습니다. 길이가 정해지지 않은 페이로드에는 뒤바꿀 16비트 워드가 없기 때문입니다. | 켜짐 / 꺼짐 | 꺼짐 |
| 곱수 (비우면 없음) | 해독한 바로 뒤, 값이 태그 자신의 변환 경로에 들어가기 전에 네트워크 서버가 적용하는 버스 쪽 계수입니다. 숫자 형식에만 적용됩니다. 0은 입력하는 자리에서 거부됩니다("곱수를 0으로 두면 모든 읽은 값이 0이 됩니다."). 그러면 그 태그의 모든 읽기가 정상 품질의 0으로 알려지게 되기 때문입니다. | 0이 아닌 아무 숫자, 또는 비움 | 비어 있음 |
읽을 때의 차례는 이렇습니다. 주소가 가리키는 바이트를 가져오고 → 비트마스크를 씌우고 → 최상위 바이트 먼저이면 뒤집고 → 태그의 데이터 형식으로 바꾸고 → 곱수를 적용합니다(숫자 형식).
11바이트 페이로드의 오프셋 2에 빅 엔디언 Int16 온도를 담은 센서를 예로 들면 이렇습니다.
- 오프셋 방식에서는 채널/오프셋
2, 읽기 길이2, 최상위 바이트 먼저 켜짐입니다. - 같은 센서가 채널 1에서 형식 103으로 Cayenne LPP를 말하는 LPP 방식에서는 LPP 확인란을 켜고 채널
1, 형식 코드103, 읽기 길이2입니다.
지원하는 데이터 형식
| 형식 | 읽는 바이트(자동) | 바이트를 해석하는 방식 |
|---|---|---|
| Boolean | 1 | 0이면 false, 그 밖에는 true |
| Byte | 1 | 부호 없는 바이트 |
| Int16 | 2 | 부호 있는 16비트 정수 |
| Int32 | 4 | 부호 있는 32비트 정수 |
| Float | 4 | IEEE 754 단정밀도 |
| String | 16 | 읽기 길이만큼의 UTF-8 글자 |
쓰기와 장치 검색
LoRaWAN 태그는 읽기 전용입니다. 값은 센서 업링크에서만 오고, 접근 칸은 쓸 수 있는 선택을 내놓지 않으며, 런타임은 성공한 척하는 대신 쓰기를 거부합니다. 다운링크는 프로토콜에 네트워크 통신으로 존재하지만(조인 수락, MAC 명령) 태그 값 쓰기로는 결코 존재하지 않습니다.
이 드라이버에는 장치 검색 스캔이 없습니다. 집중기는 Station EUI와 지역으로, 센서는 저마다 DevEUI와 AppKey로 손으로 추가하십시오. 일반적인 장치 추가 흐름은 Connector 페이지에서 설명합니다.