文章目錄
- 1、解讀起因
- 2、解讀點
- 2.1 解讀硬性要求
- 3、解讀程序
- 3.1 解讀理念
- 3.1.1 官方說明
- 3.2 解讀組合方式
- 3.2.1 綠色 —— 必選宏
- BLINKER_BLE —— ble藍牙通信
- BLINKER_WIFI、BLINKER_MQTT —— WiFi通信
- BLINKER_PRO —— 略
- BLINKER_PRO_ESP、BLINKER_WIFI_AUTO—— 略
- BLINKER_AT_MQTT—— AT開發方式
- BLINKER_WIFI_GATEWAY
- BLINKER_WIFI_SUBDEVICE
- BLINKER_NBIOT_SIM7020
- BLINKER_NBIOT_SIM7000
- BLINKER_PRO_SIM7020
- BLINKER_GPRS_AIR202
- BLINKER_PRO_AIR202
- BLINKER_LOWPOWER_AIR202
- BLINKER_QRCODE_NBIOT_SIM7020
- BLINKER_QRCODE_NBIOT_SIM7000
- 3.2.2 淺藍色—— 附加宏
- BLINKER_APCONFIG —— webSocket 局域網配網
- BLINKER_ESP_SMARTCONFIG —— smartconfig配網
- BLINKER_MIOT_LIGHT—— 小米小愛
- BLINKER_MIOT_OUTLET—— 小米小愛
- BLINKER_MIOT_MULTI_OUTLET—— 小米小愛
- BLINKER_MIOT_SENSOR —— 小米小愛
- BLINKER_DUEROS_LIGHT —— 百度小度
- BLINKER_DUEROS_OUTLET —— 百度小度
- BLINKER_DUEROS_MULTI_OUTLET —— 百度小度
- BLINKER_DUEROS_SENSOR —— 百度小度
- BLINKER_ALIGENIE_LIGHT —— 天貓精靈
- BLINKER_ALIGENIE_OUTLET —— 天貓精靈
- BLINKER_ALIGENIE_MULTI_OUTLET —— 天貓精靈
- BLINKER_ALIGENIE_SENSOR —— 天貓精靈
- 3.3 解讀原始碼細節
- 4、重新認識Blinker
- 4.1 使用Arduino & 藍牙接入
- 4.2 使用esp8266 & WiFi接入
- 4.3 使用esp32 & 藍牙接入
- 4.4 NB-IoT支持
授人以魚不如授人以漁,目的不是為了教會你具體專案開發,而是學會學習的能力,希望大家分享給你周邊需要的朋友或者同學,說不定大神成長之路有博哥的奠基石,,,
快速導航
- 單片機菜鳥的博客快速索引(快速找到你要的)
- 如何找到大部隊
重點說一下,麻煩三連點贊,你的點贊是博主創作的前進動力,
1、解讀起因
經常有粉絲朋友問我:
- 請問
Blinker怎么開發? Blinker的這個錯誤怎么解決?Blinker找不到庫怎么辦?- …

所以,我還是通讀了一下官方檔案 - 點燈科技Blinker
以及翻閱了一下 Arduino Blinker的原始碼庫(設備端)
- Arduino Blinker庫
以及可能以后會翻閱的app原始碼(暫沒看懂)
- Blinker App原始碼
首先宣告一下:
- 針對物件:
初學者 - 博主不會手把手教你如何寫Blinker的代碼,官方檔案其實已經講解非常詳細
- 我的目的:拋磚引玉,從更高的角度去
解讀Blinker,學習Blinker的設計思想,學習Blinker事半功倍,
2、解讀點
博主以我最熟悉的Arduino ESP8266開發作為一個全域引入點,帶領大家如何去解讀Blinker的核心思想,
至于Arduino ESP8266的開發知識,這里不做詳解,需要的同學麻煩去翻閱博主的8266博客專欄:
- ESP8266 Arduino專欄
2.1 解讀硬性要求
必須下載Blinker Arduino庫的原始碼,博主會加入不少注釋必須打開官方檔案(博主會時不時引入官方檔案鏈接)必須打開IDE去驗證代碼,保證精簡代碼不會報錯
3、解讀程序
下手細節包括幾個方面:
- Blinker的
產品理念 - Blinker的
組合套路 - Blinker的
實作細節
3.1 解讀理念
3.1.1 官方說明
blinker是一個物聯網接入方案,旨在讓大家可以輕松暢快地DIY物聯網設備,
- 其由服務器端、app端、設備端組成,可以部署到幾乎所有物聯網平臺,
- app端支持ios、android
- 設備端可以使用
藍牙、WiFi、NBiot/GPRS,可以應對大多數物聯網場景需求, - 通過界面布局器,用戶可自己拖拽布局設備控制界面,自由打造你的物聯網設備

