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

nblot BC260Y-CN ONENET oneJSON上云

目录

一.创建产品

二.创建对应物模型

三.创建设备

四.生成密文

五.导出设备获取ID号

六.测试连接

7.SMT32 连接

usart 准备

NBLOT部分

MAIN.C

代码说名

token等系统信息修改

反向控制修改

上传数据


一.创建产品

其他的无所谓随便选

二.创建对应物模型

三.创建设备

四.生成密文

需要的参数为设备密钥,产品ID

import base64
import hmac
from urllib.parse import quote
import time# 中国移动官方文档给出的核心秘钥计算算法
def token(id,access_key):version = '2018-10-31'res = 'products/%s' % id  # 通过产品ID访问产品API# 用户自定义token过期时间et = str(int(time.time()) + 63072000) # 设置为2年有效时间# 签名方法,支持md5、sha1、sha256method = 'sha1'# 对access_key进行decodekey = base64.b64decode(access_key)# 计算signorg = et + '\n' + method + '\n' + res + '\n' + versionsign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)sign = base64.b64encode(sign_b.digest()).decode()# value 部分进行url编码,method/res/version值较为简单无需编码sign = quote(sign, safe='')res = quote(res, safe='')# token参数拼接token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign)return tokenusername    = "3Y2lA72Nyc"                                           # 产品ID
accesskey   = "bmdjb0dlS0lCZjlIOXFsNnhIWVBkalZwT0hsU0IwSVY="         # accessKey
password = token(username, accesskey)
print(password)

五.导出设备获取ID号

导出的是表格形式

六.测试连接

前提准备

设备名 dve2

user name

密钥

topic

static const char *TOPIC_A = "$sys/产品ID/设备名/thing/property/set"; 

static const char *TOPIC_B = "$sys/ID/dve2/设备/property/post";

7.SMT32 连接

usart 准备


