马上就到RA4M2开发板评测的结尾了,今天给瑞萨论坛线上最具创意的一篇帖子,通过RA4M2开发板,和ESP8266 WIFI模块,然后通过手机上的MQTTOOL来实现手机控制RA4M2远程点灯,即使人远在千里之外的异国他乡,在ESP8266接入互联网的条件下,都可以远程点灯,不限制距离和IP地址,云服务器确实是个好东西呀!
在这个万物互联的时代,互联网正在我们的日常生活中越来越扮演者重要的角色,包括最近大火的DeepSeek都离不开物联网云服务器,现在的智能家居控制系统也越来越普及了,楼宇监控上面都应用到了云端设备,可以远程拍照监控家庭情况,在遭遇偷盗情况后,能远程记录下犯人的人脸特征,方便刑事勘察,非常的智能化!
基于这样一个便捷的生活目的,我特地使用瑞萨的RA4M2开发板来做一个基于ESP8266 MQTT协议的IOT远程控制设备,它可以配合板子上搭载的传感器,比如温度,湿度,加速度计等,如果板子配备LCD屏或者断码屏,还可以做成基于DLT645-2007的远程电表抄录系统,在三相电表内部搭载个wifi模块,工作人员就可以实现远程抄表功能,无需工作人员去住户小区去抄表,节省了人力物力和时间!
好了,话不多说了,开始上干货!
板子实物连接如下图所示:

图中红色圈是ESP8266

整个软件结构图如下:

使用到了连个串口,uart0和uart9


根据原理图进行配置,打开RAsmart配置工具,过程就不讲了,只讲重点


生成KEIL工程后打开

