이 프로젝트는 CTIC 재단이 사용할 수있는 정보를 수집하기 위해 LORA 전송 기술에 대한 작은 테스트를 수행하려고합니다. 정보는 최종 장치 (노드 또는 고객)에서 전송되며,이 정보는 게이트웨이 장치에 의해 수집되며,이를 통해 서버로 전달하여 저장합니다.
LORA는 SEMTECH가 특허받은 무선 주파수 변조 유형을 사용하는 무선 기술 (예 : WiFi, Bluetooth, LTE, Sigfox 또는 Zigbee)입니다.
현재이 기술은 Alliance LORA가 관리 하여이 기술을 사용하려는 모든 하드웨어 제조를 인증합니다.
LORA는 간섭에 대한 높은 공차 , 데이터 수신에 대한 높은 감도 (-168dB), 소비가 매우 낮고 (장치는 단일 배터리로 10 년 동안 지속될 수 있음) 10 ~ 20km 범위 (직접 비전 또는 토지의 토폴로지가 이용 가능한지에 따라)를 가지고 있습니다. 반면에, 우리는 매우 낮은 데이터 전송 (최대 255 바이트)을 발견합니다.
이 모든 것이이 전송 기술이 전류가 필요하지 않거나 전류에 접근 할 수없는 먼 거리 또는 IoT 네트워크에 유용하게 만듭니다.
LORA는 무료 주파수 (유럽에서는 868MHz , 미국에서는 916MHz 또는 아시아에서 433MHz)에서 일하면서 전기 네트워크 공급 업체와 통신 공급 업체 (방사선 수익성을 사용)가 필요하지 않아야 할 수있는 정보를 얻지 못하고 위험없이 정보를 보낼 수 있습니다.
Loremac (Lora를 통해 알려진) 또는 Lorawan을 통해 장치와 통신 할 수 있습니다.
LORAMAC : 포인트 to 포인트로 서로 두 개의 장치를 통신하는 데 사용됩니다. 하나는 정보를 보내고 다른 하나는 정보를 수집합니다 (또는 그 반대로).
Lorawan : 장치 네트워크를 통신하는 데 사용됩니다. 이 접근법에서 게이트웨이의 그림이 나타납니다 (하나 이상의 장치의 정보를 수집하여 서버로 전달하는 장치). Lorawan에서는 정보를 필터링하여 게이트웨이를 듣고 무시 해야하는 장치를 알기 위해 정보를 필터링해야하지만 나중에 볼 수 있습니다. 이 접근법은 스타 토폴로지를 사용합니다.
반면, 로라완 에는 세 가지 유형의 최종 장치 또는 노드가 있습니다.
*예제에서 클래스 A 및 B 노드에 대한 지원 (사용 된 라이브러리에서 지원)이지만 유형 A 만 구현됩니다.
유럽의 자유 주파수 대역 (868MHz)이 사용되는 경우 일부 제한 사항을 고려해야합니다.
각 주파수 대역에는 여러 채널 또는 하위 대역이 있습니다. 유럽 (868MHz)의 경우 0에서 9까지의 10 개의 채널이 있습니다. 그러나 예를 들어 미국 (915MHz)에서 최대 64를 찾을 수 있습니다.
한 채널 또는 다른 채널을 통해 정보를 전송하는 것은 라이브러리가 일반적으로 사용하는 작업입니다.
일부 최종보고 에서는 Datarrate 또는 장치 스프레더를 수정할 수 있습니다.
Datarrate 및 SpreadingFactor는 관련이 있습니다. 0의 Datarrate는 SF12를 나타내고 5의 Datarrate는 SF7을 나타냅니다. 다음과 같은 예외가있는 125kHz의 주파수로 모두 : 6의 데이터 테이터는 250kHz의 SF7을 나타냅니다.
두 개의 장치 (노드 용 및 게이트웨이 용은 Wi -Fi 연결이 있어야 함)와 TTS ( Things Network ) 또는 ChirpStack (집에서 자체 서버를 사용할 수 있음)의 관련 계정. 이 예에서, Arduino 노드와 Pycom 게이트웨이를 사용하는 Loremac과 Lorawan 예제.
시작하려면 저장소를 복제하는 것으로 충분합니다.
git clone https://github.com/Javieral95/Getting_Started_With_LoRa.git
그런 다음 관련 프로젝트를 장치에 업로드하십시오
왜 두 개의 IDE? 간단하고 Pymakr 확장은 Visual Studio Code에서 거의 작동하지 않습니다. 가장 편안한 작업 공간을 자유롭게 사용하십시오.
두 장치 모두 Antera Lora가 연결되어 있습니다.
참고 : Arduinomkr1300 (Lora end-device와 같은 사용 준비)에 대한 코드와 end-evex가 리포지션에 포함되어 있기 때문에 Pysense 또는 Pytrack을 사용하기위한 코드.

