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

原创 2013年12月03日 15:21:03

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下启用socket
    result_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));
    // 第三步 连接yeelink
    result_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 】——后续博文

ESP8266接入Yeelink平台

很早就了解了物联网云平台Yeelink,一直没有实践一把。最近有个项目用到了安信可科技的ESP8266模组,强大的ESP8266片上搭载ESP32,内置TCP/IP协议。不仅可以实现局域网内数据的无线...

MinGW安装和使用总结

0.前言 最近对开源编译平台和编译器产生了兴趣,借博客平台总结一些东西(包括minGW,eclipse,sourcery和GDB调试等内容)。总感觉时间一长某些东西自己都会忘记,过段时间回头看看自己的...

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

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

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

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

【Socket编程】套接字Windows平台C语言实现

Socket API在windows平台下的基础代码。

Windows Socket 网络编程—— 套接字编程原理

转载自VC: 一、客户机/服务器模式 在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等...

网络编程(42)—— windows平台下创建线程的四种方法(一)

一、引言        接下来,笔者主要谈下Windows平台下多线程的用法。首先,要强调一点,Windows平台的线程linux中的线程不同,它会伴着主函数的结束而销毁。Windows平台下可用的创...

网络编程(45)—— windows平台下销毁线程的四种方法

原文出自:http://www.cnblogs.com/goalone1985/articles/2126420.html 终止线程运行   若要终止线程的运行,可以使用下面的方法:   • 线程函...

网络编程(48)—— windows平台下的四种线程同步技术(二)

四、内核同步对象—— 互斥(Mutex)         内核线程同步对象包括互斥、信号量和事件,它们使用时存在很多共通之处。下面先介绍在Windows平台利用互斥进行线程的同步。 HANDLE ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Yeelink平台查询开关量——套接字编程 Windows平台
举报原因:
原因补充:

(最多只允许输入30个字)