提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
随着人工智能的不断发展,物联网这门技术也越来越重要,很多人都开启了物联网学习,本文就介绍了物联网的基础内容。
一、三元组是什么?
“它是设备的钥匙。设备出厂的时候会将三元组信息放入设备中,在 MQTT 连接的时候通过三元组就可以与物联网平台进行连接、激活、鉴权
二、使用步骤
1.引入库
代码如下(示例):
#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include "PubSubClient.h"
#include "WiFi.h"
#include "Ticker.h"
2.读入数据
#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include "PubSubClient.h"
#include "WiFi.h"
#include "Ticker.h"
#define WIFI_SSID "naitekale" //wifi名
#define WIFI_PASSWD "naitekale3366" //wifi密码
#define PRODUCT_KEY "gul7nX3bSvX" //产品ID
#define DEVICE_NAME "RSJ202208041" //设备名
#define DEVICE_SECRET "c92d25160f2ef093b3570da55f8bf31b" //设备key
#define REGION_ID "cn-shanghai"
//设备下发命令的set主题
#define ALINK_TOPIC_PROP_SET "/sys/gul7nX3bSvX/RSJ202208041/thing/service/property/set"
//设备上传数据的post主题
#define ALINK_TOPIC_PROP_POST "/sys/gul7nX3bSvX/RSJ202208041/thing/service/property/set"
//设备post上传数据要用到一个json字符串, 这个是拼接postJson用到的一个字符串
#define ALINK_METHOD_PROP_POST "thing.event.property.post"
//这是post上传数据使用的模板
#define ALINK_BODY_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define LED_B 2 //定义LED灯的引脚
int postMsgId = 0; //记录已经post了多少条
Ticker tim1; //这个定时器是为了每5秒上传一次数据
/*------------------------------------------------------------------------------------------*/
WiFiClient espClient; //创建网络连接客户端
PubSubClient mqttClient(espClient); //通过网络客户端连接创建mqtt连接客户端
// 初始化 wifi 连接
void wifiInit(const char *ssid, const char *passphrase)
{
WiFi.mode(WIFI_STA); //WIFI模式
WiFi.begin(ssid, passphrase); //传入WIFI账户密码
while (WiFi.status() != WL_CONNECTED) //等待连接完成
{
delay(1000);
Serial.println("WiFi not Connect"); //等待连接
}
Serial.println("Wifi连接成功"); //WIFI连接成功
}
//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
while (!mqttClient.connected()) //再重连客户端
{
Serial.println("reconnect MQTT...");
bool connected=connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
if (connected)
{
Serial.println("connected");
}
else
{
Serial.println("failed");
Serial.println(mqttClient.state());
Serial.println("try again in 5 sec");
delay(5000);
}
}
}
// //mqtt发布post消息(上传数据)
// void mqttPublish()
// {
// if (mqttClient.connected())
// {
// //先拼接出json字符串
// char param[82];
// char jsonBuf[178];
// sprintf(param, "{\"CurrentHumidity\":%.1f,\"CurrentTemperature\":%.1f,\"ESPLight_Pin2\":%d}", 22.2, 35.5, digitalRead(LED_B)); //我们把要上传的数据写在param里
// postMsgId += 1;
// sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);
// //再从mqtt客户端中发布post消息
// if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf))
// {
// Serial.print("Post message to cloud: ");
// Serial.println(jsonBuf);
// }
// else
// {
// Serial.println("Publish message to cloud failed!");
// }
// }
// }
//收到set主题的命令下发时的回调函数,(接收命令)
void callback(char *topic, byte *payload, unsigned int length) //接收数据回调函数
{
if (strstr(topic, ALINK_TOPIC_PROP_SET))
//如果收到的主题里包含字符串ALINK_TOPIC_PROP_SET(也就是收到/sys/a17lGhkKwXs/esp32LightHome/thing/service/property/set主题)
{
Serial.println("收到下发的命令主题:");
Serial.println(topic);
Serial.println("下发的内容是:");
payload[length] = '\0'; //为payload添加一个结束附,防止Serial.println()读过了
Serial.println((char *)payload);
//接下来是收到的json字符串的解析
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, payload);
deserializeJson(doc, payload);
int type=doc[String("protocol_type")];
char *ssid = (char *)(doc["wifi_name"]).c_str(); //解析接收过来的密码
String sensor = doc["sensor"];
switch(type)
{
case 1:break;
case 2:break;
case 3:break;
case 4:break;
case 5:break;
case 6:break;
case 7:break;
case 8:
// String password = doc["wifi_password"]; //解析接收过来的密码
//wifiInit(ssid, password);
Serial.println("longzitianzuiqiang");break;
default:break;
}
//mqttPublish(); //由于将来做应用可能要获取灯的状态,所以在这里发布一下
}
}
void setup()
{
Serial.begin(115200);
wifiInit(WIFI_SSID, WIFI_PASSWD); //连接WIFI
bool connected=connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
if (connected)
{
Serial.println("MQTT服务器连接成功!");
};
mqttClient.setCallback(callback); //绑定收到set主题时的回调(命令下发回调)
//tim1.attach(5, mqttPublish); //启动每5秒发布一次消息
}
void loop()
{
//检测有没有断线
if (!WiFi.isConnected()) //先看WIFI是否还在连接
{
wifiInit(WIFI_SSID, WIFI_PASSWD);
}
else //如果WIFI连接了,
{
if (!mqttClient.connected()) //再看mqtt连接了没
{
Serial.println("mqtt disconnected!Try reconnect now...");
Serial.println(mqttClient.state());
clientReconnect();
}
}
//mqtt客户端监听
mqttClient.loop();
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了WIFI与阿里云数据传输的使用,而arduino提供了大量能使我们快速便捷地处理数据的函数和方法,可以直接调用。