106 Star 417 Fork 238

GVPOneOS / OneOS

 / 详情

esp8266上成功连接onenet云平台,但上报属性失败

待办的
任务
创建于  
2023-08-15 14:39

int main()
{
int Temp;
int Heart,Sp02;
while(1)
{
printf("%d %d %d ",Temp,Heart,Sp02 );//每次循环都会更新这三个属性值,这里简写了
ESP8266_SendData(Temp,Heart,Sp02);//发送数据
}
}

void ESP8266_Clear(void)
{

memset(esp8266_buf, 0, sizeof(esp8266_buf));
esp8266_cnt = 0;

}

_Bool ESP8266_WaitRecive(void)
{

if(esp8266_cnt == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
	return REV_WAIT;
	
if(esp8266_cnt == esp8266_cntPre)				//如果上一次的值和这次相同,则说明接收完毕
{
	esp8266_cnt = 0;							//清0接收计数
		
	return REV_OK;								//返回接收完成标志
}
	
esp8266_cntPre = esp8266_cnt;					//置为相同

return REV_WAIT;								//返回接收未完成标志

}

_Bool ESP8266_SendCmd(char *cmd, char *res)
{

unsigned char timeOut = 200;

Usart_SendString(USART3, (unsigned char *)cmd, strlen((const char *)cmd));

while(timeOut--)
{
	if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
	{
		
		                     
		if(strstr((const char *)esp8266_buf, res) != NULL)		//如果检索到关键词
		{
			
			ESP8266_Clear();									//清空缓存
			
			return 0;
		}
	}
	
	delay_ms(10);
}

return 1;

}

void ESP8266_SendData(int Temp,int Heart,int Sp02)
{
char cmdBuf[512];

ESP8266_Clear();								//清空接收缓存

//先发送要发送数据的指令做准备

sprintf(cmdBuf, "AT+MQTTPUB=0,\"%s\",\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\":{\\\"Temp\\\":{\\\"value\\\":%d\\}\\,\\\"Heart\\\":{\\\"value\\\":%d\\}\\,\\\"Sp02\\\":{\\\"value\\\":%d\\}}}\",0,0\r\n",pubtopic,Temp,Heart,Sp02);		//发送命令



while(ESP8266_SendCmd(cmdBuf, "OK"))
delay_ms(500);
//printf("%d %d %d ",Temp,Heart,Sp02 );

memset(cmdBuf,0,sizeof(cmdBuf));
delay_ms(100);

}

void ESP8266_Init(void)
{

// GPIO_InitTypeDef GPIO_Initure;
//
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//ESP8266复位引脚

// GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Initure.GPIO_Pin = GPIO_Pin_13; //GPIOC13-复位
// GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOC, &GPIO_Initure);
//
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
// delay_ms(250);
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
// delay_ms(500);

ESP8266_Clear();

printf("0. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
	delay_ms(500);

printf("1. AT+RST\r\n");
while(ESP8266_SendCmd("AT+RST\r\n", ""))
	delay_ms(500);


printf("2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
	delay_ms(500);

printf( "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
	delay_ms(500);

printf("4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
	delay_ms(500);

printf( "5. MQTTUSERCFG\r\n");
while(ESP8266_SendCmd(ESP8266_USERCFG_INFO, "OK"))
	delay_ms(500);


printf( "6. MQTTCONN\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "OK"))
	delay_ms(500);

printf("7. ESP8266 Init OK\r\n");

}

void USART3_IRQHandler(void)
{

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断
{
	if(esp8266_cnt >= sizeof(esp8266_buf))	esp8266_cnt = 0; //防止串口被刷爆
	esp8266_buf[esp8266_cnt++] = USART3->DR;
	
	USART_ClearFlag(USART3, USART_FLAG_RXNE);
}

}

串口显示:
usart1_init_success
usart3_init_success
0. AT

  1. AT+RST
  2. CWMODE
  3. AT+CWDHCP
  4. CWJAP
  5. MQTTUSERCFG
  6. MQTTCONN
  7. ESP8266 Init OK
    24 425 -999

//串口调试助手显示0-7都以成功发送,但是进行到属性值上报时出现了错误,导致while循环不能进行下去

评论 (1)

小爷蜡笔大新 创建了任务
chao 添加协作者JohnYoung
展开全部操作日志

标准的OneJSON格式是这样的,我看您发送的at指令里面 没有version的属性,添加一下试一下呢,类似于下面这种,
{
"id": "123",
"version": "1.0",
"params": {
"Power": {
"value": "12345",
"time": 1599534283111
},
"temp": {
"value": 23.6,
"time": 1599534283111
}
}
}
如果还是不成功,建议登陆一下OneNET平台,查看设备日志信息,看一下是报的什么错误码。
输入图片说明

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
C
1
https://gitee.com/cmcc-oneos/OneOS.git
git@gitee.com:cmcc-oneos/OneOS.git
cmcc-oneos
OneOS
OneOS

搜索帮助