物联网技术入门——系列文章2

来源:互联网 发布:曹县大集淘宝村 编辑:程序博客网 时间:2024/06/14 19:37

物联网技术入门——系列文章2

上一篇博客主要谢了传感器节点(上一篇叫采集节点,我觉得在物联网中叫传感节点更合适)的电路设计,这一篇介绍传感器节点的软件设计。

传感器节点的软件主要完成两项任务:感知和WiFi通信。感知这块比较简单,主要是AD的控制。在使用之前,仔细阅读STM32的说明书,设置好与AD有关的IO、时钟、工作方式等,并适时启动AD以及读取转换值即可。不过值得一提的是STM32支持DMA通道,在DMA模式下,可以设置AD转换后的值存放到DMA通道的入口地址处,DMA通道的出口地址可以指向自定义的一段缓存,或者串口、SPI等通信端口的写入地址,这样无需CPU过问,AD转换后的值就可以被直接送到指定缓存或者通信外设的写入地址,可以减轻CPU的负担,因此建议使用DMA通道。

WiFi通信是软件设计的难点,好在大多数工作都被前人完成了,我们只需站在巨人的肩膀上关注我们的应用就可以了。

要实现WIFI通信,至少要实现WIFI驱动以及TCP/IP协议,大体结构如下图所示:

最底层是WIFI芯片,再上层是WIFI驱动层(包括SDIO驱动和WLAN驱动),最上层是TCP/IP协议层,TCP/IP协议层使用LWIP协议栈。

1. WIFI驱动

Marvell 88w8686 WiFi模块驱动主要包括802.11协议驱动和SDIO接口驱动两部分。如图。
这里写图片描述
802.11协议驱动组成包含802.11一些特点,比如扫描,连接,以及802.11d,8.2.11h,WMM等,与上层application应用层(无线工具等)实现信息交互,总线驱动连接部分位于8.2.11协议驱动和SDIO接口驱动之间,主要为无线局域网模块和低级总线驱动模块提供信息交互的接口。SDIO总线上的命令都是由host端发起请求的,后由设备回应请求。设备在与host通信之前,需要在host发出命令后,由设备对读到的命令进行解析,才能实现正常的通信。在SDIO驱动过程中,Command用于开始传输的命令,是由host端发往设备端,Response回应是设备返回的host命令,作为Command的回应,通过CMD传送。Data数据是双向传送的,可以设置为不同的模式,数据通过信号线DATn传输。SDIO每次操作都是由host在CMD线上发起一个CMD,对于有的CMD,设备需要返回一个Response,有的则不需要。WiFi Firmware是WiFi设备硬件中执行的一段程序,由WiFi驱动将其通过SDIO接口下载到WiFi模块中,主要功能是实现WiFi硬件接口控制,数据缓冲、数据帧的转换、MAC层管理和中断管理等。

在通过无线局域网传输数据的过程中,需要完成安全性设计,即数据加密。我们采用WPA认证,WPA又名PSK,长度一般为8~63字节,它通过一定的算法可以得到PMK。认证的时候会生成一个PTK,这是一组密钥。PTK加上报文数据采用一定的算法,得到密文,同时得到一个签名。认证的原理是在获取所有参数后,客户端发出一个MIC,把原文同MIC一起发给AP,AP采用相同的参数和算法计算出MIC,并与客户端发过来的比较,如果一致,则认证通过,否则失败。

2. LWIP协议栈

LwIP是用于嵌入式系统的开源裁剪版TCP/IP协议栈,可运行在无操作系统的平台上,整个协议栈实现了基本的IP、ICMP、UDP、TCP协议。它只需要十几KB的RAM和40K的ROM就可运行,尤其适用于内存资源有限的嵌入式系统。

典型的 LWIP 应用系统包括这样的三个进程:首先启动的是上层应用程序进程,然后是 LWIP 协议栈进程,最后是底层硬件数据包接收发送进程。通常 LWIP协议栈进程是在应用程序中调用 LWIP 协议栈初始化函数来创建的。但是在初始化LwIP协议栈之前,需要将各协议移植到开发板上,使其支持TCP和UDP两种方式。LwIP主要包括以下子目录:存放应用程序接口文件子目录、提供核心代码文件的core子目录、提供整个协议栈使用头文件的子目录、提供网络接口驱动程序基本框架的netif子目录和移植过程中自定义的子目录。移植LwIP协议栈,还需要完成对头文件的定义。

LWIP简化了传统的OSI七层模型,只保留了网络接口层、网络层、传输层和应用层,各层数据包接收与发送的全过程如图。

这里写图片描述

WIFI驱动和LWIP协议栈包含的东西实在太多,要花大量的时间才可能研究透彻,我实在没这个精力,所以也只知道个大概。如果感兴趣,可以阅读老衲五木的博客,写得十分全面。

3.应用

我应该更关注LWIP的应用,怎么样才能用起来是关键。

传感节点既可以主动往外推数据,也可以作为服务器被动地响应客户的请求,我选择了后者。那么应用层主要分为两个过程:一是WiFi关联过程,二是数据请求和响应过程。

WiFi关联过程有两种方式,一种是采集节点作为AP,其他设备接入AP;另一种是采集节点接入到路由器。这和手机是一样的。工作流程如下图。

这里写图片描述

首先对STM32微控制器的时钟、端口、A/DC、中断向量、串口、内存进行初始化,对Marvell模块驱动进行初始化配置(SDIO的设备枚举,加载设备固件等)。在完成上述初始化过程之后,扫描WiFi网,将结果存放在数据域中,随后进行网络关联,若返回值为0,说明网络关联成功,否则说明关联失败,接着对LWIP协议栈进行配置,并建立TCP服务器。至此,用户终端就已经可以发送数据请求,进行数据信息的访问了。

当客户端发起数据访问请求时,首先通过连接请求接口发出请求连接指令,如果连接失败,则重新连接,若连接成功,客户端发出数据请求指令,此时服务器进行数据解析,并将客户端请求的数据发送回去,当数据发送完毕时,通信结束,否则客户端继续通过请求数据指令,获取所需数据。数据请求与响应流程如图。
这里写图片描述

源代码请到我的CSDN资源下载,如果积分不够可以邮箱联系我。顺便告诉大家,这家淘宝(https://shop.m.taobao.com/shop/shop_index.htm?user_id=172566120&item_id=41627607309&spm=a1z3i.7c.action.ishop)提供了WiFi的开发套件,并提供技术支持,如果希望学习WiFi开发的可以去看看。

0 0