//硬件驱动
#include "usart.h"
#include "delay.h"//C库
#include <stdarg.h>
#include <string.h>
#include <stdio.h>/*
************************************************************
*	函数名称:	Usart1_Init
*
*	函数功能:	串口1初始化
*
*	入口参数:	baud:设定的波特率
*
*	返回参数:	无
*
*	说明:		TX-PA9		RX-PA10
************************************************************
*/
void Usart1_Init(unsigned int baud)
{GPIO_InitTypeDef gpio_initstruct;USART_InitTypeDef usart_initstruct;NVIC_InitTypeDef nvic_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//PA9	TXDgpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;gpio_initstruct.GPIO_Pin = GPIO_Pin_9;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_initstruct);//PA10	RXDgpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;gpio_initstruct.GPIO_Pin = GPIO_Pin_10;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_initstruct);usart_initstruct.USART_BaudRate = baud;usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//无硬件流控usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;						//接收和发送usart_initstruct.USART_Parity = USART_Parity_No;									//无校验usart_initstruct.USART_StopBits = USART_StopBits_1;								//1位停止位usart_initstruct.USART_WordLength = USART_WordLength_8b;							//8位数据位USART_Init(USART1, &usart_initstruct);USART_Cmd(USART1, ENABLE);														//使能串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);									//使能接收中断nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_initstruct.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&nvic_initstruct);}/*
************************************************************
*	函数名称:	Usart2_Init
*
*	函数功能:	串口2初始化
*
*	入口参数:	baud:设定的波特率
*
*	返回参数:	无
*
*	说明:		TX-PA2		RX-PA3
************************************************************
*/
void Usart2_Init(unsigned int baud)
{GPIO_InitTypeDef gpio_initstruct;USART_InitTypeDef usart_initstruct;NVIC_InitTypeDef nvic_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//PA2	TXDgpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;gpio_initstruct.GPIO_Pin = GPIO_Pin_2;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_initstruct);//PA3	RXDgpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;gpio_initstruct.GPIO_Pin = GPIO_Pin_3;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_initstruct);usart_initstruct.USART_BaudRate = baud;usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//无硬件流控usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;						//接收和发送usart_initstruct.USART_Parity = USART_Parity_No;									//无校验usart_initstruct.USART_StopBits = USART_StopBits_1;								//1位停止位usart_initstruct.USART_WordLength = USART_WordLength_8b;							//8位数据位USART_Init(USART2, &usart_initstruct);USART_Cmd(USART2, ENABLE);														//使能串口USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);									//使能接收中断nvic_initstruct.NVIC_IRQChannel = USART2_IRQn;nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_initstruct.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&nvic_initstruct);}/*
************************************************************
*	函数名称:	Usart_SendString
*
*	函数功能:	串口数据发送
*
*	入口参数:	USARTx:串口组
*				str:要发送的数据
*				len:数据长度
*
*	返回参数:	无
*
*	说明:		
************************************************************
*/
void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len)
{unsigned short count = 0;for(; count < len; count++){USART_SendData(USARTx, *str++);									//发送数据while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);		//等待发送完成}}/*
************************************************************
*	函数名称:	UsartPrintf
*
*	函数功能:	格式化打印
*
*	入口参数:	USARTx:串口组
*				fmt:不定长参
*
*	返回参数:	无
*
*	说明:		
************************************************************
*/
void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...)
{unsigned char UsartPrintfBuf[296];va_list ap;unsigned char *pStr = UsartPrintfBuf;va_start(ap, fmt);vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);							//格式化va_end(ap);while(*pStr != 0){USART_SendData(USARTx, *pStr++);while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);}
}/*
************************************************************
*	函数名称:	DEBUG_LOG
*
*	函数功能:	格式化输出调试信息
*
*	入口参数:	fmt:不定长参*	返回参数:	无
*
*	说明:		
************************************************************
*/
void DEBUG_LOG(char *fmt,...)
{unsigned char UsartPrintfBuf[296];va_list ap;unsigned char *pStr = UsartPrintfBuf;va_start(ap, fmt);vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);							//格式化va_end(ap);UsartPrintf(USART_DEBUG, "[LOG] /> ");while(*pStr != 0){USART_SendData(USART_DEBUG, *pStr++);while(USART_GetFlagStatus(USART_DEBUG, USART_FLAG_TC) == RESET);}UsartPrintf(USART_DEBUG, "\r\n");
}
/*
************************************************************
*	函数名称:	USART1_IRQHandler
*
*	函数功能:	串口1收发中断
*
*	入口参数:	无
*
*	返回参数:	无
*
*	说明:		
************************************************************
*/
u8 i;
u16 buf[20],res;
u8 receiving_flag = 0; // 新增一个标志,用于标记是否开始接收数组
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断{res = USART_ReceiveData(USART1);USART_ClearFlag(USART1, USART_FLAG_RXNE);}
}
#ifndef _USART_H_
#define _USART_H_#include "stm32f10x.h"#define USART_DEBUG		USART1		//调试打印所使用的串口组void Usart1_Init(unsigned int baud);void Usart2_Init(unsigned int baud);void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len);void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...);void DEBUG_LOG(char *fmt,...);#endif

NBLOT部分