而從我去閱讀官方檔案以及庫原始碼,我感覺最驚艷的一點就是:
- 開發人員幫我們在底層對接了諸多硬體的代碼實作,初學者只需要根據繼續的需要引入對應的模塊,然后呼叫一下Blinker的一些簡單方法,便可實作以前需要寫一大堆代碼去實作的功能(說白了就是人家底層幫我們包裝了一層,我們只需要簡單對接api即可,提高了初學者的成就感),
這里博主也簡單畫了一個圖,讓初學者能夠簡單理解一下:
-
普通開發模式:

這里分為底層核心庫以及用戶層代碼,用戶層代碼,初學者需要不斷針對性去對接底層核心庫(基礎代碼),同時還需要關注業務代碼的撰寫,對于初學者來說,還是比較吃力的, -
Blinker開發模式

在原來基礎上,Blinker封裝了硬體細節,統一對外呼叫暴露的呼叫方法都叫Blinker(Blinker可能指8266、esp32、ble藍牙等等,認真看,后面從原始碼層面去講解為何能做到這點),初學者只需要根據它提供的api去開發,便可快速上手物聯網接入,
3.2 解讀組合方式
在上面我們說了,在Blinker中任意的開發流程都以Blinker作為統一呼叫入口,那么初學者就會有一個疑問?
Blinker層是如何感知我是藍牙還是WiFi又或者其他設備呢?
Blinker雖然為我們封裝了很多技術細節,但是它肯定無法自動感知我們想要做什么,
作為開發者必須顯式明確地告訴它我們的硬體開發方式以及需要的模塊功能,
因此,Blinker提出的解決方案是
通過具體的編譯宏定義來告訴Blinker應該集成哪些功能模塊,
在引入Blinker庫之前,預先進行宏定義,
舉個例子,當我們需要用到Ble開發的時候,使用到 宏定義 BLINKER_BLE
#define BLINKER_PRINT Serial
#define BLINKER_BLE
#include <Blinker.h>
// 新建組件物件
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按鍵即會執行該函式
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// 如果未系結的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// 初始化串口
Serial.begin(115200);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin();
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
可以看到兩句最重要的代碼:
// `首先`,在Blinker.h檔案引入之前,預先告訴Blinker我們需要用到Ble的功能
#define BLINKER_BLE
// `然后`,Blinker.h檔案就會根據具體的宏定義引入具體功能的頭檔案(這就是解讀Blinker的核心思路)
#include <Blinker.h>
- 所以到這一步,初學者應該意識到 任意的功能都不是憑空出現的,肯定有一定的前提條件,而
Blinker的前提條件就是它定義了一系列的功能宏定義,讀者可以根據自己的需求去研讀某一個方面,博主這里主要是以ESP8266為案例(思路一樣),
在Blinker中定義了一系列的宏定義,而且宏定義之間允許組合使用(但是組合也是有前提的,一般是以某一個宏定義為基準,然后在基準宏定義之上疊加其他功能,比如WiFi + SmartConfig)
那么,我們有必要去了解一下Blinker提供的宏定義(可能這里總結不全,但是核心思路就是這樣),這里博主做了一個簡單的腦圖:

