本文基于平头哥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(),并更改接入点。
voidw800_in(intlinkid,void*data,size_tlen,charremote_ip[16],uint16_tremote_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]);}typedefvoid(*net_data_input_cb_t)(intlinkid,void*data,size_tlen,charremote_ip[16],uint16_tremote_ports);externintw800_packet_input_cb_register(net_data_input_cb_tcb);//net_data_input_cb_tcb=&w800_in;externintw800_module_init(utask_t*task,w800_wifi_param_t*param);staticvoidnetwork_init(){w800_wifi_param_tw800_param;/*initwifidriverandnetwork*/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外部函数在控制台进行测试
externintw800_software_reset(void);externintw800_ap_info(charssid[32],intbssid[6],int*channel,int*rssi);externintw800_get_status(int*stat);externintw800_connect_srv(char*srvname,uint16_tport);externintw800_send_data(constuint8_t*pdata,intlen,inttimeout);staticvoidcmd_at_client_handler(char*wbuf,intwbuf_len,intargc,char**argv){charssid[32];intbssid[6];intchannel;intrssi;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);intstat;w800_get_status(&stat);//[16.360]w800_apilinkstatus2已获取到ipchar*srvname="192.168.12.6";uint16_tport=3333;w800_connect_srv(srvname,port);constuint8_tpdata[5]={0,1,55,3,2};intlen=5;inttimeout=120;w800_send_data(pdata,len,timeout);}#include<aos/cli.h>intcli_reg_cmd_at(void){staticconststructcli_commandat_cmd_info={"attest","atclienttest",cmd_at_client_handler,};aos_cli_register_command(&at_cmd_info);return0;}
2、在w800_api.c中添加连接服务器的程序,简化调用参数
intw800_connect_srv(char*srvname,uint16_tport){intret=-1;ret=w800_connect_remote(0,NET_TYPE_TCP_CLIENT,srvname,port);returnret;}
3、定义接收数据时的处理程序,注册到回调中,这样就可以及时通信,相当于接收到中断调用。
voidw800_in(intlinkid,void*data,size_tlen,charremote_ip[16],uint16_tremote_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]);}typedefvoid(*net_data_input_cb_t)(intlinkid,void*data,size_tlen,charremote_ip[16],uint16_tremote_ports);externintw800_packet_input_cb_register(net_data_input_cb_tcb);net_data_input_cb_tcb=&w800_in;
4、编译完成后,下载到开发板,打开串口面板,连接,使用串口调试助手SSCOM打开一个TCPServer,在命令行输入attest,查看效果。
[2811.060]w800_apilinkstatus2
[2812.110]w800_apiw800startsend(5)(时间:120)
[2812.150]w800_apiw800endsend(ret:0)
服务器接收数据
客户端接收数据