【建筑施工监测与安防系统】十三、接收OneNET命令重设置本地参数
[复制链接]
本篇衔接“十一”和“十二”篇内容。本人参数项目是依靠OneNET云平台的一个物联网应用系统,诸如采样周期、超时值等参数设定保存在TF中。另一方面,应用端(诸如APP、小程序等)可以通过OneNET向设备端发送命令,进行参数值的修订。
这里统一命令的格式,以“参数名称"参数值”的形式,比如要修改采样周期为20分钟,那么就发送命令——period"20。
IDF实现的MQTT连接中,解析各类事件依靠回调函数,收到MQTT Server发送数据(也就是OneNET的命令)产生事件的id值为MQTT_EVENT_DATA,而命令字串就在事件的data成员中,所以只要解析“event->data”,就可以完成对命令的判断和处理。
本例只解析对period、timeout和repeat三个项目参数的重配置命令,解析函数的逻辑类似,这里只展示对period命令的解析。
/*
* parse command -- period"int
*/
uint8_t aita_parseCommPeriod(char *pl, int len) {
uint8_t np = 0;
char period[7] = {'p', 'e', 'r', 'i', 'o', 'd', '\"'};
int i;
for(i=0; i<7; i++) {
if(pl[i] != period[i]) break;
}
if(i < 7) return np;
i=7;
np = pl[i]-0x30;
i++;
while(i<len) {
np = 10*np + (pl[i]-0x30);
i++;
}
return np;
}
回调函数中,调用解析命令函数,如果解析到命令,则修改参数对应的全局量(变量名还是period),并且写回TF卡,保证系统重启后命令参数不会变成初始值。
void mqtt_event_handler(void *handler_args,
esp_event_base_t base, int32_t event_id, void *event_data) {
//省略其它代码
int par = 0;
switch ((esp_mqtt_event_id_t)event_id) {
//省略其它代码
case MQTT_EVENT_DATA:
ESP_LOGI(TAG, "MQTT_EVENT_DATA"); //by author. OneNET order
printf("TOPIC=%.*s\r\n", event->topic_len+2, event->topic);
printf("DATA=%.*s\r\n", event->data_len+2, event->data);
par=aita_parseCommPeriod(event->data, event->data_len);
if(par) {
period = par;
ESP_LOGI(TAG, "new para period=%d", period);
file_ops ops_array[1] = {writeSettings};
spisd_ops(ops_array, 1);
break;
}
//省略其它代码
}
}
writeSettings()是写回配置参数到TF卡中settings.txt文件的函数,调用了C库的文件操作函数fputs,写入字串到文件。
void writeSettings(void) {
//open settings.txt for reading
ESP_LOGI(TAG, "Write Settings to file %s", file_settings);
FILE *f = fopen(file_settings, "w");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for reading");
return;
}
char buf[160] = {0};
sprintf(buf,
"port=%d\nperiod=%d\ntimeout=%d\nrepeat=%d\ndeviceid=%sproductid=%sauthkey=%s%s",
port, period, timeout, repeat, deviceid, productid, authkey, apikey);
ESP_LOGI(TAG, "%s", buf);
fputs(buf, f);
//close file
fclose(f);
}
|