那么,稍微簡單講解一下腦圖構成,
在Blinker中,從設備角度來看,分為兩大類:
-
基礎設備
包括我們常用的Ble模塊、ArduinoESP(8266/32)、ATESP(AT指令的通信方式(選學)) -
專屬設備
包括NBIOT、GPRS等等
基于我們所選擇的對接方式,我們需要宣告對應的宏定義,
這里涉及到了N個宏定義,博主做了幾個重要的顏色區分,
這里說明一下:
-
綠色
表示必選的,一般情況指的是通信方式或者專門的設備

-
橙色
目前特指 Arduino For ESP8266 或者 ESP32的開發方式,這個配置是通過IDE編譯選項中的目標板子去定義的,不需要我們在代碼中顯式宣告,

-
淺藍色
表示在必選功能之上附加功能,比如WiFi模式下的SmartConfig

注意名詞說明:
ArduinoESP,特指Arduino For ESP8266 or Arduino For ESP32
ArduinoOther,特指除ESP8266或者ESP32之外的其他Arduino板子,比如Mega等,
3.2.1 綠色 —— 必選宏
必選,不是說選擇所有,而是選擇其中之一,
BLINKER_BLE —— ble藍牙通信
- ble藍牙通信(
ESP32、Ble藍牙模塊) - 不支持藍牙2.0模塊(HC05 / HC06 / BT06 /JDY30)
BLINKER_WIFI、BLINKER_MQTT —— WiFi通信
- 兩者都統稱為 BLINKER_MQTT,也就是后續的專案直接使用 BLINKER_MQTT,廢棄BLINKER_WIFI宏吧
- Arduino For ESP8266 –
2.7.4或以上release版本的 ESP8266 package - Arduino For ESP32 –
1.0.4及以上版本的 ESP32 package - 對應開發檔案:https://diandeng.tech/doc/arduino-support
BLINKER_PRO —— 略
BLINKER_PRO_ESP、BLINKER_WIFI_AUTO—— 略
BLINKER_AT_MQTT—— AT開發方式
- https://diandeng.tech/doc/getting-start-wifi-at
- https://diandeng.tech/doc/at-mode-support
BLINKER_WIFI_GATEWAY
BLINKER_WIFI_SUBDEVICE
BLINKER_NBIOT_SIM7020
BLINKER_NBIOT_SIM7000
BLINKER_PRO_SIM7020
BLINKER_GPRS_AIR202
BLINKER_PRO_AIR202
BLINKER_LOWPOWER_AIR202
BLINKER_QRCODE_NBIOT_SIM7020
BLINKER_QRCODE_NBIOT_SIM7000
3.2.2 淺藍色—— 附加宏
記住,可選宏必須依賴于必選宏之上,
先有必選宏,再有附加宏,它們的依賴關系麻煩去查閱腦圖
BLINKER_APCONFIG —— webSocket 局域網配網
這里的AP配網并不是走webserver配網而是走websocket局域網配網方式,
BLINKER_ESP_SMARTCONFIG —— smartconfig配網
BLINKER_MIOT_LIGHT—— 小米小愛
BLINKER_MIOT_OUTLET—— 小米小愛
BLINKER_MIOT_MULTI_OUTLET—— 小米小愛
BLINKER_MIOT_SENSOR —— 小米小愛
BLINKER_DUEROS_LIGHT —— 百度小度
BLINKER_DUEROS_OUTLET —— 百度小度
BLINKER_DUEROS_MULTI_OUTLET —— 百度小度
BLINKER_DUEROS_SENSOR —— 百度小度
BLINKER_ALIGENIE_LIGHT —— 天貓精靈
BLINKER_ALIGENIE_OUTLET —— 天貓精靈
BLINKER_ALIGENIE_MULTI_OUTLET —— 天貓精靈
BLINKER_ALIGENIE_SENSOR —— 天貓精靈
3.3 解讀原始碼細節
建議讀者找一個代碼工具匯入Blinker庫,優先推薦VScode或者IntellJ

