连接点灯科技云平台
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 用到设备和操作
- 视频在 App 点击“添加设备”→“独立设备”→“网络接入”,创建一台演示设备;可在设备详情或设备管理处查看并复制 Secret Key。原笔记误称“IP 值(p 值)”:Secret Key 不是 IP 地址,创建设备时获得的是身份验证用的密钥,板子的局域网 IP 要等联网后从串口读取。Blinker 添加设备说明
- 设备名称可改为视频里的“wifi监控避障小车”等便于辨认的名字;名称只影响列表显示,不能替代
auth密钥,也不决定视频流 URL。识别码、设备名称和密钥分别有不同用途,密钥不宜公开或复用视频中的演示值。 - 回到设备控制界面可以编辑布局、背景和组件。视频在电脑上镜像手机屏幕操作,真正运行界面的仍是 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 是否向该回调送入数据。BlinkerattachData、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地址
- 在视频组件
URL中输入串口给出的实际地址,例如课堂http://192.168.28.134/,按 App 界面确认;演示中画面出现后锁定组件布局,返回设备页可见“在线”,点设备后能看到监控画面,抬动摄像头可观察画面变化。原笔记“写入 IP 后必然出现监控画面”应理解为那次演示成功,不是对所有网络的保证。 - 分清两种故障:App 设备在线但视频黑屏,先用同一可达局域网内的浏览器试
http://板子IP/,检查摄像头排线/供电、是否选mjpg、URL 是否写对以及热点是否禁止设备互访;App 显示离线,先查 Wi-Fi、密钥和 MQTT 连接。原视频采用同一手机热点完成实验,私有地址192.168.x.x不能从任意外网直接访问;离开该局域网,即使 Blinker 的远程控制功能可用,本例的本地视频 URL 也不会自动变成远程监控。Blinker 网络接入说明、摄像头服务源码 - 这是无 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 的界面细节不一定一致,复现时以实际安装版本为准。