[经验分享] 【平头哥RVB2601创意应用开发】 五、RVB2601之WiFi联网及数据交互初次测试

kit7828   2022-3-20 15:04 楼主

平头哥RVB2601提供了web player的demo,运行后一时还找不到http://xxx.com/abcd.mp3的资源进行评测。

居然是WEB播放器,一定是能够联网的。一直想找到平头哥联网的demo例程,没找到合适的,在查阅了平头哥网站的很多博文后,

自己也打算尝试一下联网的例程,于是,复制ch2601_webplayer_demo例程后更名为ch2601_wifitest_demo

2a9880a0b7b2c0c563a3d262b73166a.png  然后更改了项目文件名等

8982fddbf1705de7539db1930a55ce5.png  更加平头哥网站的博文,在W800_api.c中加入了int w800_connect_srv(char *srvname, uint16_t port)函数,方便后面直接TCP联网

image.png  对原Web player中的init.c作了修改,方便联网测试

#include <stdbool.h>
#include <aos/kv.h>
#include <yoc/partition.h>
#include <yoc/init.h>
#include <drv/pin.h>
#include <yoc/at_port.h>
#include <devices/w800.h>
#include <devices/drv_snd_alkaid.h>

#include "app_main.h"
#include "board.h"

#define TAG "init"

netmgr_hdl_t app_netmgr_hdl;
extern at_channel_t spi_channel;

void w800_in(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)
{
	uint8_t* d;
	d=(uint8_t *)data;
	printf("data:%x,%x,%x,%x,%x ... \n",d[0],d[1],d[2],d[3],d[4]);
	printf("rev:%s\n",data);
}

typedef void (*net_data_input_cb_t)(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports);
extern int w800_packet_input_cb_register(net_data_input_cb_t cb);
//net_data_input_cb_t cb = &w800_in;
extern int w800_module_init(utask_t *task, w800_wifi_param_t *param);

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, "TP-LINK_xxxx", 12, "12345678900", 11);
		w800_module_init(task,  &w800_param);
		w800_packet_input_cb_register(&w800_in);
        netmgr_start(app_netmgr_hdl);
    }
}

void board_yoc_init(void)
{
    board_init();
    event_service_init(NULL);
    console_init(CONSOLE_UART_IDX, 115200, 512);
    //ulog_init();
    //aos_set_log_level(AOS_LL_DEBUG);

    //int ret = partition_init();
    //if (ret <= 0) {
    //    LOGE(TAG, "partition init failed");
    //} else {
    //    LOGI(TAG, "find %d partitions", ret);
    //}

    aos_kv_init("kv");
    //snd_card_alkaid_register(NULL);
    network_init();

    board_cli_init();
}

w800_in是回调函数,只是简单地打印接收的数据。

netmgr_config_wifi配置WiFi的ssid和pswd。

main主函数中,也做了些修改

/*
 * Copyright (C) 2019-2020 Alibaba Group Holding Limited
 */
#include <stdlib.h>
#include <string.h>
#include <aos/list.h>
#include <aos/debug.h>

#include <uservice/uservice.h>
#include <uservice/eventid.h>
#include <yoc/sysinfo.h>
#include <board.h>
#include "player_demo.h"

#include "app_main.h"

#define TAG "APP"

extern int w800_software_reset(void);
extern int w800_ap_info(char ssid[32], int bssid[6], int *channel, int *rssi);
extern int w800_get_status(int *stat);
extern int w800_connect_srv(char *srvname, uint16_t port);
extern int w800_send_data(const uint8_t *pdata, int len,int timeout);

static void cmd_at_client_handler(void);

static void network_event(uint32_t event_id, const void *param, void *context)
{
    switch(event_id) {
    case EVENT_NETMGR_GOT_IP:
        LOGD(TAG, "net got ip");
        break;
    case EVENT_NETMGR_NET_DISCON:
        LOGD(TAG, "net disconnect");
        break;
    }

    /*do exception process */
    app_exception_event(event_id);
}

#include <aos/cli.h>