-
全域入口檔案
整個庫的入口檔案,在這里會匯入我們所需要的業務入口檔案(按需接入對應的硬體模塊) -
業務入口檔案
真正實作硬體模塊對接代碼的地方,
博主查閱了Blinker.h檔案,通過自己的理解以及官方檔案,給出以下原始碼決議,同時也希望讀者參考我上面提供的百度腦圖去閱讀,
/**
對應開發檔案: https://diandeng.tech/doc/arduino-support?keyword=BLINKER_PRO
目前Blinker設備包括兩大類:
- 普通設備(BLINKER_BLE 和 BLINKER_WIFI)
---- 初學者玩好
- 專屬設備 (PRO)
---- https://diandeng.tech/doc/prodevice
---- 專屬設備是開發者開發后,可用于生產銷售的設備(成熟產品,非個人DIY),初學者暫時不用考慮)
普通設備Blinker開發順序:
1、選擇通信接入方式
--- Bluetooth4.x (BLE)
--- WiFi
2、選擇該通信方式下的模塊
--- ESP8266、ESP32
專屬設備Blinker開發順序:
1、直接選擇對應的專屬宏
**/
#ifndef BLINKER_H
#define BLINKER_H
// BLINKER_BLE(ble藍牙通信)
// 注意點:
// --- 不支持藍牙2.0模塊(HC05 / HC06 / BT06 /JDY30)
#if defined(BLINKER_BLE)
// BLINKER_ALIGENIE_LIGHT
// BLINKER_ALIGENIE_OUTLET
// BLINKER_ALIGENIE_SWITCH
// BLINKER_ALIGENIE_SENSOR
// 屬于天貓精靈的專用宏,所以不要亂組合(https://diandeng.tech/doc/tmallgenie)
#if defined(BLINKER_ALIGENIE_LIGHT) || defined(BLINKER_ALIGENIE_OUTLET) || \
defined(BLINKER_ALIGENIE_SWITCH)|| defined(BLINKER_ALIGENIE_SENSOR)
#error This code is intended to run on the BLINKER_MQTT mode! Please check your mode setting.
#endif
// BLINKER_DUEROS_LIGHT
// BLINKER_DUEROS_OUTLET
// BLINKER_DUEROS_SWITCH
// BLINKER_DUEROS_SENSOR
// 屬于百度小度的專用宏,所以不要亂組合(https://diandeng.tech/doc/dueros)
#if defined(BLINKER_DUEROS_LIGHT) || defined(BLINKER_DUEROS_OUTLET) || \
defined(BLINKER_DUEROS_SWITCH)|| defined(BLINKER_DUEROS_SENSOR)
#error This code is intended to run on the BLINKER_MQTT mode! Please check your mode setting.
#endif
#if defined(ESP32)
// ESP32下的Ble功能模塊,會根據ArduinoIDE編譯選項的目標板子來選擇
#include "BlinkerESP32BLE.h"
BlinkerESP32BLE Blinker;
#else
// 普通Ble模塊
#include "BlinkerSerialBLE.h"
BlinkerSerialBLE Blinker;
#endif
// BLINKER_WIFI/BLINKER_MQTT(WiFi通信)
#elif defined(BLINKER_WIFI) || defined(BLINKER_MQTT)
// 這句話宏的意思就是兩者都統稱為 BLINKER_MQTT,也就是后續的專案直接使用 BLINKER_MQTT,廢棄BLINKER_WIFI宏吧,,,,,
#if defined(BLINKER_WIFI)
#undef BLINKER_WIFI
#define BLINKER_MQTT
#endif
#include "BlinkerAssistant.h"
// Arduino For ESP8266 -- 2.7.4 或以上release版本的 ESP8266 package
// Arduino For ESP32 -- 1.0.4 及以上版本的 ESP32 package
// 對應開發檔案:https://diandeng.tech/doc/arduino-support
#if (defined(ESP8266) || defined(ESP32)) && !defined(BLINKER_MQTT_AT)
#include "BlinkerESPMQTT.h"
BlinkerESPMQTT Blinker;
#else
#define BLINKER_ESP_AT
#define BLINKER_MQTT_AT
#undef BLINKER_MQTT
#include "BlinkerSerialESPMQTT.h"
BlinkerSerialESPMQTT Blinker;
#endif
// 專屬設備 初學者暫時不用考慮
#elif defined(BLINKER_PRO)
#if defined(BLINKER_ALIGENIE_LIGHT) || defined(BLINKER_ALIGENIE_OUTLET) || \
defined(BLINKER_ALIGENIE_SWITCH)|| defined(BLINKER_ALIGENIE_SENSOR)
#error This code is intended to run on the BLINKER_MQTT mode! Please check your mode setting.
#endif
#if defined(BLINKER_DUEROS_LIGHT) || defined(BLINKER_DUEROS_OUTLET) || \
defined(BLINKER_DUEROS_SWITCH)|| defined(BLINKER_DUEROS_SENSOR)
#error This code is intended to run on the BLINKER_MQTT mode! Please check your mode setting.
#endif
#define BLINKER_ALIGENIE
#define BLINKER_DUEROS
#ifndef BLINKER_ESP_SMARTCONFIG
#ifndef BLINKER_APCONFIG
#define BLINKER_ESP_SMARTCONFIG
#endif
#endif
#if defined(ESP8266) || defined(ESP32)
#include "BlinkerESPPRO.h"
BlinkerESPPRO Blinker;
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
// BLINKER_PRO_ESP / BLINKER_WIFI_AUTO (開啟smartconfig配網)
// 注意點:
// ----- 這兩個宏用于專屬設備
// ----- 這兩個宏專用于 ESP8266或者ESP32平臺
#elif defined(BLINKER_PRO_ESP) || defined(BLINKER_WIFI_AUTO)
#include "BlinkerAssistant.h"
// 如果宏定義為 BLINKER_WIFI_AUTO 追加 BLINKER_PRO_ESP宏定義
// 目的:復合配網模式
#if defined(BLINKER_WIFI_AUTO)
#define BLINKER_PRO_ESP
#endif
#if defined(ESP8266) || defined(ESP32)
#include "BlinkerESPPROESP.h"
BlinkerESPPROESP Blinker;
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
// AT For 8266
// 對應開發檔案:
// --- https://diandeng.tech/doc/getting-start-wifi-at
// --- https://diandeng.tech/doc/at-mode-support)
#elif defined(BLINKER_AT_MQTT)
#define BLINKER_ESP_AT
#if defined(ESP8266) || defined(ESP32)
#include "BlinkerESPMQTTAT.h"
BlinkerESPMQTTAT Blinker;
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
#elif defined(BLINKER_WIFI_GATEWAY)
#include "BlinkerAssistant.h"
#if defined(ESP8266) || defined(ESP32)
#include "BlinkerESPGateway.h"
BlinkerESPGateway Blinker;
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
#elif defined(BLINKER_WIFI_SUBDEVICE)
#include "BlinkerAssistant.h"
#if defined(ESP8266) || defined(ESP32)
#include "BlinkerESPSubDevice.h"
BlinkerESPSubDevice Blinker;
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
// 專屬設備:NBIoT AT模塊 NB73
#elif defined(BLINKER_NBIOT_WH)
#ifndef BLINKER_NB73_NBIOT
#define BLINKER_NB73_NBIOT
#endif
#include "BlinkerSerialWHNBIoT.h"
BlinkerSerialWHNBIoT Blinker;
// 專屬設備:NBIoT AT模塊 SIM7020C
#elif defined(BLINKER_NBIOT_SIM7020)
#include "BlinkerSerialSIMNBIoT.h"
BlinkerSerialSIMNBIoT Blinker;
// 專屬設備:NBIoT AT模塊 SIM7000
#elif defined(BLINKER_NBIOT_SIM7000)
#ifndef BLINKER_WITHOUT_SSL
#define BLINKER_WITHOUT_SSL
#endif
#include "BlinkerSerialSIM7000NBIoT.h"
BlinkerSerialSIM7000NBIoT Blinker;
// 專屬設備:SIM7020
#elif defined(BLINKER_PRO_SIM7020)
#include "BlinkerSIMPRO.h"
BlinkerSIMPRO Blinker;
// 專屬設備: GPRS AT模塊 AIR202
#elif defined(BLINKER_GPRS_AIR202)
#include "BlinkerSerialLUATGPRS.h"
BlinkerSerialLUATGPRS Blinker;
// 專屬設備
#elif defined(BLINKER_PRO_AIR202)
#include "BlinkerLUATPRO.h"
BlinkerLUATPRO Blinker;
// 專屬設備
#elif defined(BLINKER_LOWPOWER_AIR202)
#include "BlinkerLowPowerGPRS.h"
BlinkerLowPowerGPRS Blinker;
// 專屬設備
#elif defined(BLINKER_QRCODE_NBIOT_SIM7020)
#include "BlinkerQRCodeSIMNBIOT.h"
BlinkerQRCodeSerialSIMNBIoT Blinker;
// 專屬設備
#elif defined(BLINKER_QRCODE_NBIOT_SIM7000)
#ifndef BLINKER_WITHOUT_SSL
#define BLINKER_WITHOUT_SSL
#endif
#include "BlinkerQRCodeSIM7000NBIOT.h"
BlinkerQRCodeSerialSIM7000NBIoT Blinker;
//
#elif defined(BLINKER_HTTP)
#include "BlinkerESPHTTP.h"
BlinkerESPHTTP Blinker;
#else
#error Please set a mode BLINKER_BLE/BLINKER_WIFI/BLINKER_MQTT ! Please check your mode setting.
#endif
// 匯入組件庫
#include "BlinkerWidgets.h"
// ESP多任務(ESP8266/ESP32 中啟用多任務)
#if defined(BLINKER_ESP_TASK)
#if defined(ESP8266)
// 目前ESP8266多任務支持還有點問題, 暫不支持使用
#error ESP8266 TASK NOT SUPPORT!
// #if defined(ESP32)
#elif defined(ESP32)
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <Arduino.h>
// #if CONFIG_AUTOSTART_ARDUINO
#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif
void blinkerLoopTask(void *pvParameters)
{
for(;;) {
Blinker.run();
vTaskDelay(1);
}
}
extern "C" void BLINKER_TAST_INIT()
{
// initArduino();
// #if defined(BLINKER_MQTT)
// Blinker.beginMQTT();
// #endif
xTaskCreatePinnedToCore(blinkerLoopTask,
"blinkerLoopTask",
8192,
NULL,
3,
NULL,
ARDUINO_RUNNING_CORE);
}
// #endif
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
#endif
#ifndef LED_BUILTIN
#if defined(ESP8266) || defined(ESP32)
#define LED_BUILTIN 2
#else
#define LED_BUILTIN 13
#endif
#endif
#endif
對于初學者,我們一般更針對藍牙或者WiFi模塊,所以我們可以做兩方面的精簡:
- 剔除專屬設備依賴
- 剔除ESP多任務
這樣整個Blinker可以更加精簡為:
/**
對應開發檔案: https://diandeng.tech/doc/arduino-support?keyword=BLINKER_PRO
目前Blinker設備包括兩大類:
- 普通設備(BLINKER_BLE 和 BLINKER_WIFI)
---- 初學者玩好
- 專屬設備 (PRO)
---- https://diandeng.tech/doc/prodevice
---- 專屬設備是開發者開發后,可用于生產銷售的設備(成熟產品,非個人DIY),初學者暫時不用考慮)
普通設備Blinker開發順序:
1、選擇通信接入方式
--- Bluetooth4.x (BLE)
--- WiFi
2、選擇該通信方式下的模塊
--- ESP8266、ESP32
專屬設備Blinker開發順序:
1、直接選擇對應的專屬宏
**/
#ifndef BLINKER_H
#define BLINKER_H
// BLINKER_BLE(ble藍牙通信)
// 注意點:
// --- 不支持藍牙2.0模塊(HC05 / HC06 / BT06 /JDY30)
#if defined(BLINKER_BLE)
// BLINKER_ALIGENIE_LIGHT
// BLINKER_ALIGENIE_OUTLET
// BLINKER_ALIGENIE_SWITCH
// BLINKER_ALIGENIE_SENSOR
// 屬于天貓精靈的專用宏,所以不要亂組合(https://diandeng.tech/doc/tmallgenie)
#if defined(BLINKER_ALIGENIE_LIGHT) || defined(BLINKER_ALIGENIE_OUTLET) || \
defined(BLINKER_ALIGENIE_SWITCH)|| defined(BLINKER_ALIGENIE_SENSOR)
#error This code is intended to run on the BLINKER_MQTT mode! Please check your mode setting.
#endif
// BLINKER_DUEROS_LIGHT
// BLINKER_DUEROS_OUTLET
// BLINKER_DUEROS_SWITCH
// BLINKER_DUEROS_SENSOR
// 屬于百度小度的專用宏,所以不要亂組合(https://diandeng.tech/doc/dueros)
#if defined(BLINKER_DUEROS_LIGHT) || defined(BLINKER_DUEROS_OUTLET) || \
defined(BLINKER_DUEROS_SWITCH)|| defined(BLINKER_DUEROS_SENSOR)
#error This code is intended to run on the BLINKER_MQTT mode! Please check your mode setting.
#endif
#if defined(ESP32)
// ESP32下的Ble功能模塊,會根據ArduinoIDE編譯選項的目標板子來選擇
#include "BlinkerESP32BLE.h"
BlinkerESP32BLE Blinker;
#else
// 普通Ble模塊
#include "BlinkerSerialBLE.h"
BlinkerSerialBLE Blinker;
#endif
// BLINKER_WIFI/BLINKER_MQTT(WiFi通信)
#elif defined(BLINKER_WIFI) || defined(BLINKER_MQTT)
// 這句話宏的意思就是兩者都統稱為 BLINKER_MQTT,也就是后續的專案直接使用 BLINKER_MQTT,廢棄BLINKER_WIFI宏吧,,,,,
#if defined(BLINKER_WIFI)
#undef BLINKER_WIFI
#define BLINKER_MQTT
#endif
#include "BlinkerAssistant.h"
// Arduino For ESP8266 -- 2.7.4 或以上release版本的 ESP8266 package
// Arduino For ESP32 -- 1.0.4 及以上版本的 ESP32 package
// 對應開發檔案:https://diandeng.tech/doc/arduino-support
#if (defined(ESP8266) || defined(ESP32)) && !defined(BLINKER_MQTT_AT)
#include "BlinkerESPMQTT.h"
BlinkerESPMQTT Blinker;
#else
#define BLINKER_ESP_AT
#define BLINKER_MQTT_AT
#undef BLINKER_MQTT
#include "BlinkerSerialESPMQTT.h"
BlinkerSerialESPMQTT Blinker;
#endif
// AT For 8266
// 對應開發檔案:
// --- https://diandeng.tech/doc/getting-start-wifi-at
// --- https://diandeng.tech/doc/at-mode-support)
#elif defined(BLINKER_AT_MQTT)
#define BLINKER_ESP_AT
#if defined(ESP8266) || defined(ESP32)
#include "BlinkerESPMQTTAT.h"
BlinkerESPMQTTAT Blinker;
#else
#error This code is intended to run on the ESP8266/ESP32 platform! Please check your Tools->Board setting.
#endif
#elif defined(BLINKER_HTTP)
#include "BlinkerESPHTTP.h"
BlinkerESPHTTP Blinker;
#else
#error Please set a mode BLINKER_BLE/BLINKER_WIFI/BLINKER_MQTT ! Please check your mode setting.
#endif
// 匯入組件庫
#include "BlinkerWidgets.h"
// 定義點燈引腳
#ifndef LED_BUILTIN
#if defined(ESP8266) || defined(ESP32)
#define LED_BUILTIN 2
#else
#define LED_BUILTIN 13
#endif
#endif
#endif
那么肯定有疑問?
Blinker是如何和我們本地硬體互動在一起呢?說白了就是App如何和硬體打交道?
在Blinker.h檔案中,最后有一句非常重要的頭檔案引入:
// 匯入組件庫
#include "BlinkerWidgets.h"
這里就是引入了App與設備之間互動的關鍵點,
App作為可視化虛擬設備,而對應的物理硬體設備就是BlinkerWidget庫里面定義的組件,通過這些組件才能打通和App的視覺互動,
它們之間的關聯關鍵點就是name屬性,每個name屬性都需要是唯一的,然后在Blinker App也有一個對應name的控制元件與之關聯,

