Бездротові мережі ZigBee. Частина 2 [Робота з радіомодулями ETRX35X]

Введення

минулій статті були розглянуті основні особливості бездротової технології ZigBee. У цій частині ми поговоримо про те, як швидко почати роботу з даною технологією на практиці. Для цього були обрані модулі ETRX357, що мають вбудовану прошивку, яка дозволяє працювати з мережевими функціями і управляти аналогової і цифрової периферією з допомогою набору AT-команд. Також у статті будуть більш детально розібрані питання, що стосуються типів пристроїв в мережі ZigBee і безпеки мережі. В кінці ми зберемо мережу збору даних, яка буде отримувати інформацію про температурі від декількох бездротових пристроїв.


1. Модулі ETRX357

Познайомимося з обраної апаратною платформою. Модулі ETRX357 побудовані на базі мікросхеми EM357 від компанії Silicon Labs. Дана мікросхема є системою на кристалі — процесорне ядро Cortex-M3 + ВЧ-приймач, що працює на частоті 2,4 ГГц.
Модулі ETRX357 доступні в 4 модифікаціях:
  • ETRX357 – модуль з вбудованими чіп антеною. Максимальна вихідна потужність радіосигналу +8 дБм.
  • ETRX357HR – модуль з u.FL-роз'ємом для підключення зовнішньої антени. Максимальна вихідна потужність радіосигналу +8 дБм.
  • ETRX357-LRS – модуль з вбудованими чіп антеною і вбудованим підсилювачем потужності. Максимальна вихідна потужність радіосигналу +20 дБм.
  • ETRX357HR-LRS – модуль з u.FL-роз'ємом для підключення зовнішньої антени і вбудованим підсилювачем потужності. Максимальна вихідна потужність радіосигналу +20 дБм.
Експериментальні вимірювання дальності зв'язку для модулів ETRX357 і ETRX357-LRS в умовах прямої видимості:
  • ETRX357 – впевнений прийом на відстані ~300 метрів
  • ETRX357-LRS – впевнений прийом на відстані ~900 метрів
Нижче представлена зведена таблиця по основним характеристикам модуля:











Характеристики Опис Процесорне ядро ARM Cortex-M3 ВЧ-приймач 2.4 ГГц Обсяг Flash/RAM, Кб 192 / 12 Енергоспоживання TX: 42 мА @ +8 дБм RX: 26.5 мА «сон»: 400 Робочий діапазон напруг 2.1 — 3.6 В Робочий діапазон температур -40...+85 °C
Більш детальну інформацію по технічним характеристикам можна отримати в документації на модулі[1].


2. Вбудована прошивка
Всі модулі йдуть з вбудованою прошивкою від виробника, і для початку роботи достатньо подати живлення на модуль, підключити лінії TxD і RxD послідовного інтерфейсу UART, через який здійснюється взаємодія з модулем за допомогою AT-команд. Всі команди можна умовно розділити на 2 типи:
  1. Робота з мережевими функціями. Наприклад:
    • Організація мережі/підключення до існуючої мережі
    • Відправка адресних/групових/широкомовних повідомлень

    • Читання/запис регістрів віддалених вузлів
  2. Робота з периферією модуля. Наприклад:
    • Налаштування портів введення/виводу
    • Керування потужністю ВЧ-приймача

    • Включення/вимикання виводу інформаційних повідомлень по послідовному інтерфейсу
Також стандартна прошивка включає в себе набір функцій, що дозволяють у деяких випадках обійтися без зовнішнього мікроконтролера або керуючого пристрою. Повний перелік команд можна подивитися в керівництві[2], нижче перераховані лише найбільш часто використовуються. Деякі команди з цього списку будуть потрібні нам для створення нашої системи збору даних.
Робота з мережею







Команда Опис AT+PANSCAN Просканувати ефір на наявність доступних для підключення мереж AT+EN Організація мережі AT+JN Підключення до будь-якої доступної мережі AT+DASSL Залишити поточну мережа AT+DASSR:<адреса пристрою> Відправити віддаленого пристрою команду на вихід мережі

Надсилання повідомлень






Команда Опис AT+UCAST:<адреса пристрою>=<повідомлення> Відправка адресного повідомлення AT+MCAST:<макс. кількість ретрансляцій><ID групи><повідомлення> Організація мережі AT+BCAST:<макс. кількість ретрансляцій><повідомлення> Підключення до будь-якої доступної мережі AT+SCAST:<повідомлення> Відправити дані на Sink-вузол
Максимальна довжина повідомлення: 72 байти.
Важливо: групові повідомлення є приватним випадком широкомовних, тому не варто відправляти їх з високою частотою проходження (в документації зазначено не більше 8 групових/широкомовні повідомлення протягом 8 секунд). Крім цього варто звернути увагу на те, що групові повідомлення не приймаються сплячими кінцевими пристроями.
Робота з регістрами радіомодуля






