uIP resolv_found的实现

uIP resolv_found的实现前言物联网的 IPV6 应用是一个趋势 contiki 是集成了 6lowpan 的一个集成开发工具 uip 是集成在内部的 支持 IPV6 以及 IPV4 这里先通过 IPV4 与平台连接建立一个数据通道 后续会跟进 IPV6 以及 6lowpan 的应用 而且 uip 不需要 OS 支持 以事件驱动的方式编程 占用的 RAM 以及 ROM 都符合嵌入式的需求 之前我们需要了解一些背景知识 1 http 的相关

前言

物联网的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); // DNS resolv_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 resolv_found的实现
uIP resolv_found的实现

uIP resolv_found的实现

总结:

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

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178197.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:48
下一篇 2026年3月26日 下午5:49


相关推荐

  • 线程的定义及特点_linux线程创建函数

    线程的定义及特点_linux线程创建函数1.加入头文件#include"afxmt.h"2.定义一个全局的锁CRITICAL_SECTION的实例和一个静态变量CRITICAL_SECTIONcs;//可以理解为锁定一

    2022年8月2日
    9
  • pycharm远程部署_树莓派python环境

    pycharm远程部署_树莓派python环境树莓派python安装到pycharm远程连接步骤1、从官网上下载树莓派系统到pc端2、下载diskgenius,将TF卡格式化成普通盘3、在卡中创建ssh文件,不带后缀,用于树莓派和主机的远程连接4、从官网下载piimager,将下载的树莓派系统安装TF卡中5、TF插入树莓派4B,开机自动开始安装系统6、提示是否更新软件,直接skip跳过7、更换镜像源8、update,upgrade命令更新软件9、安装虚拟键盘(可选)10、安装中文输入法11、远程控制,pc端安装xshell12

    2022年8月26日
    12
  • Pycharm中的Debug工具以及简单的使用方法[通俗易懂]

    Pycharm中的Debug工具以及简单的使用方法[通俗易懂]1.什么是Debug工具?Debug工具是PycharmIDE中集成的用来调试程序的工具,在这里程序员可以查看程序的执行细节和流程或者调解bug2.Debug工具使用步骤打断点~断点位置:目标要调试的代码块的第一行代码即可,即一个断点即可。~打断点的方法:单击目标代码和行号右侧空白位置3.debug使用,在run,下面有一个debug先看看Debugger的这个控制台面板运行debug后…

    2022年8月29日
    6
  • 学习java的好书及视频推荐

    学习java的好书及视频推荐转载来自:点击打开链接要想在java领域成为大牛,除了不断进行项目实战以外,还要不断的进行进修和学习,以下将本人学习java多年使用的好书和一些好的视频推荐给大家,这些书和视频都是本人在网络找了很久,后来又经过实践证明的好书和视频。希望对大家学习java有帮助首先,是书的推荐:1学习java,java基础,1.0 入门:HeadFirstJava(

    2022年6月21日
    29
  • wampserver中mysql密码_WampServer修改MySQL密码

    wampserver中mysql密码_WampServer修改MySQL密码WampServer 修改 MySQL 密码 WampServer 安装后密码是空的 需要设置一下一般有两种方式 一是通过 phpMyAdmin 直接修改 二是使用 WAMP 的 MySql 控制台修改 第一种 在 phpMyAdmin 界面中点击 用户 将用户概况中的所有用户名为 root 用户的密码都改为 WampServer 修改 MySQL 密码 WampServer 安装后密码是空的 需要设置一下一般有两

    2025年8月22日
    5
  • tp路由+伪静态+去掉index.php

    tp路由+伪静态+去掉index.php

    2021年9月18日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号