Статьи

Создайте свой IoT Gateway с поддержкой WiFi с помощью Camel и Kura

Общий сценарий для мобильных шлюзов IoT, например, установленных на грузовиках или других транспортных средствах, заключается в локальном кэшировании собранных данных в хранилище устройства и синхронизации данных с центром обработки данных, только когда рядом со шлюзом имеется доверенная точка доступа WiFi , Такая доверенная сеть WiFi может быть локализована возле парковки грузового парка.

Используя этот подход, менее срочные данные (например, координаты GPS, сохраненные для дальнейшего автономного анализа) могут быть доставлены в центр обработки данных без дополнительных затрат, связанных с платой за передачу GPS.

Компонент Camel Kura WiFi  от  Camel IoT Labs  можно использовать для получения информации о точках доступа WiFi, доступных в пределах диапазона устройства. Под капотом компонента Kura Wifi используется  Kura  org.eclipse.kura.net.NetworkService .

Настройка проекта Maven

Чтобы воспользоваться WiFi-компонентом Camel Kura, пользователи Maven должны добавить в свой файл POM следующую зависимость:

<dependency>
  <groupId>com.github.camel-labs</groupId>
  <artifactId>camel-kura</artifactId>
  <version>0.0.0</version>
<dependency>

Все остальные зависимости будут обрабатываться транзитивным преобразователем Maven.

Создание маршрута Camel для сканирования сетей WiFi

Компонент Kura WiFi поддерживает конечные точки как потребителя, так и производителя. На практике это означает, что вы можете либо периодически сканировать сети WiFi (потребительский режим), либо явно запрашивать одно сканирование (режим производителя).

Следующий маршрут Apache Camel будет использовать   интерфейс wlan0 для сканирования   сети mySsid . Если   сеть mySsid WiFi будет найдена, Camel автоматически запустит маршрут, отвечающий за синхронизацию автономных данных, хранящихся в локальном хранилище устройства, с центром обработки данных:

  from("kura:wlan0/mySsid").
      to("controlbus:route?routeId=onlineSync&action=start");

  from("file:///var/sensor/temperature").
      routeId("onlineSync").autoStartup(false).
      to("netty4-http://api.mydatacenter.com");

Помните, что как сетевой интерфейс, так и SSID могут быть заменены   символами *, соответствующими соответственно всем сетевым интерфейсам и SSID.

Например, чтобы прочитать все SSID, доступные рядом с устройством, можно использовать следующий маршрут:

    from("kura:*/*").to(...);

Data returned by the WiFi endpoints

The Kura WiFi consumer returns the list of the org.eclipse.kura.net.wifi.WifiAccessPoint classes returned as a result of the WiFi scan:

ConsumerTemplate consumerTemplate = camelContext.createConsumerTemplate();
WifiAccessPoint[] accessPoints = consumerTemplate.receiveBody("kura:wlan0/*", WifiAccessPoint[].class);

You can also request the WiFi scanning using the producer endpoint:

from("direct:WifiScan").to("kura-wifi:*/*").to("mock:accessPoints");

Or using the producer template directly:

ProducerTemplate template = camelContext.createProducerTemplate();
WifiAccessPoint[] accessPoints = template.requestBody("kura-wifi:*/*", null, WifiAccessPoint[].class);

Deployment options

Camel Kura WiFi component can be deployed either as the OSGi bundle, directly into the Kura container:

  public class WifiKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
      from("kura-wifi:*/*").to("log:availableWifiNetworks");
    }

  }

…where KuraRouter is the base OSGi bundle activator for Camel routes deployable into Kura.

The other option of deployment is to use Spring Boot based fat jar:

  @SpringBootApplication
  public class WifiKuraRouter extends FatJar {

    @Override
    public void configure() throws Exception {
      from("kura-wifi:*/*").to("log:availableWifiNetworks");
    }

  }

In the first place Kura Wifi component tries to locate the org.eclipse.kura.net.NetworkService instance in the Camel registry. If exactly one instance of the NetworkService is found (this is usually the case when if you deploy the route into the Kura container), that instance will be used by the Kura component. Otherwise new instance of the org.eclipse.kura.linux.net.NetworkServiceImpl will be created and cached by the KuraAccessPointsProvider.

Summary

Smart WiFi connectivity is fundamental for every mobile IoT gateway solution. Camel Kura WiFi integration makes WiFi scanning process as easy as adding a few lines of the DSL. Your gateway application should try to cache the data collected from the sensors and avoid using the expensive mobile connectivity whenever possible. The efficient IoT gateway should synchronize the stored offline data when the trusted WiFi network is available.