Команда Опис ATSXX? Читання вмісту регістра SXX ATSXX=РРРР Запис в регістр SXX значення YYYY ATREMS:<адреса пристрою>,XX? Читання вмісту регістра SXX віддаленого вузла ATREMS:<адреса пристрою>,XX=РРРР Запис в регістр SXX віддаленого вузла значення YYYY
Можливий побітове доступ до вбудованим S-регістрів. Для цього в команді на читання/запис, після XX потрібно вказати номер біта, до якого необхідно звернутися. Наприклад:
ATS001? # читання стану 1 біт з регістра S00
ATS001=1 # запис 1 у 1 біт регістра S00
ATS1812? # читання стану 18 біт з регістра S18
ATREMS:0000,0 AE? # читання стану 14 біт з регістра S0A віддаленого вузла з коротким адресою 0000


Тепер перейдемо до більш детального розгляду процесу побудови мережі ZigBee. Працювати будемо з налагоджувальні платами, на яких встановлено мезонінний радіомодуль і ZigBee-USB-шлюзом. На налагоджувальних платах є кілька аналогових датчиків, про які буде розказано пізніше. З них ми будемо знімати показання і відправляти на центральний вузол збору даних, де це все буде оброблятися. Крок за кроком ми будемо створювати нашу систему збору даних і розберемо основні труднощі, які можуть виникнути в процесі.
Опишемо майбутню систему збору даних:
  • ZigBee-USB-шлюз є координатором мережі, підключений до ПК
  • ZigBee-USB-шлюз є центральним вузлом збору даних
  • Два радіомодуля збирають дані з датчика температури і освітленості і передають їх центральний вузол збору даних з інтервалом 1 раз у 10 секунд
  • На ПК працює програма, яка отримані оцифровані значення температури переводить в градуси Цельсія і виводить на консоль



3. Створення мережі ZigBee
Вище була згадана команда AT+EN, яка дозволяє організувати мережу. Пристрій, якому дана команда була відправлена по послідовному інтерфейсу, стає координатором мережі. За замовчуванням, координатор самостійно вибирає найбільш відповідний частотний канал, генерує короткий і довгий адресу мережі.
Приклад
AT+EN
JPAN:24,949 D,56370DE37E0DC0FF
# 24 - частотний канал
# 949D - короткий ідентифікатор мережі
# 56370DE37E0DC0FF - довгий ідентифікатор мережі

Нижче представлений список регістрів, значення яких впливає на процес створення ZigBee-мережі:
  • Маска каналів – регістр S00. Дана маска визначає, які канали можуть бути використані. Нагадаємо, специфікація технології ZigBee визначає 16 частотних каналів (нумерація з 11 по 26). Регістр 2 байтний, тому установкою 0/1 можна дозволити/заборонити використовувати відповідний канал. Ця установка діє як для координатора при створенні мережі, так і для всіх інших пристроїв, які хочуть приєднатися до доступної мережі.
    Приклад
    ATS00=0001 # дозволяємо використовувати лише 11 частотний канал
    ATS00=FFFF # дозволяємо використовувати будь-який доступний частотний канал


  • Вихідна потужність передавача – регістр S01. Цей параметр застосовується до радіомодуля при створенні мережі або при підключенні до доступної мережі, і діє протягом усього часу знаходження пристрою в мережі. У процесі роботи в ZigBee-мережі цей параметр поміняти не можна. Єдина можливість це зробити – залишити мережу, поміняти значення в регістрі на нове, покинути мережу і підключитися знову. Всі можливі значення, які можна записати в регістр S01, зазначені у документації[2].
    Приклад
    ATS01=8 # встановлює вихідну потужність +8 дБм
    # (актуально для модулів ETRX357. Для LRS-версій модулів
    # відповідні значення необхідно дивитися в документації)


  • Переважні значення для короткого і довгого ідентифікаторів — регістри S02 і S03. За замовчуванням у даних реєстрах записані 0. Для координатора це означає, що при організації мережі він автоматично згенерує відповідні значення. Для всіх інших пристроїв – підключатися до будь-якої доступної мережі. В іншому випадку, якщо значення регістрів відмінно від 0, то діють наступні правила:
    • координатор постарається присвоїти новій мережі відповідні ідентифікатори
    • всі інші пристрої будуть намагатися підключитися до мережі з заданими ідентифікаторами
Для координатора є один важливий момент: якщо при спробі створити мережу з попередньо встановленими ідентифікаторами вже існує мережа з такими ж параметрами, то збігаються ідентифікатори будуть згенеровані автоматично.
  • Тип пристрою — старші 4 біта в регістрі S0A. Типи пристроїв будуть розглянуті трохи пізніше. Зараз скажемо, що тип пристрою визначається при підключенні до мережі і може бути змінений аналогічним способом з зміною вихідною потужністю передавача.


