該項目試圖對洛拉傳輸技術進行小型測試,以收集CTIC基金會可以使用的信息。信息將從最終設備(節點或客戶)發送,此信息將由網關設備收集,然後將其轉發到服務器以存儲它。
洛拉(Lora)是一種使用Semtech申請專利的射頻調製類型的無線技術(例如WiFi,藍牙,LTE,Sigfox或Zigbee)。
目前,該技術是由聯盟洛拉(Lora)管理的,該聯盟證明了所有試圖使用該技術的硬件製造商。
洛拉(Lora)對乾擾具有很高的耐受性,對接收數據(-168DB)的敏感性很高,消耗量非常低(該設備可以持續十年,單個電池可以持續十年),範圍為10至20 km (取決於直接視覺或土地拓撲是否可用)。另一方面,我們發現數據傳輸非常低(高達255個字節)。
所有這些使該轉移技術對於不需要或無法訪問電流的大距離或物聯網網絡有用。
洛拉(Lora)以自由頻率工作(歐洲為868MHz ,在美國為916MHz,例如在亞洲為433MHz),這些頻率為433MHz),他們收集了不需要的不需要的電力網絡供應商和電信提供商(我們使用放射性頻率),因此可以將信息發出和發送信息。
我們可以通過Loremac(也通過Lora知道)或Lorawan與設備通信。
Loramac :用來互相通信兩個設備,並指向點,一個人發送信息,另一個則收集信息(反之亦然)。
Lorawan :用於傳達設備網絡。在這種方法中,出現網關的圖(收集一個或多個設備的信息並將其轉發到服務器的設備)。在Lorawan中,必須對信息進行過濾,以了解您應該收聽網關的設備以及要忽略的設備,但這將在以後看到。這種方法使用恆星拓撲。
另一方面,在洛萬(Lorawan)中,還有三種類型的最終設備或節點:
*在示例中僅支持A類和B節點(由所使用的庫支持),但僅實現類型A。
如果使用歐洲的自由頻帶(868MHz),則必須考慮一些限制:
在每個頻帶中,有幾個通道或子頻帶,就歐洲(868MHz)而言,我們發現10個從0到9的通道。但是,例如,在美國(915MHz)中,我們可以找到多達64個。
通過一個或另一個渠道發送信息是庫通常促進使用的任務。
在某些最終問題中,可以修改Datartate或設備播放器。
Datartate和expreadFactor與:0的數據指示為SF12和5的Datartate指示SF7。所有的頻率為125kHz,具有以下例外:6的數據量表表示為250kHz的SF7。
兩個設備(一個用於節點的設備,另一個用於網關,也必須具有WiFi連接性),在TTS( Things Network Network )或Chirpstack中有一個關聯的帳戶(能夠在家中使用自己的服務器)。在此示例中,使用Arduino節點和Pycom Gateway的Loremac和Lorawan示例。
首先,克隆存儲庫是足夠的:
git clone https://github.com/Javieral95/Getting_Started_With_LoRa.git
然後將相關項目上傳到設備
為什麼要有兩個IDS?簡單的Pymakr擴展幾乎無法在Visual Studio代碼中起作用。隨意使用最舒適的工作空間。
兩種設備都有與它們連接的Antera Lora。
注意:Arduinomkr1300的代碼(諸如Lora End-Device的使用更多)和使用Pysense或Pytrack作為端evex的代碼也包括在存儲庫中。

