连接点灯科技云平台

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

291.9.连接点灯科技云平台

#define BLINKER_WIFI                    // 选择 Blinker 的 Wi-Fi 接入方式。
#include <Blinker.h>                   // 引入 Blinker 库的接口,供下方业务代码调用。
#include "ESP32_CAM_SERVER.h"         // 引入示例配套的摄像头服务文件;其内部实现不在本节抄录。
char auth[] = "c56be051d11f";        // 视频演示设备的 Secret Key,实际使用须换成自己设备的密钥。
char ssid[] = "302";                  // 视频演示的 Wi-Fi 热点名称,实际使用须与自己的网络一致。
char pswd[] = "12345678";            // 视频演示的 Wi-Fi 热点密码,不是点灯账号密码。
bool setup_camera = false;           // 记录是否已执行摄像头初始化,初始值为“尚未执行”。
void dataRead(const String & data)   // 定义收到 App 数据时调用的回调函数,data 是收到的内容。
{                                    // 开始处理 App 发来的数据。
    BLINKER_LOG("Blinker readString: ", data); // 把收到的内容写入 Blinker 调试日志。
    Blinker.vibrate();               // 向 App 发送手机振动请求。
    uint32_t BlinkerTime = millis(); // 读取开发板从本次启动起经过的毫秒数。
    Blinker.print("millis", BlinkerTime); // 把该毫秒数按键名 millis 发送给 App。
}                                    // 结束 dataRead 回调函数。
void setup()                         // 定义上电或复位后执行一次的初始化函数。
{                                    // 开始初始化。
    Serial.begin(115200);            // 以 115200 波特率启用串口。
    BLINKER_DEBUG.stream(Serial);    // 让 Blinker 的调试输出使用这个串口。
    Blinker.begin(auth,ssid,pswd);   // 用设备密钥及热点名称、密码初始化 Blinker 连接。
    Blinker.attachData(dataRead);    // 注册收到 App 数据时要调用的回调函数。
}                                    // 结束初始化。
void loop()                          // 定义 Arduino 重复执行的主循环。
{                                    // 开始本轮循环。
    Blinker.run();                   // 维持 Blinker 通信并处理收到的数据。
    if (Blinker.connected() && !setup_camera) // 仅在连接已建立且摄像头尚未初始化时进入。
    {                                // 开始首次初始化摄像头的分支。
        setupCamera();               // 调用配套文件中的摄像头及本地视频流服务初始化。
        setup_camera = true;         // 标记已经执行过初始化,避免以后每轮重复执行。
        Blinker.printObject("video", "{\"str\":\"mjpg\",\"url\":\"http://"+ WiFi.localIP().toString() + "\"}"); // 向 App 发送 video 组件的 MJPG 类型与本机局域网 URL。
    }                                // 结束首次初始化分支。
}                                    // 结束本轮循环;随后再次进入 loop。

一、设计APP界面

本节延续上一节的 ESP32-CAM 摄像头实验,在视频所用的 Blinker(点灯科技)App 中添加设备、设计视频组件,并通过示例草图把板子接入点灯平台。上方是视频最终修改后的 Blinker_ESP32_CAM.ino 主草图:删除了示例原注释和视频中已删掉的板载 LED 语句,只对实际保留的每条代码逐行解释;未把 ESP32_CAM_SERVER.h 的摄像头驱动、HTTP 服务实现复制进来。示例的 Secret Key、热点名和密码均是视频公开展示的演示值,复制本笔记复现时应换为自己设备和网络的值,尤其不要把自己的真实密钥、密码提交到公开仓库。课堂 App 画面显示为 2.6.5 版,后续版本的按钮名称或路径可能变化。Blinker 官方摄像头示例

1.1 点灯科技介绍

Blinker 提供设备端库、手机 App 与设备管理服务;视频通过 App 的可视化编辑界面放置组件,而不是为手机另写一套原生 App。它支持多种开发板和接入方式,但仍须选与具体板子匹配的库、例程和硬件配置,不能把 ESP32-CAM 的摄像头例程直接用于任意开发板。ESP32-CAM 可用 Wi-Fi 接入;本例串口确实出现 MQTT Connected!,说明当时的设备与 MQTT 服务建立了连接,但视频图像本身不是经 MQTT 上传到云端再下载。视频组件访问的是 ESP32-CAM 在局域网内提供的 HTTP/MJPG 地址。平台通信与摄像头视频流是两条用途不同的路径,不能因为设备显示“在线”就推断手机在任何网络下都能看到局域网 IP 的画面。Blinker 官方设备支持、ESP32/Wi-Fi 教程、MQTT 接入说明、配套摄像头服务源码

