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.用什么函数实现重启?

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

wdg - 看门狗 - IoT物联网操作系统 - 阿里云

但是涉及到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来恢复了,一个越战越勇,永不言败的阿里坚强诞生了!请明星代言一下:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员熊子峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值