前言

物联网的IPV6应用是一个趋势,contiki是集成了6lowpan的一个集成开发工具。uip是集成在内部的,支持IPV6以及IPV4,这里先通过IPV4与平台连接建立一个数据通道。后续会跟进IPV6以及6lowpan的应用。而且uip不需要OS支持,以事件驱动的方式编程,占用的RAM以及ROM都符合嵌入式的需求。

之前我们需要了解一些背景知识:

1,http的相关知识

2,yeelink http请求格式分析 (分析很透彻)

3,tcp/ip的连接

4,stm32平台+enc28j60网络模块

5,uip1.0 (contiki里面的uip已经是与6lowpan、ipv6耦合起来了,所以这里选择了uip1.0的版本)uip0.9 refman中文翻译 也是一个不错的博文,让大家更快熟悉uip的编程思想。

移植

这一部分我们会先介绍uip在stm32平台上的移植工作。Enc28j60是带SPI 接口的独立以太网控制器,可以用mcu控制spi来实现tcp/ip数据流的收发,所以要先完成Enc28j60的驱动程序,再整合Uip。

这一部分可以参考:uip在stm32上的移植,说明的也很详细,我就不累赘了。

软件实现

1,DNS

uip自带了一个dns的解析,配置如下:

void yeelink_init(void)
{uip_ipaddr_t ipaddr;resolv_init();uip_ipaddr(ipaddr, 221, 228, 255, 1); // DNSresolv_conf(ipaddr);resolv_query(YEELINK_HOST);
}

这里的DNS我们可以通过查看自己的网络参数获取。当然你也可以配置uip为DHCP模式,这样就会自动帮我们配置DNS查询上级IP。

当查找到目的网址的IP或者说查找失败,都会调用void resolv_found(char *name, u16_t *ipaddr);这个函数需要我们在main里自己实现:

void resolv_found(char *name, u16_t *ipaddr)
{if (ipaddr == NULL) {printf("Host '%s' not found.\r\n", name);} else {printf("Found name '%s' = %d.%d.%d.%d\r\n", name,htons(ipaddr[0]) >> 8,htons(ipaddr[0]) & 0xff,htons(ipaddr[1]) >> 8,htons(ipaddr[1]) & 0xff);yeelink_connect(YEELINK_HOST, YEELINK_PORT);}
}

如果查找到了yeelink的地址,我们就进行tcp连接。

2,client实现

剩下就是yeelink的client实现,代码如下:

