视频一区二区中文字幕,91精品久久久久,国产精品久久久,天天狠天天透天干天天怕∴

智宇物聯(lián) 專注于提供高穩(wěn)定、高速率的三網(wǎng)物聯(lián)網(wǎng)卡

懷化物聯(lián)網(wǎng)設(shè)備的固件遠(yuǎn)程升級(jí)方案以及軟件代碼

  • 作者:智宇物聯(lián)
  • 發(fā)表時(shí)間:2022年10月13日
  • 來(lái)源:智宇物聯(lián)

作為通用的物聯(lián)網(wǎng)設(shè)備,由于用戶需求各不相同,不少用戶有一些個(gè)性化的定制要求;

設(shè)備所對(duì)接的傳感器協(xié)議也多種多樣,比如Modbus讀寫參數(shù)的數(shù)據(jù)類型,某些物理量需要特殊的數(shù)據(jù)類型;

甚至可能還存在意想不到的bug。

因此,遠(yuǎn)程升級(jí)的功能對(duì)于設(shè)備來(lái)說(shuō)必不可少。

遠(yuǎn)程固件升級(jí)需要解決以下問題:

1)設(shè)備的遠(yuǎn)程訪問

當(dāng)設(shè)備被安裝于局域網(wǎng)內(nèi)部時(shí),位于遠(yuǎn)程的固件升級(jí)軟件工具無(wú)法穿透路由器訪問設(shè)備。

2)固件的分包以及傳送

由于設(shè)備的處理器資源有限,無(wú)法移植開源的http、FTP等協(xié)議棧,無(wú)法通過http、FTP等協(xié)議從服務(wù)器上下載固件,而需要自己實(shí)現(xiàn)代碼,采用TCP協(xié)議進(jìn)行固件包的發(fā)送;

而且對(duì)于幾十k甚至上百k的固件,需要將固件拆成幾百個(gè)字節(jié)的數(shù)據(jù)包,逐一發(fā)給設(shè)備;

4)固件的有效性檢驗(yàn)

固件在傳輸過程中,難免會(huì)出現(xiàn)錯(cuò)誤。

比如WiFi模塊,或者是ethernet模塊將數(shù)據(jù)通過uart轉(zhuǎn)發(fā)給處理器時(shí),如果有干擾、數(shù)據(jù)可能被破壞;

或者是處理器太忙,來(lái)不及接收數(shù)據(jù),導(dǎo)致固件包丟失數(shù)據(jù);

如果不對(duì)固件進(jìn)行有效性檢驗(yàn),將被破壞的固件升級(jí)進(jìn)控制器,會(huì)導(dǎo)致設(shè)備變磚而無(wú)法使用;

5)bootloader程序

bootloader程序需要下載固件的有效性檢驗(yàn),程序的擦除、固件數(shù)據(jù)從備份區(qū)到程序區(qū)的搬移。

6)處理器的固件升級(jí)軟件實(shí)現(xiàn)

軟件需要實(shí)現(xiàn)數(shù)據(jù)包接收,固件有效性驗(yàn)證、存儲(chǔ),數(shù)據(jù)應(yīng)答等。

遠(yuǎn)程固件升級(jí)系統(tǒng)架構(gòu)

物聯(lián)網(wǎng)設(shè)備的固件遠(yuǎn)程升級(jí)方案以及軟件代碼

遠(yuǎn)程固件升級(jí)系統(tǒng)架構(gòu)

設(shè)備作為TCP客戶端連接到云服務(wù)器上的TCP服務(wù)端,定時(shí)發(fā)送心跳,維護(hù)連接,從而實(shí)現(xiàn)TCP的長(zhǎng)鏈接。

在PC電腦上開發(fā)遠(yuǎn)程升級(jí)工具,作為TCP客戶端與云服務(wù)器上的TCP服務(wù)器建立連接;

當(dāng)需要遠(yuǎn)程升級(jí)時(shí),通過PC工具向云服務(wù)器發(fā)送消息,所發(fā)消息中包括了遠(yuǎn)程設(shè)備的設(shè)備編號(hào),以及PC工具的設(shè)備編號(hào);

