海尔网站建设不足之处网站做seo的好处

当前位置: 首页 > news >正文

海尔网站建设不足之处,网站做seo的好处,wordpress主页链接失效,代理平台登录目录 RT-Thread 提供的网络世界入口 - 网络组件

  1. 总概
  2. AT
  3. Lwip#xff1a; 轻量级IP协议栈
  4. W5500
  5. Netdev
  6. RT-Thread SAL#xff08;Socket Abstraction Layer#xff09;套接字和BSD套接字区别 RT-Thread SAL 套接字接口示例 BSD 套接字接口示例 …目录 RT-Thread 提供的网络世界入口 - 网络组件
  7. 总概
  8. AT
  9. Lwip 轻量级IP协议栈
  10. W5500
  11. Netdev
  12. RT-Thread SALSocket Abstraction Layer套接字和BSD套接字区别 RT-Thread SAL 套接字接口示例 BSD 套接字接口示例 RT-Thread 提供的网络世界入口 - 网络组件 作为一款在 RTOS 领域对网络支持很丰富的 RT-Thread对设备联网功能的支持的工具就是接下来要讨论的 net 组件。它位于 ./rt-thread/components/net 路径下作为一款基础组件 env 与 Studio 的工程配置界面的配置项都依赖该目录下的 Kconfig 文件。我们对网络功能的选择或者其配置都属于该 Kconfig 的管理范畴。 从图片中的信息也可以了解到ATLwipNetdevSAL 这些我们相对熟悉的功能也位于该目录中。这四个基础组件可以驱动的网络设备的种类多到各个方面。 从有线网络的各种 ETH 的方式带 PHY 的 enc28j60纯接口的 RJ45还有自带网络协议栈的 W5500都可以直接经过配置通过我们的 net 组件实现设备联网的需求除了有线网络的接入方式无线网络的接入方式则更多2G模块3G模块4G模块Cat-1模块Cat-4模块NB-IOT模块乃至 5G 模块这些依赖基站运营商的入网方式例如 SIM800EC20AIR720L610N58M5311 等这些不同厂家不同工作频率的模组均可以通过 NET 组件入网WIFI 这种无需运营商直接提供的网络的入网方式例如 ESP8266W60xrw007 等。 通过上面的简单介绍大家应该可以基本了解 Net 组件的作用即为使用 RT-Thread 的设备提供上网能力。上面的联网设备品类繁多方式各异但其实追踪到依赖的基础 net 能力其实也没有多复杂。实际上大部分的功能依赖的基础能力只有两组而已即 AT Lwip而到用户也就开发者层面大部分就只用到 SAL 这一个概念。 相信大家看过这份文档主要描述了 SAL 提供的编程接口也就是大家常用的 socket 接口通过 SAL 接口大家已经可以实现 MQTTNTPTFTPTCP ClientTCP ServerwebclientUDP ClientUDP Serverwebnet 等这些大家经常会使用的工具。像浏览器一样访问网站webclient模拟一个网站webnet连接各种云平台Mqtt获取准确授时NTP 通过网络传输文件 TFTP 诸如此类功能 SAL 提供了轻松访问网络的一把钥匙。你可以理解这把钥匙是向上的但是这篇文章现在要讲的是向下的看看 SAL 这样组件又是谁在支撑着它。 Net 组件的主要内容有 4 个方面分别是 sal ATlwip 与 netdev我们先从 AT 和 lwIP 讲起在不同的方式中介绍 sal 的用途然后讲 netdev 的作用。
  13. 总概 对于一个给定的模组他的联网方式有时并不是单一的以常见的 Cat-4 (4G) 模块为例一方面它可以使用 AT 命令这种经典的方式来实现网络连接并不一定是通过串口传送AT命令也可以通过线程间通信传送AT命令另一方面又可以通过 PPP 拨号使用 lwip 的方式来实现网络连接。或者在以 W60x 为例一方面可以使用 AT 的方式来实现联网功能另一方面又可以使用裸 IP 包的方式来实现网络连接。在选取上网模块时应当考虑片上资源的情况以及网络质量的问题选择比较适合的联网方式。条条大路通罗马短途长途步行开车还是有些小区别的。 2. AT AT 命令一开始并没有那么丰富一开始是用作拨号的功能也就是电话业务方面的内容。后来随着时间发展AT 命令的范围也一步步进行了扩展而逐渐支持了网络的一些功能例如 TCP UDP 的功能而到现在有些模块厂商甚至直接使用 AT 命令扩展的方式实现了诸如 MQTTHTTPHTTPS 之类的功能。这些使用扩展 AT 命令方式实现的上层应用对模块依赖度高在 RT Thread 的 IOT Package 的栏目中可以留意到这样的软件包例如bc28_mqtt。RT-Thread 的 AT socket 功能则是更接近底层实现 TCP UDP 这样的接口通过 SAL 来实现 MQTT 这种上层应用。 RT-Thread 的 AT 组件的设计目的就是使设备能发送和解析 AT 命令。为了到达这个目的契合 AT 命令的常见逻辑提供了AT client 功能和 AT Server 功能。 对于 AT Client 来说是由 MCU 去向 Modem 发送 AT 命令由 Modem 响应命令并给出回复。这种方式我们常用的也是我们通过支持 AT 的模组上网的常用方式。对于 AT Server 来说是由 MCU 作为类似 Modem 的功能由其他 MCU 向这个 MCU 发送 AT 命令由这个 MCU 响应 AT 命令并做出回复。 具体的 AT 的使用可以参考 AT 文档更加详细底层的实操的内容在专门的文档中有描述在查阅文档时可以同时浏览代码通过文章的说明我们应该能了解到 AT 组件的使用方法。AT 组件的适用范围也进而清晰起来 AT 命令用作模块控制AT 命令用作数据的解析 对 AT Client 功能做大规模应用的软件包为 at_device 作为一款使用频次很高的软件包可以看到他充分利用了 AT 组件的能力一方面针对模块控制的能力设置了 at_device_xxx.c 来提供模块的基础控制操作一方面也提供了 at_socket_xxx.c 来提供数据解析能力。对于整体的 net 组件而言at_socket_xxx.c 实际上沟通了 AT 组件与 SAL使得上层应用能依赖 at_socket_xxx.c 的函数实现对应的网络功能 MQTTHTTP…. static const struct sal_socket_ops at_socket_ops {at_socket,at_closesocket,at_bind,NULL,at_connect,NULL,at_sendto,at_recvfrom,at_getsockopt,at_setsockopt,at_shutdown,NULL,NULL,NULL, #ifdef SAL_USING_POSIXat_poll, #endif /* SAL_USING_POSIX / };static const struct sal_netdb_ops at_netdb_ops {at_gethostbyname,NULL,at_getaddrinfo,at_freeaddrinfo, };复制错误复制成功 从 AT 组件的 at/at_socket/at_socket.h 中可以看到 AT 组件实现的 sal 的一部分函数从这些函数命令也能看出来 at_socket 是不支持 server 模式的。 对于 at_device 软件包来说at_socket_xxx.c 的内容也主要是对 at_socket.h 内容的实现例如 / AT socket operations function */ struct at_socket_ops {int (*at_connect)(struct at_socket *socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client);int (*at_closesocket)(struct at_socket *socket);int (*at_send)(struct at_socket *socket, const char *buff, size_t bfsz, enum at_socket_type type);int (*at_domain_resolve)(const char *name, char ip[16]);void (*at_set_event_cb)(at_socket_evt_t event, at_evt_cb_t cb);int (*at_socket)(struct at_device *device, enum at_socket_type type); };复制错误复制成功 如果你能浏览对应的 at_device 中 at_socket_xxx.c 的代码你可以发现几乎都是上述函数的实现都是根据不同的模块的特性来处理对应逻辑。 在论坛中也能看到 at_device 的影响 at_device使用bc28报错4.0.3版本串口接收buff设置大于128时使用at_device有问题air720 at-device回复命令冲突AT组件接收不到数据….. 除了这些使用 at_device 能搜索到的问题还有一些因为使用了 at_device 而产生的问题这些问题的出现对于在使用 AT 组件时的使用体验影响是很大的。 在遇到问题时希望能小心地验证问题并尝试解决问题在问题难以解决时请详细描述问题复现的场景按照格式在论坛中提问。问题描述清晰复现手段准确更能吸引小伙伴们的参与共同解决问题。 AT RAW 能准确显示 AT 交互中的 modem 返回的数据再数据异常需要调试时建议打开。 市面上的各种模块at_device 已经囊括了最常使用的一些部分不过还有更多的模块等待着小伙伴们一起帮忙完善。也许是因为在小伙伴提交代码时并没有那么多的业务量或者功能在一次次的功能增加迭代中导致了 at_device 有时不能做到随取随用而产生了一些问题也希望使用的小伙伴能发现问题做出修改并给予 at_device 软件包自己的 PR一起推动 at_device 更加易用。
  14. Lwip 轻量级IP协议栈 大家基本都是看过这个 TCP/IP 模型的在嵌入式的网络协议栈入口中lwip 就是很重要的一个入口 lwip 是开源的一个协议栈已经经过很多厂家和开发者使用后得到验证和肯定的嵌入式 TCP/IP 网络协议栈lwip 的全称为 A Lightweight TCP/IP stack一个轻量级的 TCP/IP 协议栈。 所以可以知道lwip 并不是嵌入式上唯一的 TCP/IP 协议栈但 lwip 是经过验证的能胜任工作的 TCP/IP 协议栈。 在 RT-Thread 中提供了三个 lwip 的版本供用户使用 lwip1.4.1lwip2.0.2lwip2.1.2
    通常大家在使用有线连接的方式使用网络时一部分是使用的 lwip 协议栈而另一部分则是使用了 w5500 这种方式来实现。 难道 lwip 只有在有线网络中才能使用吗其实也不尽然。对于使用裸 IP 包方式实现的网络数据的交互而不是简单使用 AT 命令的话rw007 这种 WIFI 设备Air720 这种 Cat-4 设备都是可以使用 Lwip 来使用网络功能的。 AT 方式lwip 方式rw007AT 命令实现数据交互(与模块版本有关)裸 IP 包形式实现数据交互Air720AT 命令实现数据交互PPP 包形式实现数据交互 通过表格可以发现 net 组件的意图即通过数据交互的方式来实现网络数据传输。对于 AT 方式来说网络数据在 AT 命令中需要从 AT 数据中解析出想要使用的网络数据这种方式不需要 Lwip 庞大的协议栈但很明显需要比较强大的解析能力而且频繁转换解析对网络效率也是有影响的。 对于 lwip 方式来说网络数据直接以 IP/PPP 包的方式传输这是网络世界通用的格式无论是我们的交换机路由器它们都能识别 IP 报文更加轻便而且无需进行复杂的相互转换但这种方法需要有 lwip 协议栈的参与需要根据项目对 lwip 做一些细微得调整。 在 RT-Thread 中我们对 lwip 做了一些小修改也使用 Kconfig 的方式提供了一些简单的优化配置项供用户进行简单的配置。在上面提到我们对 lwip 有一些修改主要的修改内容包括 netif 与 mem 方面在 netif 中我们在上层抽象了 netdev 的结构对于 lwip 而言是对 netif 的继承和常用的一些接口函数的函数而对于不是使用 lwip 实现的网络通信功能来说netdev 可以使开发者更轻松的使用在 mem 方面我们使用 RT-Thread 自身的内存分配算法取代了 lwip 的内存堆分配算法不包括内存池部分。查看 lwipx.x.x 下的j脚本文件 Sconscript 文件可以留意到.\src\core\mem.c文件是没有参与编译的也就是说在使用 pbuf_alloc(PBUF_RAW, len, PBUF_RAM)语句来申请 pbuf 空间时我们实际上使用得是 RT-Thread 通用的内存堆算法。当然无论是 lwip 还是 RT-Thread 内存堆与内存池的申请确实是各有优劣的还是需要针对使用场景才能确定孰优孰劣。在本篇文章中主要讲解 lwip 在 net 中的作用具体的 lwip 配置方法和内容讲解会在另一篇文章中仔细描述。
  15. W5500 我们经常使用的 net 组件中的两项已经介绍了基本情况除了这两种方式w5500 作为一个拥有 TCP/IP 协议栈的一个独立模块也是一种通用的方式。在 RT-Thread 中使用 w5500 的方式也很简单。只需在工程中使用 wiznet 软件包就可以使用标准的 BSD socket 接口来实现网络编程了。 通过网络框架图可以看到wiznet 是独立与 AT socket 与 lwip 的但还是需要 netdev 与 SAL 的参与才能轻松的使用。 从salnetdevw5500 的对接过程来看在 BSD socket 的接口方面只是实现了常用的一些接口这些接口已经囊括了 IOT 设备中会使用的常用能力。 static const struct sal_socket_ops wiz_socket_ops {wiz_socket,wiz_closesocket,wiz_bind,wiz_listen,wiz_connect,wiz_accept,wiz_sendto,wiz_recvfrom,wiz_getsockopt,wiz_setsockopt,wiz_shutdown,NULL,NULL,NULL, #ifdef SAL_USING_POSIXwiz_poll, #endif /* SAL_USING_POSIX */ };static const struct sal_netdb_ops wiz_netdb_ops {wiz_gethostbyname,NULL,wiz_getaddrinfo,wiz_freeaddrinfo, };复制错误复制成功 在 w5500 的使用中也有一部分小伙伴会遇到问题。比如一些 Linux 上的网络应用在迁移到 w5500 的平台上时会出现一些参数的不兼容问题。比如设置某些 socket 的属性设置一个 TCP 的属性等等有些设置在 Linux 平台上可能是可以使用的有些则可能会产生编译或者执行过程的逻辑异常不符合函数预期。 为了在嵌入式平台上实现网络功能AT命令lwip 协议栈wiznet 这些方法都是实现了 TCP/IP 协议中的一大部分功能并没有完全实现整个协议栈的内容。可能有些函数特性在嵌入式的平台上是不太符合预期的。这时候就需要发现问题的小伙伴及时在论坛中提出问题更多的小伙伴参与讨论才能使我们的 net 组件功能更丰富。
  16. Netdev 在 lwip 的介绍中我们提到 netdev 是对 lwip 中 netif 的继承。因为 netdev 从 netif 中取出了一些字节用于关键信息的填充。我们在 cmd 控制台上经常会用到 ifconfig命令然后得到下面的回复 在控制台中可以显示每个注册为 netdev 的信息IP地址网关地址子网掩码以及 DNS 服务器地址还有 MTU 长度MAC 地址以及该 netdev 的属性是否启用链路是否正常网络是否正常DHCP 是否打开ARP 功能是否开启广播是否支持IGMP组播能力是否支持。这些内容中经常使用到的一般有三个属性 重要属性意义UP / DOWN网卡是否启用LINK_UP / LINK_DOWN链路是否正常INTERNET_UP / INTERNET_DOWN网络是否正常 LINK_UP 的意义为链路是否正常在 netdev 启用后LINK_UP 是作为 PING 命令是否可用的关键。如果 为 LINK_DOWN PING 命令将禁用。毕竟网线都没有连接PING 命令不可以用也是合情合理的喽。LINK_DOWN 状态下禁用 PING 命令很合理但是如果 netdev 的状态被异常置为 LINK_DOWN 就很苦恼了。如果被代码错误执行到设置为 LINK_DOWNPING 命令将不可用。netdev 的使用可以参考文档介绍。INTERNET_UP 的意义为网络是否正常。实际上RT-Thread 的代码逻辑中把这个位作为标志位但很少利用这个标志位做逻辑判断。这样做的原因是因为判断 INTERNET_UP 的方式为访问 link.rt-thread.org如果能有回复就把标志位置为 INTERNET_UP否则置为 INTERNET_DOWN。这个逻辑在一般情况下算是正常但是在一些网络拓扑中很有可能被网络标记位不可达被墙了PS 也有可能是 RT-Thread 的网络主机重启了所以哪怕实际上是可以连接网络的却显示为 INTERNET_DOWN。 除此以外netdev 还有 PING 功能的抽象就是上面提到的 LINK_DOWN 状态不可用的那个。说它是抽象是因为 netdev 中并没有直接实现全部的 ping 逻辑而是依赖底层的提供提供的 PING 能力。 也许会有小伙伴想问netdev 没有提供 ping 功能是因为代码不够高大上能力不足吗都是连接到一个 IP 地址上面使用 socket 的接口不可以吗为什么一定要抽象出一个 ping 接口让底层去实现这个接口而不是 netdev 层直接实现呢其实这并不是这个原因因为 ping 功能发送的数据和通过 socket 发出的数据格式并不是完全相同的。虽然统称为 IP 数据报文但实际上 netdev 这个层级是感受不到这个数据的。具体的内容可以在下一篇 lwip 的讲解中来一起解释。
  17. RT-Thread SALSocket Abstraction Layer套接字和BSD套接字区别 RT-Thread SALSocket Abstraction Layer套接字和BSD套接字在功能和使用上存在一些区别尽管它们都用于网络通信但各有其特定的设计和应用场景。 RT-Thread SAL套接字 定义与功能SAL是RT-Thread操作系统中的一个组件用于抽象和统一多种网络协议栈接口。它提供了一个Socket层面的TLS加密传输特性并支持标准BSD Socket API。SAL套接字抽象层位于网络硬件层和应用层之间通过它RT-Thread系统能够适配下层不同的网络协议栈并提供给上层统一的网络编程接口方便不同协议栈的接入。特点与优势SAL套接字的主要特点包括抽象和统一多种网络协议栈接口提供统一的FD文件描述符管理以及支持标准BSD Socket API等。这使得开发者可以更方便地使用read/write、poll/select等函数来操作网络功能。此外SAL的孕育而出使得RT-Thread可以无缝接入各式各样的网络芯片或模块极大地提升了RT-Thread在IoT领域对于不同网络硬件的兼容性。 BSD套接字 定义与功能BSD套接字最早是由BSD伯克利软件套件在1982年引入的通信机制目前已被广泛移植到主流的操作系统中。对于应用开发人员来说套接字socket是一个抽象层是一种特殊的I/O接口独立于具体协议的网络编程接口也是一种文件描述符。应用程序可以通过它发送或接收数据可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中并与网络中的其他应用程序进行通信。特点与优势BSD套接字具有跨平台、兼容性好、易于理解和使用等优点。它支持各种形式的网络应用并且还是一种进程间通信的机制。套接字可以看成是一种特殊的管道但与管道不同的是套接字所能容纳的数据不受限制。 总结来说RT-Thread SAL套接字和BSD套接字在功能和使用上存在一些差异。RT-Thread SAL套接字是RT-Thread操作系统中的一个组件主要用于抽象和统一多种网络协议栈接口提升系统的兼容性和易用性而BSD套接字则是一种广泛使用的网络通信机制具有跨平台、兼容性好等优点适用于各种网络应用。在实际应用中可以根据具体需求和场景选择合适的套接字类型。 RT-Thread 的 SAL (Socket Abstraction Layer) 套接字与 BSD 套接字在接口层面上是非常相似的因为它们都遵循 BSD Socket API 规范。下面我会分别给出一个 RT-Thread SAL 套接字和 BSD 套接字的简单接口示例以便进行比较。 RT-Thread SAL 套接字接口示例 在 RT-Thread 中使用 SAL 套接字进行网络通信时通常会遵循以下步骤 创建套接字 c复制代码 int sockfd socket(AF_INET, SOCK_STREAM, 0); if (sockfd 0) { /* 错误处理 */ } 绑定套接字 c复制代码 struct sockaddr_in server_addr; memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_port htons(8080); server_addr.sin_addr.s_addr INADDR_ANY; if (bind(sockfd, (struct sockaddr )server_addr, sizeof(server_addr)) 0) { / 错误处理 / } 监听套接字 c复制代码 if (listen(sockfd, 5) 0) { / 错误处理 */ } 接受连接 c复制代码 struct sockaddr_in client_addr; socklen_t client_len sizeof(client_addr); int connfd accept(sockfd, (struct sockaddr )client_addr, client_len); if (connfd 0) { / 错误处理 / } 发送和接收数据 c复制代码 char buf[1024]; int len recv(connfd, buf, sizeof(buf), 0); if (len 0) { / 处理接收到的数据 / } / 发送数据 */ send(connfd, Hello, Client!, strlen(Hello, Client!), 0); 关闭套接字 c复制代码 close(sockfd); close(connfd); BSD 套接字接口示例 BSD 套接字的接口与 RT-Thread SAL 套接字的接口非常相似因为 RT-Thread SAL 本身就是基于 BSD Socket API 设计的。所以上面的示例代码在 BSD 环境下也是适用的。 不过需要注意的是虽然接口相似但在具体实现和性能上可能会有所不同。 RT-Thread SAL 针对嵌入式系统和物联网设备进行了优化可能具有更小的内存占用和更高的效率。而 BSD 套接字则更广泛地应用于各种操作系统和环境中。