Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

本文介绍如何利用STM32微控制器通过LwIP协议栈与Yeelink平台进行数据交互。通过RT-Thread操作系统简化了网络协议栈移植工作,并详细展示了通过SPI接口的ENC28J60网卡芯片实现HTTP请求与响应的过程。

1.前言

【2014年4月重写该博文】
经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Thread的帮助下却很快实现了yeelink平台的应用。
【选择STM32理由】
1.常用的32位MCU,Cortex-M3内核,运算速度快,RAM和FLASH容量较大。
2.价格便宜,很容易买到。
【选择RT-Thread理由】
1.RT-Thread具有丰富的组件包括LwIP,省去了移植网络协议栈的困扰。
【网卡芯片ENC28J60】
1.SPI接口,占用较少的GPIO,适合引脚数较少的MCU。
2.价格便宜,容易买到。

2.有用的资料

代码仓库
代码仓库位于优快云 Code,方便交流。
【相关博文】
Yeelink平台查询开关量——套接字编程 Windows平台】——如果还不熟悉RT-Thread或者socket的话,试试这个吧。
【平台说明】
RT-Thread版本1.2.0
编译器版本:IAR EWARM 6.5

3.参考代码

#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 );
    }
}

4.总结

千辛万苦尝试LwIP+Yeelink,但是最终实现起来却非常简单。接下来可以尝试使用Yeelink做一些具体的应用,初步想法做一个智能鱼缸,希望前面的道路可以顺利一些。呵呵,前段时间初犯高血压每天头都很疼但是白天还是要坚持写代码;最近面试某家物联网公司,结果非常糟糕原因是自己水平不够,看来我也需要好好努力了!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值