STM32F4+ESP8266连接新版ONENET并发送数据(HTTP协议)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

新手小白在用新版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

总结

如果需要完整代码,请评论区自取。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值