工作中如果产品在异地,会遇到无法实时获取数据的问题。
在一些特定设备中,有获取实时数据的需求,并自动报警等服务。
这两类需求的特点是:
1、目标明确
2、需长时间监控
3、数据实时监控和服务
4、数据存储和查看
很容易想到物联网模式来满足以上需求
1、数据从采集器-网关-服务器-数据库
2、客户端访问服务器获取数据库内的数据
3、服务器设置门限,根据数据对采集器做出相应调整:报警、开关等
适用于大部分长期监测的电子属性产品。
使用场景如批量老化监测、运行监测、无人值守运行等。
ESP32s及传感器。
暂无,采集设备直接接入阿里云目前来看并没有劣势。有明显缺点时再改进
阿里云
详细介绍请看官网:
https://help.aliyun.com/document_detail/125800.html
红线目前用到的部分
从注册到创建产品、功能定义、创建设备,这3项操作参考教程。
创建产品 https://help.aliyun.com/document_detail/73728.html?spm=a2c4g.11186623.6.571.134d6151QxieXC
创建设备 https://help.aliyun.com/document_detail/73729.html?spm=a2c4g.11186623.6.573.34d17b7bxnxTze
这部分网络资源很多,多点点会发现一些妙用,自己探索。
官网的教程如下:
https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11186623.2.13.1098102bCu4RjV#concept-d3l-fw3-p2b
这里123456耐心阅读教程填写即可,7需要运算工具,下载官方的工具算出一串大写十六进制密码。填入即可。若参数错误,可以查看Log标签页的提示。
2020-02-17更正:似乎教程中的Password生成小工具生成的密码有误。我转发一个可靠的。
链接:https://pan.baidu.com/s/1sGLjzK8u5J-G_szsHR_1_A
提取码:gi62
登录成功后,在Subscribe页面订阅我们的topic,
默认属性设置/sys/a1f6TiEmfUj/esp32001/thing/service/property/set
fx设置好后,我们登录阿里云,在在线调试中主动下发一条配置信息。
发送成功后,回到fx的Subscribe页面,可以见到已收到的消息,模仿其格式。
params之后的内容为必要的属性参数,后面我们增加参数可用同样的方式,先fx登录,订阅,再阿里云发布,就可以得到格式。
复制红括号内的信息至Publish页面,顺便改个值。填入订阅的topic:/sys/a1f6TiEmfUj/esp32001/thing/event/property/post,粘贴发送内容,点击publish,就模拟了一次硬件上传信息。
在阿里云设备中可以看到数据已刷新。
我们实现了信息上传,希望服务器来统一设置阈值和报警措施,如温度超过50就亮一颗LED灯。需要在场景联动中设置触发条件,和执行动作。可以参考教程。https://help.aliyun.com/document_detail/85231.html?spm=5176.11485173.0.0.242e59af5FJ8hG
这是一个温度5秒上传一次的demo,超过50都就亮灯。
硬件:esp32s
环境:arduino 1.8.10
库:PubSubClient.h (需要参数修改)
ArduinoJson.h (V5版)
WiFi.h 等
ArduinoJson.h (V5版)的解读可以参考
https://blog.csdn.net/weixin_30376083/article/details/96227469
#include <PubSubClient.h>
/* 依赖 PubSubClient 2.4.0 */
#include <ArduinoJson.h>
/* 依赖 ArduinoJson 5.13.4 */
#include <ETH.h>
#include <WiFi.h>
#include <WiFiAP.h>
#include <WiFiClient.h>
#include <WiFiGeneric.h>
#include <WiFiMulti.h>
#include <WiFiScan.h>
#include <WiFiServer.h>
#include <WiFiSTA.h>
#include <WiFiType.h>
#include <WiFiUdp.h>
#define LED_BUILTIN 2
/* 连接您的WIFI SSID和密码 */
#define WIFI_SSID "TP-LINK_3C89BC"//替换自己的WIFI
#define WIFI_PASSWD "12345678"//替换自己的WIFI
/* 设备证书信息*/
#define PRODUCT_KEY "a1f6TdEmfUj"
#define DEVICE_NAME "esp32001"
#define DEVICE_SECRET "emrzGojShykbth6fICoU01fTuYRtopex"
#define REGION_ID "cn-shanghai"
/* 线上环境域名和端口号,不需要改 */
#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT 1883
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
#define CLIENT_ID "B4E62DFB29AD|securemode=3,signmethod=hmacsha1|"
// 请使用以上说明中的加密工具或参见MQTT-TCP连接通信文档加密生成password。
// 加密明文是参数和对应的值(clientIdesp8266deviceName${deviceName}productKey${productKey}timestamp1234567890)按字典顺序拼接
// 密钥是设备的DeviceSecret
#define MQTT_PASSWD "8E7F4227E9FF4C23673A479C617047AB1DEAF3E3"
#define ALINK_BODY_FORMAT "{\"id\":\"laohuajia-001\",\"version\":\"1.0.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
unsigned long lastMs = 0;
int LEDsw = 1;
int wendu = 0;
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
payload[length] = '\0';
Serial.println((char *)payload);
StaticJsonBuffer<400> jsonBuffer1;
JsonObject& root1 = jsonBuffer1.parseObject((char *)payload);
if (!root1.success()) {
Serial.println("parseObject()1 failed");
Serial.println("END");
return;
}
const char* mmethod = root1["method"];
Serial.println(mmethod);
long mid = root1["id"];
Serial.println(mid);
String message = root1["params"];
Serial.println(message);
StaticJsonBuffer<400> jsonBuffer2;
JsonObject& root2 = jsonBuffer2.parseObject(message);
if (!root2.success()) {
Serial.println("parseObject()2 failed");
Serial.println("END");
return;
}
int mLightSwitch = root2["LightSwitch"];
Serial.println(mLightSwitch);
LEDsw = mLightSwitch;
}
void wifiInit()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("espClient [");
client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接WiFi之后,连接MQTT服务器 */
client.setCallback(callback);
}
void mqttCheckConnect()
{
while (!client.connected())
{
Serial.println("Connecting to MQTT Server ...");
if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
{
Serial.println("MQTT Connected!");
}
else
{
Serial.print("MQTT Connect err:");
Serial.println(client.state());
delay(5000);
}
}
}
void mqttIntervalPost()
{
char param[32];
char jsonBuf[128];
sprintf(param, "{\"CurrentTemperature\":%d}", wendu);
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
Serial.println(jsonBuf);
boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
Serial.print("publish:0=失败;1=成功 publish:");
Serial.println(d);
if (wendu<100){
wendu = wendu +5;
}
}
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
// pinMode(SENSOR_PIN, OUTPUT);
/* initialize serial for debugging */
Serial.begin(115200);
Serial.println("Start");
wifiInit();
}
// the loop function runs over and over again forever
void loop()
{
if (millis() - lastMs >= 5000)
{
lastMs = millis();
mqttCheckConnect();
/* 上报消息心跳周期 */
mqttIntervalPost();
}
client.loop();
if (LEDsw == 0) {
Serial.println("led_off");
Serial.println(LEDsw);
digitalWrite(LED_BUILTIN, LOW);
} else if (LEDsw == 1) {
Serial.println(LEDsw);
Serial.println("led_on");
digitalWrite(LED_BUILTIN, HIGH);
}
delay(5000);
}
将自己账户的参数和发送的信息写入文本中。剩下的就是数据利用,阿里云提供了大量范例