Eclipse Kura 作为边缘计算网关应用套件,功能非常强大,作为一个基础性框架,在上面跑一些用户应用,那是非常合适的。

一、启用 Kura 上面支持 MQTT broker
进入 Kura web console,开启Simple Artemis MQTT Broker,测试中暂定 usename 和 password 都为 mqtt。

WX20200707-174344.png

登录 Kura 设备后台,查看 TCP 1833 端口已经开启

root@raspberrypi:/home/pi# netstat -nlpt |grep 1883
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      427/java            

二、模拟 MQTT 设备发送数据
使用 Chrome 浏览器插件 MQTTBox 登录我们的 MQTT server
WX20200707-174844@2x.png

三、安装 Kura 插件
使用 Eclipse marketplace 安装以下插件

  • Apache Camel MQTT endpoint
  • Apache Camel Groovy language support
  • Apache Camel GSON data format

四、创建新的 Component
创新 component
Integrating-with-Kura-and-Kapua-5.png

并输入以下内容

<routes xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="paho:humidity/sensor1/humidity?brokerUrl=tcp://localhost:1883&amp;clientId=route1&amp;userName=mqtt&amp;password=mqtt"/>
    <unmarshal><json library="Gson"></json></unmarshal>
    <transform><simple>${body["humidity"]}</simple></transform>
    <transform><groovy>["HUMIDITY": request.body/100, "ASSETNAME": "HrY", "SENSOR": "sensor1"]</groovy></transform>
    <to uri="seda:wiresOutput1"/>
  </route>
</routes>

WX20200707-175458.png

五、创建一个 Cloud publisher
WX20200707-175640.png

六、新建一个 Wire Graph
Camel Consumer - camel_comsumer
WX20200707-175756.png

Publisher - pub_camel1
WX20200707-175907.png

把两个相连起来
WX20200707-180007.png

七、发送数据,测试 Kapua 数据接收情况
发布/订阅 主题topic: humidity/sensor1/humidity
WX20200707-180254@2x.png

发送数据验证
WX20200707-180510@2x.png

Kapua 接收,查询结果
WX20200707-180442.png

Apache Camel是一个基于规则路由和中介引擎,提供企业集成模式的Java对象的实现,通过应用程序接口来配置路由和中介的规则。领域特定语言意味着Apache Camel支持你在的集成开发工具中使用平常的,类型安全的,可自动补全的Java代码来编写路由规则,而不需要大量的XML配置文件。 来自维基百科

网站: https://camel.apache.org

Kura_Camel_Integration.png

根据上图所示,Apache Camel 与 Apache Kura 集成,可以使得 Kura 扩展更多的功能,完成更多的工作。通过简单的配置,或少量的代码,就可以实现数据路由和中转。

Kapua Getting Start

https://www.eclipse.org/kapua/getting-started.php

Kapua docker 应用启动后,数据都在docker容器中,一旦重启容器,数据将丢失。

经过分析,需要将两部分的数据持久化到宿主主机磁盘上。

分两步:
1、启动docker compose实例,将sql容器中的数据拷贝出来,ca58ae61b875 是sql 容器的id;

docker cp ca58ae61b875:/var/opt/h2/data/kapuadb.mv.db .

2、修改docker-compose.xml,在特定位置增加下面volumes, 在映射宿主主机文件系统到docker 容器;

  db:
    volumes:
      - ./sql:/var/opt/h2/data
es:
    volumes:
      - ./es:/usr/share/elasticsearch/data

至此,Kapua 测试环境就可以当做准生产环境了。

systick.c
定义1Hz

/*!
    \brief      configure systick
    \param[in]  none
    \param[out] none
    \retval     none
*/
void systick_config(void)
{
    /* setup systick timer for 1Hz interrupts */
    if (SysTick_Config(SystemCoreClock / 1000 / 1000)){
        /* capture error */
        while (1);
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00);
}

阻塞式延时函数

/*!
    \brief      delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1us(uint32_t count)
{
    delay = count;

    while(0 != delay);
}

void delay_1ms(uint32_t count)
{
    delay = count * 1000;

    while(0 != delay);
}

gd32f1x0_it.c
中断处理函数中调用led_spark(),实现led翻转

/*!
    \brief      this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void SysTick_Handler(void)
{
    led_spark();
    delay_decrement();
}

main.c
led 翻转函数

/*!
    \brief      toggle the led every 500ms
    \param[in]  none
    \param[out] none
    \retval     none
*/
void led_spark(void)
{
    static __IO uint32_t timingdelaylocal = 0;

    if(timingdelaylocal){

        if(timingdelaylocal < 500*1000){
            gd_eval_ledon(LED2);
        }else{
            gd_eval_ledoff(LED2);
        }

        timingdelaylocal--;
    }else{
        timingdelaylocal = 1000*1000;
    }
}

日常阻塞式翻转

int main(void)
{
    gd_eval_ledinit(LED2);

    systick_config();
    
    while(1)
    {
      gd_eval_ledon(LED2);
      delay_1us(500*1000);
      gd_eval_ledoff(LED2);
      delay_1us(200*1000);
    }
}

解压缩:
xz -d some.img.xz
dd bs=4m if=some.img of=/dev/disk3

压缩img:
xz -z some.img

压缩xz文件写入外置存储器:
xzcat console.img.xz | dd of=/dev/disk3