1.前言
    【2014年4月重写该博文】
    曾想使用STM32+LwIP实现一个yeelink应用,但是基础知识不够所以只能耐心学习。提到LwIP自然想到socket套接字,为了降低学习难度便从windwos平台的套接字开始入手。本文使用windows平台的套接字实现向eelink平台请求开关量状态,然后把HTTP响应打印至控制台。
    【相关博文】
    【 MinGW安装和使用总结 】
    【Yeelink Http请求格式分析】
    【Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32 】
2.运行
    【工作流程】    
    先看运行结果,大致的过程分为三块。第一部分,进行DNS地址解析;第二部分,发送HTTP请求;第三部分,接收HTTP响应
图1 运行结果
    【运行设置】
若使用minGW+eclipse开发方式,需要加入wsock32库,添加的方法如下:
图2 添加wsock32库

3.参考代码
int main(int argc, char **argv)
{WSADATA wsaData;int result_id;int socket_id;// HTTP请求char send_buf[] ="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";// HTTP响应char receive_buf[1024];struct hostent *yeelink_host; // yeelink主机DNS解析结构体char *host_name = "api.yeelink.net"; // yeelink域名struct in_addr yeelink_ipaddr; // yeelink IP地址struct sockaddr_in yeelink_sockaddr; // yeelink 连接套接字// Winsows下启用socketresult_id = WSAStartup(MAKEWORD(2, 2), &wsaData);if (result_id != 0) {printf("WSAStartup failed: %d\n", result_id);return 1;}// 第一步 DNS地址解析printf("calling gethostbyname with: %s\r\n", host_name);yeelink_host = gethostbyname(host_name);if (yeelink_host == NULL){// DNS解析失败printf("error\r\n");}else{// DNS解析正确yeelink_ipaddr.s_addr = *(u_long *) yeelink_host->h_addr_list[0];printf("Yeelink IP Address %s\r\n" , inet_ntoa(yeelink_ipaddr));}// 第二步 创建套接字socket_id = socket(AF_INET, SOCK_STREAM, 0);yeelink_sockaddr.sin_family = AF_INET;yeelink_sockaddr.sin_port = htons(80); // 设置端口号yeelink_sockaddr.sin_addr = yeelink_ipaddr; // 设置IP地址memset(&(yeelink_sockaddr.sin_zero), 0, sizeof(yeelink_sockaddr.sin_zero));// 第三步 连接yeelinkresult_id = connect( socket_id, (struct sockaddr *)&yeelink_sockaddr, sizeof(struct sockaddr));if( result_id == SOCKET_ERROR ){printf("connect ok\r\n");}printf("Http request:\r\n%s\r\n",send_buf);// 第四步 发送HTTP请求send(socket_id , send_buf,strlen(send_buf), 0);// 第五步 接收HTTP响应int bytes_received = 0;bytes_received = recv( socket_id , receive_buf , 1024 , 0);receive_buf[ bytes_received ] = '\0';printf("Receive Message:\r\n%s\r\n",receive_buf );closesocket(socket_id); // 关闭套接字WSACleanup(); // windows下释放套接字getchar(); // 保持控制台窗口return 0;
}
4.若干说明
    【关于HTTP请求】
        注意请求的最后部分一定是连续两组\r\n,如果查看相关文档的话,HTTP请求以一空行结束(\r\n),考虑到上一行的回车换行所以是两组\r\n。
    【关于struct in_addr】
        可理解为一个IP地址,一个IP地址为一个32位整数。
    【关于struct sockaddr_in】
        可理解为套接字信息,一个套接字可能包括目标IP地址、端口号和协议类型等信息。所以struct sockaddr_in要比struct in_addr所占的字节数更大一些。
    【关于struct hostent】
        保存DNS解析结果的结构体,其中最为关键的域名的P地址存于h_addr_list数组中,由于一个域名可能对应多个IP地址,可取h_addr_list数组中的第一个(下标为0)。
5.总结
    熟悉了windows环境下的套接字编程,那么借助RT Thread轻松实现STM32+LwIP的方式和yeelink交互数据。
