」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何實現ESPith SDK x(腳本可編程控制器)的OTA功能

如何實現ESPith SDK x(腳本可編程控制器)的OTA功能

發佈於2024-11-01
瀏覽:624

作為支援遠端連接互聯網的物聯網設備,本地或遠端OTA升級也是腳本編程控制器的重要功能,因為不能保證繼電器完全沒有Bug,在利用bug,如果沒有OTA升級接口,很難讓客戶透過串口升級固件,控制器只能回廠升級,成本高,影響大。

另外,客戶可能有一些個人化功能無法透過中文程式設計實現,需要升級控制器韌體才能實現。

這兩種情況需要透過本地或遠端OTA功能來解決。

這幾天花了一點時間完成這個功能,現總結如下:
(1)ESP8266的FLASH可以儲存兩個韌體,名稱分別為user1.bin到user2.bin,兩個韌體的位址由位址0x0000處儲存的引導程式boot.bin決定,且儲存位址不同不同的閃光燈容量。
例如,ESP8266-01S Flash 容量為 1Mbyte,儲存位址分別為 0x01000 和 0x81000,ESP8266-07S FLASH 容量為 4Mbyte,儲存位址分別為 0x01000 和 0x101000。

(2)透過函數system_upgrade_userbin_check的回傳值取得目前程式執行的user1.bin或user2.bin,進行韌體升級,到另一個韌體儲存區寫入完整的韌體,例如如果目前執行的是儲存在user1 .bin的0x1000處,然後到地址0x81000(ESP8266-01S)或0x101000(EPS8266-07S)寫入韌體user2.bin,寫入完畢後,再透過SDKsystem_upgrade_flag_set(0x02)通知SDK設定完成系統參數,以便ESP8266啟動時引導到另一個韌體。

3)官方推薦的做法是透過http協定將韌體下載到雲端伺服器到記憶體中,我沒有使用這個方案,主要是出於兩個考慮,一是這個方案是否經過嚴格驗證,以及是否有充分考慮數據驗證以避免升級到磚塊,我對此表示懷疑。其次,這個程式要求控制器能夠連接到外部網絡,從伺服器下載固件,這並不容易做到。

我目前正在使用delphi開發一套韌體升級軟體,該軟體作為TCP客戶端直接連接到控制器,或連接到雲端伺服器的TCP網關然後傳輸到控制器,然後根據512 位元組用於將韌體推送到控制器的資料幀。

接下來可以將這套邏輯移植到伺服器上,客戶可以透過瀏覽器開啟網頁將韌體推送到控制器。

4)資料的完整性得到充分驗證,第一幀資料做crc32校驗,韌體寫入flash然後讀出與寫入的值進行比較,同時計算出該值crc32,與上位機發送的crc32值相比,讀寫資料相同,crc值也相同,則認為該幀資料寫入成功;
同時對每一幀資料的crc32值再進一步做crc32值,得到總的crc32值,與上位機發送的總crc32值進行比較,該值與呼叫函數system_upgrade_flag_set之前相同( 0x02) 以允許SDK 切換到啟動韌體。

(5)寫入兩個不同韌體區的韌體user1.bin、user2.bin不一樣,對於RTOS sdk開發,需要修改Makefile變數APP的值產生user1.bin、user2 .bin,分別是上位機根據控制器傳回目前運作的該儲存區域的韌體,選擇另一個儲存區域的韌體傳送給控制器。上位機根據控制器傳回的目前運作韌體的儲存區域選擇另一個儲存區域的韌體。

如果兩個儲存區域使用相同的韌體,ESP8266將無法正常啟動。

How to implement OTA function for ESPith SDK x(script programmable controller)

How to implement OTA function for ESPith SDK x(script programmable controller)

版本聲明 本文轉載於:https://dev.to/zhangzhuyue/how-to-implement-ota-function-for-esp8266-with-sdk-2xxscript-programmable-controller-a60如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-07-13
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-07-13
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-07-13
  • CSS可以根據任何屬性值來定位HTML元素嗎?
    CSS可以根據任何屬性值來定位HTML元素嗎?
    靶向html元素,在CSS 中使用任何屬性值,在CSS中,可以基於特定屬性(如下所示)基於特定屬性的基於特定屬性的emants目標元素: 字體家庭:康斯拉斯(Consolas); } 但是,出現一個常見的問題:元素可以根據任何屬性值而定位嗎?本文探討了此主題。 的目標元素有任何任何屬性值,...
    程式設計 發佈於2025-07-13
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-07-13
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-07-13
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-07-13
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-07-13
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-07-13
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-07-13
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-07-13
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-07-13
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-07-13
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案: args)拋出異常{ 日曆cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    程式設計 發佈於2025-07-13
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-13

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3