WiFi无线通讯

本文基于平头哥RVB2601开发板。 介绍如何在WiFi无线网络环境下获取本地IP,建立tcp连接,并在TCPClient与远程TCPServer之间传输数据。

一、概述

1、平头哥RVB2601开发板,板载资源W800是WiFi/蓝牙SoC芯片。 具有高性能、高集成度、高安全级别、高扩展性、体积小、易于开发等优点。 芯片封装尺寸为4mm*4mm,采用平头格轩铁804(32位)CPU核心,最高频率240MHz; 内置TEE安全引擎,为芯片提供高性能的核心处理能力和安全可信的执行环境; 内置DSP和浮点运算单元,支持2.4GIEEE802.11b/g/nWi-Fi标准协议,支持BT/BLE4.2蓝牙协议; 支持丰富的MCU数字接口。 芯片内置2MB Flash和288KBRAM; 支持大容量PSRAM扩展。 适用于智能家居、智能家电、无线音视频、智能玩具、工业控制、医疗监控等广泛的物联网应用领域。

2、这款W800wifi芯片是一套完整的MCU芯片。 理论上ch2601主芯片无需担心网络通信问题。 它只需要向w800发送指令和数据。 CH2601通过SPI总线与W800芯片交互,使用AT命令进行通信。 为了集成多个网络设备,CH2601芯片系统采用分层方式与系统应用程序进行通信。

3、为了支持不同的网络连接芯片类型和多样化的应用场景,YoC平台提供了完整的网络框架。 该框架主要分为四层架构,即网络应用层、网络接口层、网络芯片驱动层和底层外设驱动层。

2.测试W800连接

1、更换跳线,查看原理图,检查W800调试串口接线。 图中,J4的第3、4脚为串口转USB接口。 默认连接到1和2,分别是CH2601串口0的RX和TX。 把短接片取下来连接到5和6,即W800串口0的RX和TX。这样改后就可以在电脑上通过SerialPane显示W800调试信息了。

通信无线设备有哪些_无线通信_通信无线网络优化/

2. 设置调试串口。 在CDK的SerialPane窗口中右键,将串口端口设置为cp21x对应的端口。 其他参数默认即可。 好的

无线通信_通信无线网络优化_通信无线设备有哪些/

3、设备连接成功,显示如下信息,提示wififailed。 默认 wifi 路由器接入点和密码为:[netmgr_wifi]ssid{CSKY-T},psk{test1234}。

连接的。

[110.427352][I][netmgr_wifi]ssid{CSKY-T},psk{test1234}

[130.426123][D][WIFI]wifi失败

[130.430761][E][at_server_init]spipeermaynotbeready

[130.436078][D][app_net]Netdown

[130.439322][D][app_net]netreetcnt5

4、测试AT指令AT+FWVER,查看固件版本号

返回 AT+FWVER:Commandnotfound。

此w800的固件已编程。 AT命令和数据交换都是通过SPI接口进行的。 该串口只能用于打印调试信息。

3.管理网络设备并建立WIFI连接

1、新建一个WorkSpace,将CH2601_SDK包中的ch2601_webplayer_demo示例程序导入到工程中,更改名称,打开Packages文件夹,下载缺少的组件

通信无线设备有哪些_无线通信_通信无线网络优化/

2. 为了使用wifi连接互联网,需要调用netmgr API。 首先,需要初始化w800网络连接,在init.c文件中找到network_init(),并更改接入点。


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",d[0],d[1],d[2],d[3],d[4]);
}
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, "TEST", 4, "TEST1234", 10);
				w800_module_init(task,  &w800_param);
				w800_packet_input_cb_register(&w800_in);
        netmgr_start(app_netmgr_hdl);
    }
}

 

功能说明:

w800_in(intlinkid,void*data,size_tlen,charremote_ip[16],uint16_tremote_ports) 模块接收数据时,作为回调函数,简单打印出数量数据。

netmgr_dev_wifi_init()在netmgr_dev_t结构体中注册提供网络等回调函数,打开注册的wifi设备节点,调用设备实现的hal层初始化接口,并将设备添加到网络设备列表中进行统一管理。 返回值:调用失败时返回NULL。

netmgr_service_init(task) 初始化网络管理微服务。 如果外部微任务任务为空,则内部创建微任务,并将微服务添加到微任务中。

netmgr_config_wifi(app_netmgr_hdl,”er_suo_shang_zhan”,17,””,0),配置无线设备的SSID名称和对应的秘钥psk,修改为所连接路由器er_suo_shang_zhan的账号和密码,无密码。

