1. 程式人生 > 實用技巧 >MT7621的FOTA升級除錯

MT7621的FOTA升級除錯

1. 先測試SOTA功能吧。需要找到檔案下載好的地方,檔案的名字"package"

整個工程的結構就是ota_loop(user_context_ptr, 5000); 和uint8_t OTA_Event_Handle(void *context, int16_t EVENT) 這兩個函式搞定的,一個是主迴圈,一個是事件回撥處理。

if(ctx->task_info.type == 1) 用來判斷是 sota 還是fota

2. 下面這個,下載成功的話,就儲存到檔案,同時上報下載進度

    case OTA_EVENT_DOWNLOAD_OK: {
        OTA_Event_Handle(ctx, OTA_EVENT_custom_save_packet);
        OTA_Event_Handle(ctx, OTA_EVENT_REPORT_DOWNLOAD_PROGRESS);
        
break; }

然後看一下怎麼呼叫到OTA_EVENT_DOWNLOAD_OK 的,根據程式碼來看是 TID校驗通過之後,開始下載包

case CTX_STATE_DOWNLOAD_PACKAGE: {
if(OTA_Download_Package(ctx, _start_, _end_, timeout_ms) == OTA_OK) //下載

    if(OTA_HTTP_Recv_Handle(ota_ctx, countdown_left(countdown_tmr)) == OTA_OK) //接收資料
    {
        if(otaParse_Download_Package(ota_ctx) == OTA_ERROR) //解析下載包
OTA_Event_Handle(ctx, OTA_EVENT_DOWNLOAD_OK); // 下載OK 的事件
//那麼可以看出呼叫的過程
    case OTA_EVENT_DOWNLOAD_OK: {
        OTA_Event_Handle(ctx, OTA_EVENT_custom_save_packet); //儲存到檔案
        OTA_Event_Handle(ctx, OTA_EVENT_REPORT_DOWNLOAD_PROGRESS); //上報進度
        break;
    }

看下圖就是圖中紅框的地方

上報進度的函式,檢查檔案下載完了沒,沒有的話,繼續CTX_STATE_DOWNLOAD_PACKAGE下載,又從頭開始了,如果下載完成那麼到CTX_STATE_UPDATE

    case
OTA_EVENT_REPORT_DOWNLOAD_PROGRESS_OK: { ota_log_printf("Report download progress success\r\n"); if(ctx->download_info.range_next_end == ctx->task_info.size) { ctx->state = CTX_STATE_UPDATE; break; } ctx->state = CTX_STATE_DOWNLOAD_PACKAGE; break; }
//往下
OTA_Event_Handle(ctx, OTA_EVENT_custom_ready_update);
//再往下就到了第一節說的

3. 升級檔案的指令是啥?那麼告訴伺服器是SOTA 升級 還是 FOTA,可能看伺服器建的是啥

4. 怎麼搞SOTA ,在判斷是SOTA的時候直接呼叫system("sysupgrade /qhq/package");即可

5. FOTA怎麼搞?那麼首先需要關閉原來的下載檔案,要不然兩個socket同時用一樣的資訊去 下載估計不行的。一個問題,似乎沒有適配MH5000-31的下載啊?看了程式碼似乎真沒有。

假設第一次進入CTX_STATE_DOWNLOAD_PACKAGE就需要修改

原來的方式是先下載,下載完再去判斷是5G 的還是MT7621 的。那麼現在需要修改 從CTX_STATE_DOWNLOAD_PACKAGE 起就需要判斷了。

問題一,進度沒辦法了,只能上報最終進度。等待5G的升級指令碼返回。先搞下地址,看能用電腦下載不?

測試LOG如下

root@5G_DTU:/qhq# ./general_ota_linux.out
ota init ok
[ota] Obtain Dynamic Token

fall in OTA_HTTP_Recv_Handle 4996
Status: 200
Header field: Content-Type
Header value: application/json;charset=UTF-8
Header field: Transfer-Encoding
Header value: chunked
Header field: Date
Header value: Tue, 13 Oct 2020 10:05:17 GMT
Chunk Size: 62

callback-body len:18

Body: {"errno":0,"error"
remaining content_length 32 bytes
:"succ","data":{"token":"rDjHgTrQOQBcCxHl"}}
expect 44 bytes, recv 44 bytes
return OTA_HTTP_Recv_Handle 4847
[ota] submit version

fall in OTA_HTTP_Recv_Handle 4997
Status: 200
Header field: Content-Type
Header value: application/json;charset=UTF-8
Header field: Transfer-Encoding
Header value: chunked
Header field: Date
Header value: Tue, 13 Oct 2020 10:05:19 GMT
Chunk Size: 26

callback-body len:18

Body: {"errno":0,"error"
remaining content_length 32 bytes
:"succ"}
expect 8 bytes, recv 8 bytes
return OTA_HTTP_Recv_Handle 4615

Submit Version Success
[ota] check task

fall in OTA_HTTP_Recv_Handle 4997
Status: 200
Header field: Content-Type
Header value: application/json;charset=UTF-8
Header field: Transfer-Encoding
Header value: chunked
Header field: Date
Header value: Tue, 13 Oct 2020 10:05:20 GMT
Chunk Size: 153

callback-body len:18

Body: {"errno":0,"error"
remaining content_length 32 bytes
:"succ","data":{"target":"11.821.00.04.00","tid":1245233,"size":62342040,"md5":"3ad73ff3e2a45ef40e85f7cbdf655454","type":1,"status":2}}
expect 135 bytes, recv 135 bytes
return OTA_HTTP_Recv_Handle 4867
Check OTATask Success.
delete package
[ota] validate tid

fall in OTA_HTTP_Recv_Handle 4997
Status: 200
Header field: Content-Type
Header value: application/json;charset=UTF-8
Header field: Transfer-Encoding
Header value: chunked
Header field: Date
Header value: Tue, 13 Oct 2020 10:05:21 GMT
Chunk Size: 26

callback-body len:18

Body: {"errno":0,"error"
remaining content_length 32 bytes
:"succ"}
expect 8 bytes, recv 8 bytes
return OTA_HTTP_Recv_Handle 4880

Check OTA TID Success.
report download progress: 0%
report download progress: 0%

把token, TID 組成一個HTTP的地址用伺服器測試下,提示toekn 錯誤,看樣子還是不能把token 放到IP地址裡面。

http://183.230.40.149:8081/ota/device/1245233/download?imei=867395040051761&token=rDjHgTrQOQBcCxHl

返回值
{"errno":2,"error":"invalid request paramers: Missing request header 'token' for method parameter of type String"}