天猫精灵实现MQTT控制esp32-s3点灯
这是一篇新手小白学习笔记........使用MQTT协议,网上搜索到的教程大多使用巴法云作为服务器来中转信号,由于巴法云于2024.12.31下线了对天猫精灵平台的支持,所以选择使用阿里云生活物联网平台进行开发
这是一篇新手小白学习笔记........
使用MQTT协议,网上搜索到的教程大多使用巴法云作为服务器来中转信号,由于巴法云于2024.12.31下线了对天猫精灵平台的支持,所以选择使用阿里云生活物联网平台(https://living.aliyun.com)进行开发.
MQTT协议目前的理解为:一个地址/位置,任何东西都能往里面放数据,可以读取数据,需要选择订阅服务端clientId(客户端ID)、username(用户名)、passwd(密码)mqttHostUrl(服务端)就代表你要对这些数据进行操作(读取/写入)
参考博主:曲线把天猫精灵的设备接入到HA里控制 - 『HomeAssistant』综合讨论区 - 『瀚思彼岸』» 智能家居技术论坛 - Powered by Discuz!
天猫精灵实现MQTT控制esp32-s3
以上是效果演示
接下来开始教程
第一步:打开阿里云生活物联网平台,新建项目,在项目内新建一个产品,类型选择灯(可以直接根据实际用途来选择)
内容按照图片里面的选,下面部分都是默认,主要就选择产品名称 , 所属品类 , 节点选择选网关 , 通讯方式选择蜂窝 , 芯片模组选择其他 , 数据格式 : ICA 标准数据格式 (Alink JSON)
使用 ID² 认证 : 否

第二步:点击人机交互,云智能APP,点击保存

第三步:基础配置看着选,这里主要是语音交互这里一定要点天猫精灵,否则无法连接!
品牌展示里面我是随便选的一个品牌,不知道有什么用

第四步:更多能力里面,自动化与定时,我是全选
第五步:点击设备调试

这是生成的设备标识符
目前的理解:设备标识符就是服务器随机生成的标识码,使用这个标识码连接,有点类似于打标签

第六步 :进入阿里云物联网平台(https://iot.console.aliyun.com)不要进错了,点击公共实例,就可以看到刚刚创建的设备,点进去

第七步 : 点击MQTT连接参数

第八步 : 手机应用市店下载云智能APP 然后回到人机交互页面,选择产品说明书,点击下载配网二维码,用云智能APP添加进去

第九步:在云智能APP中 点击个人中心 点击更多服务 点击天猫精灵 登录一下账号绑定
第八步,烧录程序
代码中的对应部分替换为自己的
订阅内容在这里找,set结尾的
使用vscode里面的PlayftormIO插件,Arduino进行编程
// //! ESP32天猫精灵点灯
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
// WiFi 网络信息
const char* ssid = "WiFi名称";
const char* password = "WiFi密码";
// 设备证书
const char* productKey = "productKey"; //阿里生活物联网平台里面复制
const char* deviceName = "deviceName"; //刚刚取的名字
const char* deviceSecret = "deviceSecret"; //设备密钥
// MQTT Broker 地址和端口
const char* mqttServer = "MQTT连接参数里面 , 结尾是.com的 , mqttHostUrl";
const int mqttPort = 1883;
// 这里需要根据阿里云的要求生成正确的用户名密码或签名以进行连接
String clientId = "MQTT连接参数里面 , clientId";
String userName = "MQTT连接参数里面 , userName";
String passWord = "MQTT连接参数里面 , passWord"; // 实际应用中需要计算签名
// 创建WiFi和MQTT客户端对象
WiFiClient wifiClient;
PubSubClient client(wifiClient);
const int ledPin = 4;
// 连接WiFi函数
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// 当与MQTT服务器建立连接后调用此函数
void callback(char* topic, byte* payload, unsigned int length) {
String json_11;
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
json_11 += (char)payload[i];
}
Serial.println();
// 使用DynamicJsonDocument解析JSON数据
DynamicJsonDocument doc(2048); // 根据你的JSON大小调整这个值
DeserializationError error = deserializeJson(doc, json_11);
if (!error) {
int powerstate = doc["params"]["powerstate"];
if(powerstate == 1){
digitalWrite(ledPin, HIGH); // 当powerstate为1时,LED亮起
} else {
digitalWrite(ledPin, LOW); // 否则,LED熄灭
}
} else {
Serial.println("Failed to parse JSON");
}
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
setup_wifi();
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
if (client.connect(clientId.c_str(), userName.c_str(), passWord.c_str())) {
Serial.println("Connected to MQTT broker");
// 订阅某个topic
client.subscribe(); //订阅内容可以在topic里面看到
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
} else {
client.loop();
}
}
烧录完成,喊"天猫精灵开灯"即可看到对应数据的改变
更多推荐




所有评论(0)