为了让开发者在没有硬件的情况下仍能体验平台的透传协议功能,本示例在Linux系统下实现一个虚拟的光照度探测器。
背景信息
虚拟的光照度探测器的主要功能如下。
- 光照度值定期5s上报
定义属性lux标识当前光照度值,类型为整型,取值范围0~100。
- 当光照值超过设定阈值时触发告警事件
定义光照过高告警事件OverLuxAlarm,事件参数为当前光照值lux。
- 通过服务调用设置告警阈值
定义异步服务SetAlarmThreshold,服务的入参为threshold,整形,表示告警阈值。
操作步骤
业务逻辑开发
- 属性定时上报
实现
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时均上报了事件。
至此,基于透传协议的示例已经完成,您可以继续在此平台上的开发之旅。