1019|0

155

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【建筑施工监测与安防系统】十三、接收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);
}

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表