В предыдущей части рассказывалось, как подключить модемы RN2483 в режиме LoRa. Сейчас перейдем к следующей, более сложной части — подключению к сети LoRaWAN.
LoRaWAN — это «условно глобальная» сеть, состоящая из конечных устройств (nodes), отправляющих данные на концентраторы (gateway). Каждый концентратор имеет доступ к сети Интернет, и отправляет принятые данные на сервер, который в свою очередь рассылает их подписанным клиентам. Сеть с одной стороны, «глобальная», т.к. данные может принять любой, находящийся поблизости gateway, с другой стороны, она «условно глобальная», т.к. без интернета/интранета оно все равно работать не будет (хотя никто не мешает иметь собственный gateway и сервер внутри организации).
В качестве «узла» будет использоваться модем RN2483, для подключения будет использоваться бесплатный сервис. Продолжение под катом.
Сервис www.thethingsnetwork.org — это открытое сообщество, пользователи которого могут создавать, регистрировать устройства и концентраторы, экспериментировать с тем как все это работает, и т.д. Как говорится, бесплатно и без SMS. Им мы для тестирования и воспользуемся.
Любой желающий может зарегистрировать в сети как node, так и gateway. Сеть The Things Network совершенно бесплатная, многие энтузиасты покупают оборудование за свой счет.
Карта покрытия на момент написания статьи выглядит следующим образом:
Как можно видеть, русскоязычный сегмент покрытия оставляет желать лучшего, но все же он есть. В этом есть и положительная сторона — в Лондоне или Амстердаме новым концентратором уже никого не удивишь, а в России — вполне есть шанс быть первым.
В отличие от простого p2p-соединения, в LoRaWAN все гораздо сложнее — устройства регистрируются в сети, траффик шифруется различными ключами, и так далее. Т.к. сеть является публичной и общедоступной, вопросы защиты данных здесь весьма актуальны.
В сети LoRaWAN существует 2 вида аутентификации:
— Аутентификация «по воздуху» (OTAA, Over-the-Air Activation). Устройства регистрируются в сети и получают ключ, необходимый для работы.
— Активация ABP (Activation by Personalization). Настройки заранее прописываются в устройстве, дополнительной аутентификации не требуется. Этот режим проще, однако есть и минус — данные просто отправляются в эфир, нет гарантии что они были получены концентратором.
Важно: многие дешевые одноканальные концентраторы поддерживают только режим ABP, так что первый способ может и не сработать.
Первым делом необходимо зайти на сайт staging.thethingsnetwork.org и зарегистрировать «приложение» (application). Я назвал его Raspberry Pi Home. При регистрации приложения юзер получает первый ключ, который пригодится в дальнейшем.
Далее мы видим вкладку Devices, куда можно внести наш модем (их может быть несколько). Нажимаем «register device» и выбираем режим OTAA. Появляется окно, в котором нужно ввести идентификатор девайса.
Этот идентификатор можно получить, послав модему команду «sys get hweui». На этом регистрация закончена, как и было обещано, бесплатно и без SMS.
Открыв параметры девайса, можно увидеть все ключи, их необходимо прописать в программе.
Для упрощения кода, я воспользовался библиотекой python-loranode, исходный код для отправки данных приведен ниже. Как можно видеть, в коде есть 3 строки appkey, appeui и deveui, которые используются для аутентификации.
В этом примере на сервер отправляются пакеты, содержащие текущее время (ччмм). Это удобно для контроля того, какой пакет был принят.
Здесь все проще — регистрируем устройство как ABP, и получаем несколько ключей, которые необходимо прописать в программе.
Модем отправляет данные «как есть», никакой гарантии что аутентификация была успешной, нет.
Для отправки данных, необходимо вставить в код ключи nwkskey, appskey, devaddr. Исходный код приведен ниже.
Последний шаг, остается одно — взять ноутбук (или Arduino или Raspberry Pi) с модемом с собой и пойти (поехать, полететь) в то место, где находится зона покрытия ближайшего gateway. Мне до ближайшей зоны покрытия где-то полчаса на трамвае, так что процесс не столь долгий и дорогой.
В случае успешного приема данных, пакеты будут отображены на сервере.
Сам сервер с данными ничего не делает, на сервере можно настроить собственный код для обработки полученных данных. Данный пример лишь тестовый, с данными не делается ничего, в реальном приложении их можно складывать в базу, отсылать уведомления и пр, все зависит от поставленной задачи.
В идеале, сеть LoRaWAN предоставляет пользователю готовый сервис передачи данных, работающий «из коробки», Достаточно лишь подключить устройство, и данные будут отправлены и обработаны ближайшим концентратором (разумеется если пользователь находится в зоне покрытия сети). Сферы применения достаточно обширны, от датчиков открытия двери, температуры или уровня воды на даче, до gps-маяка на животном или модели самолета.
Несколько видеороликов (на английском).
LoRa Alliance Introduction:
The Things Network Introduction:
Впрочем, если говорить о The Things Network, то это «любительский» сервис, разумеется не гарантирующий постоянного соединения. Существуют ли коммерческие провайдеры LoRaWAN, мне пока неизвестно.
Может возникнуть вполне резонный вопрос — что делать, если до ближайшего gateway пара суток поездом или пара часов самолетом? В этом есть свой плюс — можно стать первым. Можно создать свой gateway и зарегистрировать его на сервере The Things Network, цена вопроса различна в зависимости от функциональности — от >1000EUR за «фирменные» многоканальные концентраторы, до 15$ за самодельные устройства на базе SX1276 и Raspberry Pi. Здесь есть сравнительная таблица разных маршрутизаторов, желающие могут изучить ее более подробно.
Последний вариант будет рассмотрен в следующей части.
Что такое LoRaWAN?
LoRaWAN — это «условно глобальная» сеть, состоящая из конечных устройств (nodes), отправляющих данные на концентраторы (gateway). Каждый концентратор имеет доступ к сети Интернет, и отправляет принятые данные на сервер, который в свою очередь рассылает их подписанным клиентам. Сеть с одной стороны, «глобальная», т.к. данные может принять любой, находящийся поблизости gateway, с другой стороны, она «условно глобальная», т.к. без интернета/интранета оно все равно работать не будет (хотя никто не мешает иметь собственный gateway и сервер внутри организации).
В качестве «узла» будет использоваться модем RN2483, для подключения будет использоваться бесплатный сервис. Продолжение под катом.
Сеть The Things Network
Сервис www.thethingsnetwork.org — это открытое сообщество, пользователи которого могут создавать, регистрировать устройства и концентраторы, экспериментировать с тем как все это работает, и т.д. Как говорится, бесплатно и без SMS. Им мы для тестирования и воспользуемся.
Любой желающий может зарегистрировать в сети как node, так и gateway. Сеть The Things Network совершенно бесплатная, многие энтузиасты покупают оборудование за свой счет.
Карта покрытия на момент написания статьи выглядит следующим образом:
Как можно видеть, русскоязычный сегмент покрытия оставляет желать лучшего, но все же он есть. В этом есть и положительная сторона — в Лондоне или Амстердаме новым концентратором уже никого не удивишь, а в России — вполне есть шанс быть первым.
Подключение RN2483 к LoRaWAN
В отличие от простого p2p-соединения, в LoRaWAN все гораздо сложнее — устройства регистрируются в сети, траффик шифруется различными ключами, и так далее. Т.к. сеть является публичной и общедоступной, вопросы защиты данных здесь весьма актуальны.
В сети LoRaWAN существует 2 вида аутентификации:
— Аутентификация «по воздуху» (OTAA, Over-the-Air Activation). Устройства регистрируются в сети и получают ключ, необходимый для работы.
— Активация ABP (Activation by Personalization). Настройки заранее прописываются в устройстве, дополнительной аутентификации не требуется. Этот режим проще, однако есть и минус — данные просто отправляются в эфир, нет гарантии что они были получены концентратором.
Важно: многие дешевые одноканальные концентраторы поддерживают только режим ABP, так что первый способ может и не сработать.
1. Регистрация устройства — OTAA
Первым делом необходимо зайти на сайт staging.thethingsnetwork.org и зарегистрировать «приложение» (application). Я назвал его Raspberry Pi Home. При регистрации приложения юзер получает первый ключ, который пригодится в дальнейшем.
Далее мы видим вкладку Devices, куда можно внести наш модем (их может быть несколько). Нажимаем «register device» и выбираем режим OTAA. Появляется окно, в котором нужно ввести идентификатор девайса.
Этот идентификатор можно получить, послав модему команду «sys get hweui». На этом регистрация закончена, как и было обещано, бесплатно и без SMS.
Открыв параметры девайса, можно увидеть все ключи, их необходимо прописать в программе.
Для упрощения кода, я воспользовался библиотекой python-loranode, исходный код для отправки данных приведен ниже. Как можно видеть, в коде есть 3 строки appkey, appeui и deveui, которые используются для аутентификации.
Исходный код
from loranode import RN2483Controller
from commands import *
import time
# LoRaController OTAA based join and message test
if __name__ == "__main__":
set_debug_level(Level.DEBUG)
port = "COM3"
appkey = "58FF3007CAED02xxxxxxxxxxxxxxxxxxxx"
appeui = "70B3D57Exxxxxxxxxxxxxx"
deveui = "0004A30xxxxxxxxxxx"
# Test controller
lc = RN2483Controller(port)
if lc.test():
printd("[+] Connected to LoRa RN2483 device", Level.INFO)
lc.serial_sr(CMD_GET_VERSION)
lc.serial_sr(CMD_GET_HWEUI)
lc.get_freq()
else:
printd(clr(Color.YELLOW, "[-] Failed to get version from LoRa device"), Level.WARNING)
lc.set_pwr(15)
lc.set_adr(False)
lc.serial_sr(CMD_SET_SF, "sf7") # sf12, sf7
# Join and send a message
if lc.join_otaa(appkey, appeui, deveui):
printd("[+] Connected to gateway", Level.INFO)
# Data-1
printd("[+] Sending packet #1", Level.INFO)
timeStr = time.strftime("%H%M", time.gmtime())
if lc.send(timeStr, ack=False):
printd(clr(Color.GREEN, "[+] Send-1 succeeded"), Level.CRITICAL)
else:
printd(clr(Color.RED, "[+] Send-1 failed"), Level.CRITICAL)
time.sleep(15)
# Data-2
printd("[+] Sending packet #2", Level.INFO)
timeStr = time.strftime("%H%M", time.gmtime())
if lc.send(timeStr, ack=False):
printd(clr(Color.GREEN, "[+] Send-2 succeeded"), Level.CRITICAL)
else:
printd(clr(Color.RED, "[+] Send-2 failed"), Level.CRITICAL)
time.sleep(15)
del lc
exit()
del lc
printd(clr(Color.RED, "[-] Test failed"), Level.CRITICAL)
В этом примере на сервер отправляются пакеты, содержащие текущее время (ччмм). Это удобно для контроля того, какой пакет был принят.
2. Регистрация устройства — ABP
Здесь все проще — регистрируем устройство как ABP, и получаем несколько ключей, которые необходимо прописать в программе.
Модем отправляет данные «как есть», никакой гарантии что аутентификация была успешной, нет.
Для отправки данных, необходимо вставить в код ключи nwkskey, appskey, devaddr. Исходный код приведен ниже.
Исходный код
from loranode import RN2483Controller
import platform
from commands import *
import time
# LoRaController ABP based join and ACK test
if __name__ == "__main__":
set_debug_level(Level.DEBUG)
port = "COM3"
nwkskey = "58AA52E96035Axxxxxxxxxxxxxxxxxxxx"
appskey = "381B1C9206E9BE9xxxxxxxxxxxxxxxxxxx"
devaddr = "B639xxxx"
lc = None
try:
# Test controller
lc = RN2483Controller(port)
if lc.test():
printd("[+] Connected to LoRa RN2483 device", Level.INFO)
lc.serial_sr(CMD_GET_VERSION)
lc.serial_sr(CMD_GET_HWEUI)
lc.get_freq()
else:
printd(clr(Color.YELLOW, "[-] Failed to get version from LoRa device"), Level.WARNING)
except Exception, e:
print "Error: " + str(e)
if lc is None:
printd(Color.YELLOW, "Error: cannot connect to device")
exit()
lc.set_adr(False)
lc.set_pwr(15)
lc.serial_sr(CMD_MAC_PAUSE)
lc.serial_sr(CMD_SET_SF, "sf12") # sf12, sf7
lc.serial_sr(CMD_MAC_RESUME)
# Join and send a message
if lc.join_abp(nwkskey, appskey, devaddr):
printd("[+] Connected to gateway", Level.INFO)
# Data-1
printd("[+] Sending packet #1", Level.INFO)
timeStr = time.strftime("%H%M", time.gmtime())
if lc.send(timeStr, ack=False):
printd(clr(Color.GREEN, "[+] Send-1 succeeded"), Level.CRITICAL)
else:
printd(clr(Color.RED, "[+] Send-1 failed"), Level.CRITICAL)
time.sleep(15)
# Data-2
printd("[+] Sending packet #2", Level.INFO)
timeStr = time.strftime("%H%M", time.gmtime())
if lc.send(timeStr, ack=False):
printd(clr(Color.GREEN, "[+] Send-2 succeeded"), Level.CRITICAL)
else:
printd(clr(Color.RED, "[+] Send-2 failed"), Level.CRITICAL)
time.sleep(15)
del lc
exit()
printd(clr(Color.RED, "[-] Test failed"), Level.CRITICAL)
del lc
Тестирование
Последний шаг, остается одно — взять ноутбук (или Arduino или Raspberry Pi) с модемом с собой и пойти (поехать, полететь) в то место, где находится зона покрытия ближайшего gateway. Мне до ближайшей зоны покрытия где-то полчаса на трамвае, так что процесс не столь долгий и дорогой.
В случае успешного приема данных, пакеты будут отображены на сервере.
Сам сервер с данными ничего не делает, на сервере можно настроить собственный код для обработки полученных данных. Данный пример лишь тестовый, с данными не делается ничего, в реальном приложении их можно складывать в базу, отсылать уведомления и пр, все зависит от поставленной задачи.
Зачем это надо?
В идеале, сеть LoRaWAN предоставляет пользователю готовый сервис передачи данных, работающий «из коробки», Достаточно лишь подключить устройство, и данные будут отправлены и обработаны ближайшим концентратором (разумеется если пользователь находится в зоне покрытия сети). Сферы применения достаточно обширны, от датчиков открытия двери, температуры или уровня воды на даче, до gps-маяка на животном или модели самолета.
Несколько видеороликов (на английском).
LoRa Alliance Introduction:
The Things Network Introduction:
Впрочем, если говорить о The Things Network, то это «любительский» сервис, разумеется не гарантирующий постоянного соединения. Существуют ли коммерческие провайдеры LoRaWAN, мне пока неизвестно.
Что делать если покрытия нет?
Может возникнуть вполне резонный вопрос — что делать, если до ближайшего gateway пара суток поездом или пара часов самолетом? В этом есть свой плюс — можно стать первым. Можно создать свой gateway и зарегистрировать его на сервере The Things Network, цена вопроса различна в зависимости от функциональности — от >1000EUR за «фирменные» многоканальные концентраторы, до 15$ за самодельные устройства на базе SX1276 и Raspberry Pi. Здесь есть сравнительная таблица разных маршрутизаторов, желающие могут изучить ее более подробно.
Последний вариант будет рассмотрен в следующей части.
Поделиться с друзьями
Комментарии (7)
alemv
12.10.2016 15:59LoRaWAN gateway на одном относительно дешевом модуле с SX1272 или SX1276 сделать не получится. Получится сделать так называемый «single channel gateway», и, как правильно отметили в этом обсуждении, он является только «packet forwarder» и ничего больше. Для полноценного gateway, который следует спецификации LoRaWAN, т.е. сканирует все 8 каналов, обеспечивает OTAA и downlink сообщения, необходим модем на SX1301 или уже 8 модулей на SX1276, а это будет сильно подороже чем $15.
DmitrySpb79
12.10.2016 16:59Да, совершенно верно, на SX1276 только single channel gateway сделать можно.
BurlakovSG
А если я не хочу выпускать свою LoRa сеть в глобальную, т.е. мне нужна работа только на моём участке (датчики, задвижки и т.д.), то как можно организовать связь с аутонтефикацией и прочей защитой?
DmitrySpb79
Насколько я понимаю, в настройках Gateway вы указываете адрес сервера куда слать данные, это может быть и адрес своего сервера во внутренней сети.
BurlakovSG
Вот это уже интересно, т.е. аналог сервиса «The Things Network» можно развернуть на своём сервере? Этот сервис бесплатный, но я не нашёл у них на сайте исходников. Есть что-то подобное «The Things Network» в открытом доступе?
DmitrySpb79
Есть какие-то исходники для gateway, можете попытаться разобраться что и куда отсылается. Я не изучал этот вопрос.
https://github.com/Lora-net/lora_gateway
https://github.com/brocaar/lora-gateway-bridge
alemv
Так можно же просто использовать LoRa-модемы со своими настройками. LoRaWAN в этом случае Вам не нужен.