最近要实现一个使用stm32F4通过http向服务器定时传送数据的功能。好吧,http是啥都不知道,慢慢来折腾。
第一步、首先实现http client连接服务器
经过一番请教及百度,大致了解了http连接服务器,其实可以看作tcp连接服务器的过程,tcp握手连接完成后,使用http规定的报文格式向服务器传送数据,这样一个http client 向客户端发送数据的功能就基本实现了。
tcp client的例程比较多,下了个原子哥的tcp client 例程,简单加以修改。
完整代码下载连接://download.csdn.net/download/pwbhbh/12538733
源码1:
/**
*@brief OneNet 数据打包函数
*@param 无
*@return 无
*/
uint16_t HTTP_PostPkt(void)
{
u16 len = 0;
strcat(Http_Sendbuffer, "POST http://www.????? HTTP/1.1\r\n"); //post方式,
strcat(Http_Sendbuffer, "Content-Type: text/plain\r\n");
strcat(Http_Sendbuffer, "cache-control: no-cache\r\n");
strcat(Http_Sendbuffer, "Connection: close\r\n");
strcat(Http_Sendbuffer, "\r\n");
len = strlen(Http_Sendbuffer);
for(u8 i =0; i < 55; i++)Http_Sendbuffer[len+i] = Sendbuff_Sensor[i]; //55是我自己设置的数据长度
len = len+55;
return len;
}void SendData_Handle(void)
{
//要发送数据的数据处理函数
}
//设置远端IP地址
void tcp_client_set_remoteip(void)
{
/* DNS解析成功 */
if(GetHttpServerIPfromDNS_Flag)
{
/* 将目标服务器的IP写入一个结构体*/
IP4_ADDR(&rmtipaddr,HttpServerIPfromDNS[0],HttpServerIPfromDNS[1],HttpServerIPfromDNS[2],HttpServerIPfromDNS[3]);
}
else /* DNS解析失败 */
{
IP4_ADDR(&rmtipaddr,HttpServerIPfromLocal[0],HttpServerIPfromLocal[1],HttpServerIPfromLocal[2],HttpServerIPfromLocal[3]);
}
}
//TCP Client 测试
void tcp_client_test(void)
{
struct tcp_pcb *tcppcb; //定义一个TCP服务器控制块
u8 res=0;
tcppcb=tcp_new(); //创建一个新的pcb
if(tcppcb) //创建成功
{
tcp_client_set_remoteip(); //选择远端主机IP
/* 绑定本地端号和IP地址 */
tcp_bind(tcppcb,IP_ADDR_ANY,TCP_HTTP_CLIENT_PORT);
/* 与目标服务器进行连接,参数包括了目标端口和目标IP */
tcp_connect(tcppcb,&rmtipaddr,TCP_HTTP_CLIENT_PORT,tcp_client_connected);
}
else res=1;
delay_ms(15);
SendData_Handle(); /*数据赋值处理*/
memset(Http_Sendbuffer,0,512);
Length = HTTP_PostPkt();
while(res==0)
{
res = 1 ;
if(tcp_client_flag&1<<6)//是否收到数据?
{
printf("Http received \r\n");
tcp_client_flag&=~(1<<6);//标记数据已经被处理了.
}
if(tcp_client_flag&1<<5)//是否连接上?
{
printf("Http connect succeed. Sending data......\r\n");
tcp_client_usersent(tcppcb,Http_Sendbuffer,Length); //发送HTTP数据
}
else
{
printf("Http connect failed. \r\n");
}
}
delay_ms(2);
tcp_client_connection_close(tcppcb,es);//关闭TCP Client连接
lwip_periodic_handle();
}