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

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

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

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

640.png

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

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

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

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

   接下来看以下请求数据:

//请求数据
char upload_data[] = 
{
 "----------------------------359443142220480708322079\r\n"
 "Content-Disposition: form-data; name=\"date\"\r\n\r\n"
 "%s"
 "\r\n----------------------------359443142220480708322079\r\n"
 "Content-Disposition: form-data; name=\"text1\"\r\n\r\n"
 "%s"
"\r\n----------------------------359443142220480708322079\r\n"
"Content-Disposition: form-data; name=\"place\"\r\n\r\n"
"%s"
"\r\n----------------------------359443142220480708322079--\r\n"
};

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

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

//打包HTTP头 
 int Head_Package(const char *server_ip,int port_num,int ContentLength,char *out_data)
 {
     int len = 0 ;
     char *up_head = NULL ;
     if(NULL == server_ip || NULL == out_data)
         return -1 ;
     if(ContentLength < 0 || port_num < 0)
         return -2 ;
    up_head = MALLOC(DATE_LEN);
    if(NULL != up_head)
    snprintf(up_head,DATE_LEN,upload_head,server_ip,port_num,ContentLength);
    if(NULL != out_data)
        sprintf(out_data,"%s",up_head);
    else
        return -3 ;
    len = strlen(up_head);
    FREE(up_head);
    return len;
}

打包HTTP数据包:

//打包HTTP数据 
 int Data_Package(const char *date,const char *text1,const char *place,char *out_data)
 {
     int len = 0 ;
     char *up_data = NULL ; 
     if(NULL == date || NULL == text1 || NULL == place || NULL == out_data)
         return -1 ;
     up_data = MALLOC(DATE_LEN);
     if(NULL != up_data)
    snprintf(up_data,DATE_LEN,upload_data,date,text1,place);
    if(NULL != out_data)
        sprintf(out_data,"%s",up_data);
    else
        return -2 ;
    len = strlen(up_data);
    FREE(up_data);
    return len;
}

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

#define MALLOC(x) malloc(x)
#define FREE(x) free(x)
#define TOTAL_DATA_LEN 1500
#define MAX_DATA_LEN  2048
#define DATE_LEN 512

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

//HTTP数据上传 
 int Http_Data_Upload(char *server_ip,int port_num,char *time,char *text1,char *place,char *out_buffer)
 {
     int ContentLength = 0 ;
     char *http_head = NULL ;
     char *http_data = NULL ;
     char *upload_http_data = NULL ;
     http_head = MALLOC(DATE_LEN);
     if(NULL == http_head)
        return -1 ;
    http_data = MALLOC(DATE_LEN);
    if(NULL == http_data)
        return -2 ;
    upload_http_data = MALLOC(TOTAL_DATA_LEN);
    if(NULL == upload_http_data)
        return -3 ;
    ContentLength = Data_Package(time,text1,place,http_data);
    Head_Package(server_ip,port_num,ContentLength,http_head);
    sprintf(upload_http_data,"%s%s",http_head,http_data);
    sprintf(out_buffer,"%s",upload_http_data);
    FREE(http_head);
    FREE(http_data);
    FREE(upload_http_data);
    return 0 ;
}

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

void ESP8266_StaTcpClient_UnvarnishTest ( void )
 {
     char *upload_http_data = NULL ;
     char *http_hex_data = NULL ;
     upload_http_data = malloc(TOTAL_DATA_LEN);
     if(NULL == upload_http_data)
         return ;
     http_hex_data = malloc(MAX_DATA_LEN);
     if(NULL == http_hex_data)
        return ;
    //给ESP8266上电
    macESP8266_CH_ENABLE();
    //测试模块是否已经启动
    ESP8266_AT_Test ();
    //设置模式为STA
    ESP8266_Net_Mode_Choose ( STA );
    //连接热点
  while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );
    //关闭多连接
    ESP8266_Enable_MultipleId ( DISABLE );
    //连接服务器IP以及端口号
    while ( !   ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );
    //开启透传模式
    while ( ! ESP8266_UnvarnishSend () );
    printf ( "\r\n配置 ESP8266 完毕\r\n" );
    while ( 1 )
    {       
        memset(upload_http_data,0,strlen(upload_http_data));
        //封装HTTP头以及数据
        Http_Data_Upload(SERVER_IP,SERVER_PORT,"2017/08/15 12:20","12345678910","114.0925,225.3369",upload_http_data);
        //获得要上传的HTTP数据
        Get_Hex_Http_Packet_Data(upload_http_data,http_hex_data);
        printf("%s\n",upload_http_data);
        //通过WIFI透传的形式将数据发送到服务器
        ESP8266_SendString ( ENABLE, upload_http_data, 0, Single_ID_0 );               //发送http数据
        Delay_ms (5000);
    }
}

在主函数中调用它:

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

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

640.jpg

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

优质嵌入式学习干货推荐:包括ARM裸机开发、Linux设备驱动程序、Linux应用程序开发、Android系统学习、Linux设备树等。

目录
相关文章
|
4月前
|
网络协议 关系型数据库 应用服务中间件
如何迁移网站数据到新的服务器
迁移网站数据到新服务器是一个系统化的过程,需谨慎操作以避免数据丢失或服务中断。小编为您整理发布如何迁移网站数据到新的服务器,以下是详细步骤和注意事项。
|
3月前
|
存储 安全 数据管理
服务器违规资源被删,数据定时备份OSS 云存储才是 “救命稻草”
在数字化时代,数据已成为企业与个人的核心资产。然而,服务器违规、硬件故障等问题频发,导致数据丢失、业务中断,甚至造成不可挽回的损失。为保障数据安全与业务连续性,定时备份至关重要。阿里云国际站OSS提供高效、可靠的云存储解决方案,支持自动定时备份,帮助用户轻松应对数据风险。本文详解OSS备份操作步骤与注意事项,助你为数据穿上“防护甲”,实现安全无忧存储。
|
5月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
260 18
|
5月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
294 14
|
4月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
5月前
|
弹性计算 安全
阿里云服务器镜像,快速迁移项目数据
有时候旧服务器快到期了,想把项目、数据、软件挪到新服务器上,如果全部重新搭建的话,那无疑是耗时又费力。有了镜像迁移,就方便了许多。
458 1
|
4月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
365 0
|
6月前
|
弹性计算 NoSQL 数据库
阿里云服务器如何备份数据?
阿里云服务器数据备份有多种方法,用户可按需选择。主要方式包括:1)快照备份,创建云盘的时间点拷贝,支持定期备份与数据恢复;2)数据库备份DBS,适用于多种环境的数据库备份,涵盖本地及多云场景;3)云备份Cloud Backup,提供统一灾备平台,支持ECS整机、数据库、文件系统等全方位备份,保障数据安全。
|
25天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
183 10
|
23天前
|
运维 安全 Ubuntu
阿里云渠道商:服务器操作系统怎么选?
阿里云提供丰富操作系统镜像,涵盖Windows与主流Linux发行版。选型需综合技术兼容性、运维成本、安全稳定等因素。推荐Alibaba Cloud Linux、Ubuntu等用于Web与容器场景,Windows Server支撑.NET应用。建议优先选用LTS版本并进行测试验证,通过标准化镜像管理提升部署效率与一致性。

热门文章

最新文章