玩轉 ESP32 + Arduino (七) Ticker定時庫,base64轉換,OTA, SSD1306顯示QRcode二維碼

一. Ticker 定時庫

Ticker 是ESP32自帶庫

注意: 不建議使用Ticker回調函數來阻塞IO操作(網絡、串口、文件);可以在Ticker回調函數中設置一個標記,在loop函數中檢測這個標記;
對于arg,必須是 char, short, int, float, void, char 之一;

1. 定時狀態獲取 .active();

/**
 * Ticker是否激活狀態
 * @return bool true表示ticker啟用
 */
bool active();

2. 終止定時器 .detach()

/**
 * 停止Ticker
 */
void detach();

3. once() —— xx秒后只執行一次

/**
 * xx秒后只執行一次
 * @param seconds 秒數
 * @param callback 回調函數
 */
void once(float seconds, callback_function_t callback);

/**
 * xx秒后只執行一次
 * @param seconds 秒數
 * @param callback 回調函數
 * @param arg 回調函數的參數
 */
void once(float seconds, void (*callback)(TArg), TArg arg)
示例: 一個傳參,一個不傳參
#include "Arduino.h"
#include "Ticker.h"

Ticker t1;
Ticker t2;

void func1()
{
  Serial.println("我是t1的回調,我沒參數");
}
void func1(int a)
{
  Serial.print("我是t2的回調,我的參數是:");
  Serial.println(a);
}

void setup()
{
  Serial.begin(115200);
  if (1)
  {
    t1.once(10, func1);
    t2.once(20, func1, 8);
    //t1 t2 方法名都叫func1, 但其實是不同的方法, 這涉及到一個方法重載的概念
  }
}

void loop()
{
  Serial.println("我來證明我沒被阻塞,也沒法阻塞Ticker");
  delay(2700);
}

4. once_ms() —— xx毫秒后只執行一次

用法同上

/**
 * xx毫秒后只執行一次
 * @param seconds 秒數
 * @param callback 回調函數
 */
void once_ms(float seconds, callback_function_t callback)

/**
 * xx毫秒后只執行一次
 * @param seconds 秒數
 * @param callback 回調函數
 * @param arg 回調函數的參數
 */
void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg);

5. attach() —— 每隔xx秒周期性執行

和上面一樣,只是周期性執行, 需要.detach()結束運行

/**
 * 每隔xx秒周期性執行
 * @param seconds 秒數
 * @param callback 回調函數
 */
void attach(float seconds, callback_function_t callback);

/**
 * 每隔xx秒周期性執行
 * @param seconds 秒數
 * @param callback 回調函數
 * @param arg 回調函數的參數
 */
void attach(float seconds, void (*callback)(TArg), TArg arg)

6. attach_ms() —— 每隔xx毫秒周期性執行

/**
 * 每隔xx毫秒周期性執行
 * @param seconds 秒數
 * @param callback 回調函數
 */
void attach_ms(float seconds, callback_function_t callback);

/**
 * 每隔xx毫秒周期性執行
 * @param seconds 秒數
 * @param callback 回調函數
 * @param arg 回調函數的參數
 */
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)

二. 轉換為base64

1. 什么是base64

Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數據的方法。

標準的Base64并不適合直接放在URL里傳輸,因為URL編碼器會把標準Base64中的“/”和“+”字符變為形如“%XX”的形式,而這些“%”號在存入數據庫時還需要再進行轉換,因為ANSI SQL中已將“%”號用作通配符。

為解決此問題,可采用一種用于URL的改進Base64編碼,它在末尾填充'='號,并將標準Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,并統一了數據庫、表單等處對象標識符的格式。

ESP32就是采用這種編碼方式來將數據轉換未base64的

2. ESP32轉換base64碼

base64 是ESP32自帶庫

用法非常簡單. 只有一個靜態方法:

static String base64::encode(const String &text)
還有 1 個重載

convert input data to base64

參數:
text – const String&

返回:
String

因為是靜態方法, 所以我們訪問此方法要用如下方法:

base64::encode(testBase64);

完整的舉例:

#include <Arduino.h>
#include "base64.h"

String testBase64 = "this is a test to base64!";
String revBase64Reslut;

