Скачать статью (файл PDF 164.3 Kb) - wless.ru

Скачать статью (файл PDF 164.3 Kb) - wless.ru Скачать статью (файл PDF 164.3 Kb) - wless.ru

мобильная телефония | КОМПОНЕНТЫ 11Листинг 1while(TRUE) {halResetWatchdog(); // сброс watchdog таймераemberTick();// обработка задач стекаzclTick();// передача управлениякластерам для выполненияпериодических задачappTick();// выполнение основныхзадач приложения(переключение режимов работы,опрос состояния датчиков,обработка событий и т. п.)cliProcessSerialInput(); // обмен данными черезпоследовательный порт(интерфейс командной строки)}Рис. 1.Поскольку оба проекта будут использоватьфайлы пакета EmberZNet, скопируем дляудобства папку, в которую установлен стек,в две заранее созданные папки, например,light и switch.Для каждого из двух проектируемых устройствследуем по шагам, описанным в первой частиданной статьи [1]. Запускаем программуApplication Builder. При этом загружается конфигурациянового устройства по умолчанию(New Configuration). В строке ввода имениустройства (device name) изменяем имя ZigBeeсоответственно на Light или Switch. Указываемпуть к папке, в которую будут генерироватьсязаголовочные файлы и файлы xIDE проекта(Directory of generated files): …light или…switch. В таблице 1 перечислены все изменения,которые необходимо внести в конфигурациюпо умолчанию для каждого устройства передзапуском генерации проекта, т. е. перед нажатиемкнопки Generate.После генерации открываем проект каждогоустройства в среде xIDE, запуская файлы Lightи Switch с расширением .xiw или .xip, сгенерированныеApplication Builder.Проект содержит множество связанных междусобой c-файлов, заголовочных h-файлов (в их числовходят и те файлы, которые были сгенерированыпрограммой AppBuilder) и откомпилированныхбиблиотек. Головным файлом проекта являетсяфайл ha-main.c.Каждому ZigBee-кластеру соответствует свойc-файл, а обращение к функциям, определеннымв этих файлах, из верхнего уровня приложения(т. е. из файла ha-mail.c) выполняется по схеме,приведенной на рис. 1.Как показано на рисунке, доступ к кластерамиз приложения можно получить через функциибиблиотеки утилит (ZCL Utils). Основныефункции для работы с кластерами — zclInit,zclTick и zclRx — определены для каждогокластера в отдельности. Но обращение к нимпредлагается производить через функциинадстройки,которые определены и находятсяв файле zcl-util.c. Доступ к значениям атрибутоввсех кластеров осуществляется с помощьюфункций, определенных в файле zcl-utilattribute-table.c.С помощью функции zclInit производитсяинициализация кластера, т. е. установка начальныхзначений его атрибутов.Функция zclTick предназначена для выполненияпериодических задач кластера, напримеризменения значения атрибута с определенныминтервалом времени.Функция zclRx представляет собой обработчикопределенной zcl-команды кластера, которыйвыполняет операции над атрибутами в соответствиис принятой командой. Т.е. для каждойzcl-команды в кластере определена своя функцияzclRx. Например, для кластера «On/Off» их три:«On/Off Rx On», «On/Off Rx Off» и «On/Off RxToggle». Для кластера Level Control таких функцийбольше: «Move to Level Rx», «Move Rx», «StepRx», «Stop Rx» и др. Подробное описание всехкоманд для этих и других кластеров находитсяв библиотеке ZigBee-кластеров (ZCL— ZigBeeCluster Library)[2].Обработка всех принятых по радиоканалуzcl-команд производится с помощью функцииzclUtilProcessMessage(), которая определенав файле zcl-util.c. Она распознает командуи кластер, которому адресована данная команда,и вызывает соответствующую zclRx-функцию.Вызов функции zclUtilProcessMessage() производитсяиз обработчика входящих сообщенийemberIncomingMessageHandler(), который,в свою очередь, автоматически вызываетсястеком при получении устройством новогоZigBee-пакета по радиоканалу.Такой централизованный подход снижаетизбыточность кода, в то же время повышаяего читаемость. Проекты, сгенерированныепрограммой Application Builder, содержат поддержкуинтерфейса командной строки (CLI),который позволяет вводить zcl-команды и получатьна них ответы через последовательныйканал. Функции, реализующие этот интерфейс,определенны в файле ha-zcl-cli.c.Основной цикл программы в общем случаевыглядит так, как показано в листинге 1.Если оставить проект без изменений, т. е. бездобавления пользовательского кода, и откомпилировать,то устройство, в которое он будетзагружен, сможет принимать по радиоканалустандартные zcl-команды и выполнять соответствующиеоперации с атрибутами. С помощьюинтерфейса командной строки можно будетотправлять любые zcl-команды на удаленныйZigBee-узел. Воспользуемся этой возможностью:откомпилируем проект Switch, не внося в негоникаких изменений, и загрузим его в одиниз радиомодулей.Второй проект Light доработаем таким образом,чтобы значение атрибута Current Levelкластера Level Control отображалось яркостьюсвечения светодиода на отладочной плате. Приэтом пользовательский код разместим внутрифункции appTick.В качестве источника света для устройства«Dimmable Light» можно использовать светодиодLED2 на отладочной плате Ember. Подаваяна него ШИМ-сигнал с различной длительностьюимпульса, будем изменять яркость его свечения.Длительность импульса в этом случае должнасоответствовать текущему значению атрибутаCurrent Level, которое можно прочитать из памятис помощью функции zclUtilReadAttribute(определена в файле zcl-util-attribute-table.c).Чтобы мерцание светодиода было незаметнодля человеческого глаза, частота ШИМ-сигналадолжна быть больше 50Гц.Итак, добавляем следующие переменные и константыв функцию appTick() (листинг 2):Листинг 2int16u pwm_period = 15; // период ШИМ-сигнала(15 мс — 67 Гц)int8u pwm_width; // длительность импульсаstatic int16u last_pulse = 0; //переменная, хранящая времяначала текущего периодаint8u currentValue = 0, dataType;//переменная, хранящаятекущее значение атрибутаboolean status;Для задач, требующих измерения интерваловвремени внутри функции AppTick(), каждыйраз вызывается функция библиотеки EmberZNethalCommonGetInt16uMillisecondTick(), котораявозвращает текущее значение внутреннеготаймера в миллисекундах (листинг 3):Листинг 3time = halCommonGetInt16uMillisecondTick();WWW.WIRELESS-E.RUBT#4(17).indd 11 06.11.2009 11:49:30


12КОМПОНЕНТЫ | мобильная телефонияПосле вызова функции halCommonGetInt16uMillisecondTick() добавляем следующий код(листинг 4):Листинг 4// Читаем из памяти значение атрибута,отображающего значение уровня яркостиstatus = zclUtilReadAttribute (ZCL_LEVEL_CONTROL_CLUSTER_ID,ZCL_CURRENT_LEVEL_ATTRIBUTE_ID,(int8u*) &currentValue,1, &dataType);// Если произошла ошибка чтения,выводим сообщение в последовательный портif (status!= ZCL_SUCCESS) {ZCL_UTIL_DEBUG («Err: can't read current_level_attribute»);return;}// Новое значение длительности импульса равноновому значению атрибутаpwm_width = currentValue;// Зажигаем светодиод в начале периода ШИМ-сигналаif ((time - last_pulse > = pwm_period) && (pwm_width > 0)){last_pulse = time;halSetLed(BOARDLED2);}// Гасим светодиод, если длительность импульса истеклаif (time - last_pulse > = pwm_width){halClearLed(BOARDLED2);}Компилируем проект и загружаем во второйрадиомодуль.Теперь оба модуля готовы к работе. Подключаемотладочные платы к последовательномупорту компьютера. Для каждого модуля отдельнозапускаем программу Hyper Terminalи устанавливаем связь. Настройки com-портаустанавливаем следующие:• скорость (бит/с) — 115 200;• биты данных — 8;• четность — нет;• стоповые биты — 1;• управление потоком — нет.При удачном установлении связи нажатиеклавиши Enter приводит к появлению указателяна начало строки для ввода Light> (илиSwitch>, соответственно). Меню печатаетсяв результате выполнения команды help. Оноотображает список всех команд интерфейсаCLI, предназначенных для работы с модулемчерез последовательный порт.Сначала следует образовать ZigBee-сеть.Координатором сети в нашем случае будетустройство Light. Следующая команда формируетсеть на 11 канале, с мощностью передатчика2 дБм и идентификатором сети (PANID) 00aa (рис. 2):Light> network form 11 2 00aaТеперь с помощью команды pjoin разрешимприсоединение к этой сети других ZigBeeустройствна 60 с:Light> network pjoin 60Следующей командой, вводимой на сторонепульта управления, подключаем устройствоSwitch к созданной сети:Switch> network join 11 2 00aaРис. 2. Управление устройствами Light и Switch по последовательному каналуФормируем сообщение с командой «включить»кластера вкл/выкл (on-off):Switch> zcl on-off onПередаем сообщение с этой командой на координатор,т. е. на Light:Switch> send 0000В результате выполнения последней командывключается светодиод LED2 на отладочнойплате. Аналогично выключаем светодиод:Switch> zcl on-off offSwitch> send 0000Попробуем выполнить более сложную команду,например «плавно зажечь свет» («плавно погаситьсвет») кластера Level Control:Switch> zcl level-control move 00 01Первый параметр команды move определяетнаправление изменения уровня (увеличение— 00, уменьшение 01), второй задает шагизменения уровня.Передаем сообщение с этой командой на Light:Switch> send 0000В результате выполнения этой команды яркостьсветодиода плавно увеличивается до максимальногозначения.Подробное описание работы с интерфейсомкомандной строки (CLI) и всех доступныхкоманд содержится в документации к пакетуEmberZNet [3].Интерфейс командной строки включен в проектдля отладочных целей. Реальный пульт управленияи диммер могут не иметь связи с компьютером.Пользователь в зависимости от задач своегоприложения может реализовать собственныйалгоритм образования сети и передачи zcl-команд,встроив его в код приложения.К примеру, нам необходимо, чтобы при нажатиикакой-либо кнопки на пульте управленияна диммер отправлялась zcl-команда «On»кластера «On/Off».Функцию, формирующую эту zcl-команду(листинг 5), для удобства разместим в файлеha-zcl-cli.c. Если в будущем понадобится куда-Листинг 5/* ********************************************Данная функция формирует командный (ZCL) буфери APS-заголовок ZigBee-сообщенияВ случае, если эта функция будет размещаться вне файлаha-zcl-cli.c, требуется предопределить следующиепеременные и функции:int8u appZclBuffer[APP_ZCL_BUFFER_SIZE];int8u* pAppZclBuffer = appZclBuffer;int8u appZclBufferLen;EmberApsFrame globalApsFrame;void zclCliBufferSetup(void);******************************************** */void zclUtilCmdOn(void) {//APS-заголовокzclCliBufferSetup();globalApsFrame.clusterId = ZCL_ON_OFF_CLUSTER_ID;}//ZCL-буферappZclBuffer[0] = ZCL_CLUSTER_SPECIFIC_COMMAND;appZclBuffer[1] = appGetNextZclSeqNum();appZclBuffer[2] = ZCL_ON_COMMAND_ID;//Размер ZCL-буфераappZclBufferLen=3;БЕСПРОВОДНЫЕ ТЕХНОЛОГИИ №4 ’09BT#4(17).indd 12 06.11.2009 11:49:30


мобильная телефония | КОМПОНЕНТЫ 13либо ее переместить, то необходимо будет предопределитьпеременные и функции, указанныев комментариях.Пусть при нажатии кнопки устанавливается флагbuttonPressed. Тогда будем периодически проверятьэтот флаг и в случае, если он установлен,отправлять ZigBee-сообщение c zcl-командой«On» на диммер, т. е. на узел с адресом 0x0000.Таким образом, в функцию appTick добавляемследующий код (листинг 6):Листинг 6If (buttonPressed) {zclUtilCmdOn(); // формируем zcl-команду “On”//отправляем команду на диммерzaAppSendUnicast(EMBER_OUTGOING_DIRECT,0,&globalApsFrame,appZclBufferLen,pAppZclBuffer);}В результате мы имеем два полностью ZigBeeсовместимыхстандартных устройства профиляHome Automation. При их создании нам потребовалосьдобавить код, обрабатывающийтекущее значение атрибута Current Level сервернойчасти кластера Level Control в устройстведиммер. Используя это значение, мы управлялияркостью свечения светодиода на отладочнойплате Ember. При этом мы не вникали в тонкостиреализации этого кластера. Выяснилосьтакже, что формирование и отправка zcl-командмогут быть легко встроены в код приложения,при этом можно воспользоваться готовымифункциями из файла ha-zcl-cli.c.ЗаключениеПриведенный пример показал, что платформаEmber позволяет достаточно просто реализоватьбеспроводную систему устройств домашнейавтоматизации, поддерживающую стандартныйпрофиль Home Automation. При этомразработчик может, не вдаваясь в подробностиреализации задач, связанных с функционированиемсети ZigBee и работой ZigBee-кластеров,вести разработку основного алгоритма и программ,реализующих функциональные особенностиприложения. Использование в качествеосновного инструмента разработки генератораконфигурационных файлов Application Builderне только ускоряет процесс разработки, но такжепозволяет создавать проекты, которые могутбыть быстро сертифицированы на соответствиеспецификации ZigBee Pro Feature Set.Литература1. Солодунов С. Реализация стандартногопрофиля ZigBee “Home Automation” на базеплатформы Ember. Часть 1 // Беспроводныетехнологии. 2009. № 3.2. ZigBee Cluster Library Specification, October19, 2007, www.zigbee.org3. EmberZNet3.4.1/em250/app/sampleApps.htmlWWW.WIRELESS-E.RUBT#4(17).indd 13 06.11.2009 11:49:31

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!