netmgr_start(app_netmgr_hdl),配置网络参数后,可以调用该接口使指定的网络设备开始正常工作。 该函数最终会调用网络设备初始配置对应的provision网络配置回调。 该接口是非阻塞的。 网络连接成功后,网络管理器将上报EVENT_NETMGR_GOT_IP事件,否则将上报EVENT_NETMGR_NET_DISCON事件。 应用开发者可以通过event_subscribe接口订阅这两条消息来判断网络连接是否成功。 用户还可以通过调用netmgr_is_gotip来判断IP是否正常获取。

w800_module_init(任务,&w800_param); 初始化w800模块,开始监听连接断开、数据接收等事件。

w800_packet_input_cb_register(&w800_in);注册接收数据的回调函数。

3. 事件服务初始化、网络连接、事件注册。

 event_service_init(NULL);
 network_init();
 
 event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
 event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);

 

4、将J4排针3和4从串口恢复到USB接口,分别连接到1和2,即CH2601串口0的RX和TX。

5. 检查网络连接信息,获取IP成功。

[1.760]w800_apihardreset

[1.760]w800_at######################spispeed:1024000

[1.780]初始化成功!

[1.790]netmgr启动wifi

[2.550]w800_apiWIFISOFTRESETOK

[2.560]atparserline(+CMEERROR:50),格式(OK%n),计数=-1

[2.560]netmgr_wifinoapinfo

[2.690]netmgrIP:192.168.5.134

[2.700]APPnetgotip

6、测试cli命令行,输入help

====内置命令====

====支持4cmd一次,分开;====

帮助:打印这个

sysver:系统版本

重新启动:重新启动系统

时间:系统时间

p:打印内存

m:修改内存

echo:echofor命令

退出:关闭CLI

devname:打印设备名称

====用户命令====

ping:ping命令。

ifconfig:网络配置

kv:kv工具

ps:显示任务

免费:显示内存信息

工厂:设置/获取工厂信息

sys:系统命令

证明:atclienttest

从命令列表来看,可以使用ifconfig命令来配置网络连接参数。 这里我们没有使用ifconfig命令,而是使用程序中引入的netmgr_start(app_netmgr_hdl)。 attest 命令是一个用户定义的命令,我用它来开始发送和接收数据。

4.使用sal接口通信

1.关于tcp通信程序,参考occ社区的优秀博文。 文章介绍了TCPClient和命令行调用的测试。 经过实践,证明可以使用。

我使用串口调试助手SSCOM打开一个TCPServer。

通信无线网络优化_通信无线设备有哪些_无线通信/

wifi连接成功后,在命令行输入tcptest,建立socket,连接服务器,发送数据

[18.310]APP服务器IP=192.168.5.14端口=26667。

[18.310]APP创建socket20。

[18.320]salsremote_port–:26667

[18.660]APPTCP:连接服务器成功。

[ID]间隔传输带宽

[18.680]w800_apiw800startsend(3)(时间:9990)

[18.720]w800_apiw800endsend(ret:0)

[18.830]w800_apiw800startsend(3)(时间:9990)

2. 接收数据

使用轮询方式接收数据,并在while(1)循环中调用recv()。 这里注意,需要包含头文件“sockets.h”。

我还不知道中断的方法。 如果有人知道,请告诉我! !

5.使用w800_api接口进行通信

1、在主函数文件中自定义控制台命令,调用w800_api.c外部函数在控制台进行测试


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(char *wbuf, int wbuf_len, int argc, char **argv)
{
	char ssid[32];
	int bssid[6];
	int channel;
	int rssi;
	
	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);
	
	int stat;
	w800_get_status( &stat);  //[  16.360]w800_api link status 2 已获取到ip
	char *srvname="192.168.12.6";
	uint16_t port = 3333;
	w800_connect_srv(srvname, port);
	const uint8_t pdata[5]={0,1,55,3,2};
	int len=5;
	int timeout=120;
	w800_send_data(pdata,  len, timeout);
}
#include 
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;
}

 

2、在w800_api.c中添加连接服务器的程序,简化调用参数

int w800_connect_srv(char *srvname, uint16_t port)
{
	int ret = -1;
	ret = w800_connect_remote(0, NET_TYPE_TCP_CLIENT, srvname, port);
	return ret;
}

 

3、定义接收数据时的处理程序,注册到回调中,这样就可以及时通信,相当于接收到中断调用。

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",d[0],d[1],d[2],d[3],d[4]);
}
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;

 

4、编译完成后,下载到开发板,打开串口面板,连接,使用串口调试助手SSCOM打开一个TCPServer,在命令行输入attest,查看效果。

[2811.060]w800_apilinkstatus2

[2812.110]w800_apiw800startsend(5)(时间:120)

[2812.150]w800_apiw800endsend(ret:0)

服务器接收数据

通信无线网络优化_通信无线设备有哪些_无线通信/

客户端接收数据

通信无线设备有哪些_通信无线网络优化_无线通信/