平头哥RVB2601板子上手——NETMGR与WIFI

简介: 本文介绍了网络管理层的作用及w800芯片驱动与网络管理层的关系。测试了wifi的设置等知识

本文作者:bigbat


一、简介

CH2601开发板中集成有W800 wifi芯片,这颗芯片是套完整的mcu芯片。理论上是不需要ch2601主芯片操心网络通讯方面的事情的,只要向w800发送指令和数据就可以。CH2601用过SPI总线与W800芯片交互使用AT指令通讯。CH2601芯片的系统为了整合多种网络设备,采用分层的方式与系统应用通讯。

1.jpg


从图上可以看出:为支持不同的网络连接芯片类型和多元的应用场景,YoC平台提供一套完善的网络框架。该框架主要分为四层架构,分别为网络应用层、网络接口层、网络芯片驱动层和底层外设驱动层。


二、网络管理层

网络接口层主要分为两个通道。一是数据通道,其负责网络数据的发送和接收。其可通过调用套接字适配层SAL或LWIP接口来实现,并对上层提供一组标准的 BSD 套接字 API。二是管理通道,即网络管理器netmgr,其负责所有网络的联网、连接、管理、状态查询等功能。


当前YoC平台支持多种不同的网络芯片类型,如esp8266、rtl8723ds、GPRS等。网络芯片驱动层提供了具体芯片的网络层、链路层及驱动相关的接口对接,以满足网络接口层的需求。


网络芯片可能是通过SDIO、AT等接口外接的。底层外设驱动层用于实现主控芯片和外接网络芯片的数据交互需求。


这其中的网络管理器就是wifi连接和管理的核心(netmgr),网络管理器负责所有网络的联网管理功能,具体如下:

  • 链路层的开启/初始化/配置/复位等
  • 链路层设备信息的获取
  • 链路层事件的处理和转发(linkup,linkdown)
  • 网络IP的配置(DHCP或者静态IP)


三、W800驱动

为了能够使用wifi联网就需要调用netmgr的API,下面我就此过程进行测试:

1、首先需要初始化w800网络连接

2、管理连接,注册事件。

3、进行网络通讯


如何初始化W800芯片,我参考了web播放器的例程代码。

#include <drv/pin.h>
#include <devices/w800.h>
netmgr_hdl_t app_netmgr_hdl;
static void network_init()
{
    w800_wifi_param_t w800_param;
    /* init wifi driver and network */
    w800_param.reset_pin      = PA21;
    w800_param.baud           = 1*1000000;
    w800_param.cs_pin         = PA15;
    w800_param.wakeup_pin     = PA25;
    w800_param.int_pin        = PA22;
    w800_param.channel_id     = 0;
    w800_param.buffer_size    = 4*1024;
    wifi_w800_register(NULL, &w800_param);
    app_netmgr_hdl = netmgr_dev_wifi_init();
    if (app_netmgr_hdl) {
        utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
        netmgr_service_init(task);
        netmgr_config_wifi(app_netmgr_hdl, "test", 4, "test123456", 10);
        netmgr_start(app_netmgr_hdl);
    }
}


注意其中的include文件,在官方的资料中的例程很多都没有介绍如何引用。

netmgr_config_wifi(app_netmgr_hdl, "test", 4, "test123456", 10);


其中的被注释的语句就是wifi的ssid和联网密码。只要调用该函数就可以连接到网络上了。此时就可以ping通网络了。


如何管理连接也是十分重要的程序,如果连接断网或是出现什么情况需要重连等等处理,如何管理就需要使用系统事件了。


/* network event callback */
void user_local_event_cb(uint32_t event_id, const void *param, void *context)
{
    char url[128];
    if (event_id == EVENT_NETMGR_GOT_IP) { // 网络连接成功
        printf("Net up");
    } else if (event_id == EVENT_NETMGR_NET_DISCON) {
        if ((int)param == NET_DISCON_REASON_DHCP_ERROR) {
            printf("Net down"); 
            netmgr_reset(netmgr_get_handle("wifi"), 30); // 本次网络连接失败,30s后自动重连
        }
    }
}
int main(void)
{
    board_yoc_init();
  event_service_init(NULL);                     // 发布订阅服务初始化
    LOGD(TAG, "%s\n", aos_get_app_version());
    oled_init();
  network_init();
  /* Subscribe */
    event_subscribe(EVENT_NETMGR_GOT_IP, user_local_event_cb, NULL); // 订阅网络连接成功事件
    event_subscribe(EVENT_NETMGR_NET_DISCON, user_local_event_cb, NULL); // 订阅网络连接失败事件
    while (1) {
        LOGD(TAG, "Hello world! YoC");
        aos_msleep(1000);
    }
    return 0;
}


四、wifi设置

上面的代码不复杂,主要就是三点,

1、构造一个事件函数,处理事件

2、注册事件函数,event_subscribe(EVENT_NETMGR_GOT_IP, user_local_event_cb, NULL); // 订阅网络连接成功事件

3、初始化事件函数,event_service_init(NULL); // 发布订阅服务初始化

这句很重要,如果没有整个系统就会停滞,系统也会不运行。


整个联网过程就此完成。后面我会测试如何使用网络高层接口编写应用。

2.jpg


可以看到网络启动的事件消息,"Net up"和IP地址“192.168.1.104”


本文源自:平头哥芯片开放社区

相关文章
|
网络协议 数据安全/隐私保护 芯片
|
存储 API 开发工具
【平头哥RVB2601创意应用开发】使用体验02 -- KV存储
使用KV组件在RVB2601进行项目参数的本地持久化。
583 0
【平头哥RVB2601创意应用开发】使用体验02 -- KV存储
|
网络协议 物联网 数据处理
【平头哥RVB2601开发板试用体验】AT 解析器和通过w800 AT命令接入阿里云生活物联网平台
RISC-V RVB2601 Yoc 实现和测试验证阿里云平台接入的等相关功能,同时去了解YoC中网络设备和AT解析器框架。
699 0
【平头哥RVB2601开发板试用体验】AT 解析器和通过w800 AT命令接入阿里云生活物联网平台
|
存储 JSON 数据格式
【平头哥RVB2601创意应用开发】疫情播报系统应用
实现通过网络读取json数据,进行分解,针对数据字符,播放相应的mp3音频文件,并在OLED屏幕上显示实际对应数据的疫情播报系统。
227 0
【平头哥RVB2601创意应用开发】疫情播报系统应用
|
芯片
【平头哥RVB2601开发板试用 】GPIO控制的流水灯
对于芯片来说,其实经常用到的就是IO口了,其实其所有功能的实现都是通过IO口的复用实现的,那么今天咱们就简单对IO口控制流水灯进行讲解分析
389 0
【平头哥RVB2601开发板试用 】GPIO控制的流水灯
|
存储 编解码 监控
【平头哥RVB2601开发板试用体验】基于 HTTPClient 的云语音识别 3
在本文中,我们将手动实现“multipart/form-data”类型内容的 POST 请求,并且最终完成整个云语音识别功能。
244 0
【平头哥RVB2601开发板试用体验】基于 HTTPClient 的云语音识别 3
|
存储 编解码 物联网
|
6月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
151 0