前言:基于正点原子的,用的阿里云平台,之前的主函数设备上传数据代码是这个,按下KEY0后成功输送给阿里云
key = key_scan(0); //按键
if(key == KEY0_PRES)
{
snprintf(DTU_DATA, sizeof(DTU_DATA), //将数据以json形式传送到阿里云
"{\"method\":\"thing.event.property.post\","
"\"id\":\"%s\","
"\"params\":{"
"\"Humidity\":%d,"
"\"temperature\":%d,"
"\"AQI\":%d"
"},"
"\"version\":\"1.0.0\"}",
"unique-request-id",
humidity,
temperature,
AQI);
printf("Sending data: %s\n", DTU_DATA);
atk_idm750c_uart_printf("%s\r\n", DTU_DATA);
}
这上面的是之前成功上传的数据
*************************************************************************分界线
现在的问题是:代码没变过,同样的操作,但是上传阿里云时提示6207错误代码,如下图
根据阿里云帮助文档物模型属性、事件、服务的Alink JSON数据格式和Topic_物联网平台(IoT)-阿里云帮助中心
的这个位置
我进行了代码更改,更改图如下:
long currentTime = get_current_timestamp_ms();这个函数是我用的一个简单时间戳
上传数据时还是提示6207,我已经很无奈了,不知道是不是位置搞错了,请教大佬,我的这个代码应该如何更改?
附带主函数如下:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/DHT11/dht11.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/KEY/key.h"
#include "./BSP/ATK_IDM750C/atk_idm750c.h"
#include "./BSP/ATK_IDM750C/atk_idm750c_uart.h"
#include "stm32f1xx_hal.h"
#define DEMO_DTU_TEST_DATA "ALIENTEK ATK-IDM750C TEST"
// 阿里云物联网平台参数
#define DTU_ALIYUN_PRODUCTKEY "k1wd9etVnLn"
#define DTU_ALIYUN_DEVICENAME "4GM750"
long get_current_timestamp_ms(void)
{
// 获取自系统启动以来的毫秒数
return (long)HAL_GetTick();
}
void show_mesg(void)
{
/* LCD显示实验信息 */
lcd_show_string(30, 130, 200, 16, 16, "Temp: C", BLUE);
lcd_show_string(30, 150, 200, 16, 16, "Humi: %", BLUE);
lcd_show_string(30, 170, 200, 16, 16, "air quality:", BLUE);
lcd_show_string(30, 190, 200, 16, 16, "VOL: .", BLUE); /* 先在固定位置显示小数点 */
lcd_show_string(30, 30, 200, 16, 16, "KEY0: Send Message", BLUE); /* 按下发送信息 */
/* 串口输出实验信息 */
printf("********************************\r\n");
printf("STM32\r\n");
printf("ATK-IDM750C\r\n");
printf("ATOM@ALIENTEK\r\n");
printf("********************************\r\n");
}
int main(void)
{
uint8_t x = 0;
uint8_t t = 0;
uint8_t temperature;
uint8_t humidity;
uint16_t adcx;
uint16_t AQI;
float temp;
uint8_t *buf;
uint8_t key;
char kile_temperature[20];
char kile_humidity[20];
char kile_adcx[20];
char DTU_DATA[256];
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
adc_init(); /* 初始化ADC */
key_init(); /* 初始化KEY */
dht11_init();
lcd_show_string(30, 110, 200, 16, 16, "DHT11 OK", RED);
lcd_show_string(30, 90, 200, 16, 16, "MQ135 OK", RED);
delay_ms(1000);
demo_run(); /* 运行示例程序 */
show_mesg(); /* 显示实验信息 */
delay_ms(500);
while (1)
{
if (t % 10 == 0) /* 每100ms读取一次 */
{
dht11_read_data(&temperature, &humidity); /* 读取温湿度值 */
lcd_show_num(30 + 40, 130, temperature, 2, 16, BLUE); /* 显示温度 */
lcd_show_num(30 + 40, 150, humidity, 2, 16, BLUE); /* 显示湿度 */
adcx = adc_get_result_average(ADC_ADCX_CHY, 10); /* 获取通道5的转换值,10次取平均 */
sprintf(kile_adcx, "%d", adcx);
lcd_show_xnum(124, 170, adcx, 5, 16, 0, BLUE); /* 显示ADCC采样后的原始值 */
AQI = adcx;
temp = (float)adcx * (3.3 / 4096); /* 获取计算后的带小数的实际电压值,比如3.1111 */
adcx = temp; /* 赋值整数部分给adcx变量,因为adcx为u16整形 */
lcd_show_xnum(64, 190, adcx, 1, 16, 0, BLUE); /* 显示电压值的整数部分,3.1111的话,这里就是显示3 */
temp -= adcx; /* 把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111 */
temp *= 1000; /* 小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。 */
lcd_show_xnum(80, 190, temp, 3, 16, 0X80, BLUE); /* 显示小数部分(前面转换为了整形显示),这里显示的就是111. */
}
sprintf(kile_temperature, "%d", temperature);
sprintf(kile_humidity, "%d", humidity);
delay_ms(10);
t++;
key = key_scan(0); // 按键
if (key == KEY0_PRES)
{
// 构建JSON数据
long currentTime = get_current_timestamp_ms(); // 示例时间戳,您需要替换为实际的时间戳
snprintf(DTU_DATA, sizeof(DTU_DATA),
"{\"id\":\"%s\",\"version\":\"1.0\",\"sys\":{\"ack\":0},\"params\":{\"Humidity\":{\"value\":%d},\"temperature\":{\"value\":%d},\"AQI\":{\"value\":%d}},\"method\":\"thing.event.property.post\"}",
currentTime, // id字段
humidity, // 湿度属性值
temperature, // 温度属性值
AQI); // 空气质量指数属性值
printf("Sending data: %s\n", DTU_DATA); // 确保这里有分号结束语句
atk_idm750c_uart_printf("%s\r\n", DTU_DATA);
}
if (x == 1)
{
LED1_TOGGLE();
x = 0;
}
buf = atk_idm750c_uart_rx_get_frame();
if (buf != NULL)
{
printf("%s", buf);
atk_idm750c_uart_rx_restart();
}
}
}
标签:include,show,16,stm32,lcd,DTU,4g,M750,adcx
From: https://blog.csdn.net/SABERLU/article/details/143750670