6.参考资料
【Yeelink Http请求格式分析】
【Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32 】——后续博文

Yeelink平台查询开关量——套接字编程 Windows平台相关推荐

  1. Yeelink平台推送传感器结果——套接字编程 Windows平台

    1.前言     本文使用windows平台的socket套接字实现向yeelink平台推送传感器结果.     [相关博文]     [ MinGW安装和使用总结 ]     [Yeelink Ht ...

  2. Windows平台的原始套接字编程的知识点概要(备忘)

    其实从大学学习了C语言后,翻看整本教材只有C语言的语法,根本没有网络编程相关的任何内容,现在回想起来,都记不起自己何时在哪本书上学习了套接字编程,说起TCP.UDP,能知道他们的区别,相关的编程的&q ...

  3. 套接字编程(VC_Win32)

    简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以 ...

  4. IPv6套接字编程介绍

    IPv6套接字编程 1.概述 由于互联网用户的日益增加,网络需求日益扩大,IPv4地址也日益紧张.人们为了解决地址日趋耗尽的问题,采用了CIDR.NAT等技术来延缓地址耗尽的速度,但这并不能从根本上解 ...

  5. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

  6. MFC—windows套接字编程

    Windows 套接字编程 一.常见概念 1.Windows Sockets 规范 Windows Sockets 规范是 Windows 平台下定义的可以兼容二进制数据传输的网络编程接口,是基于伯克 ...

  7. 【C++】Winsock套接字编程,struct sockaddr、sockaddr_in,主机网络字节序

    前一篇关于windows平台下winsock套接字编程的相关api struct sockaddr与struct sockaddr_in 在bind函数,connect函数里提到了套接字编程网络地址信 ...

  8. WindowsSockets套接字编程学习-C语言

    Windows操作系统环境下的套接字编程主要步骤如下: 初始化WinSock的DLL动态链接库,使用WSAStartup函数. 创建套接字,进行地址.端口.协议等的绑定,涉及socket.bind函数 ...

  9. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

最新文章

  1. git fetch与git pull的区别
  2. 泰山服务器 oracle数据库,泰山之巅对话•Oracle数据库掌门人:领先对手10年?凭什么口气这么大?...
  3. React开发(231):常见手机号邮箱的正则
  4. 计算机科技新闻,新浪网_科技时代_计算机_新闻报道
  5. 将Activity启动模式说的明白一点
  6. php安装redis扩展模块,[教程]为PHP安装phpRedis扩展模块
  7. 程序员别埋头苦干了,花时间学点薪资谈判技巧多赚一个亿可好?
  8. 对xhtml、dhtml、shtml的解释说明
  9. Expo大作战(四十一)【完】--expo sdk 之 Assets,BarCodeScanner,AppLoading
  10. python登录微信pc版_详解PC端微信扫码注册和登录实例代码
  11. dble 不支持的关键字 mysql_分布式 | DBLE Release Notes 详细解读 2.19.11.0
  12. Python-OpenCV 的 remap函数
  13. 基于51单片机的万年历(包含闹钟,秒表)实现
  14. JQuery制作飘落的树叶动画效果
  15. junit-vintage-engine和junit-jupiter-engine之间的区别?
  16. 安卓手机使用LEAP企业Wifi网络(公司内部的证书方式)
  17. 设计模式之观察者模式 1
  18. python 笔记:dtw包
  19. Win11通过注册表修改文件默认打开方式
  20. MapInfo点符号的制作方法

热门文章

  1. PL/SQL(英文版)中如何改变 字体大小
  2. 预训练技术在美团到店搜索广告中的应用
  3. 破旧立新破解先有鸡还是先有蛋
  4. 中控考勤机通过公网添加入异地中控系统
  5. MAPICS系统简单概述(zt)
  6. 买了一台云服务器,到底能用来干嘛?
  7. Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
  8. 《测试开发方法论》之 未雨绸缪
  9. C++学习——cc1: all warnings being treated as errors 解决办法
  10. 如何正确计算并最大限度减小IGBT的死区时间