设备:esp32c3
IDE:Arduino
实验:
(1)获取网络时间,b站粉丝数和b站关注数,心知天气
ArduinoJson需要从库管理下载
#include "HTTPClient.h"
#include "WiFi.h"
#include "ArduinoJson.h"
char *ssid ="Redmi K40 Gaming";
char *pswd ="87654321";
/*
*获取b站粉丝数和关注up主数量
*https://api.bilibili.com/x/relation/stat?vmid=1387378819
*vmid为自己b站的uid
*返回
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 1387378819,
"following": 139,
"whisper": 0,
"black": 1,
"follower": 44
}
}
*/
void GetFollower_Following(void)
{
HTTPClient http;
http.begin("https://api.bilibili.com/x/relation/stat?vmid=1387378819");
int httpCode=http.GET();
DynamicJsonDocument doc(1024);
if(httpCode==200) //服务器响应成功
{
String payload=http.getString();
deserializeJson(doc,payload);
int follower=doc["data"]["follower"].as<int>();
int following=doc["data"]["following"].as<int>();
String uid=doc["data"]["mid"].as<String>();
Serial.println("用户: "+uid);
Serial.printf("粉丝数: %d\r\n",follower);
Serial.printf("关注up主数: %d\r\n",following);
}
http.end();
}
void ConnectWifi(void)
{
WiFi.mode(WIFI_MODE_STA);
WiFi.begin(ssid,pswd);
Serial.print("连接wifi中");
while(WiFi.status()!= WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.print("连接成功");
}
/*
*连接网络
*HTTP 状态码的英文为 HTTP Status Code
*200 - 请求成功
*301 - 资源(网页等)被永久转移到其它URL
*404 - 请求的资源(网页等)不存在
*500 - 内部服务器错误
*访问http://quan.suning.com/getSysTime.do
*返回:
{"sysTime2":"2024-04-09 13:56:34","sysTime1":"20240409135634"}
*/
void GetTime(void)
{
HTTPClient http;
http.begin("http://quan.suning.com/getSysTime.do");
int httpCode=http.GET();
DynamicJsonDocument doc(1024);
if(httpCode==200) //服务器响应成功
{
String payload=http.getString();
deserializeJson(doc,payload);
String time=doc["sysTime2"].as<String>();
Serial.println("当前时间:"); //带ln后缀的,打印后换行
Serial.println(time);
}
http.end();
}
/*
*获取心知天气数据
*访问:https://api.seniverse.com/v3/weather/now.json?key=自己的密钥&location=chongqing&language=zh-Hans&unit=c
*返回:
{
"results": [
{
"location": {
"id": "WM7B0X53DZW2",
"name": "重庆",
"country": "CN",
"path": "重庆,重庆,中国",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"now": {
"text": "阴",
"code": "9",
"temperature": "21"
},
"last_update": "2024-04-09T14:26:30+08:00"
}
]
}
*/
void Get_Weather(String city,String key)
{
HTTPClient http;
http.begin("https://api.seniverse.com/v3/weather/now.json?key="+key+"&location="+city+"&language=zh-Hans&unit=c");
int httpCode=http.GET();
DynamicJsonDocument doc(1024);
if(httpCode==200) //服务器响应成功
{
String payload=http.getString();
deserializeJson(doc,payload);
//results里面中是一个[]代表是数组,而且只有一个数组,即下标为0处中有location,now,last_update三个对象
String city=doc["results"][0]["location"]["name"].as<String>();
int temperature=doc["results"][0]["now"]["temperature"].as<int>();
String weather=doc["results"][0]["now"]["text"].as<String>();
Serial.println("所处城市: "+city); //带ln后缀的,打印后换行
Serial.println("天气状况: "+weather);
Serial.printf("气温: %d ℃",temperature);
}
http.end();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
ConnectWifi();
GetTime();
GetFollower_Following();
Get_Weather("chongqing","私钥");
}
void loop() {
// put your main code here, to run repeatedly:
}
(2)MQTT主题订阅发布
需要下载测试工具MQTTX (此时单片机已经下载程序运行)
#include <WiFi.h>
#include <PubSubClient.h>
#define LED 12
#define LED_CTRL 13
float shuifei=23.45;
float dianfei=33.71;
char *ssid="Redmi K40 Gaming";
char *pswd="87654321";
WiFiClient tcpclient;
PubSubClient mqttClient; //mqtt客户端对象
const char *mqtt_broker_address="broker.mqttdashboard.com"; //服务器地址
const uint16_t mqtt_broker_port=1883; //服务器端口号
const uint16_t mqtt_client_buff_size=4096; //客户端缓存大小(非必须)
String mqtt_client_id="esp32c3_client"; //客户端ID
const char *mqtt_topic_pub="esp32c3_publish_topic"; //发布的主题
const char *mqtt_topic_sub="esp32c3_subscrib_topic"; //订阅的主题
char str[256];
//回调函数
void mqtt_callback(char *topic,byte *payload,unsigned int length)
{
Serial.println("********************************begin**********************************");
Serial.printf("收到主题: %s ,消息长度:%d",topic,length);
//Serial.println(payload);
String msg="";
for(int i=0;i<length;i++)
{
msg +=(char)payload[i];
}
if(msg=="开灯") //找到开灯的消息
{
digitalWrite(LED_CTRL,HIGH);
Serial.println("开灯");
}
else if(msg=="关灯") //找到关灯的消息
{
digitalWrite(LED_CTRL,LOW);
Serial.println("关灯");
}
Serial.println("********************************end************************************");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED,OUTPUT);
pinMode(LED_CTRL,OUTPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pswd);
Serial.print("连接WIFI中");
while(WiFi.status()!=WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.printf("\r\n连接成功\r\n");
mqttClient.setClient(tcpclient);
mqttClient.setServer(mqtt_broker_address,mqtt_broker_port);
mqttClient.setBufferSize(mqtt_client_buff_size);
mqttClient.setCallback(mqtt_callback); //设置回调函数(接收到消息)
}
void loop() {
// put your main code here, to run repeatedly:
sprintf(str,"水费:%.2f,电费: %.2f",shuifei,dianfei);
if(!mqttClient.connected()) //如果断开连接
{
if(mqttClient.connect(mqtt_client_id.c_str())) //尝试连接服务器
{
Serial.println("成功连接服务器");
mqttClient.subscribe(mqtt_topic_sub); //订阅主题
}
}
else if(mqttClient.connected()) //如果连接正常 发布消息
{
mqttClient.publish(mqtt_topic_pub,str);
digitalWrite(LED,!digitalRead(LED));
}
mqttClient.loop(); //处理网络事件和调度回调,例如接收服务器发送的消息、发送未发送的消息等
delay(1000);
}