#include "NB_Lot.h"
#include "lcd.h"
#include "usart.h"#include <stdio.h>
#include <string.h>/* NB-IoT模块工作步骤列表 */
enum {TASK_NBIOT_AT_PREPARE = 0,TASK_NBIOT_AT_PREPARE2,TASK_NBIOT_AT_TEST,TASK_NBIOT_AT_TEST_RSP,TASK_NBIOT_DISABLE_PSM,TASK_NBIOT_DISABLE_PSM_RSP,TASK_NBIOT_DISABLE_ECHO,TASK_NBIOT_DISABLE_ECHO_RSP,TASK_NBIOT_SET_BAND,TASK_NBIOT_SET_BAND_RSP,TASK_NBIOT_DHCP,TASK_NBIOT_DHCP_RSP,TASK_NBIOT_MQTT_OPEN,TASK_NBIOT_MQTT_OPEN_RSP,TASK_NBIOT_MQTT_CONNECT,TASK_NBIOT_MQTT_CONNECT_RSP,TASK_NBIOT_MQTT_GET_TOPIC,TASK_NBIOT_GET_DATA,TASK_NBIOT_MQTT_PRE_SEND,TASK_NBIOT_MQTT_SEND,TASK_NBIOT_MQTT_CHECK_DATA,TASK_NBIOT_MQTT_CLOSE,TASK_NBIOT_FINISH,TASK_NBIOT_ERROR,TASK_NBIOT_ERROR_RSP,
};extern float temperature,TDS_value,PH;
extern u8 water;/*腾讯云MQTT服务器信息*/
//域名
//static const char *DOMAIN = "020L7JSU2A.iotcloud.tencentdevices.com";
static const char *DOMAIN = "175.178.30.200";
//端口
static const char *PORT="1883";
//客户端ID
static const char *CLIENT_ID = "0001";
//用户名
static const char *USERNAME = "2KFIR2QXNX0001;12010126;9DWJ5;2032687910";
//密码
static const char *PASSWORD = "4bdd5d1e7bcb69327da2c7feb20f0af9f428964da1d542f86ee4465e3b985bd8;hmacsha256";
//主题
static const char *TOPIC_A = "$thing/up/property/2KFIR2QXNX/0001";static const char *TOPIC_B = "$thing/down/property/2KFIR2QXNX/0001";/* NB-IoT模块工作步骤 */
static int nbStep;/* 计时器 */
static int timeCounter;/* 屏幕显示字符串 */
static char lcdString[16];/* AT指令字符串 */
static char atString[256];/* 数据字符串 */
static char dataString[256];/* AT指令发送标记 */
static uint8_t isSendAT;uint8_t svcMsgBuf[SVC_MSG_BUF_MAX];const char *params[] = {"SSS", "aaa"}; // 你需要提取的参数名称
int paramValues[2];  // 你需要提取的参数名称
/*当前缓冲区已存放的字节数量*/
volatile uint16_t svcMsgCounter = 0;
int paramCount = 2;static int atDefaultCheck(void);
static int atDHCPCheck(void);
static int atMqttOpenCheck(void);
static int atMqttConnectCheck(void);
static int atDataCheck(const char *params[], int paramCount, int paramValues[]);
static int atSendAndCheckData(const char *dataString, const char *params[], int paramCount, int paramValues[]);
/*
************************************************************
*	函数名称:	USART1_IRQHandler
*
*	函数功能:	串口1收发中断
*
*	入口参数:	无
*
*	返回参数:	无
*
*	说明:		
************************************************************
*/
void USART2_IRQHandler(void)
{unsigned char byte = 0;if (USART_GetITStatus(NB_Lot_USARTx, USART_IT_RXNE) != RESET) {byte = USART_ReceiveData(NB_Lot_USARTx); // Auto to clear RXNE flag when read!
//				USART_SendData(USART2,byte);svcMsgBuf[svcMsgCounter++] = byte;}else USART_ClearFlag(NB_Lot_USARTx,USART_FLAG_TC);
}
/*
* 读取接收到的数据
* @param buf 读取到数据的存储地址
* @param len 待读取数据的长度
*
* @return 
*/
uint16_t svcMsgRead(uint8_t *buf, uint16_t len)
{//实际读取的数据长度uint16_t size;//如果缓冲区中没有数据,那么结束本函数if (svcMsgCounter == 0){return 0;}//计算实际读取的数据长度if (len > svcMsgCounter){size = svcMsgCounter;}else{size = len;} //从缓冲区中取出数据memcpy(buf, svcMsgBuf, size);//svcMsgCounter = 0;if(svcMsgCounter>size){uint16_t i,j;for(i=0,j=size;j<svcMsgCounter;i++,j++){svcMsgBuf[i]=svcMsgBuf[j];}}    svcMsgCounter=svcMsgCounter-size;return size;
}
/** 向串口发送信息** @param buf - 待发送的信息的存储地址* @param len - 待发送的信息的数据长度*/
void halUartWrite(const unsigned char *buf, unsigned int len)
{for (unsigned int i = 0; i < len; i++) {USART_SendData(NB_Lot_USARTx, buf[i]);while(USART_GetFlagStatus(NB_Lot_USARTx, USART_FLAG_TXE) == RESET);}
}
/*
* 发送字符串
* @param string 待发送的字符串
*/
int svcMsgWriteString(const char *string)
{halUartWrite((uint8_t *)string, strlen(string));return 0;
}
void dataUploadRunner(void)
{switch (nbStep) {/* AT Prepare1 */case TASK_NBIOT_AT_PREPARE:OLED_ShowCH(0,6,"CMD: Prepare");svcMsgWriteString("AT+QMTDISC=0\r\n");nbStep++;timeCounter = 0;break;case TASK_NBIOT_AT_PREPARE2:OLED_ShowCH(0,6,"CMD: Prepare2");svcMsgWriteString("AT+QRST=1\r\n");nbStep++;break;/* AT Test */case TASK_NBIOT_AT_TEST:OLED_ShowCH(0,6,"CMD: AT      ");svcMsgWriteString("AT\r\n");nbStep++;break;/* Response: AT Test */case TASK_NBIOT_AT_TEST_RSP:OLED_ShowCH(0,6,"RSP: AT      ");if (atDefaultCheck() == 0) nbStep++;else nbStep--;break;/* Disable PSM */case TASK_NBIOT_DISABLE_PSM:OLED_ShowCH(0,6,"CMD: QSCLK=0      ");svcMsgWriteString("AT+QSCLK=0\r\n");nbStep++;break;/* Response: Disable PSM */case TASK_NBIOT_DISABLE_PSM_RSP:OLED_ShowCH(0,6,"RSP: QSCLK=0      ");if (atDefaultCheck() == 0) nbStep++;else nbStep--;break;/* Disable Echo */case TASK_NBIOT_DISABLE_ECHO:OLED_ShowCH(0,6,"CMD: ATE0      ");svcMsgWriteString("ATE0\r\n");nbStep++;break;/* Response: Disable Echo */case TASK_NBIOT_DISABLE_ECHO_RSP:OLED_ShowCH(0,6,"RSP: ATE0      ");if (atDefaultCheck() == 0) nbStep++;else nbStep--;break;/* Set Band */case TASK_NBIOT_SET_BAND:OLED_ShowCH(0,6,"CMD: QBAND=8      ");svcMsgWriteString("AT+QBAND=1,8\r\n");nbStep++;break;/* Response: Set Band */case TASK_NBIOT_SET_BAND_RSP:OLED_ShowCH(0,6,"RSP: QBAND=8      ");if (atDefaultCheck() == 0) nbStep++;else nbStep--;break;/* DHCP */case TASK_NBIOT_DHCP:OLED_ShowCH(0,6,"CMD: DHCP      ");svcMsgWriteString("AT+CGPADDR?\r\n");nbStep++;timeCounter = 0;break;/* Response: DHCP */case TASK_NBIOT_DHCP_RSP:OLED_ShowCH(0,6,"RSP: DHCP      ");timeCounter++;if(timeCounter>=1&& atDHCPCheck() == 0){nbStep++;}else if(timeCounter>=3){nbStep--;}break;/* MQTT Open */case TASK_NBIOT_MQTT_OPEN:OLED_ShowCH(0,6,"CMD: QMTOPEN      ");sprintf(atString, "AT+QMTOPEN=0,\"%s\",1883\r\n", DOMAIN);svcMsgWriteString(atString);nbStep++;timeCounter = 0;break;/* Response: MQTT Open */case TASK_NBIOT_MQTT_OPEN_RSP:OLED_ShowCH(0,6,"RSP: QMTOPEN      ");timeCounter++;if(timeCounter>=1&& atMqttOpenCheck() == 0){nbStep++;}else if(timeCounter>=3){nbStep = TASK_NBIOT_ERROR;}break;/* MQTT Connect */case TASK_NBIOT_MQTT_CONNECT:OLED_ShowCH(0,6,"CMD: QMTCONN      ");sprintf(atString, "AT+QMTCONN=0,\"%s\",\"%s\",\"%s\"\r\n", CLIENT_ID, USERNAME, PASSWORD);svcMsgWriteString(atString);nbStep++;timeCounter = 0;break;/* Response: MQTT Connect */case TASK_NBIOT_MQTT_CONNECT_RSP:OLED_ShowCH(0,6,"RSP: QMTCONN      ");timeCounter++;if (timeCounter>=1&&atMqttConnectCheck() == 0){
//						svcLogWriteLcd(0,0, (uint8_t *)"", 0, 0);nbStep++;}else if(timeCounter >= 3){//svcLogWriteLcd(0,0, (uint8_t *)"conn tiemout", 0, 0);svcMsgWriteString("AT+QMTDISC=0\r\n");nbStep = TASK_NBIOT_ERROR;}break;case TASK_NBIOT_MQTT_GET_TOPIC:OLED_ShowCH(0,6,"RSP:GET_TOPIC  ");sprintf(atString, "AT+QMTSUB=0,1,\"%s\",0\r\n", TOPIC_B);svcMsgWriteString(atString);nbStep++;/* Get data */case TASK_NBIOT_GET_DATA:OLED_ShowCH(0,6,"CMD: get data    ");nbStep++;break;/* MQTT Pre-Send */case TASK_NBIOT_MQTT_PRE_SEND:OLED_ShowCH(0,6,"CMD: QMTPUB      ");sprintf(dataString, "{\"method\":\"report\",\"clientToken\":\"123\",\"timestamp\":1628646783,\"params\":{\"wd\":%f,\"tds\":%f,\"ph\":%f,\"hz\":%d}}",temperature,TDS_value,PH,water);sprintf(atString, "AT+QMTPUB=0,0,0,0,\"%s\",%d\r\n", TOPIC_A, strlen(dataString));svcMsgWriteString(atString);nbStep++;timeCounter = 0;isSendAT=0;break;/* MQTT Send and Check Data */case TASK_NBIOT_MQTT_SEND:OLED_ShowCH(0,6,"CMD:SendAndCheck");if(isSendAT==0){svcMsgWriteString(dataString);isSendAT=1;}timeCounter++;if (timeCounter >= 8 || atSendAndCheckData(dataString, params,paramCount, paramValues) == 0) {nbStep = TASK_NBIOT_GET_DATA;if (paramValues[0] != -1)OLED_ShowNum(0,2,paramValues[0],3,16);if (paramValues[1] != -1)OLED_ShowNum(0,4,paramValues[1],3,16);}break;/* Process Data */case TASK_NBIOT_MQTT_CHECK_DATA:OLED_ShowCH(0,6,"CMD:CHECK DATA ");if (paramValues[0] != -1)OLED_ShowNum(0,2,paramValues[0],3,16);if (paramValues[1] != -1)OLED_ShowNum(0,4,paramValues[1],3,16);nbStep = TASK_NBIOT_GET_DATA;break;/* MQTT Close */case TASK_NBIOT_MQTT_CLOSE:OLED_ShowCH(0,6,"CMD: CLOSE      ");svcMsgWriteString("AT+QMTDISC=0\r\n");nbStep++;break;/* Finish */case TASK_NBIOT_FINISH:OLED_ShowCH(0,6,"CMD: Finish      ");break;/* RESET */case TASK_NBIOT_ERROR:OLED_ShowCH(0,6,"CMD: RESET      ");svcMsgWriteString("AT+QRST=1\r\n");nbStep++;timeCounter = 0;break;/* RSP: RESET */case TASK_NBIOT_ERROR_RSP:timeCounter++;if(atDefaultCheck() == 0){nbStep = TASK_NBIOT_DHCP;}else if (timeCounter >= 3) {nbStep = TASK_NBIOT_DHCP;}else{nbStep--;}break;default: break;}
}/*
* 基础AT指令结果检测
*/
int atDefaultCheck()
{uint16_t len;uint8_t buf[20];memset(buf, 0, sizeof(buf));len = svcMsgRead(buf, sizeof(buf));if (len == 0) return -1;//taskNbiotDebug(buf, len);if (strstr((char *)buf, "OK") != NULL) return 0;return -1;
}
/*
* 检测服务器下发的数据,并提取指定参数的值
*/
int atDataCheck(const char *params[], int paramCount, int paramValues[])
{uint16_t len;uint8_t buf[SVC_MSG_BUF_MAX + 1];memset(buf, 0, sizeof(buf));len = svcMsgRead(buf, sizeof(buf));if (len == 0) return -1;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;
}
/*
* DHCP AT指令结果检测
*/
int atDHCPCheck()
{uint16_t len;uint8_t buf[SVC_MSG_BUF_MAX + 1];memset(buf, 0, sizeof(buf));len = svcMsgRead(buf, sizeof(buf));if (len == 0) return -1;//taskNbiotDebug(buf, len);if (strstr((char *)buf, "OK") == NULL) return -1;char *start = strstr((char *)buf, "+CGPADDR: ");if (start == NULL) return -1;char *ip = start + 13;char *end = strchr(ip, '"');if (end == NULL) return -1;*end = 0;if (strlen(ip) < 7) return -1;return 0;
}
/*
* 发送数据并检测服务器下发的数据
*/
int atSendAndCheckData(const char *dataString, const char *params[], int paramCount, int paramValues[])
{uint16_t len;uint8_t buf[SVC_MSG_BUF_MAX + 1];memset(buf, 0, sizeof(buf));// 发送数据svcMsgWriteString(dataString);// 读取数据len = svcMsgRead(buf, sizeof(buf));if (len == 0) return -1;// 检查发送结果if (strstr((char *)buf, "OK") != NULL) {// 检查服务器下发的数据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;}return -1;
}/*
* MQTT Open AT指令结果检测
*/
int atMqttOpenCheck()
{uint16_t len;uint8_t buf[SVC_MSG_BUF_MAX + 1];memset(buf, 0, sizeof(buf));len = svcMsgRead(buf, sizeof(buf));if (len == 0) return -1;//taskNbiotDebug(buf, len);if (strstr((char *)buf, "+QMTOPEN: 0,0") != NULL) return 0;return -1;
}/*
* MQTT Conn AT指令结果检测
*/
int atMqttConnectCheck()
{uint16_t len;uint8_t buf[SVC_MSG_BUF_MAX + 1];memset(buf, 0, sizeof(buf));len = svcMsgRead(buf, sizeof(buf));if (len == 0) return -1;//taskNbiotDebug(buf, len);if (strstr((char *)buf, "+QMTCONN: ") != NULL) return 0;return -1;
}
#ifndef __NB_LOT_H 
#define __NB_LOT_H  
#include "stm32f10x.h"                  // Device header#define SVC_MSG_BUF_MAX     500#define NB_Lot_USARTx     USART2void dataUploadRunner(void);
uint16_t svcMsgRead(uint8_t *buf, uint16_t len);#endif

MAIN.C

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "lcd.h"
#include "ds1302.h"
#include "IOput.h"
#include "usart.h"
#include "nblot.h" 
#include "timer.h"
u8 show_flag, show1_flag, light=0;u8 webTime;
void TIM2_IRQHandler(void)   //TIM2中断
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 webTime++;}
}extern u8 IRQdata;
extern u8 res1;
int main (void)
{delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);OLED_Clear();	OLED_Init(); delay_ms(1);OLED_Clear();input_init();output_init();Usart2_Init(9600); TIM2_Int_Init(71,9999);    
//  	      MQTTconnect();
//	        delay_ms(1000);
//	  SendATcommand("AT\r\n");
//	  delay_ms(1000);
//	  SendATcommand("AT+MQTTCONN=0,"175.178.30.200",1883,"0001","A4RKGYL86E0001;12010126;S1XV6;2043455836","e7a438948af1bf1fa8c21cf2ad2ee6c980381fd59a59066a4626bef7543ee866;hmacsha256"\r")//175.178.30.200 域名");
//  	MQTTconnect();
//	  delay_ms(1000);
//		MQTTconnect();
//	  delay_ms(1000);
//		MQTTconnect();Usart1_Init(9600);
//			SendATcommand("AT+MQTTDISC=0\r");while(1)
{        if(webTime>=150){MQTTconnect();webTime=0;
//					USART_SendData(USART1, 1); }//        OLED_ShowCH(0,0,"1111");OLED_ShowNum(0,0,webTime,2,16);
//				OLED_ShowNum(0,4,ATresult,2,16);
//		  OLED_ShowNum(0,4,AsroproArray[6],2,16);
//		  OLED_ShowNum(40,4,AsroproArray[7],2,16);
//			OLED_ShowNum(80,4,AsroproArray[8],2,16);
//      if (!show1_flag){
//			}}
}

代码说名

token等系统信息修改

反向控制修改

<!--注意如果要加反向控制,必须上传程序里也有此数据,和腾讯云的nb不太一样-->

<!--因为oneNet反向控制接收到数据 必须还要做回应,单片机如果做其他操作特别容易超时,我直接把数据解析出来在从新上传了-->

                                     <!--下面的情况可以不用管-->

上传数据


文章转载自:

http://hBCFBLOL.sypzg.cn
http://1my9KVd3.sypzg.cn
http://OVZfC4BV.sypzg.cn
http://J5S42Otq.sypzg.cn
http://LClQhkY9.sypzg.cn
http://ESgIcpqa.sypzg.cn
http://ty95Umsi.sypzg.cn
http://3Go8cKKf.sypzg.cn
http://9WNMzTDb.sypzg.cn
http://3TOB0jlj.sypzg.cn
http://cNWcjcIk.sypzg.cn
http://juE9Bzua.sypzg.cn
http://sTqn9JSb.sypzg.cn
http://0jjPpPQm.sypzg.cn
http://wkvPUABa.sypzg.cn
http://n5fKULIc.sypzg.cn
http://yz1jVuR0.sypzg.cn
http://pBS8Rpxl.sypzg.cn
http://GYiCPrT2.sypzg.cn
http://SyXbDiHI.sypzg.cn
http://Mq5CTsG8.sypzg.cn
http://RB8AkfDi.sypzg.cn
http://nC8rK80j.sypzg.cn
http://CvugCAAr.sypzg.cn
http://Gq9BnfLS.sypzg.cn
http://Vl7yhwln.sypzg.cn
http://BTfhfDwg.sypzg.cn
http://C8iHJj2U.sypzg.cn
http://grJb4xRR.sypzg.cn
http://V1tPYuab.sypzg.cn
http://www.dtcms.com/a/387978.html

相关文章:

  • 硬件驱动——I.MX6ULL裸机启动(6)(i2c相关设置)
  • 9.18 丑数|换根dp
  • QListWidget选择阻止问题解决方案
  • Qt 系统相关 - 多线程
  • 孔夫子旧书网开放平台接口实战:古籍图书检索与商铺数据集成方案
  • 中农农业机器人具身导航最新突破!T-araVLN:农业机器人视觉语言导航的指令翻译器
  • CoaXPress Device HOST设备发现-速率匹配
  • c++中的继承和多态
  • GPTZero:在线AI内容检测工具
  • Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)
  • pytorch图像识别,入门深度学习第一个项目
  • Ubuntu 22.04 使用 Docker 部署 Redis 6.2(带密码与持久化)
  • Termux 安装 Trilium 笔记,全平台同步的好用开源 Markdow 笔记,超大型双链接笔记
  • CVAT工具的详细使用教程(视频标注)
  • 【一周AI资讯】Claude自动抓取网页;美团发布生活Agent;阿里通义发布双模型
  • [视图功能4] 视图共享与外部链接权限管理:安全又灵活的数据展示
  • 20250917在荣品RD-RK3588-MID开发板的Android13系统下使用tinyplay播放wav格式的音频
  • PAT 1013 Battle Over Cities
  • 自动驾驶车辆的网络安全威胁及防护技术
  • 《基于uni-app构建鸿蒙原生体验:HarmonyOS NEXT跨平台开发实战指南》
  • 数学_向量投影相关
  • 【完整源码+数据集+部署教程】传统韩文化元素分割系统: yolov8-seg-GFPN
  • hybrid实验
  • Prompt Engineering 技术文档
  • 《我看见的世界》- 李飞飞自传
  • TPS54302开关电源启动 1s 后输出电压掉电排查笔记 — TPS54302 5V→2.8V 案例
  • 具身智能数据采集方案,如何为机器人打造“数据燃料库”?
  • Prism模块化和对话服务
  • nas怎么提供给k8s容器使用
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(8)多标签图像分类理论