
一 .生成密钥

二.查看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 内容和 ReturnValueLength
len = 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:
//拼接AT
sprintf(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,"");
{"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