這里涵蓋了大多數的功能模塊,比如滑動條、顏色選擇器、開關、字串顯示等等,
具體每個控制元件支持的功能請查閱官方檔案,里面都寫得比較詳細,缺乏的檔案就可以直接看看原始碼去學習吧:
- https://diandeng.tech/doc/arduino-support
4、重新認識Blinker
從上面的講解來說,我們可以概括正常Blinker開發流程是這樣的:
-
第一步
選擇對應的通信方式或者直接選擇專屬設備 -
第二步(可選)
選擇對應通信方式下的附加技能 -
第三步
選擇對應的操作組件(widget)
4.1 使用Arduino & 藍牙接入
說明:https://diandeng.tech/doc/arduino-support
-
第一步
選擇BLINKER_BLE -
第二步 略
-
第三步 選擇
BlinkerButton和BlinkerNumber控制元件
代碼如下:
#define BLINKER_PRINT Serial
#define BLINKER_BLE
#include <Blinker.h>
// 新建組件物件
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按鍵即會執行該函式
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// 如果未系結的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// 初始化串口
Serial.begin(115200);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin();
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
4.2 使用esp8266 & WiFi接入
說明:https://diandeng.tech/doc/getting-start-8266
-
第一步
選擇BLINKER_WIFI -
第二步 略
-
第三步 選擇
BlinkerButton和BlinkerNumber控制元件
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
// 新建組件物件
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按鍵即會執行該函式
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// 如果未系結的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// 初始化串口
Serial.begin(115200);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
4.3 使用esp32 & 藍牙接入
說明:https://diandeng.tech/doc/arduino-support
-
第一步
選擇BLINKER_BLE -
第二步 略
-
第三步 選擇
BlinkerButton和BlinkerNumber控制元件
#define BLINKER_PRINT Serial
#define BLINKER_BLE
#include <Blinker.h>
// 新建組件物件
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按鍵即會執行該函式
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// 如果未系結的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// 初始化串口
Serial.begin(115200);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin();
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
4.4 NB-IoT支持
-
第一步
選擇BLINKER_NBIOT_SIM7020 -
第二步 略
-
第三步 選擇
BlinkerButton和BlinkerNumber控制元件
#define BLINKER_NBIOT_SIM7020
#include <Blinker.h>
char auth[] = "Your Device Secret Key";
// 新建組件物件
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按鍵即會執行該函式
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
// 如果未系結的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, D6, D7, 9600);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
CSDN認證博客專家
Java
ESP8266
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232518.html
標籤:其他
