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.有用的资料

    【代码仓库】
    代码仓库位于CSDN Code,方便交流。请不要使用任何版本的IE浏览器打开代码仓库,请使用谷歌或者火狐浏览器,如果使用国产双核浏览器,请切换至极速模式。在博客和代码仓库留言中我经常发现无法下载代码的情况,我再windows和ubuntu中反复实验始终没有问题,后来才才发现我除了买火车票之外从来不用IE浏览器,而很多网友使用了低版本的IE浏览器,低版本的IE浏览器正是问题所在。
    【相关博文】
    【Yeelink Http请求格式分析】
    【Yeelink平台查询开关量——套接字编程 Windows平台】——如果还不熟悉RT-Thread或者socket的话,试试这个吧。
    【平台说明】
    RT-Thread版本1.2.0
    编译器版本:IAR EWARM 6.5
    【操作说明】

【1.1】请务必修改Http请求内容——见tcpclient_yeelink.c,包括设备编号,传感器编号和用户API

    【1.2】请详细核对ENC28J60相关接口,包括SPI接口,中断接口,相关时钟等。请认真修改enc28j60.c和stm32f10x_it.c中相关函数。如果SPI总线上还有其他设备,请务必确认该从设备CS端口存在上拉电阻或把与CS端口连接的GPIO端口配置为输出高电平。
    【1.3】由于ENC28J60无法自动识别交叉线和非交叉线,请把目标板连接路由器。
    【1.4】如果您还是学生,并且您所在的高校需要通过网页拨号上网,你可能无法成功运行以下代码。我只能说一声抱歉了。

    【2】请务必修改目标板IP地址(路由器地址和子网掩码),默认的IP地址为192.168.1.30——见rtconfig.h,目标板并没有打开DHCP。
#define RT_LWIP_IPADDR0192
#define RT_LWIP_IPADDR1168
#define RT_LWIP_IPADDR2 1 
#define RT_LWIP_IPADDR3 30

【3】请先查看目标板IP地址,建议使用putty。待目标板启动之后按下tab键,可查看目标板支持的指令。之后输入list_ip()——查看目标板IP地址相关信息,等同于windows中的ipconfig和linux中的ifconfig。

图1 按下TAB键
图2 查看IP地址
【4】输入httpclient() 执行HTTP请求。仅执行一次HTTP请求。
图3 HTTP请求结果
【5】代码以CSDN代码仓库为准

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;}// 第三步 连接yeelinkif (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做一些具体的应用,初步想法做一个智能鱼缸,希望前面的道路可以顺利一些。

Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32相关推荐

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

    1.前言     [2014年4月重写该博文]     曾想使用STM32+LwIP实现一个yeelink应用,但是基础知识不够所以只能耐心学习.提到LwIP自然想到socket套接字,为了降低学习难 ...

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

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

  3. 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合

    让嵌入式想java一样一处编写到处运行 第一次写博客,其实接触嵌入式已经快两年了,从开始学51单片机的时候,怀着满腔的热情.写出了点亮第一个流水灯代码的时候那个无比的激动,到后面自己做许多有趣的东西( ...

  4. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  5. ESP8266接入Yeelink平台

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

  6. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  7. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  8. xpt 2046的触摸屏 rt thread设备驱动框架

    1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...

  9. 使用RT Thread设备框架封装一个I2C设备——DS3231

    使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...

最新文章

  1. 关于 0xCCCCCCCC
  2. MySQL—03—MySQL的查询
  3. 数值数据表示的三要素
  4. 下列选项中 采用边界值平滑_使用Illustrator中的混合工具创建很有个性的蛋宝宝...
  5. java intbyreference_java并发包(1)-AtomicReference和AtomicStampedReference
  6. 基础野:细说原码、反码和补码
  7. Spring Boot –如何跳过缓存thyemeleaf模板,js,css等以每次绕过重启服务器
  8. 算法章节 递归、排序、⼆分查找
  9. VS2008下直接安装使用Boost库1 46 1版本
  10. MySql 一条普通的查询语句 你知道需要执行几次树的搜索操作以及会扫描多少行吗??? MySql 索引覆盖
  11. CSS——FC(BFC/IFC/FFC/GFC)超详细版+原理案例分析
  12. Excel 使用技巧之 -- 统计、过滤与引用数据
  13. 【数据结构】分治代码模板
  14. DL加速器与GPU的不同,一个用于推理,一个用于训练。
  15. .atitit.web 推送实现解决方案集合(3)----dwr3 Reverse Ajax
  16. 项目管理系统与项目管理信息系统与配置管理系统与变更控制系统的区别
  17. 利用edge模拟ie8浏览器环境
  18. 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系
  19. RK3399外设驱动之RTC驱动(一)
  20. oblog商业版本4.6注射漏洞,直接拿管理员

热门文章

  1. 计算机未响应硬盘,我的电脑是固态硬盘加机械硬盘的混合硬盘,运行win8.1的时候经常遇到卡死,未响应的情况。...
  2. 办公室常用赞美英语经典句子
  3. 技多不压身,史上最全IT学习视频高清全集
  4. 基于MATLAB的动态前景目标特征提取与运动跟踪
  5. 两个辅助变量挖字符串
  6. linux下代理上网设置
  7. 轻松管理多个织梦网站 织梦CMS多后台快捷登陆软件
  8. 随机森林python_实战:用Python实现随机森林
  9. 企业oa设计java_基于jsp的企业OA系统-JavaEE实现企业OA系统 - java项目源码
  10. 世界顶级五大女程序媛,不仅技术强还都是美女