int cli_reg_cmd_at(void)
{
    static const struct cli_command at_cmd_info = {
        "attest",
        "at client test",
        cmd_at_client_handler,
    };
    aos_cli_register_command(&at_cmd_info);
    return 0;
}

static void cmd_at_client_handler(void)
{
	const uint8_t pdata[]="{\"M\":\"checkin\",\"ID\":\"25923\",\"K\":\"df02bd2ef\"}\n";
	char ssid[32];
	int bssid[6];
	int channel;
	int rssi;
	int status = 0;

	while(status != 2) {
		w800_ap_info( ssid, bssid , &channel,  &rssi);
		printf("ssid: %s\r\n", ssid);
		printf("channel: %d\r\n", channel);
		printf("rssi: %d\r\n", rssi);
		w800_get_status( &status); //[  16.360]<D>w800_api link status 2 已获取到ip
		printf("w800_get_status: %d\r\n", status);
		aos_msleep(2000); 
	}

	char *srvname="www.bigiot.net";
	uint16_t port = 8181;
	status = w800_connect_srv(srvname, port);
	printf("w800_connect_srv: %d\r\n", status);
	
	int len;
	len=strlen(pdata);
	int timeout=120;
	status = w800_send_data(pdata, len, timeout);
	printf("w800_send_data: %d\r\n", status);
}
		 
static void iot_time(void)
{
	const uint8_t pdata[]="{\"M\":\"time\",\"F\":\"Y-m-d-w H:i:s\"}\n";
	int len;
	len=strlen(pdata);
	int timeout=120;
	w800_send_data(pdata, len, timeout);
}


int main(void)
{
	//int *stu;
	board_yoc_init();
	//player_init();
	netmgr_dev_wifi_init();
	//cli_reg_cmd_player();
	cli_reg_cmd_at();    
	/* Subscribe */
	event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
	event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
	aos_msleep(10000);
	cmd_at_client_handler();
	while(1)
	{
		aos_msleep(10000);      
		//w800_get_status();
		//w800_iot_status();     
		iot_time(); 
	}
}

用的前面大佬提供的方法,www.bigiot.net网站中提供了一些功能,感觉测试还是蛮好的,想要获取时间,得先注册用户,然后注册设备,操作倒比较简便。

开发板J4的排针,1,2是CPU这边的串口,用于printf函数的输出

3、4脚连接的USB,5、6脚是W800这边的输出。

如需要看到所有的数据,最好再单多接一个串口TTL模块,显示数据

b4cc4ab06eda6ae1ba43ee7c00d5a2d.png

可以看到,通过WiFi能正常联网,并发送和获取信息,代码中实现了每10秒更新一次时间的功能。

 

两边的串口,都可以输入help,功能还是有较大的差异的

b18494cb88606e16269210cafefd6c4.png

a8934abbf54bcc2bef2a8a8791efd5f.png

CDK的组件cli应该是一个可以交互的调试件,功能应该也是蛮强大的,后面好好学习一下。   

回复评论 (4)

就不知道平头哥有没有单独介绍使用各个模块的贴子,我想把LVGL跟联网结合到一块,一结合就不成功。

点赞  2022-3-22 11:18

代码行号:50和51,"w800_module_init"和“w800_packet_input_cb_register”是不是不需要调用,因为“wifi_w800_register”里面已经调用这两个API了

点赞  2022-3-23 09:49
引用: lugl4313820 发表于 2022-3-22 11:18 就不知道平头哥有没有单独介绍使用各个模块的贴子,我想把LVGL跟联网结合到一块,一结合就不成功。

还没测试LVGL,到时来取取经哈

点赞  2022-3-23 21:18
引用: 小默叔叔 发表于 2022-3-23 09:49 代码行号:50和51,"w800_module_init"和“w800_packet_input_cb_register”是不是不需要调 ...

w800_module_init是可以重复的,有个注册成功的标注,如果已经注册就直接返回了。w800_packet_input_cb_register这个的目的是为了调试,接收到哪些信息。

点赞 (1) 2022-3-23 21:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复