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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1978|回复: 5

[已解答] freerots mqtt_print_limt 限制函数的疑问

[复制链接]
发表于 2020-10-19 21:08 | 显示全部楼层 |阅读模式
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  随着发送数据会慢慢变大
QQ截图20201019210535.jpg

然后mills 在接近26000 时 直接清零了;
微信截图_20201019210735.png

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


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

发表于 2020-10-19 21:29 | 显示全部楼层
服务器资源有限,过高的频率通信会占用服务器资源,增加运营成本。因此设备端限制通信频率,频率过高,就会触发broker限制,导致设备无法连接broker或者设备被删除,又或者账号被封
 楼主| 发表于 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次/秒 !是我理解错了,还是?

发表于 2020-10-20 12:43 | 显示全部楼层
Ding3417 发表于 2020-10-19 23:27
服务器请求限制

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

文档中wifi是局域网内通信,不是通过MQTT broker
 楼主| 发表于 2020-10-20 13:04 | 显示全部楼层
coloz 发表于 2020-10-20 12:43
文档中wifi是局域网内通信,不是通过MQTT broker

好的,感谢指导;
 楼主| 发表于 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??
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 14:35 , Processed in 0.148946 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表