freerots mqtt_print_limt 限制函数的疑问-Arduino中文社区 - Powered by Discuz! Archiver

Ding3417 发表于 2020-10-19 21:08

freerots mqtt_print_limt 限制函数的疑问

blinker_mqtt.c 函数中的


blinker_mqtt_print函数中有一部分发送限制函数如下


if (!check_print_limit())//检测limit 函数返回是否为0
{
   return 0;//返回0
}
_print_times++;//返回1   _print_times ++


另外check print_limit 如下图:



int8_t check_print_limit(void)
{
    if ((millis() - _print_time) < 60000)    //mills为uint32_t esp_log_early_timestamp( void )   判断millis- _print_time 是否小于 60000
    {                                        // 返回在日志输出中使用的时间戳的函数。
                                             // 该功能使用硬件周期计数器,并且不依赖于操作系统,因此可以在应用程序崩溃后安全使用。
                                             // 时间戳,以毫秒为单位



      if (_print_times < 10) return 1;   //如果打印次数小于10 返回1
      else
      {
            BLINKER_ERR_LOG(TAG, "MQTT MSG LIMIT");//否则返回0 ,打印 MQTT MSG 限制
            return 0;
      }
    }
    else
    {
      _print_time = millis();   //如果millis - _print_time> 60000
      _print_times = 0;         //将_print_times 清零
      return 1;                   //返回1
    }
}


但是实际测试发现,mills随着发送数据会慢慢变大


然后mills 在接近26000 时 直接清零了;


这样实际表现为 mills数据永远不会大于60000;只要发送的数据超过10次,就再也无法发送数据了;一直打印"MQTT MSG LIMIT"


不清楚这个设计的用意,实际使用 应该怎么更改?

coloz 发表于 2020-10-19 21:29

服务器资源有限,过高的频率通信会占用服务器资源,增加运营成本。因此设备端限制通信频率,频率过高,就会触发broker限制,导致设备无法连接broker或者设备被删除,又或者账号被封

Ding3417 发表于 2020-10-19 23:27

本帖最后由 Ding3417 于 2020-10-19 23:30 编辑

coloz 发表于 2020-10-19 21:29
服务器资源有限,过高的频率通信会占用服务器资源,增加运营成本。因此设备端限制通信频率,频率过高,就会 ...
服务器请求限制

请求类型      频率限制(次/分钟)
MQTT登陆信息      1
配置信息上传/查询      1
数据上传      1(次/小时)
数据查询      1
短信发送      1
天气查询      1
AQI查询      1



通讯限制

接入/通信类型      频率限制(次/秒)      数据长度限制(bytes/次)
BLE          20      128
WiFi         20      512
MQTT      1      512
Bridge      1      512
心跳包      20      512


请问下这个limit函数是不是限制了10次/分钟,但文档里好像写着是20次/秒 !是我理解错了,还是?

coloz 发表于 2020-10-20 12:43

Ding3417 发表于 2020-10-19 23:27
服务器请求限制

请求类型      频率限制(次/分钟)


文档中wifi是局域网内通信,不是通过MQTT broker

Ding3417 发表于 2020-10-20 13:04

coloz 发表于 2020-10-20 12:43
文档中wifi是局域网内通信,不是通过MQTT broker

好的,感谢指导;

Ding3417 发表于 2020-10-20 14:10

本帖最后由 Ding3417 于 2020-10-20 14:19 编辑

coloz 发表于 2020-10-19 21:29
服务器资源有限,过高的频率通信会占用服务器资源,增加运营成本。因此设备端限制通信频率,频率过高,就会 ...
这是一些关于 esp_log_early_timestamp 的打印信息
------------------->>>>>>>>>>>>>>>>>>>>>>>------------xthal_get_ccount: -20738276
------------------->>>>>>>>>>>>>>>>>>>>>>>------------esp_log_early_timestamp: 26713
I (26750) sct2430: Free memory: 263060 bytes
------------------->>>>>>>>>>>>>>>>>>>>>>>------------xthal_get_ccount: 18462606
------------------->>>>>>>>>>>>>>>>>>>>>>>------------esp_log_early_timestamp: 115

关于时间戳函数:uint32_t ATTR esp_log_early_timestamp()
{
    return xthal_get_ccount() / (g_ticks_per_us_pro * 1000);
}

经过测试xthal_get_ccount 最大计数为 2 的32次方单位us    最大为:【4,294,967,296】g_ticks_per_us_pro 为CPU频率 单位为MHz ; 80-240之间

按照时间戳函数计算方式4,294,967,296 / (80~240) / 1000= 17895 ~ 53687之间

if ((millis() - _print_time) < 60000)
    {
      if (_print_times < 10) return 1;
      else{
            BLINKER_ERR_LOG(TAG, "MQTT MSG LIMIT");
            return 0;
      }
    }
    else {
      _print_time = millis();
      _print_times = 0;
      return 1;
    }



所以这个limit函数 millis() 最大的参数为53687 ; _print_time 初值为0; 两者相减;应该永远都是小于60000,根本不会进去else 判断条件
于是不管隔多少时间发一次,一旦mqtt发送次数超过10次,就提示 MQTT MSG LIMIT 限制了;


不知道 这个是不是bug??
页: [1]
查看完整版本: freerots mqtt_print_limt 限制函数的疑问