1.1.1 代码示例
1.1.1.1 选择开发板
  • Arduino IDE 顶部选 AI Thinker ESP32-CAM,再选 USB 转串口器对应的 COM 口;“选择开发板”决定编译/上传目标,不是在 App 里挑一个同名图标。视频从 文件 → 示例 → 来自自定义库的示例 → Blinker → Blinker_ESP32_CAM 打开官方示例;库是课程前面已安装的 Blinker 库,若菜单没有该项,要先核对库是否安装成功、是否装在当前 IDE 能识别的位置。
  • 示例有 Blinker_ESP32_CAM.ino 和 ESP32_CAM_SERVER.h 两个标签。前者是本节讲解和修改的草图,后者提供 AI Thinker 摄像头引脚配置、初始化和流服务。#include "ESP32_CAM_SERVER.h" 只是引用配套文件,不表示应把这个头文件的实现粘贴到主草图。Blinker 官方示例目录
1.1.1.2 官方例程
  • 原笔记“官方历程”“ESP32K”应为官方例程和 ESP32-CAM。视频是在 Blinker_ESP32_CAM 例程上修改:写入设备 Secret Key、热点 SSID/密码,取消 BLINKER_ESP_SMARTCONFIG 使本课采用代码中直接给出 Wi-Fi 凭据的方式,删除无关的 LED_BUILTIN 配置,并把原 Blinker.begin(auth) 改为 Blinker.begin(auth,ssid,pswd)。代码仍由官方示例提供摄像头服务器、App 回调和视频组件 URL 的主要逻辑,并非从零编写整个工程。Blinker 官方示例、Wi-Fi 参数形式
  • **与第 290 节区别:**上节 CameraWebServer 先打开控制网页,再点 Start Stream;本节 Blinker 示例的配套文件把 GET / 直接接到 MJPEG 流处理器,HTTP 服务使用 80 端口。因此手机视频组件填 http://板子IP/,不应照搬上一节的控制网页或额外加 :81/stream。Blinker 摄像头服务源码
1.1.1.3 点灯科技云平台注册
  • 视频版本的 App 用手机号和验证码注册/登录;讲师已登录,所以只展示添加设备操作,没有演示收短信的全过程。手机号验证码用于用户账号登录,与设备 Secret Key、Wi-Fi 密码是三种不同凭据,不要互相填错。
  • 官方当前文档仍说明从 App 的“添加设备”入口申请设备 Secret Key,但页面名称/选项可能与视频版不同。遇到 UI 差异以正在使用的 App 和官方添加设备说明为准,不必死记视频截图的位置。
1.1.1.4 用到设备和操作
  1. 视频在 App 点击“添加设备”→“独立设备”→“网络接入”,创建一台演示设备;可在设备详情或设备管理处查看并复制 Secret Key。原笔记误称“IP 值(p 值)”:Secret Key 不是 IP 地址,创建设备时获得的是身份验证用的密钥,板子的局域网 IP 要等联网后从串口读取。Blinker 添加设备说明
  2. 设备名称可改为视频里的“wifi监控避障小车”等便于辨认的名字;名称只影响列表显示,不能替代 auth 密钥,也不决定视频流 URL。识别码、设备名称和密钥分别有不同用途,密钥不宜公开或复用视频中的演示值。
  3. 回到设备控制界面可以编辑布局、背景和组件。视频在电脑上镜像手机屏幕操作,真正运行界面的仍是 Blinker App;视频里 App 能显示画面,还依赖手机对板子局域网地址的可达性。