服務(wù)器收到消息之后,根據(jù)消息中的目標(biāo)設(shè)備編號(hào),從其維護(hù)的長(zhǎng)鏈接中找到與該編號(hào)對(duì)應(yīng)的鏈接,通過該鏈接向設(shè)備轉(zhuǎn)發(fā)該消息;

設(shè)備收到消息之后,對(duì)消息中的固件包進(jìn)行有效性驗(yàn)證,如果有效,則寫入到固件暫存區(qū),并回復(fù)成功,否則回復(fù)失敗。

一些設(shè)計(jì)要點(diǎn)

處理器的存儲(chǔ)空間安排:

以STM32F103RCT6為例,該處理器有256KByte的FLASH空間;

4KByte的空間用于bootloader程序。

52KByte用于存儲(chǔ)用戶數(shù)據(jù);

剩余的FLASH空間一半作為程序存儲(chǔ)區(qū),一半作為固件暫存區(qū),程序必須小于100KByte。

固件的生成與分包

在Keil中,將程序的memory的起始地址設(shè)置為0x8001000,大小設(shè)置為0x19000。

同時(shí),設(shè)置運(yùn)行fromelf.exe,使得編譯程序時(shí)自動(dòng)生成用于固件升級(jí)的bin文件。

物聯(lián)網(wǎng)設(shè)備的固件遠(yuǎn)程升級(jí)方案以及軟件代碼

Keil設(shè)置

通過delphi將生成出來(lái)的bin文件讀入,并采用下述代碼進(jìn)行發(fā)包,加上協(xié)議頭以及CRC32的校驗(yàn)值。

pkgs := stream.Size div perpage;
  rem := stream.Size mod perpage;
  addr := 0;
  if(rem > 0) then
  begin
    pkgs := pkgs + 1;
  end;
  strcrc := '';
  for i:= 0 to (pkgs - 1) do
  begin
       curlen := perpage;
       if((i + 1) * perpage > bytecount) then
       begin
          curlen := bytecount - (i * perpage);
       end;
       payload :=  inttohex(i* perpage, 8)+inttohex(curlen, 8);      //
       stream.Position := i * perpage;
       k := 0;
       tmpstr := '';
       for j:= 0 to (curlen - 1) do
       begin
        stream.Read(val, 1);
        if((k and 1) = 0)  then
        begin
          tmpstr := inttohex(val, 2);
        end
        else
        begin
          tmpstr := inttohex(val, 2) + tmpstr;
        end;
        inc(k);
        if((k and 1) = 0)  then
        begin
          payload := payload + tmpstr;
        end;
       end;
       tempcrc :=  crc(payload);
       payload := tempcrc +payload;
       payload := inttohex((2 + 4 + 4 + perpage) * i, 8) + payload;
       payload := '01'+payload;
       strcrc := strcrc + tempcrc;
       payload := payload + crc(payload);;
       str := header+'&msgid='+inttostr(msgid)+'&length='+inttostr(1 + 2 + 4 + 4 + 4 + 2+ curlen)+'&cmd='+payload;
       inc(msgid);
       strcommands.Add(str);
  end;

固件的有效性驗(yàn)證以及升級(jí)的可靠性保證

整個(gè)固件包根據(jù)處理器的資源拆分為500個(gè)byte一個(gè)數(shù)據(jù)包;

每一個(gè)數(shù)據(jù)包都計(jì)算CRC32的數(shù)值并加入數(shù)據(jù)包中;

所以CRC32的數(shù)值再計(jì)算一遍CRC32數(shù)值并放入開始升級(jí)的命令之中;

控制器收到固件之后,重新計(jì)算500個(gè)byte的CRC32的計(jì)算值并與收到的CRC32值進(jìn)行比對(duì),只有兩者相等時(shí)才存入暫存區(qū);

當(dāng)收到所有數(shù)據(jù)包時(shí),從暫存區(qū)中按包讀出固件,計(jì)算CRC32值與同時(shí)存儲(chǔ)的CRC32值比對(duì),同時(shí)計(jì)算所有CRC32數(shù)值的CRC32數(shù)值,與開始升級(jí)的命令中所攜帶的數(shù)值比對(duì)。

只有所有CRC32的數(shù)值都相同的情況下,應(yīng)用程序才將升級(jí)程序的標(biāo)志位寫入到FLASH中,并重啟處理器進(jìn)入bootloader程序。

