本文是物联网智慧路灯应用代码解析(上)的下篇。上篇我们介绍智慧路灯应用注册设备和获取上报数据的实现原理,本文我们继续介绍智慧路灯应用其他功能的实现。
智慧路灯应用注册设备成功后,界面上会显示下半部分的内容。
灯状态与环境亮度
这三个组件中,灯状态和环境亮度均会根据设备上报的数据刷新。首先让我们查看index.html,查看会刷新的内容对应的id和class。
因为这些数据应该是在应用获取到设备上报数据时刷新,所以让我们回去查看上篇中我们在common.js中找到的getDis()函数和getSub()函数。
可以看到,这两个函数的fuction实现是相同的,都是根据从后端获取的值,刷新前端信息,刷新的项也就是我们刚才在index里看到的那几项。
路灯控制
最后来看下路灯控制模块。路灯控制可以选择三种开关模式,分别是终端联控模式(terminal),分段定时模式(timeRange)和自动调光模式(autoLux)。
终端联控模式
查看HTML代码,可以看到终端联控模式是直接设置开关后触发common.js中的setOpenClose()函数。
查看函数,看到该函数是携带开关灯状态调用/set-open-close接口。
/set-open-close接口对应SetOpenClose类中的setPara(@RequestBody String onOff)函数,但我们可以看到,该函数只是设置了TempDatabase中ctrlMode和onOffSetter的值,并没有给设备下发命令,那么应用是什么时候给设备下发命令的?
从应用逻辑上来说,如果不是在设置命令时直接下发,那么就肯定是在其他事件被触发时或者定时任务中下发。“命令”、“定时任务”这两个关键词是不是很眼熟?我们之前查看定时获取数据函数(getDIsData()和getDeviceData())时看到的createDeviceCommand.runSetCommand(slMsg);这行代码从字面上解释不就是下发命令的意思么?
于是我们打开createDeviceCommand类,查看runSetCommand(StreetLightMsg streetLightMsg)函数。这个函数会判断ctrlMode进行不同的处理。对于terminal模式,应用根据命令指定的状态和路灯当前状态判断是否下发命令,即命令设置为开且路灯当前状态为关时下发开灯命令,命令设置为关且路灯当前状态为开时下发关灯命令,其余情况不下发命令。
实际下发命令是调用了同一个类中的setCommand(String command)函数,这个函数通过调用设备接入服务的下发设备命令接口实现命令下发。
综上所述,用户在界面上点击设置命令状态后,应用只是设置了控制模式和开关灯参数,然后在定时任务中检查参数,满足条件时就进行下发。例如,灯状态为关时设置命令状态为开,应用就会定时给设备下发开灯命令,直到设备上报开灯状态或用户设置命令状态为关。
分段定时模式
分段定时模式是通过两个时间控件让用户选择关灯时间段后调用setTimeRange()函数。
setTimeRange()函数调用/set-time-range接口,携带用户设置的时间段。
/set-time-range接口对应TimeRangeCtrl类的setPara(@RequestBody TimeRange value)函数,和终端联控模式一样并没有直接下发命令,只是设置了控制模式和时间段。
查看createDeviceCommand类的runSetCommand(StreetLightMsg streetLightMsg)函数,可以看到控制模式为timeRange时,应用通过调用Time类的isInTimeMain(String startTime, String endTime, String dateStr)函数判断当前时间是否在设置的关灯时间段内,然后如果灯状态为开且在关灯时间段内,下发关灯命令;灯状态为关且不在关灯时间段内,下发开灯命令。同样因为是定时任务,满足条件后命令会反复下发直到设备上报的灯状态变化或时间超过时间段。Time类是智慧录音应用自定义的一个用于判断当前时间是否在时间段内的工具类,本文不进行详述,感兴趣的同学可以自己查看源码。
自动调光模式
自动调光模式调用setDeviceLuxThreshold(btn)函数,该函数又调用/threshold接口,携带用户设置的阈值。
/threshold接口对应SetCustomData类中的setThreshold(@RequestBody Threshold value)函数,设置控制模式和阈值。
查看createDeviceCommand类的runSetCommand(StreetLightMsg streetLightMsg)函数,可以看到控制模式为autoLux时,若阈值为有效值(大于0),当前上报环境光强小于阈值且灯状态为关时下发开灯命令,大于阈值且灯状态为开时下发关灯命令,只要满足条件就一直重复下发。
至此,智慧路灯应用的代码全部解析完毕,各位同学如果想要修改某个功能,只要修改该功能对应的函数就行,若想要替换成路灯以外的设备,只要根据产品模型和业务逻辑重新设计代码逻辑还行,核心的“注册设备-获取数据-下发命令”的逻辑是不变的。