最近要使用mqtt进行android设备和esp8266进行通信,出个教程怕自己忘记。
流程
1、在阿里云平台创建产品
2、在阿里云平台创建设备
3、esp8266发送数据至云平台——MQTT格式
4、Android获取云平台数据
5、esp8266和Android通过云平台进行通讯——云流转
1、在阿里云平台创建产品
第一步,点击创建产品
第二步,填写产品名称、点击自定义品类
填写”产品名称“并且修改为自定义品类后,点击确认即为创建成功。
随后出现的界面,点击“返回产品列表”。
注意:标准品类中有很多模板,很多都可以直接拿来用。
第三步,添加默认模块(如果选择标准品类,这个步骤可以跳过)
在产品界面点击“产品名称”或者点击“查看”,进入界面。
进入产品界面后,点击”功能定义“后,再点击”编辑草稿“。
点击”添加自定义功能“
”属性、服务、事件“功能类型三选一,随后输入功能名称、标识符、选择数据类型、选择读写类型即可完成最简单的自定义功能。填写完成后,点击”确定“即可。
在编辑草稿界面,默认模块显示了设备,说明添加成功。
接下来点击左下角的“发布上线”即可。
2、在阿里云平台创建设备
第一步,点击“添加设备”
第二步,添加设备
产品注意选择之前新建的test,设备名称注意填写英文的。
显示未激活,说明没有连接过任何设备
3、esp8266发送数据至云平台
关于passed的获取方法 mqtt工具
查看三元组数据
arduino代码示例:
//---------------------esp8266联网
#include <ESP8266WiFi.h>
const char* ssid = "*********"; //wifi名称
const char* password = "*********"; //wifi密码
//---------------------JS解析
#include <ArduinoJson.h>
StaticJsonDocument<200> jsonBuffer;
//---------------------阿里云部分
#include <PubSubClient.h>
//设备的三元组信息
#define PRODUCT_KEY "*********"
#define DEVICE_NAME "*********"
#define DEVICE_SECRET "*********"
#define REGION_ID "cn-shanghai"
//线上环境域名和端口号,无需修改
#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT 1883
#define CLIENT_ID "*********|securemode=3,signmethod=hmacsha1,timestamp=789|"
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
#define MQTT_PASSWD "*********"
#define ALINK_BODY_FORMAT "{\"id\":\"123456\",\"version\":\"1.0\",\"params\":%s,\"method\":\"thing.event.property.set\"}"
#define SET_TOPIC "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
unsigned long lastMs = 0;
WiFiClient espClient; //创建一个tcp client连接
PubSubClient client(espClient); //发送消息的对象
//---------------------
void WIFI_Connect();
void MQTT_Check_Connect();
void callback(char* topic, byte* payload, unsigned int length);
void setup() {
//-------------------------------------------设置串口
Serial.begin(115200);
//-------------------------------------------连接&初始化
WIFI_Connect();
SendMessage();
MQTT_Check_Connect();
}
void loop() {
if (millis() - lastMs >= 3000) {
lastMs = millis();
MQTT_Check_Connect();
//上报数据//
SendMessage();
//delay(5000);
}
client.loop();
}
//-------------------------------------------MQTT回调函数
void callback(char* topic, byte* payload, unsigned int length) {
if (strstr(topic, SET_TOPIC)) {
Serial.print("Message arrived [");
Serial.print(topic); // 打印主题信息
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // 打印主题内容
}
Serial.println();
// //-----------------------------------JS解析
// DeserializationError error = deserializeJson(jsonBuffer, payload);
// if (error) {
// Serial.print(F("deserializeJson() failed: "));
// Serial.println(error.f_str());
// return;
// }
// int LED_FLAG = jsonBuffer["params"][Ali_JSON];
// if (LED_FLAG) {
// digitalWrite(LED, LOW); // 亮灯
// } else {
// digitalWrite(LED, HIGH); // 熄灯
// }
}
}
//-------------------------------------------联网
void WIFI_Connect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println(" ");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println(" ");
Serial.print("WIFI连接成功,IP地址为:");
Serial.println(WiFi.localIP());
client.setServer(MQTT_SERVER, MQTT_PORT); //设置MQTT服务器
Serial.println("MQTT服务器设置成功");
client.setCallback(callback); //设置MQTT订阅回调函数
Serial.println("MQTT订阅设置成功");
}
//-------------------------------------------MQTT连接
void MQTT_Check_Connect() {
while (!client.connected()) {
client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD);
}
Serial.println("MQTT服务器连接中");
}
//-------------------------------------------获取MPU6050数据
void SendMessage() {
char param[32] = "";
char jsonBuf[128] = "";
sprintf(param, "{\"Brightness\":%s}","asdf123");
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
client.publish(PROP_POST, jsonBuf);
}
4、Android获取云平台数据
具体看其他文章Android接入阿里云
5、esp8266和Android通过云平台进行通讯
这部分使用消息转发功能,使用“云产品流转”功能,注意因为是两个设备消息流转,所以要创建两个设备。
流程:创建数据源-->创建数据目的-->创建解析器-->关联解析器
创建数据源
填写数据源名称。
编辑数据源,给数据源添加Topic。
创建数据目的
创建解析器
阿里云官方文档,记得启动触发器!