void setup()
{
  Serial.begin(115200);
  delay(5000);
  Serial.println("begin encode the string!");
  revBase64Reslut = base64::encode(testBase64);
  Serial.println(revBase64Reslut);
}

void loop() {}

我們使用https://base64.us/來驗證一下:

三. OTA空中升級

OTA(空中)更新是使用 WiFi 連接而不是串行端口將固件加載到 ESP 模塊的過程。

  • Arduino IDE:主要用于軟件開發階段,實現不接線固件燒寫
  • Web Browser:通過 Web 瀏覽器手動提供應用程序更新模塊
  • HTTP Server:自動使用http服務器 - 針對產品應用

在三種升級情況下,必須通過串行端口完成第一個固件上傳。

OTA 進程沒有強加的安全性,需要確保開發人員只能從合法/受信任的來源獲得更新。更新完成后,模塊將重新啟動,并執行新的代碼。開發人員應確保在模塊上運行的應用程序以安全的方式關閉并重新啟動。

1. ESP32 OTA升級原理

ESP32 連接 HTTP 服務器(可以使本地也可以是云,OTA demo使用本地服務器),發送請求 Get 升級固件;每次讀取1KB固件數據,寫入Flash。

ESP32 SPI Flash 內有與升級相關的(至少)四個分區:

OTA data區:決定運行哪個區的App
Factory App區:有出廠時的默認App
OTA_0區:OTA_0 App
OTA_1區:OTA_1 App
首次進行 OTA 升級時,OTA Demo 向 OTA_0 分區燒錄目標App,并在燒錄完成后,更新 OTA data 分區數據并重啟。

系統重啟時獲取 OTA data 分區數據進行計算,決定此后加載 OTA_0 分區的App執行(而不是默認的 Factory App 分區內的App),從而實現升級。

同理,若某次升級后 ESP32 已經在執行 OTA_0 內的App,此時再升級時,OTA Demo 就會向 OTA_1 分區寫入目標App。再次啟動后,執行 OTA_1 分區實現升級。以此類推,升級的目標App始終在 OTA_0、OTA_1 兩個分區之間交互燒錄,不會影響到出廠時的 Factory App 固件,如下圖狀態。

2. OTA升級的安全性

模塊必須以無線方式聯網獲取新的固件, 這使得模塊被強行入侵并加載了其他代碼。 為了減少被黑客入侵的可能性,請考慮使用密碼保護您的上傳,選擇某些OTA端口,也可以給bin文件加密等。

3. ESP32 OTA升級流程和說明(服務器是本地PC)

升級流程
  1. 電腦連上路由器(AP)
  2. 電腦運行HTTP服務器(本地)
  3. 下載OTA Demo到ESP32開發板
  4. ESP32連上路由器(AP)后就會訪問HTTP下載新的APP到OTA區
升級邏輯
這里要補一個 局域網OTA升級的程序

4. ESP32 OTA升級(真正網絡環境,真正云服務器)

這里要補充一個真正的OTA升級程序

4. ESP32無線代碼上傳(ESP32搭建服務器進行OTA升級)

流程:

  1. ESP32通過STA模式連接至WIFI
  2. ESP32建立局域網WEB服務器, 提供WEB更新界面, 需要使用庫 ESP32HTTPUpdateServer
  3. 用IDE編譯好 .bin文件
  4. 通過mDNS功能在瀏覽器中訪問ESP32的服務器頁面 ,服務器默認地址: http://esp32.local
  5. 通過web界面將本地編譯好的程序使用HTTP的POST方法上傳到ESP32中
  6. 上傳完成后, ESP32將固件寫入flash
這里要補充一個esp32作為局域網服務器的  OTA程序

四. SSD1306顯示二維碼

這里我們要用到一個庫 : ESP8266 QRcode
這個庫依賴于庫: ESP8266_SSD1306

這個SSD1306驅動庫非常好用,可以了解一下

#include <Arduino.h>
#include "SSD1306.h"
#include "qrcode.h"

SSD1306 display(0x3c, 21, 22);
QRcode qrcode(&display);

void setup()
{
  Serial.begin(115200);
  delay(5000);
  Serial.println("");
  Serial.println("Starting...");

  display.init();
  display.clear();
  display.display();

  qrcode.init();
  // create qrcode
  qrcode.create("helloworld!.");
}
void loop()
{
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374