
一 .生成密钥

二.查看TOPIC列表

三.修改三元组



四.ML30732.C
#include "ML3072.h"
#include "usart.h"#include <stdio.h>
#include <string.h>
#include "IOput.h"//腾讯云数据解析
static const char *DOMAIN = "175.178.30.200";
//端口
static const char *PORT="1883";
//客户端ID
static const char *CLIENT_ID = "";
//用户名
static const char *USERNAME = "";
//密码
static const char *PASSWORD = "";
//主题
static const char *TOPIC_A = "";static const char *TOPIC_B = "";
//AT指令
static char atString[256];
//json数据
/* 数据字符串 */
static char JsonString[256];
u8 step; //步骤
u8 ATresult; //AT指令结果
uint8_t Buffer[BUF_MAX]; //缓存区
u16 ReturnValueLength; //返回值长度
//串口二中断
void USART2_IRQHandler(void)
{unsigned char byte = 0;if (USART_GetITStatus(ML3072_USARTx, USART_IT_RXNE) != RESET) {byte = USART_ReceiveData(ML3072_USARTx); // Auto to clear RXNE flag when read!Buffer[ReturnValueLength] = byte;ReturnValueLength++;
// USART_SendData(USART1, byte); }else USART_ClearFlag(ML3072_USARTx,USART_FLAG_TC);
}//AT返回值检查
int CheckData(u16 size){for(int i = 0; i < size; i++) {if(Buffer[i] == 'O' && Buffer[i+1] == 'K') {return 1;}}return 0;
}//AT数据发送
int SendATcommand(const char *buf){int lengthTemp;lengthTemp=strlen(buf);for (unsigned int i = 0; i < lengthTemp; i++) {USART_SendData(USART1, buf[i]); delay_ms(1);USART_SendData(ML3072_USARTx, buf[i]);while(USART_GetFlagStatus(ML3072_USARTx, USART_FLAG_TXE) == RESET);}
}// 多参数数据解析函数
int atDataCheck(const char *params[], int paramCount, int paramValues[])
{uint16_t len;uint8_t buf[BUF_MAX + 1];memset(buf, 0, sizeof(buf));// 这里直接用 Buffer 内容和 ReturnValueLengthlen = ReturnValueLength;if (len == 0) return -1;memcpy(buf, Buffer, len > BUF_MAX ? BUF_MAX : len);buf[len > BUF_MAX ? BUF_MAX : len] = 0;for (int i = 0; i < paramCount; i++) {char searchStr[50];snprintf(searchStr, sizeof(searchStr), "\"%s\":", params[i]);char *start = strstr((char *)buf, searchStr);if (start == NULL) {paramValues[i] = -1; // 标记未找到的参数continue;}start += strlen(searchStr);char *end = strchr(start, ',');if (end == NULL) {end = strchr(start, '}');if (end == NULL) return -1;}char numberStr[10];memset(numberStr, 0, sizeof(numberStr));strncpy(numberStr, start, end - start);paramValues[i] = atoi(numberStr);}return 0;
}u8 isShow=1;
u8 lin=6;
//腾讯云连接
void MQTTconnect(){switch(step){case 0://先主动断开连接 防止 调试异常SendATcommand(" AT+MQTTDISC=0\r\n");memset(Buffer, 0, ReturnValueLength);ReturnValueLength=0;step++;break;//开机case 1://发送开机指令//获取长度SendATcommand("AT\r\n");//检查返回值ATresult=CheckData(ReturnValueLength);step+=ATresult;//清空接受缓存区 和下标memset(Buffer, 0, ReturnValueLength);ReturnValueLength=0;isShow?OLED_ShowCH(0,lin,"OPEN DEVICE"):OLED_ShowCH(0,lin,""); break;//连接阿里云case 2://拼接ATsprintf(atString, "AT+MQTTCONN=0,\"%s\",%s,\"%s\",\"%s\",\"%s\"\r\n", DOMAIN, PORT, CLIENT_ID,USERNAME,PASSWORD);//发送AT指令SendATcommand(atString);//检查返回值ATresult=CheckData(ReturnValueLength);step+=ATresult;//清空接受缓存区 和下标memset(Buffer, 0, ReturnValueLength);ReturnValueLength=0;isShow?OLED_ShowCH(0,lin,"AT+MQTTCONN"):OLED_ShowCH(0,lin,"");break;//订阅数据case 3: sprintf(atString, "AT+MQTTSUB=0,\"%s\",0\r\n",TOPIC_A);SendATcommand(atString);//检查返回值ATresult=CheckData(ReturnValueLength);step+=ATresult;//清空接受缓存区 和下标memset(Buffer, 0, ReturnValueLength);ReturnValueLength=0;isShow?OLED_ShowCH(0,lin,"AT+MQTTSUB DOWN"):OLED_ShowCH(0,lin,"");break;//数据发送case 4:if(ReturnValueLength>100){//进入 数据解析step++;break;}isShow?OLED_ShowCH(0,lin,"AT+MQTTSUB UP "):OLED_ShowCH(0,lin,"");
//// AT+MQTTPUB=0,"$thing/up/property/A4RKGYL86E/0001",0,0,0,83,"{"method":"report","clientToken":"123","timestamp":1628646783,"params":{"dome1":1}}"\r
// //表示接受到订阅到的数据返回sprintf(JsonString, "{\"method\":\"report\",\"clientToken\":\"123\",\"timestamp\":1628646783,\"params\":{\"dome1\":%d,\"dome2\":%d}}",14,0);sprintf(atString, "AT+MQTTPUB=0,\"%s\",0,0,0,%d,\"%s\"\r\n", TOPIC_A, strlen(JsonString),JsonString);SendATcommand(atString);memset(Buffer, 0, ReturnValueLength);ReturnValueLength=0;break;case 5://用于数据解析操作isShow?OLED_ShowCH(0,lin,"AT+MQTTSUB UP1"):OLED_ShowCH(0,lin,"");// 需要解析的参数名const char *params[] = {"dome1", "dome2"};int paramValues[2] = {0};if (atDataCheck(params, 2, paramValues) == 0) {if(paramValues[0]!=-1){OLED_ShowNum(0,2,paramValues[0],10,16); // 显示 dome1}if(paramValues[1]!=-1){OLED_ShowNum(0,4,paramValues[1],10,16); // 显示 dome2}memset(Buffer, 0, ReturnValueLength);ReturnValueLength=0;step--; }break;} }
ML30732.H
#ifndef _ML3072_H_
#define _ML3072_H_#define BUF_MAX 400#define ML3072_USARTx USART2
#include "stm32f10x.h"void MQTTconnect();
int SendATcommand();
#endif