void yeelink_client_appcall(void)
{if (uip_connected()) {yeelink_request_get();printf("yeelink_client: connected, waiting for data...\r\n");return;}if (uip_aborted()) {printf("yeelink_client: connection aborted\r\n");}if (uip_timedout()) {printf("yeelink_client: connection timed out\r\n");}if (uip_acked()) {yeelink_request_acked();}if ( uip_rexmit() || uip_newdata()) {yeelink_newdata(); // 这里的数据是分包发送过来的return;}if (uip_poll()) {if (yeelink_poll()) {return;}}if (uip_closed()) {yeelink_closed();printf("yeelink_client: connection closed\r\n");}
}

这个流程按照uip的网络编程流程来,这里需要注意几点:

1,分包

http请求是根据mss来决定一包里面的有效数据长度的。这里就出现了yeelink的http应答分包发送,那么我们在处理http数据的时候就需要考虑到组包。实现的时候我取了个巧。

static void yeelink_newdata(void)
{yeelink_client.timer = 0;u16_t len = uip_datalen();memcpy(yeelink_client.data, uip_appdata, len);//{"timestamp":"2014-03-25T13:40:47","value":0}u8_t *value_info = (u8_t *)strstr(yeelink_client.data, "\"value\"");if (value_info != NULL) {   // 分片传送的len = strlen("\"value\":");u8_t status = *(value_info + len);if (status == '0') {printf("yeelink_client: switch is close\r\n");} else {printf("yeelink_client: switch is open\r\n");}memset(yeelink_client.data, 0x00 , WEBCLIENT_CONF_MAX_URLLEN);/*uip_close();*/yeelink_struct_init();}
}

2,查询时间周期

查询的时候似乎并没有时间限制,我在poll里面设置了1s查询一次,结果也依然可以返回。之前提到的5s限制并不存在,不知道是否是升级了服务。

总结:

uip相对于lwip而言会更适合物联网的开发,但是编程相对lwip而言会需要一些技巧性,因为与我们常规的阻塞式编程有区别。

代码的地址如下:https://utopiaprince@bitbucket.org/utopiaprince/uip1.0-stm32-webserver 可以用hg clone。

uip的yeelink实现相关推荐

  1. uIP resolv_found的实现

    前言 物联网的IPV6应用是一个趋势,contiki是集成了6lowpan的一个集成开发工具.uip是集成在内部的,支持IPV6以及IPV4,这里先通过IPV4与平台连接建立一个数据通道.后续会跟进I ...

  2. Yeelink Http请求格式分析

    0.Yeelink简介 最近接触了一个物联网平台 Yeelink.这个平台可以使用户通过Http请求的方式上传或查询数据,通过这样的方式可以使用WEB方式访问Yeelink平台,通过这种方式获取传感器 ...

  3. 调试uIP出现死机问题

    在调试uIP,加入http功能时,调试出现死循环 原因是所加入的http文件中含有printf等输出函数,遇到这种情况,有2种解决方法: 1.Keil中勾选"Use MicroLIB&quo ...

  4. 【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究

    接触高通物联网框架AllJoyn不太久,但确是被深深地吸引了.在我看来,促进我深入学习的原因有三点:一.AllJoyn开源,对开源的软硬件总会有种莫名的喜爱,虽然或许不会都深入下去:二.顺应潮流,物联 ...

  5. 单片机联网,UIP实现tcp/udp协议

    原文地址:https://www.cnblogs.com/dengxiaojun/p/4375047.html UIP是单片机界联网的一个很好地选择,移植这个库有点复杂,首先是第一步,网卡驱动要写好, ...

  6. ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程

    ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程 以太网接口芯片W5500与ENC28J60对比 转载于:https://www.cnblogs.com/LittleTiger/p/6 ...

  7. 【物联网】 Yeelink开发平台注册

    官方网址:http://www.yeelink.net/index 注册 Yeeklink作为一个开放的公共物联网接入平台,目的是为服务所有所有的爱好者和开发者,使传感器数据的接入.存储和展现变得轻松 ...

  8. 3、PV、UIP、UV指的是什么

    PV:是Page View的缩写. 即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页 ...

  9. uip UDPclient模式通信移植,当地port随机

    现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************ ...

最新文章

  1. 李开复对话彭特兰:AI 不是单打独斗,应避免 AI 冷战!
  2. 面性对象中栈内存和堆内存的理解
  3. 关闭Bootstrap的modal后,重新打开还会有input里上传的file解决
  4. 图论—割点zcmu2095
  5. 图像局部显著性—点特征(FREAK)
  6. 如何获取租户中所有的Team
  7. 【渝粤教育】国家开放大学2018年春季 8625-22T老年心理健康 参考试题
  8. Exchange 常用命令行备忘
  9. python变量的作用域及生命周期_Python——变量的作用域
  10. Aspose.Words for .NET
  11. python实现矢量分级渲染_AE 栅格图分级渲染
  12. Android学习之适配器SimpleCursorAdapter
  13. VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
  14. 防范勒索病毒及关闭相关端口
  15. PS常用案例步骤详解,自学 Photoshop 2022 Mac版,多个PS后期修图小案例笔记
  16. 记一次hydra密码破解神器的学习
  17. 服务器内网与外网的四大区别?
  18. U盘安装CentOS7 解决各种问题
  19. OpenGL和OpenCV
  20. 人工神经网络设计选择题,人工神经网络设计原则

热门文章

  1. thinking in uml 大象 用例
  2. fastadmin后台多表联查
  3. 直播预告 | NeurIPS 专场六 青年科学家专场
  4. linux驱动调试技巧:灌寄存器---------以mma7660为例
  5. linux I2c设备注册
  6. IAR工程某些文件字体改不过来
  7. pads-logic
  8. mysql slave skip_mysql运维-slave_skip_errors
  9. 单片机原理及应用 实验一 计数显示器
  10. SQL 中的 COALESCE 函数初学者指南