bootloader程序從FLASH中讀取到升級(jí)程序的標(biāo)志,則從暫存區(qū)中按包讀取數(shù)據(jù),進(jìn)行同樣的CRC32的驗(yàn)證過程,確保無(wú)誤的情況下,將暫存區(qū)中的固件搬移到程序區(qū)。

全部程序搬移完之后,再逐個(gè)字節(jié)比較暫存區(qū)以及程序區(qū)的內(nèi)容。

比對(duì)時(shí),再檢驗(yàn)CRC32是否正確。

只有CRC32數(shù)值正確并且與程序區(qū)的數(shù)據(jù)都相等的情況下,才清空升級(jí)程序的標(biāo)志,完成升級(jí)過程。

升級(jí)程序的步驟及代碼

步驟1:PC工具發(fā)送清空暫存區(qū)的命令,將暫存區(qū)的內(nèi)存都擦寫成0xff。

步驟2:PC工具發(fā)送寫固件數(shù)據(jù)包的命令,處理器收到之后,進(jìn)行有效性驗(yàn)證,并寫入暫存區(qū),重復(fù)該過程,完成整個(gè)固件的發(fā)送。

步驟3:PC工具發(fā)送開始升級(jí)的命令,處理器收到之后,再進(jìn)行一次有效性驗(yàn)證,并重啟,進(jìn)入bootloader程序。

步驟4:bootloader程序進(jìn)行有效性驗(yàn)證之后,將暫存區(qū)的固件搬移至程序區(qū),完成升級(jí);

代碼如下:

U32 data, value, dataB;
U8 res = FALSE;
U8 flag;
U16 pointer;
U16 len;

U8 *ins = lins + AP_ID_HEX_BYTE;

if(fnCRC16_Check(lins, llen)){
  len = 0;
  if(llen >= AP_ID_HEX_BYTE){
    len = llen - AP_ID_HEX_BYTE;
  }
  if(inscode == FM_OPERATECODE_START){
    if(fmups.m_uchState == FM_STATE_IDLE){
      if(len == (1 + 4 + FM_STARTCODE_LEN + 2 )){

        if(fnFM_IsStartStopValid(&ins[1 + 4])){
          data = (U32)ins[1] << 24;	
          data |= (U32)ins[2] << 16;
          data |= (U32)ins[3] << 8;
          data |= (U32)ins[4];
          if(data < FLASH_ROM_SIZE_FIRMWARE){
            fmups.m_uchState = FM_STATE_INIT;
            fmups.m_ulLen = data;
            fmups.m_uiTimer = FM_STATE_TIME;
            res = TRUE;
          }
        }
      }
    }
  }
  else if(inscode == FM_OPERATECODE_DOWNLOAD){

    if(fmups.m_uchState == FM_STATE_DOWNLOAD){

      if((len > (1 + 4 + 2 + 4 + 4 + 2))
         && (len <= (1 + 4 + 2 + 4 + 4 + 2 + FM_DOWNLOAD_EVERYMSG))){

        data = (U32)ins[1] << 24;	
        data |= (U32)ins[2] << 16;
        data |= (U32)ins[3] << 8;
        data |= (U32)ins[4];

        value = (U32)ins[7] << 24;	
        value |= (U32)ins[8] << 16;
        value |= (U32)ins[9] << 8;
        value |= (U32)ins[10];

        dataB = (U32)ins[11] << 24;	
        dataB |= (U32)ins[12] << 16;
        dataB |= (U32)ins[13] << 8;
        dataB |= (U32)ins[14];

        flag = TRUE;
        if(value != fmups.m_uchPointer){
          flag = FALSE;
          if((value + dataB) == fmups.m_uchPointer){
            res = TRUE;
          }
        }
        if(data >= (FLASH_ROM_SIZE_FIRMWARE - (FM_DOWNLOAD_EVERYMSG + 4+ 4 + 2))){
          flag = FALSE;
        }
        if(dataB > FM_DOWNLOAD_EVERYMSG){
          flag = FALSE;
        }
        if((fmups.m_uchPointer + dataB) > fmups.m_ulLen){
          flag = FALSE;
        }
        if(flag){
          if(value == fmups.m_uchPointer){
            res = fnFL_WriteBytesAndCheck(data + FLASH_ROM_ADDR_FIRMWARE, (2 + 4 + 4 + dataB), &ins[5]);
            if(res){
              fmups.m_uchPointer += dataB;
            }
          }else{
            res = TRUE;
          }
        }
      }
    }
  }
  else if(inscode == FM_OPERATECODE_STOP){
    if(len == (1 + 2 + 2 + FM_STARTCODE_LEN)){
      if(fnFM_IsStartStopValid(&ins[3])){
        if(fmups.m_uchState == FM_STATE_COMPLETE){
          if(fnFM_Check(ins[1], ins[2])){
            res = fnFM_ProCon(ins[1], ins[2]);
            if(res){
              fmups.m_uchReStartTimer = 10;
            }
          }

        }
      }
    }
  }
  else if(inscode == FM_OPERATECODE_RESET){
    if(len == (1 + 2 + FM_STARTCODE_LEN)){
      if(fnFM_IsStartStopValid(&ins[1])){
        res = TRUE;
        fmups.m_uchState = FM_STATE_IDLE;
        fmups.m_uiTimer = 0;
      }
    }
  }
}
ack[0] = inscode | 0x80;
ack[1] = res;
ack[2] = 0 ;
pointer = 3;
return(pointer);
物聯(lián)網(wǎng)設(shè)備的固件遠(yuǎn)程升級(jí)方案以及軟件代碼