核心代码如下:
#include "esp8266.h"
static volatile bool uart_send_complete_flag = false;
uint8_t esp8266_buf[RXBUFFLENGTH];
uint16_t esp8266_cnt = 0;
uint16_t esp8266_cntPre = 0;
char tx_buffer[150];
void UART0_Init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open(&g_uart0_ctrl,&g_uart0_cfg);
assert(err == FSP_SUCCESS);
}
void WIFI_Send_Byte(uint8_t ch)
{
/* ����һ���ֽ����ݵ�UART */
R_SCI_UART_Write(g_uart0.p_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
}
void WIFI_Send_Bytes(uint8_t data, uint32_t len)
{
/ ����һ���ֽ����ݵ�UART */
R_SCI_UART_Write(g_uart0.p_ctrl, data, len);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
}
void WIFI_Send_String_Length(uint8_t str,uint32_t strlen)
{
unsigned int k=0;
do
{
WIFI_Send_Byte ((str + k));
k++;
} while(k < strlen);
}
void WIFI_Send_String(uint8_t str)
{
unsigned int k=0;
do
{
WIFI_Send_Byte ((str + k));
k++;
} while(*(str + k)!='\0');
}
void ESP8266_Clear(void)
{
memset(esp8266_buf, 0, sizeof(esp8266_buf));
esp8266_cnt = 0;
}
uint8_t ESP8266_WaitRecive(void)
{
if(esp8266_cnt == 0)
return REV_WAIT;
if(esp8266_cnt == esp8266_cntPre)
{
esp8266_cnt = 0;
return REV_OK;
}
esp8266_cntPre = esp8266_cnt;
return REV_WAIT;
}
//==========================================================
// �������ƣ� ESP8266_SendCmd
//
// �������ܣ� ��������
//
// ��ڲ����� cmd������
// res����Ҫ���ķ���ָ��
//
// ���ز����� 0-�ɹ� 1-ʧ��
//
// ˵����
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 200;
WIFI_Send_Bytes((uint8_t *)cmd, strlen((uint8_t *)cmd));
while(timeOut--)
{
if(ESP8266_WaitRecive() == REV_OK)
{
if(strstr((const char *)esp8266_buf, res) != NULL)
{
printf("%s\r\n",esp8266_buf);
ESP8266_Clear();
return 0;
}
}
delay_ms(10);
}
return 1;
}
//==========================================================
// �������ƣ� ESP8266_SendData
//
// �������ܣ� ��������
//
// ��ڲ����� data������
// len������
//
// ���ز����� ��
//
// ˵����
//==========================================================
void ESP8266_SendData(uint8_t*data, uint32_t len)
{
char cmdBuf[32];
ESP8266_Clear();
sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);
if(!ESP8266_SendCmd(cmdBuf, ">"))
{
WIFI_Send_Bytes(data, len);
}
}
//==========================================================
// �������ƣ� ESP8266_GetIPD
//
// �������ܣ� ��ȡƽ̨���ص�����
//
// ��ڲ����� �ȴ���ʱ��(����10ms)
//
// ���ز����� ƽ̨���ص�ԭʼ����
//
// ˵���� ��ͬ�����豸���صĸ�ʽ��ͬ����Ҫȥ����
// ��ESP8266�ķ��ظ�ʽΪ "+IPD,x:yyy" x�������ݳ��ȣ�yyy����������
//==========================================================
uint8_t *ESP8266_GetIPD(uint16_t timeOut)
{
char *ptrIPD = NULL;
do
{
if(ESP8266_WaitRecive() == REV_OK)
{
ptrIPD = strstr((char *)esp8266_buf, "IPD,");
if(ptrIPD == NULL)
{
}
else
{
ptrIPD = strchr(ptrIPD, ':');
if(ptrIPD != NULL)
{
ptrIPD++;
return (unsigned char *)(ptrIPD);
}
else
return NULL;
}
}
delay_ms(5);
} while(timeOut--);
return NULL;
}
//==========================================================
// �������ƣ� ESP8266_Init
//
// �������ܣ� ��ʼ��ESP8266
//
// ��ڲ����� ��
//
// ���ز����� ��
//
// ˵����
//==========================================================
void ESP8266_Init(void)
{
#define WIFI_SSID "CMCC-c2H2" // WIFI������ ������2.4G��wifi������5G�ģ��Ҳ��������ġ��ո�
#define WIFI_PSWD "62x9wttb" // WIFI����
#define SERVER_HOST "broker.emqx.io" // MQTT������������IP
#define SERVER_PORT "1883" // MQTT�������˿ڣ�һ��Ϊ1883���øģ�
#define ESP8266_WIFI_INFO "AT+CWJAP="" WIFI_SSID "","" WIFI_PSWD ""\r\n"
#define ESP8266_ONENET_INFO "AT+CIPSTART="TCP","" SERVER_HOST ""," SERVER_PORT "\r\n"
//GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET)
//DelayXms(250)
//GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET)
//DelayXms(500)
ESP8266_Clear()
ESP8266_SendCmd("AT+RST\r\n", "")
delay_ms(1200)
while(ESP8266_SendCmd("AT\r\n", "OK"))
delay_ms(500)
/*
ESP8266_SendCmd("AT+CIPCLOSE\r\n", "");
delay_ms(500);
*/
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_ms(500)
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
delay_ms(500)
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_ms(500)
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
delay_ms(500)
printf("ESP8266 Initialization [OK]\r\n")
}
void Wifi_connect(char *SSID, char *Password)
{
uint8_t err = 0;
ESP8266_SendCmd("AT+CWQAP\r\n", "OK");
delay_ms(1500);
sprintf(tx_buffer, "AT+CWJAP=\"%s\",\"%s\"\r\n", SSID, Password);
ESP8266_SendCmd(tx_buffer,"OK");
}
void MQTT_Connect(char *ip,char *port)
{
sprintf(tx_buffer,"AT+MQTTUSERCFG=0,1,"1","1","1",0,0,""\r\n");
ESP8266_SendCmd(tx_buffer,"OK");
sprintf(tx_buffer,"AT+MQTTCONN=0,\"%s\",%s,0\r\n",ip,port);
ESP8266_SendCmd(tx_buffer,"OK");
}
/*******************************************************
������:void MQTT_Subscribe(char *tipname)
����:����MQTT����
����:
@tipname:������
*******************************************************/
void MQTT_Subscribe(char *tipname)
{
sprintf(tx_buffer,"AT+MQTTSUB=0,"%s",0\r\n",tipname);
ESP8266_SendCmd(tx_buffer,"OK");
}
void MQTT_Publish(char *topicName,char *message)
{
sprintf(tx_buffer,"AT+MQTTPUB=0,"%s","%s",0,0\r\n",topicName,message);
ESP8266_SendCmd(tx_buffer,"OK");
}
void Read_Message(char message)
{
char buff = esp8266_buf;
/----------- �������� ---------------/
if(strstr(buff,"+MQTTSUBRECV:0") == NULL) return ;
buff = strstr(buff,"",")+2;
buff = strstr(buff,",")+1;
strcpy(message,buff);
printf("�յ���������: %s\r\n",message);
}
void esp8266_wifi (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
if(p_args->event == UART_EVENT_RX_CHAR)
{
if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0; //��ֹ���ڱ�ˢ��
esp8266_buf[esp8266_cnt++] = (uint8_t)p_args->data;
}
}
#if 0
/* �ض��� printf ��� */
#if defined GNUC && !defined clang
int _write(int fd, char *pBuffer, int size); //��ֹ���뾯��
int _write(int fd, char *pBuffer, int size)
{
(void)fd;
R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return size;
}
#else
int fputc(int ch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
while(uart_send_complete_flag == false);
uart_send_complete_flag = false;
return ch;
}
#endif
#endif



#include "esp8266.h"
#include "onenet.h"
#include "mqttkit.h"
#include <string.h>
#include <stdio.h>
#include "cJSON.h"
#define PROID "stm32+8266"
#define AUTH_INFO "stm32+8266"
#define DEVID "stm32+8266"
//extern unsigned char esp8266_buf[128];
extern uint8_t alarmFlag;//是否报警的标志
extern uint8_t alarm_is_free;
//==========================================================
// 函数名称: OneNet_DevLink
//
// 函数功能: 与onenet创建连接
//
// 入口参数: 无
//
// 返回参数: 1-成功 0-失败
//
// 说明: 与onenet平台建立连接
//==========================================================
_Bool OneNet_DevLink(void)
{
char ProductID[64];
char Auth_Info[64];
char DeviceID[64];
uint32_t MCU_ID;
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};
unsigned char *dataPtr;
_Bool status = 1;
printf("MQTT_PacketConnect ready\r\n");
if(MQTT_PacketConnect(PROID, AUTH_INFO,DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
{
ESP8266_SendData(mqttPacket._data, mqttPacket._len);
dataPtr = ESP8266_GetIPD(250);
if(dataPtr != NULL)
{
if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
{
switch(MQTT_UnPacketConnectAck(dataPtr))
{
case 0:printf("Tips: 连接成功\r\n");status = 0;break;
case 1:printf("WARN: 连接失败:协议错误\r\n");break;
case 2:printf("WARN: 连接失败:非法的clientid\r\n");break;
case 3:printf("WARN: 连接失败:服务器失败\r\n");break;
case 4:printf("WARN: 连接失败:用户名或密码错误\r\n");break;
case 5:printf("WARN: 连接失败:非法链接(比如token非法)\r\n");break;
default:printf("ERR: 连接失败:未知错误\r\n");break;
}
}
}
MQTT_DeleteBuffer(&mqttPacket);
}
else
printf("WARN: MQTT_PacketConnect Failed\r\n");
return status;
}
//==========================================================
// 函数名称: OneNet_Subscribe
//
// 函数功能: 订阅
//
// 入口参数: topics:订阅的topic
// topic_cnt:topic个数
//
// 返回参数: SEND_TYPE_OK-成功 SEND_TYPE_SUBSCRIBE-需要重发
//
// 说明:
//==========================================================
void OneNet_Subscribe(const char *topics[], unsigned char topic_cnt)
{
unsigned char i = 0;
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};
for(; i < topic_cnt; i++)
printf("Subscribe Topic: %s\r\n", topics[i]);
if(MQTT_PacketSubscribe(MQTT_SUBSCRIBE_ID, MQTT_QOS_LEVEL0, topics, topic_cnt, &mqttPacket) == 0)
{
ESP8266_SendData(mqttPacket._data, mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket);
}
}
//==========================================================
// 函数名称: OneNet_Publish
//
// 函数功能: 发布消息
//
// 入口参数: topic:发布的主题
// msg:消息内容
//
// 返回参数: SEND_TYPE_OK-成功 SEND_TYPE_PUBLISH-需要重送
//
// 说明:
//==========================================================
void OneNet_Publish(const char *topic, const char *msg)
{
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
printf("Publish Topic: %s, Msg: %s\r\n", topic, msg);
if(MQTT_PacketPublish(MQTT_PUBLISH_ID, topic, msg, strlen(msg), MQTT_QOS_LEVEL0, 0, 1, &mqttPacket) == 0)
{
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //向平台发送订阅请求
MQTT_DeleteBuffer(&mqttPacket); //删包
}
}
//==========================================================
// 函数名称: OneNet_RevPro
//
// 函数功能: 平台返回数据检测
//
// 入口参数: dataPtr:平台返回的数据 也就是*cmd
//
// 返回参数: 无
//
// 说明:
//==========================================================
void OneNet_RevPro(unsigned char *cmd)
{
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
char *req_payload = NULL;
char *cmdid_topic = NULL;
unsigned short topic_len = 0;
unsigned short req_len = 0;
unsigned char type = 0;
unsigned char qos = 0;
static unsigned short pkt_id = 0;
short result = 0;
char *dataPtr = NULL;
char numBuf[10];
int num = 0;
type = MQTT_UnPacketRecv(cmd);
switch(type)
{
case MQTT_PKT_CMD:
result = MQTT_UnPacketCmd(cmd, &cmdid_topic, &req_payload, &req_len);
if(result == 0)
{
printf("cmdid: %s, req: %s, req_len: %d\r\n", cmdid_topic, req_payload, req_len);
if(MQTT_PacketCmdResp(cmdid_topic, req_payload, &mqttPacket) == 0)
{
printf("Tips: Send CmdResp \r\n");
MQTT_DeleteBuffer(&mqttPacket);
}
}
break;
case MQTT_PKT_PUBLISH:
result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
if(result == 0)
{
printf("topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",
cmdid_topic, topic_len, req_payload, req_len);
#if 0
if((req_payload[0] == 'O')&&(req_payload[1] == 'N'))
{
printf("LED1 ON\r\n");
}
if((req_payload[0] == 'O')&&(req_payload[1] == 'F')&&(req_payload[2] == 'F'))
{
printf("LED1 OFF \r\n");
}
#else
if(strstr((const char*)req_payload,(const char*)"LED1 ON"))//比对信息内容是不是LED1 ON
{
LED1_lighting_up;
printf("LED1 ON\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED1 OF"))//同上
{
LED1_lighting_off;
printf("LED1 OFF\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED2 ON"))//同上
{
LED2_lighting_up;
printf("LED2 ON\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED2 OF"))//同上
{
LED2_lighting_off;
printf("LED2 OFF\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED3 ON"))//同上
{
LED3_lighting_up;
printf("LED3 ON\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED3 OF"))//同上
{
LED3_lighting_off;
printf("LED3 OFF\r\n");//publish主题发布(发送到云平台)
}
else if(strstr((const char*)req_payload,(const char*)"ON"))//同上
{
LED1_lighting_up;LED2_lighting_up;LED3_lighting_up;
printf("LED1 LED2 LED3 ON\r\n");//publish主题发布(发送到云平台)
}
else if(strstr((const char*)req_payload,(const char*)"OF"))//同上
{
LED1_lighting_off;LED2_lighting_off;LED3_lighting_off;
printf("LED1 LED2 LED3 ON\r\n");//publish主题发布(发送到云平台)
}
#endif
}
break;
case MQTT_PKT_PUBACK:
if(MQTT_UnPacketPublishAck(cmd) == 0)
printf("Tips: MQTT Publish Send OK\r\n");
break;
case MQTT_PKT_PUBREC:
if(MQTT_UnPacketPublishRec(cmd) == 0)
{
printf("Tips: Rev PublishRec\r\n");
if(MQTT_PacketPublishRel(MQTT_PUBLISH_ID, &mqttPacket) == 0)
{
printf("Tips: Send PublishRel\r\n");
ESP8266_SendData(mqttPacket._data, mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket);
}
}
break;
case MQTT_PKT_PUBREL:
if(MQTT_UnPacketPublishRel(cmd, pkt_id) == 0)
{
printf("Tips: Rev PublishRel\r\n");
if(MQTT_PacketPublishComp(MQTT_PUBLISH_ID, &mqttPacket) == 0)
{
printf("Tips: Send PublishComp\r\n");
ESP8266_SendData(mqttPacket._data, mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket);
}
}
break;
case MQTT_PKT_PUBCOMP:
if(MQTT_UnPacketPublishComp(cmd) == 0)
{
printf("Tips: Rev PublishComp\r\n");
}
break;
case MQTT_PKT_SUBACK:
if(MQTT_UnPacketSubscribe(cmd) == 0)
printf("Tips: MQTT Subscribe OK\r\n");
else
printf("Tips: MQTT Subscribe Err\r\n");
break;
case MQTT_PKT_UNSUBACK:
if(MQTT_UnPacketUnSubscribe(cmd) == 0)
printf("Tips: MQTT UnSubscribe OK\r\n");
else
printf("Tips: MQTT UnSubscribe Err\r\n");
break;
default:
result = -1;
break;
}
ESP8266_Clear();
if(result == -1)
return;
dataPtr = strchr(req_payload, '}');
if(dataPtr != NULL && result != -1)
{
dataPtr++;
while(*dataPtr >= '0' && *dataPtr <= '9')
{
numBuf[num++] = *dataPtr++;
}
num = atoi((const char *)numBuf);
}
if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
{
MQTT_FreeBuffer(cmdid_topic);
MQTT_FreeBuffer(req_payload);
}
}



下面是MQTT远程点灯代码

主文件
#include "hal_data.h"
#include <stdio.h>
#include "usart9.h"
#include "esp8266.h"
#include "onenet.h"
#include "MqttKit.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
void delay_ms(uint32_t ms)
{
R_BSP_SoftwareDelay(ms, BSP_DELAY_UNITS_MILLISECONDS);
}
uint16_t timeCount = 0;
char PUB_BUF[256];//上传数据的buf(温度,湿度,光照强度,LED和蜂鸣器)
const char *devSubTopic[] = {"LED"}; // 设备订阅命令地址,MQTTX发送命令到服务器,stm32接收命令
const char devPubTopic[] = "RA4M2MQTT"; // 设备上行数据地址,stm32传感器向服务器传输数据并使用MQTTX接收
uint8_t alarmFlag;//是否报警的标志
uint8_t alarm_is_free;
/*******************************************************************************************************************//**
-
main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
-
is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
uint8_t *dataPtr = NULL;
/* TODO: add your own code here */
UART9_Init();
UART0_Init();
ESP8266_Init();
while(OneNet_DevLink() == 1) // 循环连接服务器
{delay_ms(500);}
OneNet_Subscribe(devSubTopic, 1); // 参数1:
while(1)
{
if(++timeCount >= 40) // 五秒发送间隔
{
printf("OneNet_Publish \r\n");
sprintf(PUB_BUF, "{\"Temp\":%d.%d, \"Hum\":%d.%d, \"Light\":%.1f, \"LED\":%d, \"BEEP\":%d}",
22,3,33,4,1,1?0:1,alarmFlag);
OneNet_Publish(devPubTopic, PUB_BUF);
timeCount = 0;
ESP8266_Clear();
}
dataPtr = ESP8266_GetIPD(3);
if(dataPtr != NULL)
OneNet_RevPro(dataPtr);
delay_ms(10);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
/*******************************************************************************************************************//**
-
This function is called at various points during the startup process. This implementation uses the event that is
-
called right before main() to set up the pins.
-
@param[in] event Where at in the start up process the code is currently at
**********************************************************************************************************************/
void R_BSP_WarmStart (bsp_warm_start_event_t event)
{
if (BSP_WARM_START_RESET == event)
{
#if BSP_FEATURE_FLASH_LP_VERSION != 0
R_FACI_LP->DFLCTL = 1U;
#endif
}
if (BSP_WARM_START_POST_C == event)
{
R_IOPORT_Open(&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME);
#if BSP_CFG_SDRAM_ENABLED
R_BSP_SdramInit(true);
#endif
}
}
#if BSP_TZ_SECURE_BUILD
FSP_CPP_HEADER
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();
/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{
}
FSP_CPP_FOOTER
#endif


接收解析函数
OneNet_RevPro(dataPtr);


void OneNet_RevPro(unsigned char *cmd)
{
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
char *req_payload = NULL;
char *cmdid_topic = NULL;
unsigned short topic_len = 0;
unsigned short req_len = 0;
unsigned char type = 0;
unsigned char qos = 0;
static unsigned short pkt_id = 0;
short result = 0;
char *dataPtr = NULL;
char numBuf[10];
int num = 0;
type = MQTT_UnPacketRecv(cmd);
switch(type)
{
case MQTT_PKT_CMD:
result = MQTT_UnPacketCmd(cmd, &cmdid_topic, &req_payload, &req_len);
if(result == 0)
{
printf("cmdid: %s, req: %s, req_len: %d\r\n", cmdid_topic, req_payload, req_len);
if(MQTT_PacketCmdResp(cmdid_topic, req_payload, &mqttPacket) == 0)
{
printf("Tips: Send CmdResp \r\n");
MQTT_DeleteBuffer(&mqttPacket);
}
}
break;
case MQTT_PKT_PUBLISH:
result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
if(result == 0)
{
printf("topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",
cmdid_topic, topic_len, req_payload, req_len);
#if 0
if((req_payload[0] == 'O')&&(req_payload[1] == 'N'))
{
printf("LED1 ON\r\n");
}
if((req_payload[0] == 'O')&&(req_payload[1] == 'F')&&(req_payload[2] == 'F'))
{
printf("LED1 OFF \r\n");
}
#else
if(strstr((const char*)req_payload,(const char*)"LED1 ON"))//比对信息内容是不是LED1 ON
{
LED1_lighting_up;
printf("LED1 ON\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED1 OF"))//同上
{
LED1_lighting_off;
printf("LED1 OFF\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED2 ON"))//同上
{
LED2_lighting_up;
printf("LED2 ON\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED2 OF"))//同上
{
LED2_lighting_off;
printf("LED2 OFF\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED3 ON"))//同上
{
LED3_lighting_up;
printf("LED3 ON\r\n");//publish主题发布(发送到云平台)
}else if(strstr((const char*)req_payload,(const char*)"LED3 OF"))//同上
{
LED3_lighting_off;
printf("LED3 OFF\r\n");//publish主题发布(发送到云平台)
}
else if(strstr((const char*)req_payload,(const char*)"ON"))//同上
{
LED1_lighting_up;LED2_lighting_up;LED3_lighting_up;
printf("LED1 LED2 LED3 ON\r\n");//publish主题发布(发送到云平台)
}
else if(strstr((const char*)req_payload,(const char*)"OF"))//同上
{
LED1_lighting_off;LED2_lighting_off;LED3_lighting_off;
printf("LED1 LED2 LED3 ON\r\n");//publish主题发布(发送到云平台)
}
#endif
}
break;
case MQTT_PKT_PUBACK:
if(MQTT_UnPacketPublishAck(cmd) == 0)
printf("Tips: MQTT Publish Send OK\r\n");
break;
case MQTT_PKT_PUBREC:
if(MQTT_UnPacketPublishRec(cmd) == 0)
{
printf("Tips: Rev PublishRec\r\n");
if(MQTT_PacketPublishRel(MQTT_PUBLISH_ID, &mqttPacket) == 0)
{
printf("Tips: Send PublishRel\r\n");
ESP8266_SendData(mqttPacket._data, mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket);
}
}
break;
case MQTT_PKT_PUBREL:
if(MQTT_UnPacketPublishRel(cmd, pkt_id) == 0)
{
printf("Tips: Rev PublishRel\r\n");
if(MQTT_PacketPublishComp(MQTT_PUBLISH_ID, &mqttPacket) == 0)
{
printf("Tips: Send PublishComp\r\n");
ESP8266_SendData(mqttPacket._data, mqttPacket._len);
MQTT_DeleteBuffer(&mqttPacket);
}
}
break;
case MQTT_PKT_PUBCOMP:
if(MQTT_UnPacketPublishComp(cmd) == 0)
{
printf("Tips: Rev PublishComp\r\n");
}
break;
case MQTT_PKT_SUBACK:
if(MQTT_UnPacketSubscribe(cmd) == 0)
printf("Tips: MQTT Subscribe OK\r\n");
else
printf("Tips: MQTT Subscribe Err\r\n");
break;
case MQTT_PKT_UNSUBACK:
if(MQTT_UnPacketUnSubscribe(cmd) == 0)
printf("Tips: MQTT UnSubscribe OK\r\n");
else
printf("Tips: MQTT UnSubscribe Err\r\n");
break;
default:
result = -1;
break;
}
ESP8266_Clear();
if(result == -1)
return;
dataPtr = strchr(req_payload, '}');
if(dataPtr != NULL && result != -1)
{
dataPtr++;
while(*dataPtr >= '0' && *dataPtr <= '9')
{
numBuf[num++] = *dataPtr++;
}
num = atoi((const char *)numBuf);
}
if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
{
MQTT_FreeBuffer(cmdid_topic);
MQTT_FreeBuffer(req_payload);
}
}
把上面代码编译后烧录到RA4M2开发板子中
打开串口助手

打开手机上的
手机端操作请看底部视屏
因为手机上操作大家看不到细节,所以我采用电脑端的MQTTfx来进行详细讲解,效果是一样的,所以既可以电脑控制,也可以手机控制,非常的人性化!!效果拉满

红色区域必须这样写,其余随便填就可以

用户名和密码和开发板中的软件保持一致就可以


点击添加,就可以收到RA4M2发送来的数据了

串口上抓到的数据

这就是RA4M2通过MQTT给云服务器传送数据
反过来,通过云服务器控制RA4M2点灯操作
详情请看视频操作


开始灯全亮

一一对应起来,填入数据发送


现在LED1熄灭

过程是这样的,后续请看顶部视频