ESP8266透传:利用STM32f103zet6发送数据到HTTP服务器
微信公众号:morixinguan
关注可了解更多的教程。问题或建议,请公众号留言;
如果你觉得本文对你有帮助,欢迎赞赏
合作请点击公众号菜单中的合作机会后选择商务合作,或者投稿文章请点击合作机会的投稿文章。
关于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
2
3
4
5
将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}
最后在我的后台可以成功的看见我的数据成功上传:
当然,本文仅仅只是为了测试这个模块是否能够正常将数据上传,并没有做过多的考虑,仅供参考;真正应用需要根据实际产品需求以及业务需求去做设计。
优质嵌入式学习干货推荐:包括ARM裸机开发、Linux设备驱动程序、Linux应用程序开发、Android系统学习、Linux设备树等。
长期商务合作服务:
本公众号以及本人在圈子里有很多的人流量,如需定期产品推广,货源代销等可关注微信公众号<<安立顺产品服务>>,我们可以用这个公众号来帮你赚更多的钱。
联系人:深圳安立顺技术研发事业群总经理 杨源鑫