1.1.1.5 写代码
  • 1.1.1.5.1 输入密钥:auth 填这台设备的 Secret Key。此值让 Blinker 确认设备身份,不是网页地址、热点密码或用户登录验证码。视频填写后将 BLINKER_ESP_SMARTCONFIG 那行禁用,因为本次直接给出 SSID/密码;精校代码去掉原注释后未保留这条失效的宏定义。Blinker ESP32/Wi-Fi 教程
  • 1.1.1.5.2 写入账号和密码:ssid 是板子要连的热点名称,pswd 是该热点密码,视频分别填 302、12345678。它们应与实际手机热点一致;ESP32 需使用可接入的 2.4 GHz Wi-Fi。Blinker.begin(auth,ssid,pswd) 同时接收设备密钥和网络凭据,所以仅填 auth 并不能按视频这种接入方式连上指定热点。原笔记“第 76 行粘贴账号密码”只适用于视频旧版的某个行号,找变量名和函数调用更可靠。Blinker 官方教程
  • 1.1.1.5.3 代码每一行的意义:BLINKER_WIFI 选择 Wi-Fi 接入;两个 #include 分别提供 Blinker 接口和摄像头服务。setup_camera=false 是“尚未调用 setupCamera()”的软件标志,不是证明摄像头传感器已断电。dataRead 是收到 App 数据时的回调:BLINKER_LOG 打印收到的内容,Blinker.vibrate() 请求手机振动,millis() 取本次开机后的毫秒数,Blinker.print("millis", BlinkerTime) 把它发回 App。这里的 millis() 不是设置心跳包发送间隔,视频“定时/心跳包时间”的口述与实际代码不符;也不能说每次按任意按钮都会触发振动,取决于 App 是否向该回调送入数据。Blinker attachData、print、心跳说明
  • setup() 中 Serial.begin(115200) 设置串口速率,BLINKER_DEBUG.stream(Serial) 让 Blinker 调试信息走同一个串口;原笔记“点灯科技串口第八口”是转录错误,不是第 8 个硬件串口。视频把原例程中 LED_BUILTIN 的两条示例语句删掉,说明本节不做灯控制,不应把它们抄进最终代码。Blinker.attachData(dataRead) 把函数名与回调绑定,改名时定义与注册两处须保持一致。Blinker 调试与回调接口
  • loop() 中必须反复执行 Blinker.run() 来处理通信;Blinker.connected() && !setup_camera 表示 Blinker 连接已建立且尚未执行过摄像头初始化,不是笼统地“判断 ESP32 是否正常执行”。首次满足条件时调用 setupCamera()、设标志为 true,再用 Blinker.printObject("video",...) 把 mjpg 类型和由 WiFi.localIP() 拼成的 URL 作为视频组件信息发送;它发送的是配置文字,不是把每一帧图像经 MQTT 传到云端。即使函数已调用,也仍需检查摄像头初始化是否有报错、手机能否访问 URL;代码没有进一步确认服务启动成功。Blinker 官方示例、摄像头服务源码
1.1.1.6 下载并编译代码
  • 先核对板型、端口和供电,再按前几节 ESP32-CAM 的方式接好 USB 转串口烧录线。需手动下载模式的板子在复位时让 GPIO0/IO0 接地,然后点击 IDE 上传;看到上传完成再移除 IO0—GND 下载跳线并复位,使程序正常启动。视频说“拔掉下载线”,实际不应把维持供电和串口日志的全部导线拔掉,否则后面无法继续用串口读 IP。Espressif ESP32 启动模式说明
  • 编译/上传摄像头与联网示例可能要等待;App 布局可在等待时先编辑,但是否连接成功只能在烧录、复位、联网后验证。视频一度重按复位、重新打开串口,这只是处理当时连接状态;遇到串口无输出,应先区分端口未选、波特率不一致、IO0 仍接地、供电或接线问题,不应直接归因于“串口接触不良”。
