为了让开发者在没有硬件的情况下仍能体验平台的透传协议功能,本示例在Linux系统下实现一个虚拟的光照度探测器。

背景信息

虚拟的光照度探测器的主要功能如下。

  • 光照度值定期5s上报

    定义属性lux标识当前光照度值,类型为整型,取值范围0~100。

  • 当光照值超过设定阈值时触发告警事件

    定义光照过高告警事件OverLuxAlarm,事件参数为当前光照值lux。

  • 通过服务调用设置告警阈值

    定义异步服务SetAlarmThreshold,服务的入参为threshold,整形,表示告警阈值。

操作步骤

  1. 创建光照度探测器产品。
    数据格式配置为透传/自定义格式。
    定义属性
  2. 进行产品功能自定义。
    • 定义属性lux标识当前光照度值,类型为整型,取值范围0~100。
      定义属性
    • 定义异步服务SetAlarmThreshold,服务入参为threshold,类型为整形,取值范围0 ~ 100。表示告警阈值。
      定义服务
    • 定义光照过高告警事件OverLuxAlarm,事件参数为当前光照值lux。
      定义事件

    定义完,如下图自定义功能中所示。


    完成自定义功能
  3. 添加测试设备。

    新增测试设备
  4. 生成脚本。
    1. 设备端开发页签中,单击数据解析中的编辑脚本

      数据解析
    2. 单击自动生成脚本

      编辑脚本
      脚本生成好之后需要进行简单验证之后才能提交生效。

业务逻辑开发

  • 属性定时上报
    实现userHandler函数,放在main函数的while(1)内调用。
    void userHandler(void)
    {
        Uint8_t lux;
        static Uint32_t last, now;
        sdk_global_t *hsdk = (sdk_global_t *)getSdkObjHandle();
    
        /* 采集光照度的值,这里随机生成 */
        lux = rand() % 101;  // 取值0~100
        now = hsdk->jiffies;
        if (now - last >= 5000)
        {
            last = now;
            boneSet_lux(lux);   /* 调用设置lux的API */
            bonePostProp();     /* 上报 */
        }
    }
    
    Int32_t main(Int32_t argc, char *argv[])
    {
        // 此处省略其他代码
    
        while (1)
        {
            boneSdkRun();
    
            userHandler();
    
            usleep(100 * 1000);
        }
    						

    重新将代码编译运行之后可以到云端查看属性的上报日志信息如下。说明:由于使用的软件定时器不是很准,上报的时间间隔并非是严格的5s。


    设置属性
  • 光照度过高告警上报
    默认阈值为99,当超过该值时会触发光照度过高告警。
    Uint8_t threshold = 99;    /* 告警阈值 */
    
    void userHandler(void)
    {
        Uint8_t lux;
        static Uint32_t last1, last2, now;
        sdk_global_t *hsdk = (sdk_global_t *)getSdkObjHandle();
    
        /* 采集光照度的值,这里随机生成 */
        lux = rand() % 101;  // 取值0~100
        now = hsdk->jiffies;
    
        if ((lux > threshold) && (now - last1) > 2000)
        {
            /* 上报事件,为了避免频繁上报,这里约束事件上报间隔最短2s */
            eo_OverLuxAlarm_t oarg;
    
            oarg.a_lux = lux;
            boneEvntPost_OverLuxAlarm(&oarg);   /* 调用光照过高告警事件API */
    
            last1 = now;
        }
    
        if (now - last2 >= 5000)
        {
            last2 = now;
            boneSet_lux(lux);   /* 调用设置lux的API */
            bonePostProp();     /* 上报 */
        }   
    
    }
    						
    编译执行后,在云端收到当告警信息如下:
    告警管理
  • 云端修改告警阈值

    通过云端修改设备上的告警阈值,需要在服务处理接口中添加自己的逻辑代码。

    extern Uint8_t threshold;
    
    static Int32_t boneServCall_SetAlarmThreshold(Uint32_t id, Uint8_t *data, Uint16_t length)
    {
        Uint8_t len = 0;
        Uint8_t buffer[64] = {0};
        si_SetAlarmThreshold_t *iarg;
        BONE_UNUSED(len);
        BONE_UNUSED(buffer);
    
        // 1. 解析入参(没有则忽略)
        iarg = (si_SetAlarmThreshold_t*)data;
    
        // 2. 处理入参(没有则忽略)
        LOG_DBG("threshold = %d\n", iarg->a_threshold);
        threshold = iarg->a_threshold;    // 添加的处理代码
    
        // 3. 构造出参(没有则忽略)
    
        // 4. service回复
        return BONE_SUCCESS;
    }
    					

    编译后运行,通过云端调用服务设置告警阈值。

    设备端接收日志:


    设备端日志

    在云端查看事件日志,光照度阈值大于89时均上报了事件。


    设备事件管理

至此,基于透传协议的示例已经完成,您可以继续在此平台上的开发之旅。