Привет всем. В данной статье я бы хотел показать пример использования связки TI SensorTag, Raspberry PI, Apache Camel с выводом в веб часть. В результате будет веб приложение, отображающее в реальном времени данные с сенсоров и бд хранящая показания, с промежуточным связующим узлом в виде Apache Camel приложения.
Подготовка
Для работы использовались:
- Raspberry PI 3
- TI SensorTag 2650 (Можно использовать и TI SensorTag 2541, только будет меньше сенсоров)
Настраиваем TI SensorTag
- Если вы еще не перезаписывали стандартную прошивку, то она подойдет для работы.
- Или нужно скачать BLE Stack и прошить с помощью SmartRF Flash Programmer образ CC2650SensorTag_BLE_All_v1_20.hex, лежащий в %programfiles(x86)%Texas InstrumentsSmartRF ToolsBLE Device monitorfirmwarecc26xxsensortag
Настраиваем Raspberry PI
Устанавливаем Raspbian на Raspberry PI отсюда.
Eclipse Kura
Eclipse Kura — это фреймворк для создания приложений, работающих с IoT на таких платформах как Raspberry PI. Позволяет настраивать приложения через веб интерфейс или через API. Приложения разворачиваются через OSGi. Так же берет на себя заботу об работе с mqtt брокером. [1]
Установка Eclipse Kura
Для простоты станем рутом и обновим список пакетов sudo -i && apt-get update
. Установим Java (лучше использовать Oracle java, apt-get install oracle-java8-jdk
). Скачаем Kura версии Raspbian (Model 2) — Stable отсюда (скачать последную версию на момент статьи: wget http://mirror.onet.pl/pub/mirrors/eclipse//kura/releases/3.0.0/kura_3.0.0_raspberry-pi-2-3_installer.deb
) и установим: dpkg -i kura_*_installer.deb && apt-get install -f
. Перезапускаем Raspberry PI: shutdown -r now
.
Теперь можно открыть Kura WEB UI по адресу http://<rpi-device-ip> c логином и паролем admin/admin. Здесь можно настроить сеть, wi-fi точку доступа, имя устройства и другие параметры.
Установка BlueZ для связи по BLE с SensorTag
Версия из менеджера пакетов должна вполне подойди. Поэтому выполняем:
apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
apt-get install bluez
Запустим и добавим в автозагрузку bluetooth сервис: systemctl enable bluetooth && systemctl start bluetooth
. Включим беспроводной интерфейс: hciconfig hci0 up
. Проверим, что интерфейс включился и все работает: hciconfig -a
. При возникновении ошибок в bluez, можно попробовать скачать и скомпилировать последнюю версию, например по статье [3][4].
Установка Mosquitto
Mosquitto — опенсорный брокер сообщений по протоколу MQTT. Он нам нужен для отправки данных с SensorTag на Camel backend приложение.
Его можно установить, как на Rasperry PI, так и на другую машину, или использовать облачные решения (IBM, Azure). Но для работы web части, необходимо, чтобы mosquitto был настроен на работу через mqtt over websockets (Это можно сделать на другом экземпляре брокера, а не на локальном брокере).
Установка на Raspberry PI:
Версия из стандартного репозитория
apt-get install mosquitto
systemctl enable mosquitto
Чтобы включить websocket в mosquitto добавим следующие строки в /etc/mosquitto/mosquitto.conf
# Websocket
listener 1883
listener 9001
protocol websockets
и запустим systemctl start mosquitto
. Чтобы установить самую новую версию mosquttio с поддержкой websockets. [2]
wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
apt-get update
apt-get install mosquitto
Сборка и развертывание BLE TI SensorTag example приложения
Kura содержит пример приложения для работы с TI SensorTag. Оно раз в n секунд подключается по BLE к устройству, считывает данные с помощью Generic Attribute Profile (GATT) и отправляет их в брокер. Получается довольно медленно, но для начала пойдет.
Для начала склонируем репозиторий с kura. Можете воспользоваться или оригинальным https://github.com/eclipse/kura или форкнутым проектом https://github.com/leadex/kura, в котором добавлено считывание метрики температуры с барометра.
Выкачиваем:
git clone https://github.com/leadex/kura
cd kura
У меня скомпилировать код удалось только на linux. Для сборки выполняем ./build-all.sh
. Для последующей сборки только ble example:
cd kura/kura/examples/org.eclipse.kura.example.ble.tisensortag
mvn clean install -Dmaven.test.skip=true
Далее скопируем полученный jar на Raspberry PI.
cd kura/examples/org.eclipse.kura.example.ble.tisensortag
scp target/org.eclipse.kura.example.ble.tisensortag-*-SNAPSHOT.jar pi@<rpi-device-ip>:/tmp
Развертывание
Подключаемся к OSGi console из Raspberry PI telnet localhost 5002
или удаленно telnet <rpi-device-ip> 5002
. Вводим команду на установка нашего скомпилированного приложения install file:///tmp/org.eclipse.kura.example.ble.tisensortag-1.0.3-SNAPSHOT.jar
и потом вводим для проверки ss
. Видим установленный, но не запущенный bundle в конце: 75 INSTALLED org.eclipse.kura.example.ble.tisensortag
.
Запустим командой start 75
, где 75 — id приложения с предыдущего шага. Теперь он запущен: 75 ACTIVE org.eclipse.kura.example.ble.tisensortag
и можно просмотреть логи на Raspberry PI: tail -f /var/log/kura.log
[5].
В Kura web UI появился новый сервис BluetoohLe. Откроем и настроим его.
После перезапуска Kura, наш развернутый бандл пропадет, поэтому можно воспользоваться инструкцией по постоянной работе бандла.
Настроим Kura:
- В CloudService установим encode.gzip в false
- В MqttDataTransport укажите broker-url, topic.context.account-name
Интеграция с помощью Camel и Web часть
Для быстрого запуска MongoDB + Mosquitto + Webview можно выполнить docker-compose up -d
в корне проекта. Это создаст 3 контейнера и забиндит mqtt, websocket, http (8081) порты на localhost. Сразу после этого будет доступна веб часть по адресу http://localhost:8081. И mqtt broker на localhost:1883, поэтому можно будет указать в Kura MqttDataTransport ваш IP.
Пример веб части:
Camel интеграция
iot-backend-camel содержит Apache Camel проект, который подписывается к брокеру сообщений и получает KuraPayload.
EclipseKura сообщения передаются в закодированном формате Google Protobuf. Поэтому нам понадобится библиотека от Google для декодирования com.google.protobuf:protobuf-java
.
Далее из сообщения достаются метрики, сериализуются в json и отправляются подписчикам веб части в брокер, а так же сохраняются в базу MongoDB.
Для запуска Camel приложения выполним: gradlew clean build
и java -jar ./build/libs/iot-backend-camel-1.0.0-SNAPSHOT.jar
.
Веб часть
webview содержит докер образ на основе nginx с html & js. Веб часть использует mqtt over websocket Paho библиотеку и highcharts для динамического отображения значения сенсоров (Температура с ИК сенсора и уровень освещения).
Сайт подписывается у брокера на обновления данных. Вероятно для работы, вам придется сменить mqtt хост в webview. Это можно сделать в webview/dist/view.js
. В строке:
// Create a client instance
client = new Paho.MQTT.Client("localhost", Number(9001), "webview_" + parseInt(Math.random() * 1000000, 10));
Перезапустить webview можно с помощью docker-compose up -d --build
. Это пересобирет docker образ и перезапустит, если он изменился.
Ссылки
- http://eclipse.github.io/kura/doc/intro.html
- https://mosquitto.org/2013/01/mosquitto-debian-repository/
- http://blog.mrgibbs.io/bluez-5-39-ble-setup-on-the-raspberry-pi/
- http://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM
- http://eclipse.github.io/kura/doc/deploying-bundles.html
Автор: quckly