1.1.1.7 添加点灯科技云平台组件
  • 视频在设备界面选择壁纸,再从底部组件栏加入视频组件,打开配置页,勾选 mjpg 而非 hls;可设置组件背景为正常、半透明或透明。壁纸/组件背景是 UI 外观设置,不等于摄像头画面真的具有透明通道。
  • 视频组件的 URL 是视频流的网络地址。视频版配套头文件在板子 80 端口的根路径 / 提供 MJPEG,所以示例格式为 http://192.168.28.134/:http 后是英文冒号和两条正斜杠 //,IP 各段用英文句点 . 分隔。转录把 // 说成“两个下滑线”,容易误写成下划线 __;也不要使用 https://,这份示例未设置 HTTPS。192.168.28.134 只是视频演示时分配的地址,不能固定用于自己的板子。Blinker 示例 HTTP 路由与 MJPEG 响应
  • 视频还在代码中使用 Blinker.printObject("video",...) 发送视频组件的格式和本机 URL,随后又在 App 编辑页手动填写 URL;两种操作都在课堂出现,但它们只是向组件提供地址,视频帧由 App 按地址直接从 ESP32-CAM 的 HTTP 服务读取,不是存到点灯云后再播放。此视频组件能否跨网络访问取决于这个本地 URL 能否从手机到达,设备在线并不自动提供公网视频转发。
1.1.1.8 打开串口
  • 上传完成、退出下载模式并复位后,在 Arduino IDE 打开串口监视器,波特率设为 115200。视频在串口出现 WiFi Connected.、IP Address:、192.168.28.134,并有 Connecting to MQTT...、MQTT Connected! 等日志。前者说明 Wi-Fi 已连接并获得局域网 IP,后者才说明 MQTT 已连上;串口启动日志、联网状态和摄像头视频是否可看是不同检查点。Blinker 官方 ESP32 教程
  • 视频按回车、复位以刷新演示画面;回车不是获取 IP 的必要指令,IP 是设备启动联网后输出的。每次更换热点或重新联网都应读自己的实际 IP。若始终没有 IP,优先查 SSID/密码、热点 2.4 GHz、供电;若有 IP 但无 MQTT Connected!,再查设备密钥、热点上网能力和平台连接。
1.1.1.9 写入IP地址
  1. 在视频组件 URL 中输入串口给出的实际地址,例如课堂 http://192.168.28.134/,按 App 界面确认;演示中画面出现后锁定组件布局,返回设备页可见“在线”,点设备后能看到监控画面,抬动摄像头可观察画面变化。原笔记“写入 IP 后必然出现监控画面”应理解为那次演示成功,不是对所有网络的保证。
  2. 分清两种故障:App 设备在线但视频黑屏,先用同一可达局域网内的浏览器试 http://板子IP/,检查摄像头排线/供电、是否选 mjpg、URL 是否写对以及热点是否禁止设备互访;App 显示离线,先查 Wi-Fi、密钥和 MQTT 连接。原视频采用同一手机热点完成实验,私有地址 192.168.x.x 不能从任意外网直接访问;离开该局域网,即使 Blinker 的远程控制功能可用,本例的本地视频 URL 也不会自动变成远程监控。Blinker 网络接入说明、摄像头服务源码
  3. 这是无 HTTPS 的教学示例,视频流服务源码也没有为根路径另设网页登录验证。仅在可信网络中演示,妥善保管并定期更换自己的设备 Secret Key 和热点密码;不要直接把摄像头 HTTP 端口映射到公网。原笔记的“成功利用云平台显示画面”可保留为App 界面集成显示的结果,不能据此说云平台实际托管或存储了视频。Blinker 摄像头示例服务实现

核对依据

  • 本地 videos/291.9.连接点灯科技云平台.mp4 中的 App 2.6.5 操作、Arduino IDE 最终草图、串口日志和视频组件演示;结合 transcripts/291.9.连接点灯科技云平台.txt、原始 notes/md/291.9.连接点灯科技云平台.md。代码以视频最终状态为准。
  • 课程配套压缩包 源码/7、项目3、项目4资料/项目3:基于ESP32的物联网WIFI小车.zip 内的 Arduino需要的库文件/blinker-library-dev_3.0(1).zip,其中 examples/Blinker_ESP32_CAM/Blinker_ESP32_CAM.ino 与 ESP32_CAM_SERVER.h 用于核对示例原始代码及本地流服务路由;没有把 ESP32_CAM_SERVER.h 内容误当课堂自写业务代码。
  • Blinker 官方摄像头示例、视频流服务源码、ESP32/Wi-Fi 教程、Arduino 支持库接口、Espressif GPIO0 启动模式说明:交叉核对密钥/联网、回调与 millis()、根路径 MJPEG 和烧录模式。当前官方文档与视频所用旧版 App 的界面细节不一定一致,复现时以实际安装版本为准。