4. Безпека мережі
В мережах ZigBee за безпеку відповідає спеціальний вузол – Trust-центр. Координатор за замовчуванням є Trust-центром. Також Trust-центром може бути будь-роутер (FFD-пристрій), у випадку, якщо мережа створювалася в режимі розподіленого Trust-центру (про це буде розказано в кінці цієї глави).
Список обов'язків Trust-центру:
  1. дозвіл на підключення інших пристроїв
  2. робота з ключами шифрування (періодичне оновлення ключів, повідомлення інших вузлів про оновлення ключа)
В мережах ZigBee використовується два ключа:
  1. Link Key — цей ключ використовується для встановлення захищеного з'єднання між двома пристроями в мережі для обміну даними. Ключ, який пристрій отримує в момент підключення до мережі називається Trust Center Link Key, а всі інші ключі, які можуть бути отримані в процесі роботи пристрою — Application Layer Link Keys. За замовчуванням, Trust Center Link Key передається у відкритому вигляді, що являє дірку в безпеці, так як в момент підключення нового пристрою до мережі цей ключ можна перехопити
  2. Network Key — цей ключ використовується для шифрування даних на мережевому рівні ZigBee стека. Він генерується Trust-центром і періодично оновлюється. Всі пристрої в окремо взятій мережі ZigBee мають єдиний Network Key. З його допомогою здійснюється шифрування всіх мережевих пакетів. За замовчуванням, Trust-центр передає Network Key зашифрований за допомогою Link Key
Щоб запобігти потенційну компрометацію даних, що передаються в мережі, можна використовувати кілька варіантів:
  • передавати Link Key по нестандартному каналу зв'язку/іншим протоколом зв'язку
  • використовувати встановлений у всі пристрої ключ
  • використовувати механізм вирішення підключення на стороні Trust-центру (даний метод не захистить від компрометації, але зате чужі пристрої не зможуть брати участь в роботі мережі випадково або навмисно)
У даній статті ми розглянемо варіант із встановленим Link Key. Мінус цього підходу, це необхідність запису відповідної конфігурації в усі модулі. Але для нашої маленької мережі це не критично. У стандартній прошивці модулів ETRX357 Link Key можна встановити за допомогою запису відповідного значення в регістр S09. Крім цього необхідно в регістрі S0A встановити в 1 наступні біти:
  • біт 2 — установка в 1 примушує вузол передавати Network Key зашифрованим з допомогою Link Key при спробі перепідключення будь-яких пристроїв
  • біт 4 — -//- при спробі підключення нових вузлів
  • біт 8 — установка в 1 змушує вузол використовувати попередньо Link Key
Приклад конфігурування вузла
ATS09=ABCDEFFEDCBACBAFEDDEFABCBAFEDCFF:password # задаємо Link Key
# :password - пароль для звернення до захищеного регістру
ATS0A8=1
ATS0A4=1
ATS0A2=1

Установка бітів 2 і 4 на всіх вузлах крім координатора є обов'язковою процедурою. Плюси даного підходу:
  • немає необхідності в запису потрібної ідентифікатора (короткої та/або довгого) мережі, які вузли будуть намагатися використовувати для підключення. Пристрої зможуть підключатися лише до мережі з встановленим Link Key
  • зловмисник не зможе отримати Link Key, так як він не буде передаватися у відкритому вигляді
  • до мережі не зможе підключитися «чуже» пристрій
Вкажемо ще на одну цікаву можливість: в регістрі S0A 9 біт відповідає за включення особливої функції — створити мережу в режимі розподіленого Trust-центру. У даному режимі роботи будь-роутер (FFD-пристрій) може дозволити новим пристроям підключатися до мережі. Режим розподіленого Trust-центру використовується при розгортанні великих мереж, щоб уникнути затримок на підключення всіх бездротових вузлів. Після того як мережа розгорнута, з допомогою команди AT+BECOMETC вибирається Trust-центр, який буде займатися регулюванням політики безпеки. Щоб забезпечити безпеку мережі в даному режимі роботи також необхідно подбати про заздалегідь визначену настройку/отриманні Link Key. В іншому випадку, поки не буде обраний Trust-центр, будь ZigBee-пристрій потенційно зможе безперешкодно підключитися до мережі.


5. Типи ZigBee-пристроїв
попередній статті були розглянуті основні типи ZigBee-пристроїв. Нагадаємо головні особливості та зупинимося детальніше на типах кінцевих пристроїв:
  • координатор (COO) – пристрій, яке організувало мережу. Бере участь у процесі маршрутизації мережевого трафіку, виконує обов'язки Trust-центру (крім випадку з режимом розподіленого Trust-центру). Не йде в сплячий режим, тому такий пристрій повинен мати стаціонарний джерело живлення
  • роутер (FFD) — пристрій, який при підключенні мало тип FFD (повнофункціональний пристрій). Як і координатор такий пристрій бере участь в маршрутизації мережевого трафіку і всі зауваження для координатора з приводу сплячого режиму справедливі і для роутера.
