ML3072 MQTT连接阿里云

一 .生成密钥

 二.查看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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值