1.基础知识

sprintf()函数:将各种类型的数据构造成字符串类型。

int sprintf( char *buffer, const char *format [, argument] … );

除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。

1.格式化数字字符串

sprintf(s, "%d", 123); // 产生"123"

2.控制浮点数打印格式

1 2 3 sprintf(s, "%10.3f", 3.1415626);    // 产生:"     3.142″ sprintf(s, "%-10.3f", 3.1415626);   // 产生:"3.142     " sprintf(s, "%.3f", 3.1415626);      // 不指定总宽度,产生:"3.142"

3.连接字符串

1 2 3 char *who = "I"; char *whom = "52PHP"; sprintf(s, "%s love %s.", who, whom); // 产生:"I love 52PHP. "

4.打印地址信息

1 sprintf(s, "%p", &i);

5.返回值为字符串的长度

1 int len = sprintf(s, "%d", i);

strcpy()函数:将一个字符串复制到另一块空间地址中,‘\0’是停止拷贝的终止条件,同时也会将 '\0' 也复制到目标空间。

char* strcpy(char* destination,const char* source);

注意事项:源字符必须以‘\0’结束,目标空间必须足够大,以确保能放源字符串,目标空间必须可变。

2.ESP32通过MQTT上传温湿度数据至阿里云服务器

注意事项:上传的数据格式因为阿里云物模型上报规定需要加上params和method,还有上传的键值需要和设置的物模型的标识符一致。

eg:{"params":

{"Temp": %d ,

"Hum": %d ,

"Light": %d,

"Led":%d,

"Beep":%d},

"method": "thing.event.property.post"}

#include

#include

#include

#include

#include

#include

#define DHTPIN 2

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

// const char *ssid = "leisure";

// const char *password = "shadow27";

const char *ssid = "TP-LINK_9B47";

const char *password = "MengYun1006&";

const char *mqttServer = "iot-06z00formvsxwnm.mqtt.iothub.aliyuncs.com";

const char *mqttUserName = "device2&i3c6vjLss9C";

const char *mqttPwd = "27ae4ab21d99554afb9b02e224e1543eccdfa3400c378f01bdf43140ad5aae56";

const char *clientId = "i3c6vjLss9C.device2|securemode=2,signmethod=hmacsha256,timestamp=1672664951875|";

const char *subTopic = "/i3c6vjLss9C/device2/user/mytopic";

#define ALINK_BODY_FORMAT "{\"id\":\"device2\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"

#define ALINK_TOPIC_PROP_POST "/sys/i3c6vjLss9C/device2/thing/event/property/post" // 发布主题

unsigned long lastMS = 0;

WiFiClient esp32Client;

PubSubClient mqttClient(esp32Client);

void connectwifi()

{

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED)

{

vTaskDelay(500);

Serial.print(F("."));

}

Serial.println(F(""));

Serial.println(F("WiFi Connected!"));

Serial.println(F(""));

}

/*订阅主题*/

void subscribeTopic()

{

if (mqttClient.subscribe(subTopic))

{

Serial.print("Subscribed Topic: ");

Serial.println(subTopic);

}

else

{

Serial.print("Subscribe Fail...");

}

}

void connectMQTTServer()

{

while (!mqttClient.connected())

{

if (mqttClient.connect(clientId, mqttUserName, mqttPwd))

{

Serial.println(F("MQTT connected"));

subscribeTopic(); // 订阅指定主题

}

else

{

Serial.print("failed, rc=");

Serial.print(mqttClient.state());

Serial.println(" try again in 5 seconds");

vTaskDelay(5000);

}

}

}

/*subscribe call back*/

void receiveCallback(char *topic, byte *payload, unsigned int length)

{

Serial.print(F("Message arrived in topic: "));

Serial.println(topic);

Serial.print("Message:");

String data = "";

for (int i = 0; i < length; i++)

{

Serial.print((char)payload[i]);

data += (char)payload[i];

}

Serial.println("");

Serial.print("Message Length(Bytes) ");

Serial.println(length);

Serial.println();

Serial.println("-----------------------");

Serial.println(data);

/*JSON数据解析*/

StaticJsonDocument<32> doc;

DeserializationError error = deserializeJson(doc, data);

if (error)

{

Serial.print("deserializeJson() failed: ");

Serial.println(error.c_str());

return;

}

int msg = doc["msg"]; // 1

Serial.print("msg = ");

Serial.println(msg);

/*根据JSON信息执行相应的动作*/

switch (msg)

{

case 1:

Serial.println("LED_on");

break;

case 2:

Serial.println("LED_off");

break;

default:

break;

}

}

void pubMQTTmsg()

{

char param[32];

char jsonBuf[128];

float h = dht.readHumidity();

float t = dht.readTemperature();

sprintf(param, "{\"humi\":%2f}", h); // 换成对应的标识符

sprintf(jsonBuf, ALINK_BODY_FORMAT, param);

Serial.println(jsonBuf);

boolean b = mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);

if (b)

{

Serial.println("publish Humidity success");

}

else

{

Serial.println("publish Humidity fail");

}

sprintf(param, "{\"temp\":%2f}", t); // 换成对应的标识符

sprintf(jsonBuf, ALINK_BODY_FORMAT, param);

Serial.println(jsonBuf);

boolean c = mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);

if (c)

{

Serial.println("publish Humidity success");

}

else

{

Serial.println("publish Humidity fail");

}

}

void setup()

{

Serial.begin(115200);

connectwifi();

dht.begin();

mqttClient.setServer(mqttServer, 1883);

// mqttClient.setCallback(receiveCallback);

connectMQTTServer();

}

void loop()

{

if (!mqttClient.connected())

{

connectMQTTServer();

}

mqttClient.setCallback(receiveCallback);

if(millis()-lastMS>=1000){

lastMS = millis();

pubMQTTmsg();//上报信息

}

// 处理信息以及心跳

mqttClient.loop();

}

查看原文