Перераховані пристрої виступають в якості батьківських вузлів для кінцевих пристроїв. Максимальна кількість дочірніх вузлів у роутера або координатора може досягати 32. Батьківські пристрої відповідають за прийом та зберігання(*) повідомлень для кінцевих пристроїв, які підключені до них. Кінцеві пристрої, в свою чергу, спілкуються з мережею через батьків. Кожен раз, коли нове кінцеве пристрій підключається до мережі або ж коли старе перепідключається, для нього визначається батько, який робить запис у спеціальній таблиці дочірніх пристроїв. У цій таблиці зберігається короткий і довгий адресу дочірнього вузла і його тип. Розглянемо доступні типи кінцевих пристроїв:
  • кінцеве обладнання (ZED) — пристрій, який не бере участь в роботі мережі з маршрутизації трафіку, підключення нових пристроїв і т. д. Для даного типу специфікація технології ZigBee не передбачає наявність сплячого режиму. Тому при описі батька (*) означала, що вони не зберігають повідомлення для ZED-пристроїв. Передбачається, що у ZED-пристрої приймач завжди включений і батьківський вузол одразу ж по отриманні адресного повідомлення переправляє його адресату. Так що дані пристрої теж повинні мати стаціонарне джерело живлення.
  • спляче кінцеве обладнання (SED) — мережеві обов'язки для даного типу пристроїв аналогічні попереднього типу. Відмінність лише в підтримку сплячого режиму, який оголошений в специфікації технології ZigBee. Такі пристрої більшу частину часу проводять в режимі сну і можуть працювати від батареечного джерела живлення тривалий час. Визначення «тривалого часу» тут залежить від програми, але якщо розглянути приклад з бездротовим ZigBee-вимикачем, то термін роботи такого пристрою від одного комплекту дискових батарей може скласти 2-3 роки[3]. Такі пристрої виходять із сплячого режиму тільки з якого-небудь зовнішнього події (переривання від таймера, щоб оцифрувати показання датчика; по натисненню на кнопку тощо) або ж коли прийшов час відправляти пакет даних. Для того, щоб отримувати повідомлення від батьківського сайту, сплячі вузли використовують Polling-механізм. Про нього ми поговоримо трохи пізніше.
  • мобільний кінцеве обладнання (MED) — аналог сплячого кінцевого пристрою (SED), з тим лише винятком, що запис про нього в дочірній таблиці батьківського вузла зберігається нетривалий час — від декількох секунд до декількох хвилин (для сплячого кінцевого пристрою час зберігання запису може становити до 48 днів). Це зроблено, виходячи з назви, типу, для того, щоб такий пристрій міг переміщатися по приміщенню/об'єкта не викликаючи колізій при передачі повідомленні. Колізія може виникнути, якщо в декількох батьків буде запис про одному і тому ж сайті. Даний тип пристрою не описаний в специфікації ZigBee і є типом розширення функцій SED-пристрої в реалізації стека ZigBee від Silicon Labs.
Приклад мережі ZigBee

Кінцеві пристрої завжди підключаються через FFD-пристрій, який на момент підключення мало найкращий показник якості зв'язку. В процесі роботи може виникнути ситуація, коли роутер вийшов з ладу або його забрали на сервісне обслуговування. В такому випадку, після кількох спроб відновити зв'язок з батьком, кінцеве пристрій почне пошук нового батьківського сайту. На малюнку зв'язок між мобільним вузлом і батьком позначена пунктирною лінією. Через певний проміжок часу MED-пристрій може приєднатися до мережі через іншого батька.


Polling-механізм
Даний механізм використовується в декількох цілях:
  1. мобільні та кінцеві пристрої таким чином можуть отримувати повідомлення, які зберігаються для них в батьківському сайті.
  2. запобігання видалення запису з таблиці дочірніх пристроїв.
По специфікації ZigBee для сплячих кінцевих пристроїв, адресні повідомлення зберігаються батьком ~7.68 секунди. Причому, якщо частота проходження адресних повідомлення для SED/MED-пристрої вище вказаного значення, то повідомлення буде перезаписуватися. Отже, для забезпечення надійної доставки даних спляче кінцеве пристрій повинен опитувати батьківський вузол досить часто. У зв'язку з цим для сплячих кінцевих пристроїв існує два інтервали опитування: Short Poll і Long Poll інтервали.
Short Poll інтервал використовується при очікуванні підтвердження успішності транзакції, наприклад, при відправленні пакета з даними про показання датчика. Зазвичай цей інтервал задається рівним 1 секунді. Після того, як отримано підтвердження, пристрій переходить в сплячий режим і далі використовується Long Poll інтервал.
Long Poll інтервал зазвичай задається у досить великим — від декількох хвилин до декількох днів. Це дозволяє спящему кінцевого пристрою зберігати місце в дочірній таблиці батьків. Батько може викреслити кінцеве пристрій зі своєї таблиці, якщо воно не вийшло вчасно на зв'язок. У такому разі проспавшее свій момент кінцеве пристрій зобов'язаний буде перепідключитися до мережі.
Більш детальну інформацію про Polling-механізмі можна подивитися у посібнику ZigBee-стеку від Silicon Labs. У стандартній прошивці для модулів ETRX357 опитування батьківського вузла здійснюється по перериванню від таймера/лічильника 0.


