当前位置: 首页 > news >正文

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 内容和 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

http://www.lryc.cn/news/598171.html

相关文章:

  • 企业资产管理智能化:IT运维如何借力数字化管理提效避坑?
  • 计算机网络-- TCP 滑动窗口与拥塞控制
  • 亚马逊云科技:引领云计算新时代,开启无限可能
  • JavaSE:学习输入输出编写简单的程序
  • 【Unity开发】飞机大战项目实现总结
  • DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B
  • Socket编程入门:从IP到端口全解析
  • element-plus 组件 ElMessage、ElLoading 弹框 和加载css 样式展示异常总结
  • SQL基础⑫ | 视图篇
  • 若用dnf下载的nginx和源文件下载的nginx冲突
  • 【学习路线】JavaScript全栈开发攻略:前端到后端的完整征程
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现卫星图像识别(C#代码,UI界面版)
  • 20-ospf技术
  • Java Map.Entry 核心解析
  • IPSec VPN -- 野蛮模式
  • OSPF开放式最短路径优先
  • C# 泛型(泛型方法)
  • Python中常用标准库(时间库、随机库、正则表达式)
  • pytest官方Tutorial所有示例详解(一)
  • 基于Node.js开发的开源博客平台ghost安装和使用
  • MySQL高可用部署
  • 云原生MySQL Operator开发实战(一):Operator基础与CRD设计
  • Spring MVC中常用注解_笔记
  • nuxt更改页面渲染的html,去除自定义属性、
  • 【Word Press进阶】自定义区块的行为与样式
  • go项目实战二
  • Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)
  • 数据挖掘顶刊TKDE论文分享│ST-LLM+:面向交通预测的图增强时空大语言模型
  • 第五章 Freertos物联网实战 微信小程序篇
  • 从0开始学习R语言-Day56--空间变系数模型