Loramac示例(在同型文件夾中找到)是使用Arduino最終設備和PYCOM Gateway的功能。
該節點僅發送硬碼信息,而網關僅連接到Lora和Wifi,接收PYCOM信息並打印讀取的數據(儘管它已經實現了將數據發送到網絡的功能)。
使用網絡服務器的使用。
要了解更多信息,您可以訪問文件夾/Loramac 。
為了使用這些示例(使用Arduino最終設備和PYCOM網關的功能性製作)需要服務器來可視化數據。在此示例中,已經解決了Things Network和Chirpstack (以前稱為Loraserver)的使用。
要了解更多信息,您可以訪問文件夾/Lorawan ,然後繼續諮詢此文檔。
Lorawan中有兩種類型的身份驗證:
*目前只有OTAA。
如前所述,我們將需要一台服務器。在此示例中,已經使用了Things 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 已經確定,網絡事物的所有十六進制地址都在市長中,在對設備進行編程但錯誤時遭受了錯誤時並不重要。
這是開源替代方案,它仍在開發中,其文檔並不是那麼好。但是,它有效並允許啟動服務器。
PYCOM提供了Chirpstack服務器來連接您的網關設備。
該應用程序類似於事物網絡部分中的詳細信息。
您必須轉到服務器部分的設備填充,一旦IT訪問該配置文件(在這種情況下為OTAA)並修改版本:
要創建網關,請訪問同名,然後單擊 +按鈕。填寫表格,特別注意網關ID字段(在識別網關的十六進制中的64位),您可以使Chirpstack為您生成它們,但通常使用設備的MAC(如果您在網關上不知道它的部分,則可以詳細說明它的詳細信息)。
您可以留下其餘的默認值。
為了讀取節點已發送到服務器的數據,有必要解碼有效載荷,在Chirpstack的情況下,我們將為每個設備配置文件執行此操作,在設備Propiles_中,我們訪問了感興趣的配置文件(在這種情況下為OTAA),我們訪問CODECEC TAB:
我們在自定義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的所有十六進制地址都在負曲線中,在編程設備但錯誤中遭受了錯誤時並不重要。
Chirpstack提供了一種OpenSource替代方案,可以在Lorawan啟動我們自己的專用服務器,並允許我們以簡單的方式和通過容器進行操作。
這就是為什麼允許此操作的Chirpstack(Brocar)創始人擁有的另一個存儲庫:Chirpstack-Docker已在當前的存儲庫中克隆。我們在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
注意:如果您將網關連接到沒有Internet連接的本地網絡,則在同步手錶時會返回錯誤。您可以在nanogateway.py文件的啟動(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庫,可讓您抽象Lora通信的許多方面。它已由Platformio Library Manager安裝。
基本上,Arduino客戶端使用的代碼是庫的ttn-otaa.ino示例中找到的代碼,除了進行了一些修改。
配置是在兩個不同的文件中進行的:
如上所述,所有與Lorawan相關的配置均在lorawan.cpp文件中指示。在文檔的開頭,詳細說明了數據應顯示: app_eui , dev_eui和app_key (目光調整下面指示的格式)。
然後是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的各個部分所示。
如前所述,納米門戶PYCOM板只能在Arduino Final設備能夠在所有樂隊頻道上廣播(例如,在歐洲樂隊中有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)中進行EV_TXCOMPLETE ,觀察到該事件包括“ RX窗口”,此時設備會在設備上聽。
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;
該函數在同一文件中,將詳細介紹發送的數據是do_send (如果要發送平面文本,請評論或decoments編碼信息的行):
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.
}
注意:遇到了一個錯誤,該錯誤阻止了節點接收後套件,因此無法對服務器前面的設備進行身份驗證。已在客戶設置()中添加了它(更具體地說,在lorawan_startjob() lorawan.cpp文件的函數中)以下代碼行將最大時鐘錯誤增加10%:
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100);
Chirpstack和Things Network都提供了一系列集成,以將服務器收到的數據發送給其他服務。例如:我們可以將數據發送到影響數據庫,使用MQTT,連接到AWS服務或Azure ...
在本節中,將看到一個實際情況,在該情況下,我們可以使用HTTP (事物網絡中的Webhooks)和MQTT的集成來發送我們的設備發送的數據,並且我們的服務器收到了自己的應用程序。
訪問集成:
如果使用Chirpstack ,我們很感興趣
在這兩個服務器中,此集成都以類似的方式工作:每次應用程序設備發送信息時啟動事件(在TTN的情況下,我們必須標記上行鏈路消息框),並且使用此信息,將郵政-Type HTTP請求的延遲啟動到我們指出的URL。
注意:一個很好的做法,要么驗證事件是否正確啟動,要么可視化數據格式是訪問郵政局服務,我們可以在其中創建一個垃圾箱(臨時URL以接收請求)。
Note2:如果您要啟動的應用程序將請願書包含在Localhost和Chirpstack Server(如本文檔中所示)(如本文檔所示),您將不得不表示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應用程序中,要做類似於以下操作的操作(在file /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),否則不需要從服務器Web應用程序訪問任何集成。
在此示例中,我們將簽署我們的應用程序將最終設備發送數據的主題。
如果我們的應用程序是在家中啟動的,並且還在Chirpstack服務器(如我們在本文檔中顯示的那樣對DOCKERING),則經紀人主機將是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
我們可以在Docker的示例中使用MQTT,並帶有帶有TRU值的匿名參數(不使用任何類型的密碼或用戶列表),或者我們可以配置用戶列表(每個都有可以讀取或寫入其各自密碼的主題)(如以下文檔所示)。
為此,我們將啟動以下命令(我們可以從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
})
並訂閱所需的主題( #字符是多級通配符,這意味著我們讀取任何siptopian,而字符+是單一級別的通配符)。
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 ,是的,在進行任何集成之前,我們必須配置證書。
接下來,將記錄如何在本地Chirpstack服務器中與MQTT集成(有關更多信息,請查看本地文檔的私有CHIRPSTACK部分)。
在生成證書之前,我們必須安裝CFSSL&CFSSLJSON。之後,我們將克隆Chirpstack的創建者擁有的以下存儲庫,並遵循其文檔的步驟:Chirpstack認證。
注意:如果使用Windows,請在WSL計算機中安裝先決條件,因為您需要使用make命令。
我們將certs文件夾放置在我們的Chirpstack-Docker項目中生成的帶有Chirpstack-Certificates項目的文件夾。然後, docker-compose.yml文件將相應證書將要添加到每個容器中。
我們繼續遵循Chirpstack-Certificates項目的文檔,以進行服務器配置中的所有相關修改:
正如我們之前所看到的,收到消息時發布的事件調用了讀取接收到的消息並將其解碼的函數。
接收到的消息的格式(如果我們使用了示例的解碼器)是一個文本鏈,上面有以下內容:
{"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"}}
這就是我們尋求在以下功能中閱讀的內容:
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;
}
對象是我們解碼器函數返回的對象。
眾所周知,洛拉的轉移率很低,當發送信息時會導致包裝損失和巨大延遲:
一些專家表明,對於通信更具流動性,必須使用設備之間的一定距離(30m,最好是它們之間的某些障礙)。它尚未經過測試,並且僅在兩端的一端都釋放了兩張牌。
另一方面,使用了古老的洛杉磯(1.0.2和1.0.3)的古老版本,這些安全問題在以下版本中部分解決(1.0.4和1.1.0),後者在與Lorawan Network脫節的情況下還實現了重新連接的重新連接,但是沒有圖書館可以與他們一起使用。
這並不意味著由於不依賴外部供應商(通信和電力),這項技術在將來可能非常有趣且有用,這是在大城市或農村環境中使用的物聯網項目中的一種生態且非常引人注目的選擇。
該項目是針對CTIC基金會進行的,其使用是免費的,並且不需要使用信用(審查使用的庫許可證)。