2.4 MQTT 数据上传实现
通过 ESP8266 的 AT 指令直接发送 MQTT 消息,核心代码如下:
// 全局宏定义(需根据云平台配置修改)
#define MQTT_SERVER “mqtt.aliyun.com” // 阿里云MQTT服务器地址
#define MQTT_PORT 1883 // MQTT端口(非加密)
#define MQTT_CLIENT_ID “你的客户端ID” // 云平台注册的客户端ID
#define MQTT_TOPIC “/agriculture/temperature” // 数据上传主题
// 1. 连接MQTT服务器
status_t MQTT_ConnectServer(void)
{
char cmd[256];
// 步骤1:配置MQTT用户信息(无密码则留空)
snprintf(cmd, sizeof(cmd), "AT+MQTTUSERCFG=0,1,\"%s\",\"\",\"\",0,0,\"\"\r\n", MQTT_CLIENT_ID);
if(ESP8266_SendATCommand(cmd, "OK", 2000) != kStatus_Success)
return kStatus_Fail;
// 步骤2:连接MQTT服务器(参数:0=客户端编号,1=clean session)
snprintf(cmd, sizeof(cmd), "AT+MQTTCONN=0,\"%s\",%d,1\r\n", MQTT_SERVER, MQTT_PORT);
if(ESP8266_SendATCommand(cmd, "OK", 5000) != kStatus_Success)
return kStatus_Fail;
PRINTF("MQTT connected successfully!\r\n");
return kStatus_Success;
}
// 2. 上传温度数据到云平台
status_t uploadTemperatureToCloud(double temperature)
{
char cmd[256];
char payload[64]; // 存储MQTT消息体(JSON格式)
// 步骤1:格式化温度数据为JSON(云平台通常要求JSON格式)
snprintf(payload, sizeof(payload), "{\"temperature\":%.2f,\"time\":%lu}", temperature, SDK_GetTickCount()/1000);
// 步骤2:发送MQTT消息(参数:0=客户端编号,0=QoS等级,0=不保留)
snprintf(cmd, sizeof(cmd), "AT+MQTTPUB=0,\"%s\",\"%s\",0,0\r\n", MQTT_TOPIC, payload);
if(ESP8266_SendATCommand(cmd, "OK", 3000) != kStatus_Success)
{
PRINTF("Failed to upload temperature data!\r\n");
return kStatus_Fail;
}
PRINTF("Temperature data uploaded: %s\r\n", payload);
return kStatus_Success;
}
2.5 系统初始化与主流程整合
将传感器、WiFi、MQTT 初始化逻辑整合,形成完整系统流程:
// 系统初始化(整合所有模块)
void System_Init(void)
{
BOARD_InitHardware();
PRINTF(“FRDM-MCXA153 Smart Agriculture Sensor\r\n”);
// 1. 初始化温度传感器
if(Init_TemperatureSensor() != kStatus_Success)
{
PRINTF("Temperature sensor init failed!\r\n");
while(1);
}
// 2. 初始化ESP8266并连接WiFi
if(ESP8266_Init() != kStatus_Success || ESP8266_ConnectWiFi() != kStatus_Success)
{
PRINTF("WiFi module init failed!\r\n");
while(1);
}
// 3. 连接MQTT服务器
if(MQTT_ConnectServer() != kStatus_Success)
{
PRINTF("MQTT server connect failed!\r\n");
while(1);
}
PRINTF("System init complete! Start data collection...\r\n");
}
// 主函数(系统入口)
int main(void)
{
status_t result = kStatus_Success;
double temperature;
// 执行系统初始化
System_Init();
// 主循环(持续采集与上传数据)
while (1)
{
// 读取温度数据
result = P3T1755_ReadTemperature(&p3t1755Handle, &temperature);
if (result != kStatus_Success)
{
PRINTF("\r\nTemperature read failed.\r\n");
}
else
{
PRINTF("\r\nCurrent Temperature: %.2f °C\r\n", temperature);
uploadTemperatureToCloud(temperature); // 上传数据
}
// 5秒采集一次(可根据需求调整)
SDK_DelayAtLeastUs(5000000, CLOCK_GetCoreSysClkFreq());
}
}
系统测评及其总结请见下一帖子。