Loramac 예제 (homonyon 폴더에 있습니다)는 Arduino 최종 장치와 Pycom 게이트웨이를 사용하는 기능적입니다.
노드는 하드 코드 정보 만 보내고 게이트웨이는 LORA 및 WIFI에만 연결하고 PYCOM 정보를 수신하고 데이터를 읽는 것을 인쇄합니다 (데이터를 네트워크로 전송하는 기능을 구현했지만).
네트워크 서버의 사용은 분배됩니다.
더 알아 보려면 폴더 /loramac 에 액세스 할 수 있습니다.
이러한 예제 (Arduino 최종 장치 및 Pycom 게이트웨이를 사용하여 기능적 인 경우)를 사용하려면 데이터를 시각화하려면 서버가 필요합니다. 이 예에서는 Things Network 및 Chirpstack (이전에 Loraserver로 알려진)의 사용이 해결되었습니다.
더 많은 것을 알기 위해 폴더 /로라완 에 액세스 한 다음이 문서를 계속 상담 할 수 있습니다.
Lorawan에는 두 가지 유형의 인증이 있습니다.
*현재의 예에서는 OTAA 만 만들어집니다.
앞에서 언급했듯이 서버가 필요합니다. 이 예에서는 무료 버전의 Thing Network, Pycom이 소유 한 Chirpstack 서버 및 집에서 배포 된 다른 버전이 사용되었습니다.
가장 신뢰할 수 있고 안전하며 더 나은 문서화 된 대안입니다. 그러나 모든 것이 열려있는 것이 중단 될 것임을 나타냅니다 (애플리케이션 당 50 개의 노드가 있음).
응용 프로그램 생성은 간단하고 메뉴에 액세스하고 +버튼을 클릭하십시오. 응용 프로그램의 이름, 고유 ID 및 설명을 표시하면.
응용 프로그램이 생성되면 +버튼을 클릭하면 최종 장치 (노드)를 추가 할 수 있습니다.
게이트웨이는 여러 최종 장치 (여러 응용 프로그램에 속하는)에서 나오는 트래픽을 전송하고 서버로 전달하는 장치입니다. 게이트웨이 생성도 간단합니다. + 버튼을 클릭하고 다음 개념에주의를 기울이는 양식을 작성하십시오.
노드가 서버로 전송 한 데이터를 읽으려면 페이로드를 해독해야합니다. TTN의 경우 각 장치에 대해 페이로드 포메 라스 탭에서 수행합니다. 우리는 Formatter가 JavaScript 옵션을 유형하는 방법을 선택하고 다음을 선택합니다.
function Decoder(bytes, port) {
// Decode plain text; for testing only
return {
myTestValue: String.fromCharCode.apply(null, bytes)
};
}
arduino_ttn_decoder.js 네트워크의 모든 16 진수 주소가 시장에있는 것으로 확립되어 있으며, 장치를 프로그래밍 할 때는 중요하지 않지만 과거 버전에서 오류가 발생했습니다.
이것은 오픈 소스 대안이며 여전히 개발 중이며 문서는 그리 좋지 않습니다. 그러나 작동하고 서버를 시작할 수 있습니다.
Pycom은 게이트웨이 장치를 연결하기 위해 Chirpstack 서버를 제공합니다.
응용 프로그램은 Things Network의 섹션에서 자세한 내용과 유사합니다.
서버 섹션의 장치 프로파일 로 이동하여 관심있는 프로파일 (OTAA)에 액세스하고 버전을 수정해야합니다.
게이트웨이를 만들려면 동일한 이름으로 액세스하고 +버튼을 클릭하십시오. 게이트웨이 ID 필드에 특별한주의를 기울이는 양식 (Gateway를 식별하는 64 비트)에 특별한주의를 기울이면 Chirpstack이 귀하를 위해 생성 할 수 있지만 장치의 Mac이 일반적으로 사용됩니다 (게이트웨이 Pycom을 설명하는 섹션에서는 알지 못하는 경우).
나머지 기본값을 남길 수 있습니다.
노드가 서버로 전송 된 데이터를 읽으려면 페이로드를 해독해야합니다. ChirpStack의 경우 각 장치 프로필에 대해 수행 할 것입니다. 장치 profiles_에서 우리는 우리에게 관심있는 프로파일에 액세스하고 코드 탭에 액세스합니다.
우리는 사용자 정의 Decipt 코덱 함수 에서 선택하고 다음을 선택합니다.
function Decode(fPort, bytes) {
var tempObj = new Object();
tempObj.data=bytes;
tempObj.decodedData = String.fromCharCode.apply(null, bytes);
tempObj.message = "Informacion recibida del nodo";
return tempObj;
}
arduino_chirpstark_decoder.js Chirpstack의 모든 16 진수 주소는 Minuscules에 있으며 장치를 프로그래밍 할 때는 중요하지 않지만 과거 버전에서는 오류가 발생했습니다.
Chirpstack은 Lorawan에서 자체 개인 서버를 출시하기위한 OpenSource 대안을 제공하며 간단한 방식으로 컨테이너를 통해 수행 할 수 있습니다.
그렇기 때문에이 작업을 허용하는 Chirpstack (Brocar)의 창립자가 소유 한 다른 저장소가 현재 저장소에서 복제되었습니다. chirpstack-docker 폴더에서 찾을 수 있습니다.
Chirpstack은 아키텍처에 다양한 구성 요소가있어 서비스를 작동 할 수 있습니다.

