LwIP+ STM32+HTTP例程参考

本文介绍了一个基于RT-Thread操作系统的嵌入式设备如何通过TCP协议与远程服务器进行通信。具体实现了DNS解析、套接字创建、连接建立、HTTP请求发送及响应接收的全过程,并展示了如何解析HTTP响应内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <RTL.h>

#include <rtthread.h>
#include <lwip/netdb.h>
#include <lwip/sockets.h>
#include <led.h>
// Http请求内容
static const char send_data[] =
"GET /v1.0/device/1949/sensor/2511/datapoints HTTP/1.1\r\n"
"U-ApiKey:[your apikey]\r\n"
"Host: api.yeelink.net\r\n\r\n";
void tcpclient(const char* host_name, int port)
{
(void)port;

char *recv_data;
int sock, bytes_received;

struct hostent *yeelink_host;
struct in_addr yeelink_ipaddr;
struct sockaddr_in yeelink_sockaddr;

recv_data = rt_malloc(1024);
if (recv_data == RT_NULL)
{
rt_kprintf("No memory\r\n");
return;
}
// 第一步 DNS地址解析
rt_kprintf("calling gethostbyname with: %s\r\n", host_name);
yeelink_host = gethostbyname(host_name);
yeelink_ipaddr.s_addr = *(unsigned long *) yeelink_host->h_addr_list[0];
rt_kprintf("Yeelink IP Address:%s\r\n" , inet_ntoa(yeelink_ipaddr));


yeelink_sockaddr.sin_family = AF_INET;
yeelink_sockaddr.sin_port = htons(80);
yeelink_sockaddr.sin_addr = yeelink_ipaddr;
rt_memset(&(yeelink_sockaddr.sin_zero), 0, sizeof(yeelink_sockaddr.sin_zero));

while(1)
{
// 第二步 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
rt_kprintf("Socket error\n");
rt_free(recv_data);
return;
}

// 第三步 连接yeelink
if (connect(sock, (struct sockaddr *)&yeelink_sockaddr, sizeof(struct sockaddr)) == -1)
{
rt_kprintf("Connect fail!\n");
lwip_close(sock);
rt_free(recv_data);
return;
}

// 第4步 发送Http请求
send(sock,send_data,strlen(send_data), 0);

// 第5步 获得Http响应
bytes_received = recv(sock, recv_data, 1024 - 1, 0);
recv_data[bytes_received] = '\0';

// 响应内容为 {"timestamp":"2013-11-19T08:50:11","value":1}
// 截取“value”之后的内容
char* actuator_info = rt_strstr( recv_data , "\"value\"");
int offset = rt_strlen("\"value\":");
actuator_status = *(actuator_info + offset);
rt_kprintf("actuator status :%c\r\n",actuator_status);

// 获得开关状态,并设置LED指示灯
char actuator_status;
(actuator_status == '1')?rt_hw_led_on(0):rt_hw_led_off(0);

rt_memset(recv_data , 0 , sizeof(recv_data));

// 关闭套接字
closesocket(sock);

// 延时5S之后重新连接
rt_thread_delay( RT_TICK_PER_SECOND * 5 );
}
}
---------------------
作者:Lolwuj
来源:优快云
原文:https://blog.youkuaiyun.com/mikewu_helloworld/article/details/52769650
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/wdy0505/p/10096033.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值