提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
新手小白在用新版STM32往新版ONENET上传输数据上遇到了很多问题,希望我的解决办法对大家有帮助!!!
参考博客:
物联网开发esp8266通过HTTP协议连接新版onenet云平台(一)_onenetesp8266-CSDN博客
2-STM32+ESP8266连接onenet并上传数据(HTTP)_stm32 esp8266 http-CSDN博客
一、ONENET注册和设备创建
这部分的教程网络上很多,本文不再论述。
二、STM32+ESP8266向ONENET发送数据
1.配置ESP8266 AT指令
1.检查是否正常,正常返回OK
2.设置Station模式,返回OK
3.ESP8266复位,返回OK
4.连接WIFI,AT+CWJAP=“WIFIName”,“Password”,返回 WIFI GOT IP
5.设置单连接模式,返回OK
6.设置SSL大小,返回OK
7.连接SSL,返回CONNECT
8.进入透传模式(AT+CIPMODE=1 返回OK,AT+CIPSEND返回 >)
9.传输数据包写入数据
AT
AT+CWMODE=1
AT+RST
AT+CWJAP="WIFIName","Password"
AT+CIPMUX=0
AT+CIPSSLSIZE=4096
AT+CIPSTART="SSL","open.iot.10086.cn",443
AT+CIPMODE=1
AT+CIPSEND
至此我们已经进入ESP8266透传模式,下面就发送数据包
2.数据包发送
Http数据包格式如下:
POST /fuse/http/device/thing/property/post?topic=$sys/产品ID(用户修改)/设备ID(用户修改)/thing/property/post&protocol=http HTTP/1.1
Host: open.iot.10086.cn
Content-Type: application/json
Token: 用户Token
Content-Length: 60
{"id":"123","version":"1.0","params":{"photo":{"value":66}}}
注意:id version应该是不变的,然后photo是我设备的物理模型中属性的标识符,用户根据自己设置的参数自己修改。
用户Token获取:
使用MQTT.fx客户端连接OneNet(token算法的et参数的获取)_onenet mqtt token-CSDN博客
下面给出STM32的代码
板子是正点原子的STM32F407探索者,ESP也是正点原子的ATK_ESP8266
##参数宏定义
#define DEVID ""
#define PROID ""
#define APIKEY ""
#define TOKEN ""
#define http_uploader_head \
"POST /fuse/http/device/thing/property/post?topic=$sys/%s/%s/thing/property/post&protocol=http HTTP/1.1\r\n" \
"Host: open.iot.10086.cn\r\n" \
"Content-Type: application/json\r\n" \
"Token:%s\r\n" \
"Content-Length:%d\r\n\r\n"
#define http_uploader_data \
"{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"photo\":{\"value\":%d}}}\r\n"
##ESP8266连接WIFI
uint8_t atk_8266_wifista_config(void)
{
uint8_t ret;
ret = atk_mw8266d_init(115200);
if (ret != 0)
{
printf("ATK-MW8266D init failed!\r\n");
return 1;
}
printf("Joining to AP...\r\n");
ret = atk_mw8266d_restore(); /* 恢复出厂设置 */
ret += atk_mw8266d_at_test(); /* AT测试 */
ret += atk_mw8266d_set_mode(1); /* Station模式 */
ret += atk_mw8266d_sw_reset(); /* 软件复位 */
ret += atk_mw8266d_ate_config(0); /* 关闭回显功能 */
ret += atk_mw8266d_join_ap(DEMO_WIFI_SSID, DEMO_WIFI_PWD); /* 连接WIFI */
if (ret != 0)
{
printf("Error to join ap!\r\n");
return 1;
}
return 0;
}
##连接SSL服务器
uint8_t atk_mw8266d_connect_ssl_server(char *server_ip, char *server_port)
{
uint8_t ret;
char cmd[64];
sprintf(cmd, "AT+CIPSTART=\"SSL\",\"%s\",%s", server_ip, server_port);
ret = atk_mw8266d_send_at_cmd(cmd, "CONNECT", 5000);
if (ret == ATK_MW8266D_EOK)
{
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
}
##进入透传模式
uint8_t atk_mw8266d_enter_unvarnished(void)
{
uint8_t ret;
ret = atk_mw8266d_send_at_cmd("AT+CIPMODE=1", "OK", 500);
ret += atk_mw8266d_send_at_cmd("AT+CIPSEND", ">", 500);
if (ret == ATK_MW8266D_EOK)
{
return ATK_MW8266D_EOK;
}
else
{
return ATK_MW8266D_ERROR;
}
}
##连接OneNet
uint8_t ConnectO(void)
{
uint8_t res;
res=atk_8266_wifista_config();
if(res == 1)
{
printf("WIFI Connect Fail!\n");
return 1;
}
printf("WIFI Connect Success!\n");
res += atk_mw8266d_send_at_cmd("AT+CIPMUX=0","OK",3000);
res += atk_mw8266d_send_at_cmd("AT+CIPSSLSIZE=4096","OK",3000);
res += atk_mw8266d_connect_ssl_server(ONENET_SERVERIP,ONENET_SPORTNUM);
if(res == 1)
{
printf("Connect Fail!\n");
return 1;
}
printf("Connect Success!\n");
delay_ms(300);
atk_mw8266d_uart_rx_restart();
res += atk_mw8266d_enter_unvarnished();
if (res == 0)
{
printf("Enter unvarnished!\r\n");
}
return 0;
}
##Http数据包准备
##参数,产品id,设备id,token,要发送的数值
void Onenet_Packet_Send(const char *product_id,const char *device_id,const char *token,uint8_t value)
{
int len = 0;
char buf[512] = {0};
char buf_data[120] = {0};
sprintf(buf_data,http_uploader_data,value);
len = strlen(buf_data);
sprintf(buf,http_uploader_head,product_id,device_id,token,len);
strcat(buf,buf_data);
printf("数据包:\n");
printf("%s",buf);
atk_mw8266d_uart_printf(buf);
}
##发送数据
void Onenet_SendData(uint8_t data)
{
Onenet_Packet_Send(PROID,DEVID,TOKEN,data);
}
##主函数只需要调用
ConnectO();
Onenet_SendData(0x88);
三、运行结果:
正点原子串口打印数据
OneNet
总结
如果需要完整代码,请评论区自取。