【DigiKey&NXP】NXP FRDM-MCXA153开发板 智能农业传感器开发测评报告(二)

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());
}

}
系统测评及其总结请见下一帖子。