最新資訊
最熱資訊
视频一区二区中文字幕,91精品久久久久,国产精品久久久,天天狠天天透天干天天怕∴
<ul id="i4ug0"></ul>
  • <ul id="i4ug0"></ul>
    <ul id="i4ug0"></ul> <ul id="i4ug0"><sup id="i4ug0"></sup></ul><ul id="i4ug0"></ul>
  • 国产女人18毛片水18精品| 欧美日韩中文在线观看| 国产美女精品视频免费观看| 午夜免费久久久久| 国内外成人免费激情在线视频网站| 亚洲激情六月丁香| 国内欧美视频一区二区| 欧美jizz19性欧美| 久久亚洲私人国产精品va| 亚洲精品在线看| 国产精品一区二区三区四区 | 欧美三级黄美女| 欧美电影资源| 亚洲免费在线观看| **欧美日韩vr在线| 精品电影一区| 欧美日韩中文| 欧美日韩久久精品| 久久国产加勒比精品无码| 亚洲激情视频网站| 在线欧美视频| 国产精品日日摸夜夜添夜夜av | 国产欧美一区二区三区另类精品| 久久婷婷蜜乳一本欲蜜臀| 日韩亚洲精品电影| 亚洲精选在线观看| 国产欧美精品一区二区三区介绍 | 欧美a级理论片| 久久综合狠狠| 亚洲影视中文字幕| 亚洲国产精品一区二区久| 亚洲第一二三四五区| 国产精品黄视频| 欧美亚洲第一页| 蜜臀a∨国产成人精品| 麻豆乱码国产一区二区三区| 亚洲午夜视频在线| 亚洲高清视频在线观看| 136国产福利精品导航| 国产精品免费久久久久久| 国产精品久久久久久久久婷婷 | 老牛嫩草一区二区三区日本| 久久嫩草精品久久久精品一| 宅男噜噜噜66一区二区| 在线观看国产成人av片| 亚洲国产精品一区二区三区| 国产欧美午夜| 国产一区在线免费观看| 欧美色欧美亚洲另类二区| 欧美色大人视频| 欧美成人第一页| 欧美日韩免费观看一区三区 | 欧美成人一品| 久久久久久9999| 欧美1区视频| 久久精品在线| 欧美fxxxxxx另类| 久久精品伊人| 欧美激情中文不卡| 看片网站欧美日韩| 欧美乱妇高清无乱码| 欧美成人一区二区| 欧美日韩亚洲网| 欧美精品久久久久久| 欧美色视频在线| 欧美日韩成人一区二区| 国产精品区一区| 国产精品国产自产拍高清av王其| 国产性做久久久久久| 国产欧美日韩一区| 亚洲国产精品福利| 在线成人亚洲| 99国内精品久久| 99精品欧美一区二区三区综合在线 | 樱桃国产成人精品视频| 狠狠操狠狠色综合网| 国产嫩草影院久久久久 | 91久久午夜| 亚洲韩国日本中文字幕| 亚洲一区影院| 麻豆精品一区二区av白丝在线| 久久尤物视频| 欧美午夜精品理论片a级按摩| 欧美日韩亚洲一区二区| 国产亚洲一级| 一区二区三区在线高清| 一区二区三欧美| 久久久久久尹人网香蕉| 久久免费精品视频| 欧美视频成人| 国产精品日韩在线观看| 91久久线看在观草草青青| 91久久精品国产91久久性色tv | 亚洲片在线观看| 亚洲欧美日韩一区二区三区在线观看| 美脚丝袜一区二区三区在线观看 | 欧美日韩在线播| 禁久久精品乱码| 亚洲高清视频的网址| 亚洲欧美综合v| 欧美激情久久久久| 欧美日韩在线视频一区二区| 在线日韩中文字幕| 亚洲精品欧美在线| 久久久久中文| 国产欧美日本一区二区三区| 国产一区在线播放| 亚洲午夜在线| 欧美日本二区| 国产精品一区二区久久| 日韩亚洲不卡在线| 免费成人小视频| 欧美日韩午夜在线| 亚洲福利电影| 一区二区精品| 欧美激情按摩在线| 精品不卡在线| 亚洲免费激情| 免费中文字幕日韩欧美| 国产美女精品| 亚洲国产精品激情在线观看| 欧美在线3区| 国产精品色午夜在线观看| 一区二区三区自拍| 久久超碰97中文字幕| 99国产精品久久久久久久久久| 一区在线视频| 日韩网站在线观看| 美日韩丰满少妇在线观看| 国产三级欧美三级| 亚洲高清免费在线| 久久综合精品国产一区二区三区| 国产日韩在线一区| 亚洲黄色av一区| 免费亚洲电影在线观看| 狠狠色丁香婷婷综合久久片| 99re亚洲国产精品| 欧美激情一区二区三区蜜桃视频 | 蘑菇福利视频一区播放| 国产精品成人午夜| 一区二区三区回区在观看免费视频| 欧美高清视频一二三区| 国产精品自拍三区| 午夜国产精品视频免费体验区| 国产精品a久久久久| 在线播放日韩欧美| 久久中文字幕导航| 依依成人综合视频| 老色批av在线精品| 国产精品视频免费| 午夜精品久久久久久久白皮肤| 国产精品久久久久高潮| 亚洲第一色在线| 欧美成人a视频| 亚洲精选一区二区| 欧美日一区二区三区在线观看国产免| 国产综合在线看| 久久天天躁夜夜躁狠狠躁2022 | 欧美国产日韩二区| 国产日韩欧美精品综合| 欧美一区二区视频在线| 国产欧美一区二区三区久久人妖| 日韩亚洲视频| 欧美视频专区一二在线观看| 一区二区三区国产在线观看| 国产精品二区在线| 亚洲日本va午夜在线影院| 欧美片第一页| 国产精品99久久99久久久二8| 国产精品久久毛片a| 亚洲精选久久| 国产精品v亚洲精品v日韩精品| 亚洲欧美日韩国产精品 | 久久综合伊人77777| 国产亚洲精品bt天堂精选| 久久久精品网| 亚洲伦理中文字幕| 国产精品成人va在线观看| 亚洲毛片在线| 国产精品一二三四区| 久久国产加勒比精品无码| 亚洲电影下载| 欧美日韩一区不卡| 亚洲看片免费| 国产精品视频自拍| 久久久青草婷婷精品综合日韩| 亚洲精华国产欧美| 国产精品高精视频免费| 99热在线精品观看| 国产视频在线观看一区| 欧美freesex8一10精品| 亚洲一区二区高清| 狠狠入ady亚洲精品| 欧美国产日韩一区二区在线观看| 亚洲成色777777在线观看影院| 欧美三级视频| 久久久xxx| 在线午夜精品自拍| 狠狠色狠狠色综合日日91app| 欧美激情中文字幕一区二区|