视频一区二区中文字幕,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í)需要解決以下問(wèn)題:

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

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

2)固件的分包以及傳送

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

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

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

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

比如WiFi模塊,或者是ethernet模塊將數(shù)據(jù)通過(guò)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í),通過(guò)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)的鏈接,通過(guò)該鏈接向設(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è)置

通過(guò)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)證過(guò)程,確保無(wú)誤的情況下,將暫存區(qū)中的固件搬移到程序區(qū)。

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

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

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

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

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

步驟2:PC工具發(fā)送寫固件數(shù)據(jù)包的命令,處理器收到之后,進(jìn)行有效性驗(yàn)證,并寫入暫存區(qū),重復(fù)該過(guò)程,完成整個(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>
  • 你懂的网址国产 欧美| 日韩视频永久免费| 欧美一区二区播放| 国产精品青草综合久久久久99 | 欧美天堂亚洲电影院在线播放| 久久精品中文字幕一区| 国产视频精品va久久久久久| 久久成人人人人精品欧| 亚洲高清不卡在线| 国产精品无码永久免费888| 久久国产精品黑丝| 亚洲人成在线播放网站岛国| 韩国自拍一区| 欧美夫妇交换俱乐部在线观看| 日韩午夜在线观看视频| 亚洲高清一区二区三区| 欧美日韩a区| 欧美国产日韩精品| 亚洲激情午夜| 国产精品久久久久一区二区三区| 欧美伦理在线观看| 午夜视频在线观看一区二区三区| 在线观看日产精品| 欧美精品亚洲精品| 久久久精品国产免大香伊| 一区二区三区在线免费视频| 国产精品高清网站| 久久久噜噜噜久噜久久| 日韩手机在线导航| 亚洲精品欧美日韩专区| 国产精品一区二区三区乱码| 欧美视频在线一区二区三区| 9l国产精品久久久久麻豆| 亚洲精品国产精品国产自| 国产精品入口66mio| 欧美性大战久久久久久久| 久久青草久久| 久久字幕精品一区| 在线欧美小视频| 亚洲影院免费| 在线欧美影院| 亚洲大片免费看| 国产精品激情av在线播放| 欧美日韩国产天堂| 欧美一区二区三区精品电影| 亚洲高清免费| 亚洲国产一区在线观看| 国产女主播一区二区| 国产精品日韩专区| 欧美成人在线免费视频| 欧美日韩国产首页在线观看| 最新日韩精品| 国产精品伦一区| 欧美性做爰猛烈叫床潮| 久久九九国产精品| 久久久91精品国产一区二区精品| 一本久久a久久精品亚洲| 国产精品色网| 国产精品一区二区久久精品| 欧美成人影音| 欧美少妇一区| 欧美国产在线电影| 欧美女同视频| 一区三区视频| 欧美大片18| 欧美经典一区二区| 久久久噜噜噜久久中文字幕色伊伊| 久久亚洲一区二区三区四区| 欧美精品一区二区三区在线播放 | 在线视频日本亚洲性| 一区二区国产日产| 国产一区二区剧情av在线| 狠狠久久五月精品中文字幕| 国产日本欧洲亚洲| 在线播放亚洲一区| 黑人一区二区| 日韩一级精品视频在线观看| 亚洲精品乱码久久久久久蜜桃91| 夜夜嗨av一区二区三区网页| 国产精品自拍一区| 国产一区视频观看| 欧美日韩国产色综合一二三四| 国产精品自在欧美一区| 欧美日韩在线一区| 欧美日韩一区二区三区在线观看免| 美女视频一区免费观看| 久久久久国内| 久久久久久亚洲精品中文字幕| 久久在线免费观看| 欧美一区二区高清在线观看| 另类av导航| 久久人人爽国产| 免费成人黄色| 亚洲午夜精品网| 一区二区高清视频在线观看| 欧美自拍偷拍| 久久免费视频网| 麻豆精品精华液| 国产精品每日更新| 国产私拍一区| 亚洲视频在线观看免费| 久久尤物视频| 在线综合亚洲欧美在线视频| 黄色成人av| 日韩视频精品在线| 亚洲国产日韩综合一区| 亚洲精品日韩一| 国产麻豆午夜三级精品| 亚洲人成在线播放网站岛国| 国产精品入口夜色视频大尺度| 国产一区二区毛片| 影音先锋中文字幕一区二区| 亚洲一区二区综合| 欧美激情第一页xxx| 欧美色欧美亚洲另类二区| 悠悠资源网久久精品| 亚洲人成人一区二区在线观看| 激情国产一区| 亚洲人成欧美中文字幕| 久久久亚洲国产天美传媒修理工 | 欧美精品久久久久久| 欧美精品videossex性护士| 欧美人在线观看| 欧美黄在线观看| 欧美三区在线视频| 亚洲盗摄视频| 最新中文字幕亚洲| 久久久久久久久岛国免费| 欧美日韩国产成人在线| 国产精品美女黄网| 亚洲伦理网站| 狠久久av成人天堂| 欧美一区二区播放| 国产精品视频大全| 亚洲国产高清自拍| 一本一本a久久| 欧美va天堂在线| 欧美伊人影院| 国产精品国产一区二区| 精品不卡在线| 国产精品va在线播放| 国产精品成人在线| 一区二区成人精品 | 国产乱码精品一区二区三区五月婷 | 欧美福利一区| 欧美丝袜一区二区| 99re6热只有精品免费观看| 亚洲人成欧美中文字幕| 欧美成人资源网| 亚洲风情亚aⅴ在线发布| 久久亚洲精品视频| 亚洲精品视频一区二区三区| 久久综合电影| 国产精品久久久久久久久久免费 | 国内激情久久| 91久久精品日日躁夜夜躁欧美| 久久久久久国产精品一区| 欧美精品情趣视频| 亚洲美女av黄| 欧美精品自拍偷拍动漫精品| 欧美日韩精品欧美日韩精品一| 日韩图片一区| 欧美日韩中文字幕精品| 亚洲电影免费在线观看| 免费在线亚洲欧美| 亚洲精品免费看| 欧美日韩成人综合在线一区二区| 韩国亚洲精品| 免费成人黄色| 日韩亚洲一区二区| 激情综合激情| 国产伦精品一区二区| 夜色激情一区二区| 国产精品视频成人| 亚洲激情影院| 欧美日本二区| 黄色精品免费| 亚洲综合视频1区| 国产精品一区视频| 亚洲精品一区二区三区婷婷月| 欧美激情区在线播放| 亚洲人成网站色ww在线| 欧美福利电影在线观看| 精品99视频| 欧美日本乱大交xxxxx| 一本色道久久精品| 国产精品高精视频免费| 在线午夜精品自拍| 国产精品自拍小视频| 久热国产精品视频| 国产一级揄自揄精品视频| 美腿丝袜亚洲色图| 激情国产一区二区| 欧美日本在线观看| 亚洲欧美中文在线视频| 精品91在线| 欧美日韩ab| 亚洲精品在线观看视频| 国产精品久久久久秋霞鲁丝| 久久久青草婷婷精品综合日韩|