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.用什么函数实现重启?
一开始想到看门狗,停止喂狗指令,参考官方帮助文档:
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.1.0升级到3.3.0