컨테이너 형태로 서버를 표시하는 방법을 사용하면 많은 아키텍처 구성 요소를 추상화 할 수 있지만 아래에 자세히 설명되어 있습니다.
배포하기 전에 필요한 모든 매개 변수는 구성 보드에 저장된 구성 파일에 구성되어야합니다.
다음 공식 문서를 참조 할 수 있습니다.
참고 : 구성 파일은 빈 공간이나 빈 줄에 민감합니다 (모기 그물에서 발견 됨) 파일을 확인하고 오류를 피하기 위해 제거합니다.
이미 앞에서 언급했듯이 컨테이너의 배포는 간단하며 chirpstack-docker 디렉토리에 있습니다.
필요한 것이 이미 구성되면 Chirpstack Docker 디렉토리에 배치하고 시작하는 것으로 충분합니다.
docker-compose up
기본 구성을 사용하면 로컬 방향으로 서버에 액세스 할 수 있습니다 : 8080 . 사용자는 관리자 및 관리자 비밀번호입니다.
기본 구성 추가를 시작합시다 :
서버가 구성되면 게이트웨이를 등록하고 최종 장치를 기록하기 위해 응용 프로그램을 작성해야합니다. 이 프로세스는이 문서의 이전 섹션에서 설명 된 것과 유사하게 수행됩니다 : Chirpstack (LORA Server).
또한, 수신 된 정보를 디코딩하고 인코딩하는 기능을 표시해야하며, 이전 섹션에서도 설명되어야합니다.
게이트웨이를 시작하는 데 사용되는 코드는 아래에 Pycom (Pytrack이있는 Fipy)에 자세히 설명되어 있습니다. 이 코드는 Lorawan/Lorapycomgateway 에 있습니다.
Nanogateway Py 라이브러리가 사용되어 게이트웨이를 몇 분 안에 출시 할 수 있습니다.
Nano-Gateway는 PYCOM 장치를 간단한 게이트웨이로 변환하여 주파수 대역 (모노 카날) 채널에만 듣고 PYCOM의 더 많은 밴드를 들으려면 상용 게이트웨이에 필요할 수 있습니다.
구성 파일에서 게이트웨이를 사용자 정의하는 데 필요한 모든 것을 다음과 같습니다.
WIFI_MAC = ubinascii.hexlify(machine.unique_id()) #.toUpper() para TTS
SERVER = 'loraserver.pycom.io' #(or url of your server)
GATEWAY_ID = WIFI_MAC[:6] + "ffff" + WIFI_MAC[6:12] #Minusculas: Chirpstack
NTP = "es.pool.ntp.org"
NTP_PERIOD_S = 3600
#WiFi settings (change it)
WLAN_SSID = "MyAwesomeWiFi" #"pycom-wifi"
WLAN_PASS = "CheckOutThisGoodPassword" #"securepassword"
WLAN_TIMEOUT_MS = 180000
### LoRaWAN for EU868 ###
LORA_FREQUENCY = 868500000
#Spreading Factor: (Higher value in SF=More distance but less speed transmision)
LORA_GW_DR = "SF7BW125" # DR_5,Can change in range: SF7 to SF15 (SF7B250 also exists)
LORA_NODE_DR = 5 #5 (6 uses 250Khz) for SF7, 4 for SF6.. all using 125Khz
###
def get_gateway_id():
print("Your gateway_id is: {}".format(GATEWAY_ID)) #The gateway is b'THIS_STRING'
return GATEWAY_ID
참고 : 인터넷 연결없이 게이트웨이를 로컬 네트워크에 연결하면 시계를 동기화 할 때 오류가 반환됩니다. 다음 예제가 표시된 것처럼 nanogateway.py 파일의 시작 (self) 함수의 다음 줄 (self) 함수에서 다음 줄에 댓글을 달리는 단계에서 벗어날 수 있습니다.
# get a time sync
self._log('Syncing time with {} ...', self.ntp_server)
#self.rtc.ntp_sync(self.ntp_server, update_period=self.ntp_period)
#while not self.rtc.synced():
# utime.sleep_ms(50)
self._log("RTC NTP sync complete")
여러 기본 파일 기능이 사용되지 않으며 다음과 같이 게이트웨이를 시작해야하며 이미 작동합니다.
def init_loraWAN_gateway():
print("Initializing LoRaWAN nano Gateway")
nanogw = NanoGateway(
id=config.GATEWAY_ID,
frequency=config.LORA_FREQUENCY,
datarate=config.LORA_GW_DR,
ssid=config.WLAN_SSID,
password=config.WLAN_PASS,
server=config.SERVER,
port=config.PORT,
ntp_server=config.NTP,
ntp_period=config.NTP_PERIOD_S
)
print("Ok! Now you have a LoRaWAN Gateway! Lets start it, wait . . .")
pycom.rgbled(0xAA0000)
nanogw.start()
nanogw._log('. . . Yeah! Nano gateway is connected and running, enjoy the log:')
pycom.rgbled(0x000000)
PYCOM은 연결할 때까지 빨간색 표시등을 유지하면 장치의 장치에 귀를 기울이면 녹색 LED가 플래시됩니다.
다음은 Arduino를 사용하여 클래스 노드 A를 작동하도록 자세히 설명합니다.
이론은 주파수 대역에서 사용 가능한 모든 채널을 사용하며 나중에 힘의 방법은 하나만 볼 수 있습니다 (권장되지 않음).
McCi Arduino Lorawan Library가 사용되어 Lora 커뮤니케이션의 많은 측면을 추상화 할 수 있습니다. 플랫폼 라이브러리 관리자가 설치했습니다.
기본적으로 Arduino 클라이언트에 사용되는 코드는 일부 수정을 제외하고 Library의 ttn-otaa.ino 예제에있는 코드입니다.
구성은 두 개의 다른 파일로 만들어집니다.
위에 표시된대로 Lorawan과 관련된 모든 구성은 Lorawan.cpp 파일에 표시됩니다. 문서 의 시작 부분에서는 데이터 가 표시되어야한다고 자세히 설명 해야합니다.
그런 다음 Chirpstack의 예 :
static const u1_t PROGMEM APPEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
static const u1_t PROGMEM DEVEUI[8] = {0x7b, 0x6b, 0xff, 0x2c, 0x7b, 0x2c, 0x19, 0x5a};
static const u1_t PROGMEM APPKEY[16] = {0xbd, 0x21, 0x5a, 0x82, 0xb2, 0xf7, 0x92, 0xf3, 0xc7, 0xcb, 0xb2, 0x88, 0xc7, 0x55, 0x33, 0xe7};
loraWan.cpp 파일의 전체 키 구성에서 온도 및 습도 센서에서 플랫 텍스트 또는 데이터를 전송할지 여부를 선택할 수 있습니다. 원하는 옵션을 분해합니다.
/******* Send data config *******/
// Use this to send a Hello world in plain text
// static uint8_t mydata[] = "Hello World!";
// Use this to send sensor data
const int neededBytes = 4; // 4 bytes: 2 for temperature and 2 for humidity, can change this value
static byte mydata[neededBytes];
static LoraEncoder encoder(mydata);
전송 된 정보에 따라 네트워크 및 chirpstack의 섹션에 표시된대로 디코딩 또는 기타 기능을 사용해야합니다.
이전에 본 바와 같이, Nano-Gateway Pycom 플레이트는 채널에서만 읽을 수 있으며 Arduino Final Device는 모든 밴드 채널에서 방송 될 수 있습니다 (예 : 유럽 밴드에는 10 개의 채널이 있습니다). 권장되지는 않지만 (1%규칙을 위반할 수 있음) 개발 및 테스트 문제로 인해 채널과 주파수 만 사용해야합니다.
이를 위해서는 라이브러리 코드,보다 구체적으로 lorabase_eu868.h (유럽 주파수 사용의 경우)를 수정하고 원하는 주파수가 다음과 같이 발행하도록 강요해야합니다 (주파수 868.mhz를 나타내도록 모든 값이 어떻게 하드 코딩되었는지 확인).
enum {
EU868_F1 = 868500000, // g1 SF7-12
EU868_F2 = 868500000, // g1 SF7-12 FSK SF7/250
EU868_F3 = 868500000, // g1 SF7-12
EU868_F4 = 868500000, // g2 SF7-12
EU868_F5 = 868500000, // g2 SF7-12
EU868_F6 = 868500000, // g3 SF7-12
EU868_J4 = 868500000, // g2 SF7-12 used during join
EU868_J5 = 868500000, // g2 SF7-12 ditto
EU868_J6 = 868500000, // g2 SF7-12 ditto
};
enum {
EU868_FREQ_MIN = 868500000,
EU868_FREQ_MAX = 868500000
};
다음 함수는 Lora ( Lorawan_StartJob () 함수의 시작 부분에서도 호출되어야합니다.
// Define the single channel and data rate (SF) to use
void disableChannels(int selectedChannel, int dr)
{
// Disable all channels, except for the one defined above.
// ONLY FOR TESTING AND DEVELOPING!
for (int i = 0; i < 9; i++)
{ // For EU; for US use i<71
if (i != selectedChannel)
{
LMIC_disableChannel(i);
}
}
// Set data rate (SF) and transmit power for uplink
LMIC_setDrTxpow(dr, 14);
}
구성 할 채널과 절차는 파일의 시작 부분, 선에 있습니다 (기본적으로 : 채널 0 및 값이 5 인 스프레딩 계수 7의 원하는 데이터 테이트) :
/******* Channel config (only change if you want to uses a single channel) *******/
const int channel = 0; // Use if you want to use only one Band's Channel.
const int dr = DR_SF7; // Use if you want to use a specific datarate (The spreading factor mark the dr's value).
이로 인해 게이트웨이가 수신되지 않는 것이 여전히 있지만 패키지 손실이 상당히 줄어 듭니다.
프로젝트를 Arduino 플레이트에 복사하기 만하면됩니다.
서점은 이벤트별로 작동합니다.이 경우 가장 중요한 것은 인증 (완료하면 콘솔의 키가 표시됩니다)과 데이터 배송입니다.
Lorawan.cpp 파일의 void onevent 함수 (EV_T EV) 에서 데이터가 전송 되는 이벤트는 이벤트에 "RX Window"가 포함되어 있으며,이 시점에서 장치가 장려됩니다.
case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen)
{
Serial.print(F("Received "));
Serial.print(LMIC.dataLen);
Serial.println(F(" bytes of payload"));
}
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL), do_send);
break;
동일한 파일의 함수는 전송되는 데이터가 자세히 설명되어 있습니다 .
void do_send(osjob_t *j)
{
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND)
{
Serial.println(F("OP_TXRXPEND, not sending"));
}
else
{
// Leer datos de sensor y codificar (Libreria LoRa_Serialization).
am2315_readedData data = readAM2315Data();
encoder.writeTemperature(data.temp);
encoder.writeHumidity(data.hum);
// Comentar las dos lineas "encoder" para enviar texto plano
// Send packet
LMIC_setTxData2(1, mydata, sizeof(mydata), 0);
if (isLoopRunning)
{
freq = String(LMIC.freq);
Serial.println("-->Packet queued using freq = " + freq);
// Prepare upstream data transmission at the next possible time.
printSensorInfoInDisplay(data.temp, data.hum);
printLoraSentInDisplay(freq);
}
}
// Next TX is scheduled after TX_COMPLETE event.
}
참고 : 노드가 패키지를 다시받지 못하게하는 오류가 발생하여 서버 앞에서 장치를 인증하는 것은 불가능했습니다. 고객 setup () (특히 lorawan_startjob () 함수에서 Lorawan.cpp 파일)에 추가되었습니다. 최대 클록 오류를 10%증가시키는 다음 코드 줄을 추가했습니다.
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100);
Chirpstack과 Things Network는 모두 서버를 다른 서비스로 보내는 데이터를 보내기 위해 일련의 통합을 제공합니다. 예 : 데이터를 영향 데이터베이스로 보낼 수 있고, MQTT를 사용하고, AWS 서비스 또는 Azure에 연결할 수 있습니다 ...
이 섹션에서는 HTTP (Webhooks in the Things Network) 및 MQTT 의 통합을 사용하여 장치가 전송하는 데이터를 보내고 서버가 자체 응용 프로그램을 수신하는 실용적인 사례가 나타납니다.
통합 액세스 :
Chirpstack을 사용 하는 경우 관심 이 있습니다
두 서버 모두 에서이 통합은 비슷한 방식으로 작동합니다. 응용 프로그램 장치가 정보를 보낼 때마다 이벤트를 시작합니다 (TTN의 경우 업 링크 메시지 상자를 표시해야 함).이 정보를 사용하면 Post -Type HTTP 요청의 연기가 표시되는 URL로 시작됩니다.
참고 : 이벤트가 올바르게 시작되었는지 확인하거나 데이터 형식을 시각화하는 것이 좋은 방법은 PostBin 서비스에 액세스하는 것 입니다.
Note2 : 청원서를 시작할 신청서가 LocalHost 및 Chirpstack 서버 (이 문서에 표시된대로 Dokerized 방식으로)에 보관 된 경우 URL을 다음과 같이 표시해야합니다.
http://host.docker.internal:PUERTO/uri
이 문서는 Chirpstack의 사용에만 적용되며 TTN은 데이터를 보내도록 문서화되어 있지 않습니다 (청원서에서 다른 형식이 있습니다).
이 저장소 (폴더 Decoders-Integrations )의 예제로 데이터가 디코딩 된 경우 다음과 유사한 요청에서 본문을 얻게됩니다.
{
"applicationID": 0,
"applicationName": "Name",
"deviceName": "DeviceName",
"devEUI": "BYTES_EUI",
"txInfo": [Object object],
"adr": true,
"dr": 5,
"fCnt": 24,
"fPort": 1,
"data": "DATA_WITHOUT_DECODE",
"objectJSON": {
"data":"DATA_WITHOUT_DECODE==",
"decodedData":{
"humidity":37,"temperature":23
},
"message":"Informacion recibida del nodo"
},
"tags": [Object object],
"confirmedUplink": false,
"devAddr": "BYTES_DEV_ADDR"
}
ObjectJson 은 디코더 기능에 의해 반환 된 객체입니다.
예를 들어 JavaScript 응용 프로그램에서 다음과 유사한 작업을 수행하는 데 충분합니다 ( /Decoders-Integrations/arduino_Chirpstack_Http_Integration.js ).
const { deviceName, objectJSON, devAddr} = req.body;
var sensorData = JSON.parse(objectJSON);
//devAddr esta codificado!
var temperature = sensorData.decodedData.temperature;
var humidity = sensorData.decodedData.humidity;
실제로 MQTTS (TLS와 MQTT)를 사용하지 않으면 서버 웹 애플리케이션에서 통합에 액세스 할 필요가 없습니다.
이 예에서는 최종 장치가 데이터를 보낼 주제에 응용 프로그램에 서명합니다.
우리의 응용 프로그램이 집에서 시작되고 Chirpstack 서버 (이 문서에 나와있는 것처럼 dockerized)에서도 브로커 호스트가 WSL 머신의 IP가됩니다. 이 데이터를 알기 위해 우리는 시작할 것입니다.
wsl hostname -I
또한 다음 명령을 시작하여 일부 구성을 만들어야합니다 (1883은 다른 수정을 사용하는 경우 모기 포트입니다).
netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=1883 connectaddress=127.0.0.1
TRU 값이있는 익명 매개 변수 (모든 유형의 암호 또는 사용자 목록을 사용하지 않고)와 함께 Docker의 예에서 MQTT를 사용할 수 있거나 (다음 문서로 표시된대로) 사용자 목록 (각 암호로 읽거나 쓸 수있는 주제를 가진)을 구성 할 수 있습니다.
이를 위해 다음 명령을 시작할 것입니다 ( WSL 에서 시작할 수 있음). 각 명령은 각 사용자에 대한 비밀번호를 소개하도록 요청합니다 (이 예에서는 모든 것이 모두 사용되었습니다).
# Create a password file, with users chirpstack_gw, chirpstack_ns, chirpstack_as, bob and nodeApp
sudo mosquitto_passwd -c /etc/mosquitto/passwd chirpstack_gw
sudo mosquitto_passwd /etc/mosquitto/passwd chirpstack_ns
sudo mosquitto_passwd /etc/mosquitto/passwd chirpstack_as
sudo mosquitto_passwd /etc/mosquitto/passwd bob
sudo mosquitto_passwd /etc/mosquitto/passwd nodeApp
# Optional, Secure the password file
sudo chmod 600 /etc/mosquitto/passwd
이렇게하면 모든 사용자와 비밀번호가 포함 된 passwd 파일이 생성되며 이제 다음과 같은 동종 파일로 ACLS 목록을 구성 할 수 있습니다.
user chirpstack_gw
topic write gateway/+/event/+
topic read gateway/+/command/+
user chirpstackns
topic read gateway/+/event/+
topic write gateway/+/command/+
user chirpstack_as
topic write application/+/device/+/event/+
topic read application/+/device/+/command/+
user bob
topic read application/123/device/+/event/+
topic write application/123/device/+/command/+
user nodeApp
topic read application/+/device/#
topic write application/+/device/#
이제 /chirpstack-docker/configuration 에 제출 된 파일을 수정하여 다음 자격 증명을 사용하려면 서버 구성을 수정해야합니다.
[application_server.integration.mqtt]
server="tcp://mosquitto:1883"
username="chirpstack_as"
password="pass"
[integration.mqtt.auth.generic]
servers=["tcp://mosquitto:1883"]
username="chirpstack_gw"
password="pass"
[network_server.gateway.backend.mqtt]
server="tcp://mosquitto:1883"
username="chirpstack_ns"
password="pass"
listener 1883
password_file /mosquitto/config/passwd
acl_file /mosquitto/config/acls
allow_anonymous false
mosquitto:
image: eclipse-mosquitto:2
ports:
- 1883:1883
volumes:
- ./configuration/eclipse-mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
- ./configuration/eclipse-mosquitto/passwd:/mosquitto/config/passwd
- ./configuration/eclipse-mosquitto/acls:/mosquitto/config/acls
이 예에서는 Nodejs 응용 프로그램을 사용하여 로컬 Chirpstack 로컬 서버에 연결합니다. 모든 코드는 /Decoders-Integrations/arduino_Chirpstack_mqtt_Integration.js 파일에서 찾을 수 있습니다.
먼저 MQTT 패키지를 설치해야합니다
npm install mqtt --save
그와 함께, 우리는 이미 브로커에 연결할 수 있습니다.
var mqtt = require('mqtt')
const host = 'WSL_IP'
const port = '1883' //or your port
const clientId = 'mqtt_NodeApp_' + Math.random().toString(16).slice(3)
const connectUrl = 'mqtt://' + host + ':' + port;
const client = mqtt.connect(connectUrl, {
clientId,
clean: true,
//username: "nodeApp", //Descomentar si usamos contraseñas y acls
//password: "pass", //Colocar el usuario y contraseña correspondiente
connectTimeout: 4000,
reconnectPeriod: 1000,
debug: true
})
그리고 원하는 주제를 구독합니다 ( # 문자는 다단계 와일드 카드입니다. 즉, 우리는 모든 하위 토피아를 읽고 문자 +는 단일 레벨 와일드 카드입니다).
const chirpstackApplicationID = 1; //Check url, for example: http://localhost:8080/#/organizations/1/applications. /1/ is the ID
const chirpstackDeviceID = "DEV_EUI";
const chirpstackReadAppTopic = "application/" + chirpstackApplicationID + "/device/#";
const chirpstackWriteAppTopic = "application/" + chirpstackApplicationID + "/device/"+chirpstackDeviceID+"/EXAMPLE";
이를 위해 다음 이벤트를 사용할 것입니다.
//Evento al conectarse
client.on('connect', function () {
console.log("Connected")
client.subscribe(chirpstackReadAppTopic, function (err) {
if (!err) {
console.log("Subscribed to topic: "+chirpstackReadAppTopic)
//client.publish(chirpstackWriteAppTopic, 'Hello mqtt') //Podemso enviar un mensaje para debugear
}
else {
console.log("Error in connection:")
console.log(err)
}
})
})
//Evento al recibir un mensaje
client.on('message', function (topic, message) {
// El mensaje es un buffer, convertimos a String.
var stringMsg = message.toString();
console.log(topic + " - " + stringMsg)
insertSensorEntry_Mqtt(topic, stringMsg); //Funcion que lee el mensaje e inserta en base de datos
})
두 서버 (Chirpstack 및 Things Network)에서 통합을 MQTT 라고합니다. 예, 통합을하기 전에 인증서를 구성해야합니다.
A continuación se documentará como realizar la integración con MQTT en un servidor local de Chirpstack (para más info revisar el apartado ChirpStack privado en local de esta documentación).
Antes de generar los certificados, debemos tener instalado CFSSL & CFSSLJSON. Tras ello, clonaremos el siguiente repositorio propiedad del creador de Chirpstack y seguiremos los pasos de su documentación: Chirpstack-Certificates.
NOTA: Si se usa Windows, instalar los pre-requisitos en la máquina WSL pues se necesitará hacer uso del comando make .
Colocamos la carpeta certs generada con el proyecto Chirpstack-Certificates en nuestro proyecto Chirpstack-Docker . Después modificados el archivo docker-compose.yml para añadir a cada contenedor el volumen que contendrá los certificados correspondientes.
Seguimos siguiendo la documentación del proyecto Chirpstack-Certificates para realizar todas las modificaciones pertinentes en la configuración del servidor:
Como hemos visto anteriormente, el evento que se lanza al recibir un mensaje llama a una función que lee el mensaje recibido y lo descodifica.
El formato del mensaje recibido (si hemos usado los descodificadores del ejemplo) es una cadena de texto con el siguiente contenido:
{"applicationID":"1","applicationName":"APP_NAME","deviceName":"DEV_NAME","devEUI":"DEV_ADDRESS", "txInfo":{"frequency":868500000,"dr":5},"adr":true,"fCnt":2, "fPort":1,"data":"DATA","object":{"data":"DATA","decodedData":{"humidity":0,"temperature":-327},"message":"Informacion recibida del nodo"}}
Y es lo que buscamos leer en la siguiente función:
function insertSensorEntry_Mqtt(topic, msg){
console.log("INSERTAMOS DATO DE SENSOR RECIBIDO POR MQTT EN TOPICO: "+topic);
const parseMsg = JSON.parse(msg); //Recordar haber hecho un ToString al buffer antes!
var deviceName = parseMsg.deviceName;
var devAddr = parseMsg.devEUI; //No codificado
var temperature = parseMsg.object.decodedData.temperature;
var humidity = parseMsg.object.decodedData.humidity;
var success = true;
}
object es el objeto retornado por nuestra función Decoder .
Como bien se sabe, la tasa de transferencia de LoRA es muy baja, lo que provoca una gran perdida de paquetes y una enorme latencia cuando se envía información:
Algunos expertos indican que es necesario cierta distancia entre los dispositivos (30m y preferiblemente algún obstaculo entre ellos) para que la comunicación sea más fluida. No ha sido probado y solo se ha lanzado con las dos tarjetas en un extremo cada una de un piso.
Por otro lado se hace uso de versiones antiguas de LoRaWAN (1.0.2 y 1.0.3) que tienen problemas de seguridad que se solventan en parte en las siguientes versiones (1.0.4 y 1.1.0, esta última también implementa re-conectividad en caso de desconectarse de la red LoRaWAN), pero no se dispone de librerias para trabajar con ellas.
Esto no quita que esta técnología pueda ser muy interesante y útil en el futuro debido a no depender de proveedores externos (de comunicaciones y electricidad), siendo una opción ecónomica y muy llamativa para utilizar en proyectos IoT de grandes ciudades o entornos rurales.
Este proyecto ha sido realizado para la Fundación CTIC, su uso es libre y no es necesarío ningún crédito en su uso (Revisar las licencia de las librerias utilizadas).