无线固件算法

Firmware over the air algorithm

我正在无线更新固件,但我不知道下载固件和升级设备需要多长时间。所以我尝试的是进入无限循环 while(1) 并检查固件是否完成升级。那把街上的设备弄坏了……另一种选择是超时,但要超时多久?这是不可预测的。 问题是,如何保证可靠性,做到正确?

这是我尝试过的:

signed char wait_commands(vu32 timeout, char*command, const char *result_command, int valueToCheck)
{
    char *result = NULL;
        
    timer_1sec = 0;

        while(timer_1sec < timeout)
        {
            if( GSMGetString(tempdata, 5) == OK)
            {
            result = strstr(tempdata, command);
            if ( result != NULL)
            {
                int value;
                if ( result_command != NULL)
                {
                    if( valueToCheck != -1)
                    {
                        if (sscanf(result, result_command, &value) > 0)
                        {
                            
                            if (value != valueToCheck)
                            {
                                return FEHLER; 
                            }
                            else
                            {
                                return OK;
                            }
                        }
                }
                }
                else
                {
                    return OK;
                }
            }
        }
    }
    return FEHLER;
}

u8 isUpdated(void)
{
        
    char *currentFirmwareVersion = "BG96MAR02A07M1G_01.019.01.019";

    while (GSMCommand("+QGMR", tempdata, 20) != AT_OK)
        ;
    
    if (strncmp(tempdata, currentFirmwareVersion, strlen(currentFirmwareVersion))==0)
    {
        isBG96Updated = 1;
    }
    else
    {
        isBG96Updated = 0;
        
    }
    
    return isBG96Updated;
}

signed char updateBG96FirmwareVersion(vu32 timeout)
{
    char *url = "\"http://10.10.169.1/dfota/upgrade.bin\"";
    char command[150] = {0};
    signed char res = FEHLER;
    
    if(isUpdated())
        return OK;
    
    sprintf(command, "AT+QFOTADL=%s", url);
    PutStringUART(UART_GSM, command);
    PutCharUART(UART_GSM, '\r');
    res = wait_commands(timeout, "\"FOTA\",\"HTTPSTART\"", NULL, -1);
    res = wait_commands(timeout, "\"FOTA\",\"END\"",  "\"FOTA\",\"END\",%d", 0);
    
    return res;
}

移远BG96芯片我没有具体使用过,不过貌似支持DFOTA,官方也有指导可以view/download here.

本指南包含无线升级固件所需的 AT 命令。另外,我认为这可能会澄清您对升级过程的疑虑。