Alios Things 3.3.0应用稳定性底牌方案:网络异常自动重启

Posted 千夫长-莫学良

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Alios Things 3.3.0应用稳定性底牌方案:网络异常自动重启相关的知识,希望对你有一定的参考价值。

需求:

        在一个特殊的场景下,一个搭载了Alios Things 3.3.0的Haas100板子,在8个200万高清摄像头的网络里,和摄像头共用网线连接到路由器,网络流量在32M到40M左右,一根100M的网线,负载是相当高的,现场温度长期40°以上,这种极限情况下,HaaS100出现半小时断网的情况,需要重启一下才能恢复。但是程序本身并没有崩掉,重启又可以再战半小时。

        这在不间断运行的实用环境下,是不可以接收的,为了提高产品的可用性,我做了一个连接异常重启的代码,共享如下。

目录

1.用什么函数实现重启?

2.在哪里添加:

1.MQTT事件回调函数中:

2.MQTT发送回调函数中

3.MQTT接收回调函数中

   结语 


1.用什么函数实现重启?

一开始想到看门狗,停止喂狗指令,参考官方帮助文档:

https://help.aliyun.com/document_detail/268767.htm?spm=a2c4g.11186623.2.16.2fff3a30hcWFUh

但是涉及到fopen(),设置间隔啥的,一系列操作,感觉会增加程序的复杂度,导致系统更多的bug,摸索了一下,果断放弃。

然后搜索reboot,发现一个ota_reboot,再发现了一个aos_reboot,就是它了。在

#include <aos/kernel.h>

    里面自带的系统库函数,那就没有什么增加组件,添加depands,define:之类的事情了。

2.在哪里添加

3个位置:

1.MQTT事件回调函数中:

/* MQTT事件回调函数, 当网络连接/重连/断开时被触发, 事件定义见core/aiot_mqtt_api.h */

void demo_mqtt_event_handler(void *handle, const aiot_mqtt_event_t *event, void *userdata)

前面有reconnect的处理,这里是确实失败了,或者心跳超时之后才到的这里,所以状态比较明确,3次到这里,就重启。

        /* SDK因为网络的状况而被动断开了连接, network是底层读写失败, heartbeat是没有按预期得到服务端心跳应答 */
        case AIOT_MQTTEVT_DISCONNECT: {
            char *cause = (event->data.disconnect == AIOT_MQTTDISCONNEVT_NETWORK_DISCONNECT) ? ("network disconnect") :
                          ("heartbeat disconnect");
            printf("AIOT_MQTTEVT_DISCONNECT: %s\\n", cause);
            connectfailcount+=1;
            if(connectfailcount>3)//重连超过3次失败,就重启
            {
                printf("\\n\\n\\n\\n network fail or heartbeat lost,reboot\\n\\n\\n\\n");
                aos_msleep(1000);
                aos_reboot();
            }

2.MQTT发送回调函数中

       判断发送的结果是网络断开STATE_SYS_DEPEND_NWK_CLOSED和发送错误STATE_SYS_DEPEND_NWK_SEND_ERR。累计5次失败就重启,成功一次就复位计数值。

/* 执行aiot_mqtt_process的线程, 包含心跳发送和QoS1消息重发 */
void *demo_mqtt_process_thread(void *args)
{
    int32_t res = STATE_SUCCESS;

    while (g_mqtt_process_thread_running) {
        res = aiot_mqtt_process(args);
        if (res < STATE_SUCCESS){
            if (res == STATE_USER_INPUT_EXEC_DISABLED) {
                break;
            }
            aos_msleep(1000);
            if ((res == STATE_SYS_DEPEND_NWK_CLOSED)||(res == STATE_SYS_DEPEND_NWK_SEND_ERR))
            {
                connectfailcount+=1;
                if(connectfailcount>5)//重连超过5次失败,就重启
                {
                    printf("\\n\\n\\n\\n Send Mqtt Fail 5 times,reboot\\n\\n\\n\\n");
                    aos_msleep(1000);
                    aos_reboot();
                }
            }
        }
        else{
            connectfailcount=0;//正常通讯,复位错误计数
        }
    }
    return NULL;
}

3.MQTT接收回调函数中

      判断发送的结果是网络断开STATE_SYS_DEPEND_NWK_CLOSED和发送错误STATE_SYS_DEPEND_NWK_RECV_ERR。累计5次失败就重启,成功一次就复位计数值。

/* 执行aiot_mqtt_recv的线程, 包含网络自动重连和从服务器收取MQTT消息 */
void *demo_mqtt_recv_thread(void *args)
{
    int32_t res = STATE_SUCCESS;

    while (g_mqtt_recv_thread_running) {

        res = aiot_mqtt_recv(args);
        if (res < STATE_SUCCESS) {
            if (res == STATE_USER_INPUT_EXEC_DISABLED) {
                
                break;
            }
            if ((res == STATE_SYS_DEPEND_NWK_CLOSED)||(res == STATE_SYS_DEPEND_NWK_RECV_ERR))
            {
                connectfailcount+=1;
                if(connectfailcount>5)//重连超过5次失败,就重启
                {
                    printf("\\n\\n\\n\\n Recv Mqtt Fail 5 times,reboot\\n\\n\\n\\n");
                    aos_msleep(1000);
                    aos_reboot();
                }
            }

            aos_msleep(1000);
        }
        else{
            connectfailcount=0;//正常通讯,复位错误计数
        }
    }
    return NULL;
}

   结语 

         这样,无论是拔网线,网络数据包压力,或是云端禁用,各种异常,都可以通过最后手段reboot来恢复了,一个越战越勇,永不言败的阿里坚强诞生了!请明星代言一下:

        关注,点赞,收藏,会有更多实用经验分享哦。

以上是关于Alios Things 3.3.0应用稳定性底牌方案:网络异常自动重启的主要内容,如果未能解决你的问题,请参考以下文章

AliOS Things 3.3.0 : http组件介绍

AliOS Things 3.3.0 : BLE组件介绍

开发笔记-AliOS Things如何从3.1.0升级到3.3.0

AliOS Things 3.3.0 : A2SA组件介绍

AliOS Things 3.3.0 : 实战HaaS100扩展SD卡

AliOS Things 3.3.0 Wi-Fi连网的那些事