6. Створення мережі збору даних
Базова теорія розказана, перейдемо до практики. Для роботи з радіомодулями ETRX357 буде використовуватися модуль Python. Всі рекомендації по його використанню дані в супутньому README-файл.
6.1 Налаштування ZigBee-пристроїв
Запишемо в кожен вузол відповідну конфігурацію. Всі три пристрої — USB-шлюз і дві налагоджувальні плати — були підключені до комп'ютера і кожне було відповідним чином налаштовано:
  • для USB-шлюзу використовувалася гілка координатора ("COO") з конфігураційного файлу
  • для модулів на налагоджувальних платах — гілка сплячих кінцевих пристроїв ("SED") з конфігураційного файлу
Приклад програми-конфігуратора
#!/usr/bin/env python3
# coding=utf-8

import rfconf
import serial.tools.list_ports

def main():
# читаємо конфігурацію з файлу sensor_nwk.xml
configurator = rfconf.ModuleConfigReader("sensor_nwk.xml")
supp_nodes = configurator.get_avail_nodes()
supp_nodes = dict(enumerate(supp_nodes))

if len(supp_nodes) > 0:
print("XML Configuration file support {} nodes:".format(len(supp_nodes)))
print(supp_nodes)
# для всіх пристроїв в описі яких є "Telegesis"
for com in serial.tools.list_ports.comports():
if com.description.split()[0] == "Telegesis":
tgmodule = rfconf.ModuleInterface(com.device)
usr_choice = int(input("How would you like to configure that node: "))
tgmodule.set_node_type(supp_nodes[usr_choice])
tgmodule.write_config(configurator
else:
print("There is nothing to do")

if __name__ == "__main__":
main()

Файл конфігурації
<rfconfig>
<node type="COO">
<!-- Link Key -->
<reg name="S09" password="password" overwrite="y" type="string">
12341234123412341234123412341234
</reg>
<!-- Налаштування безпеки -->
<reg name="S0A" password="password" overwrite="n" type="hex">
0114
</reg>
<!-- Вихідна потужність передавача -->
<reg name="S01" overwrite="y" type="int">
3
</reg>
<!-- Стати Sink-вузлом -->
<reg name="S10" overwrite="n" type="hex">
10
</reg>
</node>
<node type="SED">
<!-- Link Key -->
<reg name="S09" password="password" overwrite="y" type="string">
12341234123412341234123412341234
</reg>
<!-- Налаштування безпеки -->
<reg name="S0A" password="password" overwrite="n" type="hex">
0114
</reg>
<!-- Вихідна потужність передавача -->
<reg name="S01" overwrite="y" type="int">
3
</reg>
<!-- Включити автоматичний пошук Sink-вузла -->
<reg name="S10" overwrite="n" type="hex">
100
</reg>
<!-- Включення альтернативної функціональності PB5 -->
<reg name="S15" overwrite="n" type="hex">
2000
</reg>
<!-- Налаштування портів вводу/виводу -->
<reg name="S13" overwrite="y" type="hex">
00FF7EFB
</reg>
<reg name="S16" overwrite="y" type="hex">
00008204
</reg>
<!-- Запис початкового значення регістра S16,
яке буде діяти після скидання -->
<reg name="S17" overwrite="y" type="hex">
00008204
</reg>
<!-- Налаштування портів вводу/виводу -->
<reg name="S18" overwrite="y" type="hex">
00FD58E7
</reg>
<!-- Запис початкового значення регістра S18,
яке буде діяти після скидання -->
<reg name="S19" overwrite="y" type="hex">
00FD58E7
</reg>
<!-- Налаштування таймера/лічильника 7 -->
<reg name="S37" overwrite="y" type="int">
40
</reg>
<reg name="S38" overwrite="y" type="hex">
8110
</reg>
<!-- Настроювання переходів в різні режими енергоспоживання -->
<!-- Перехід в режим 2 при підключенні до мережі -->
<reg name="S28" overwrite="y" type="int">
0003
</reg>
<!-- Перехід в режим 0 при натисканні на кнопку 1 (PA0) -->
<reg name="S23" overwrite="y" type="hex">
0001
</reg>
<!-- Перехід в режим 2 при натисканні на кнопку 2 (PA1) -->
<reg name="S24" overwrite="y" type="hex">
0003
</reg>
</node>
</rfconfig>

Кілька коментарів з приводу налаштування сплячих кінцевих пристроїв. Для того, щоб мінімізувати енергоспоживання радіомодуля, необхідно відключити всю невикористану периферію: світлодіодну індикацію та харчування датчика освітлення. Крім цього необхідно всі невикористовувані висновки сконфігурувати на вхід з підтяжкою або вихід. За налаштування портів вводу/виводу відповідає кілька 32-розрядних регістрів:
  • регістр S13 допоміжний регістр, що дозволяє визначити напрямок виводу (Hi-Z, вхід з підтяжкою, push-pull вихід, вихід з відкритим колектором)
  • регістр S16 налаштовує певний висновок у якості входу (запис 0) або виходу (запис 1). Радимодуль має 3 порти A, B, C за 8 висновків. Запис налаштувань можна проводити як записом окремого біта, змінюючи кожен висновок окремо, так і робити зміни відразу для всієї групи. Регістр не є незалежним, тому якщо необхідно постійне застосування певної конфігурації, то її необхідно записати в регістр S17. Значення даного регістра автоматично переноситься в регістр при подачі живлення або при скиданні.
  • регістр S18 визначає логічний рівень на виході виводу. Якщо висновок налаштований як вихід, то запис 0/1 в певний біт встановить відповідний логічний рівень. Якщо висновок налаштований як вхід з підтяжкою, то запис 0/1 буде активувати підтяжку до харчування або до землі. Регістр S18 як і регістр S16 теж не є енергонезалежним. Його початкове значення можна записати у регістр S19, значення якого буде скопійовано при скиданні.
Більш детальну інформацію з можливим налагодження портів вводу/виводу можна подивитися в документації AT-команд[2]. В конфігураційному файлі для сплячих вузлів записано значення, яке відключає всю непотрібну для нашої задачі периферію за винятком висновку, що використовується для живлення датчика температури і входу АЦП. Для того, щоб задіяти вхід АЦП необхідно в регістрі S15 встановити біт 13 в 1 (задіяння альтернативної функціональності виведення PB5). На налагоджувальної платі встановлений датчик температури LM61.
Схема включення LM61
6.2 Організація передачі даних на центральний вузол збору
Для того, щоб сплячі кінцеві пристрої автоматично надсилали дані на центральний пристрій, скористаємося вбудованою функцією, яка може бути викликана переривання або події. У нашій задачі ми хочемо отримувати інформацію про температуру через певні інтервали часу. Тому необхідно скористатися одним з вбудованих таймерів, який і буде викликати вбудовану функцію. Нехай переривання від таймера/лічильника 7 буде виникати кожні 10 секунд. Для завдання порога спрацьовування таймера/лічильника 7 використовується регістр S37. Порогове значення в секундах визначається за такою формулою:

Номер викликається по перериванню від таймера/лічильника 7 функції записується в регістр S38. Необхідна нам функція має номер 0110, яка відправляє дані про стан усіх портів введення/выывода, напрузі живлення і оцифровані значення АЦП на Sink-вузол. Для того, щоб вона автоматично перезапускала таймер, необхідно старший біт (S38F) в регістрі S38 встановити в 1. Підсумкове значення, яке необхідно записати – 8110. Про цієї можливості вбудованої прошивки можна почитати в документації[3]. Нижче дана коротка інформація про те, що таке Sink-вузол.
Sink-вузли
Кожний пристрій у мережі ZigBee має власний унікальний короткий ідентифікатор (PANID). Координатор завжди має короткий адреса 0000 і дуже часто саме його роблять центральним вузлом збору даних. Однак, бувають випадки, коли координатором є пристрій, що не має зовнішніх інтерфейсів (UART, SPI і т. д.) і потрібно відправляти дані з датчиків на якийсь інший вузол. Одне з рішень – у власній програмі, взаємодіючому з модулями ETRX357, вручну задати адресу пристрою, який буде збирати та обробляти інформацію, що надходить. Недоліки цього підходу:
  • якщо використовується короткий ідентифікатор при відправці адресних повідомлень з даними:
    • пристрій збору даних може за певних обставин покинути мережу і при перепідключенні йому буде видано новий ідентифікатор
    • короткий ідентифікатор видається при підключенні вузла мережі. У зв'язку з цим можуть виникнути труднощі з налаштуванням вузлів, які повинні передавати пакети даних на вузол збору даних

  • якщо використовується довгий ідентифікатор при відправці адресних повідомлень з даними:
    • у разі заміни вузла збору даних виникає проблема з оновленням довгого ідентифікатора у всіх вузла, в яких він використовувався. Цей пункт справедливий і для випадку використання короткого ідентифікатора
Для того, щоб спростити механізм відправки даних на певні вузли в мережі, в стандартній прошивці модулів ETRX357 є спеціальна надбудова — стати Sink-вузлом — яку може задіяти будь-роутер в мережі. Щоб зробити роутер Sink-вузлом, 4 біт в регістрі S10 необхідно встановити в одиницю. У всіх вузлах, які використовують вбудовані функції, надсилає дані на Sink, або ж охочі використовувати спеціальну команду для відправки повідомлень на Sink, необхідно встановити 8 біт в регістрі S10 або використовувати команду AT+SSINK для здійснення пошуку найближчого Sink-вузла. Sink-пристрій періодично відправляє широкомовні повідомлення в мережу і всі вузли, які отримали його, роблять запис у своїй адресній таблиці. У разі великої мережі, вводять кілька Sink-сайтів, які приймають дані від найближчих сусідів. Пристрою, що надсилає дані на Sink-сайт, автоматично вибирають найбільш відповідний вузол збору даних, використовуючи інформацію про якість зв'язку. Це дозволяє розвантажити пристрою збору даних, а також запобігти збоям в отриманні даних, так як у випадку виходу з ладу одного з Sink-вузлів мережа автоматично змінить маршрути.
Після цього можна відправляти дані на Sink допомогою команди AT+SCAST:
# надсилання повідомлення на Sink
AT+SCAST:Hello
# (для прикладу) відправлення звичайного адресного повідомлення
AT+UCAST:CAFE=Hello
AT+UCAST:000D6F00024CBCCC=Hello

6.3 Зниження енергоспоживання сплячих пристроїв
За замовчуванням усі модулі знаходяться в режимі енергозбереження 0, незалежно від заданого типу. Перехід в сплячий режим і назад можна реалізувати з допомогою виклику відповідної вбудованої функції з якого-небудь події.
Енергоспоживання модулів в різних режимах

Хай сплять пристрою переходять у режим енергозбереження 2 при підключенні до мережі (регістр S28). Зверніть увагу, що модулі, що знаходяться в режимах 2-4, не відповідають на команди, відправлені по послідовному інтерфейсу UART. У зв'язку з цим необхідно передбачити можливість переходу модуля в режим 0 і назад, для того, щоб була можливість внести зміни в конфігурацію пристрою або в логіку його роботи. На налагоджувальних платах є 4 кнопки, кожна з яких може активувати певну вбудовану функцію по перериванню. Ми будемо використовувати кнопки 1 і 2 (висновки PA0 і PA1). Команди для завдання відповідної конфігурації:
# Функція, яка переводить модуль в режим 0 - 0001
# Функція, яка переводить модуль в режим 2 - 0003
# Перехід в режим 2 при підключенні до мережі
ATS28=0003
# Перехід в режим 0 при натисканні кнопки 1
ATS23=0001
# Перехід в режим 2 при натисканні кнопки 2
ATS24=0003

Нижче наведені графіки енергоспоживання для сплячих кінцевих пристроїв у різних режимах роботи:
Процес підключення до мережі
Режим 2, датчик LM61 включений
Режим 0, датчик LM61 включений
Режим 2, датчик LM61 вимкнено
Піки, що йдуть з інтервалом 1 секунда, це робота Polling-механізму. Цей інтервал може бути збільшений або зменшений, в залежності від того, потрібно двосторонній канал зв'язку або немає. Інтервал в 1 секунду дозволяє гарантувати надійну доставку адресних повідомлень на сплячі пристрою. Збільшення Polling-інтервалу зменшує середнє енергоспоживання пристрою, але і доставити повідомлення для нього буде складніше.
Енергоспоживання в режимі 2, poll=1024 с, датчик LM61 вимкнено
6.4 Обробка даних
Після того, як пристрої налаштовані, необхідно відправити команду для організації мережі координатору. проекті на GitHub, в папці examples, є файл sensor_nwk.py. У ньому міститься проста реалізація функцій створення мережі обробки даних, що поступають на координатор. Для нашої задачі достатньо лише перевести оцифровані значення температури в градуси Цельсія. Після цього в консоль виводиться інформація про адресу пристрою і отриманої температурі. Також ніщо не заважає додати відправку отриманих даних кудись на сервер, де вони будуть відображатися у особистому кабінеті користувача.
Читання вступників на координатор даних
#!/usr/bin/env python3
# coding=utf-8

import rfconf
import serial.threaded

class TemperatureReader(rfconf.ETRXModuleReader):
TEMP_POS = 2
NODEID_POS = 0

def handle_line(self, data):
if not data:
# пропускаємо порожні рядки
return
# формат одержуваних даних від кінцевих пристроїв:
# SDATA: <Long ID><GPIO state><ADC0><ADC1><SeqNO><VCC>
info, *payload = rfconf.response_split(data)
if info == "SDATA":
nodeid = payload[self.NODEID_POS]
temp = int(payload[self.TEMP_POS], 16)
# перетворюємо значення АЦП у відповідність з
# документацією на LM61
temp = (temp / 10 - 600) / 10
print("Node: {} - Temperature: {:.2f}".format(nodeid, temp))

def leave_network(node):
LEAVE_NWK_CMD = "AT+DASSL"
node.write_command(LEAVE_NWK_CMD)
resp = node.read_resp()
# За замовчуванням команда AT+DASSL після статусного повідомлення "OK"
# видає повідомлення про те, що пристрій успішно покинуло мережа "LeftPAN"
if resp[-1] == "OK":
msg = ""
while not msg:
msg = node.readline()
print(msg)
else:
print(resp[-1])

def get_network_info(coordinator):
NWK_INFO_POS = 1
GET_NWK_INFO_CMD = "AT+N"
coordinator.write_command(GET_NWK_INFO_CMD)
resp = coordinator.read_resp()
if resp[-1] == "OK":
nwk_info = resp[NWK_INFO_POS]
*nused, ch, txpower, panid, longid = rfconf.response_split(nwk_info)
print("network already created - ", end="")
print("ch: {}, PANID: {}, EUI64: {}".format(ch, panid, longid))

def create_network(coordinator):
NWK_INFO_POS = 1
NWK_PARAMS_POS = 1
CREATE_NWK_CMD = "AT+EN"
coordinator.write_command(CREATE_NWK_CMD)
resp = coordinator.read_resp()
if resp[-1] == "OK":
# Успішно створена мережа
nwk_info = resp[NWK_INFO_POS]
info, ch, sid, lid = rfconf.response_split(nwk_info)
print("network is created - ", end="")
print("ch: {}, PANID: {}, EUI64: {}".format(ch, sid, lid))
else:
# Проблеми з створенням мережі - вона вже була створена,
# або координатор не може створити мережу з заданими параметрами
get_network_info(coordinator)

def main():
coo_node = rfconf.ETRXModule("<COMXX координатора (Windows) або /dev/<ttyUSBXX> (Linux)>", node_type="COO")
reader = TemperatureReader(coo_node)
# відправляємо команду на створення мережі
create_network(coo_node)
ser = coo_node.get_serial_interface()
reader_thread = serial.threaded.ReaderThread(ser, reader)
# читаємо і обробляємо дані, що надходять
with reader_thread as protocol:
reader_thread.join()

if __name__ == "__main__":
main()

Приклад виводу на консоль


7. Висновок
У даній статті ми розібрали процес створення простої мережі збору даних, яка передає інформацію від датчиків температури на центральний вузол збору даних. Були розібрані основні особливості налаштування ZigBee-радіомодулів для енергоефективної і безпечної передачі інформації. Як ви могли бачити, зі стандартними налаштуваннями Polling-механізму і включеним датчиком температури енергоспоживання пристрою склала ~250 мкА. При ємності джерела живлення 1 Ач, автономне час роботи бездротового пристрою може скласти до 4000 годин (~160 днів). А якщо провести додаткові оптимізації, то це також дозволить продовжити термін служби. Також були розглянуті можливості вбудованих функцій, які для нашої задачі дозволили обійтися без зовнішнього мікроконтролера.
Буду вдячний, якщо в коментарях ви вкажете на моменти, які залишилися незрозумілими після прочитання цієї статті. В цьому випадку я зможу її доповнити.
P. S. Вимір енергоспоживання сплячих кінцевих пристроїв були виконані за допомогою утиліти Energy Profiler, що входить до складу пакету Simplicity Studio, і налагоджувальної плати EFM32GG-STK3700 Advanced Energy Monitor. Подробиці можна почитати в Application Note від Silicon Labs. Дана утиліта крім енергоспоживання пристрою, що отримується через налагоджувальну плату STK3700, дозволяє відслідковувати які функції у вашому коді є найбільш енергозатратними при виконанні. Тільки для активації функції профілювання коду потрібна наявність SWO інтерфейсу у цільового пристрою.
Макет для вимірювання енергоспоживання


Список літератури
  1. Опис модулів ETRX357 <a href=«www.wless.ru/files/ZigBee/ETRX3/TG-ETRX35x-PM-010-107.pdf>без підсилювача
  2. і з підсилювачем

Керівництво по AT-команд стандартної прошивки модулів ETRX357
Опис ZigBee-вимикача, що працює від батарейок від Silicon Labs
Опис налагоджувального комплекту ETRX3DVKA357

Список статей
  1. Бездротові мережі ZigBee. Частина 1 [Вступна]
  2. Бездротові мережі ZigBee. Частина 2 [Робота з радіомодулями ETRX35X]
Корисні посилання
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.