首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266透传:利用STM32f103zet6发送数据到HTTP服务器

ESP8266透传:利用STM32f103zet6发送数据到HTTP服务器

作者头像
杨源鑫
发布2019-07-04 15:56:24
4K0
发布2019-07-04 15:56:24
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈

关于ESP8266,网上的程序控制例程也很多,这里就不详细写出来。这节我们来写写怎么编写一个应用程序,打包HTTP格式的数据并传递到HTTP服务器,定义格式如下:

HTTP POST请求,格式为from-data,也就是表单格式:

主要包括date、text1、place三个字段,分别代表日期和时间,序号,位置。

有了以上这三个字段,我们很容易就可以用C语言封装出两个字符串数组,一个用来表示HTTP请求头、一个用来表示HTTP请求数据包。

1//请求头部
2char upload_head[] =
3"POST /api/upload/messages HTTP/1.1\r\n"
4"Host: %s:%d\r\n"
5"content-type: multipart/form-data; boundary=--------------------------359443142220480708322079\r\n"
6"content-length: %d\r\n\r\n";

其中,Host对应后面的%s:%d表示HTTP服务器的地址以及端口号,这是需要通过用户写入的。content-length后的%d也是需要用户自行填写,表示请求数据的长度,这个也需要用户去计算,因为上传的数据大小会随着表单数据大小而改变。

接下来看以下请求数据:

 1//请求数据
 2char upload_data[] = 
 3{
 4"----------------------------359443142220480708322079\r\n"
 5"Content-Disposition: form-data; name=\"date\"\r\n\r\n"
 6"%s"
 7"\r\n----------------------------359443142220480708322079\r\n"
 8"Content-Disposition: form-data; name=\"text1\"\r\n\r\n"
 9"%s"
10"\r\n----------------------------359443142220480708322079\r\n"
11"Content-Disposition: form-data; name=\"place\"\r\n\r\n"
12"%s"
13"\r\n----------------------------359443142220480708322079--\r\n"
14};

这里的三个%s分别代表日期和时间、序号、位置,需要用户自行填写。

接下来分别写一个函数用来打包HTTP头以及HTTP数据,打包HTTP头:

 1//打包HTTP头 
 2int Head_Package(const char *server_ip,int port_num,int ContentLength,char *out_data)
 3{
 4    int len = 0 ;
 5    char *up_head = NULL ;
 6    if(NULL == server_ip || NULL == out_data)
 7        return -1 ;
 8    if(ContentLength < 0 || port_num < 0)
 9        return -2 ;
10    up_head = MALLOC(DATE_LEN);
11    if(NULL != up_head)
12    snprintf(up_head,DATE_LEN,upload_head,server_ip,port_num,ContentLength);
13    if(NULL != out_data)
14        sprintf(out_data,"%s",up_head);
15    else
16        return -3 ;
17    len = strlen(up_head);
18    FREE(up_head);
19    return len;
20}

打包HTTP数据包:

 1//打包HTTP数据 
 2int Data_Package(const char *date,const char *text1,const char *place,char *out_data)
 3{
 4    int len = 0 ;
 5    char *up_data = NULL ; 
 6    if(NULL == date || NULL == text1 || NULL == place || NULL == out_data)
 7        return -1 ;
 8    up_data = MALLOC(DATE_LEN);
 9    if(NULL != up_data)
10    snprintf(up_data,DATE_LEN,upload_data,date,text1,place);
11    if(NULL != out_data)
12        sprintf(out_data,"%s",up_data);
13    else
14        return -2 ;
15    len = strlen(up_data);
16    FREE(up_data);
17    return len;
18}

其中MALLOC、FREE、DATE_LEN分别为以下宏定义:

1#define MALLOC(x) malloc(x)
2#define FREE(x) free(x)
3#define TOTAL_DATA_LEN 1500
4#define MAX_DATA_LEN  2048
5#define DATE_LEN 512

将HTTP头和数据封装成一个函数:

 1//HTTP数据上传 
 2int Http_Data_Upload(char *server_ip,int port_num,char *time,char *text1,char *place,char *out_buffer)
 3{
 4    int ContentLength = 0 ;
 5    char *http_head = NULL ;
 6    char *http_data = NULL ;
 7    char *upload_http_data = NULL ;
 8    http_head = MALLOC(DATE_LEN);
 9    if(NULL == http_head)
10        return -1 ;
11    http_data = MALLOC(DATE_LEN);
12    if(NULL == http_data)
13        return -2 ;
14    upload_http_data = MALLOC(TOTAL_DATA_LEN);
15    if(NULL == upload_http_data)
16        return -3 ;
17    ContentLength = Data_Package(time,text1,place,http_data);
18    Head_Package(server_ip,port_num,ContentLength,http_head);
19    sprintf(upload_http_data,"%s%s",http_head,http_data);
20    sprintf(out_buffer,"%s",upload_http_data);
21    FREE(http_head);
22    FREE(http_data);
23    FREE(upload_http_data);
24    return 0 ;
25}

接下来编写一个简单的函数来进行测试:

 1void ESP8266_StaTcpClient_UnvarnishTest ( void )
 2{
 3    char *upload_http_data = NULL ;
 4    char *http_hex_data = NULL ;
 5    upload_http_data = malloc(TOTAL_DATA_LEN);
 6    if(NULL == upload_http_data)
 7        return ;
 8    http_hex_data = malloc(MAX_DATA_LEN);
 9    if(NULL == http_hex_data)
10        return ;
11    //给ESP8266上电
12    macESP8266_CH_ENABLE();
13    //测试模块是否已经启动
14    ESP8266_AT_Test ();
15    //设置模式为STA
16    ESP8266_Net_Mode_Choose ( STA );
17    //连接热点
18  while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );
19    //关闭多连接
20    ESP8266_Enable_MultipleId ( DISABLE );
21    //连接服务器IP以及端口号
22    while ( !   ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
23    //开启透传模式
24    while ( ! ESP8266_UnvarnishSend () );
25    printf ( "\r\n配置 ESP8266 完毕\r\n" );
26
27    while ( 1 )
28    {       
29        memset(upload_http_data,0,strlen(upload_http_data));
30        //封装HTTP头以及数据
31        Http_Data_Upload(SERVER_IP,SERVER_PORT,"2017/08/15 12:20","12345678910","114.0925,225.3369",upload_http_data);
32        //获得要上传的HTTP数据
33        Get_Hex_Http_Packet_Data(upload_http_data,http_hex_data);
34        printf("%s\n",upload_http_data);
35        //通过WIFI透传的形式将数据发送到服务器
36        ESP8266_SendString ( ENABLE, upload_http_data, 0, Single_ID_0 );               //发送http数据
37        Delay_ms (5000);
38    }
39}

在主函数中调用它:

 1/**
 2  * @brief  主函数
 3  * @param  无
 4  * @retval 无
 5  */
 6int main ( void )
 7{
 8  USARTx_Config ();                                                              //初始化串口1
 9    SysTick_Init ();                                                               //配置 SysTick 为 1ms 中断一次 
10    ESP8266_Init ();                                                               //初始化WiFi模块使用的接口和外设
11  ESP8266_StaTcpClient_UnvarnishTest ();
12  while ( 1 );
13}

最后在我的后台可以成功的看见我的数据成功上传:

当然,本文仅仅只是为了测试这个模块是否能够正常将数据上传,并没有做过多的考虑,仅供参考;真正应用需要根据实际产品需求以及业务需求去做设计。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式开发圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档