2225|1

53

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

成功用RVB2601做为TCP Server的web服务器 [复制链接]

 

成功用RVB2601做为TCP Server的web服务器

 

.c文件的代码如下:

#include "wifi_w800.h"

#include <uservice/uservice.h>

#include <uservice/eventid.h>

#include <uservice/uservice.h>

#include <yoc/netmgr_service.h>

#include <devices/w800.h>

#include <drv/pin.h>

#include <drv/timer.h>

#include "../w800_api.h"

#include <aos/cli.h>

 

#define TAG "W800"

 

#define WIFI_SSID "MI6"//这里填你的wifi的SSID

#define WIFI_PASSWORD "12345678"//这里填你的密码

 

netmgr_hdl_t app_netmgr_hdl;

static int net_reset_err_times = 0;

int rcflag=0;

aos_timer_t test_timer;//定义定时器变量

char ip[16]="0.0.0.0",wg[16],mask[16];

 

uint8_t gb=0;//小车遥控命令,1左,2前,3右,4后,5停

uint8_t re=0;//是否有响应数据包需要回复

 

char sendat[1024];

char senbdy[800];

 

const char body[]={

"<html><head>"

"<meta http-equiv='Content-Type' content='text/html;charset=utf-8'>"

"<meta name='viewport' content='width=device-width,initial-scale=1,minimum-scale=0.5,maximum-scale=2'>"

"<style>button{font-size:30px;margin:10px}div{text-align:center}</style>"

"<script>"

"var xhr;if(window.XMLHttpRequest){xhr=new XMLHttpRequest()}else{xhr=new ActiveXObject('Microsoft.XMLHTTP')}"

"function tj(id){xhr.open('get','http://%s/'+id);xhr.send();}"

"</script>"

"</head><body>"

"<div><button onclick=tj('2')>前进</button></div>"

"<div><button onclick=tj('1')>左转</button><button onclick=tj('5');>停止</button><button onclick=tj('3')>右转</button></div>"

"<div><button onclick=tj('4')>后退</button></div>"

"</body></html>"

};

 

const char head[]={

"HTTP/1.1 200 OK\r\n"

//"Connection: Keep-Alive\r\n"

"Connection: close\r\n"

"Content-Length: %d\r\n\r\n"

"%s"

};

 

//发送响应数据包

void timer_wifi(void *arg1, void* arg2)

{

size_t len;

w800_choose_id(0);

if(rcflag==1){//显示网页

len=sprintf(senbdy,body,ip);//把IP地址压入body中

len=sprintf(sendat,head,len,senbdy);

w800_send_data((uint8_t*)sendat, len, 120);

printf("send len=%d\r\n",len);

}

else{//只显示head头

len=sprintf(sendat,head,0,"");

w800_send_data((uint8_t*)sendat, len, 120);

printf("send len=%d\r\n",len);

}

}

 

//接收数据回调函数

void w800_data_receive_callback(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)

{

char* p=data;

if(len == 0)return;

 

printf("receive data len: %d,id=%d\r\n",len,linkid);

 

if(linkid==0){//如果为0号链接,表示web服务器

if(strncmp(data,"GET / ",6)==0){

rcflag=1;

printf("Get /\r\n");

}

else{

rcflag=0;

for(int i=0;i<10;i++){

printf("%c",p);

}

gb=p[5]-'0';

//sum_e_Velocity=0;

printf("=%d\r\n",gb);

}

aos_timer_start(&test_timer);

//re=1;

}

}

 

 

void app_exception_event(uint32_t event_id)

{

switch(event_id) {

case EVENT_NETMGR_NET_DISCON:

LOGD(TAG, "EVENT_NETMGR_NET_DISCON");

net_reset_err_times++;

if (net_reset_err_times >= MAX_NET_RESET_ERR_TIMES) {

LOGD(TAG, "Net Reset times %d, reboot", net_reset_err_times);

//do reboot

aos_reboot();

} else {

LOGD(TAG, "Net Reset after %d second", NET_RESET_DELAY_TIME);

netmgr_reset(app_netmgr_hdl, NET_RESET_DELAY_TIME);

}

break;

case EVENT_NETMGR_GOT_IP:

net_reset_err_times = 0;

break;

}

}

 

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");

w800_link_info(ip,wg,mask);

printf("net got ip=%s\r\n",ip);

/*需要打开w800_api.c文件,找到w800_connect_remote函数,把下面的语句加入到

* ret = atparser_send(g_atparser_uservice_t, "AT+CIPSTART=%d,%s,%d", id, "tcp_server", port);

* 加入到

* case NET_TYPE_TCP_SERVER:

* 下面,否则不能做为服务器动行

*/

w800_connect_remote(0, NET_TYPE_TCP_SERVER, "", 80);//TCP Web服务器

break;

 

case EVENT_NETMGR_NET_DISCON:

LOGD(TAG, "net disconnect");

break;

}

 

/*do exception process */

app_exception_event(event_id);

}

 

static void network_init()

{

w800_wifi_param_t w800_cs;

/* init wifi driver and network */

w800_cs.reset_pin = PA21;

w800_cs.baud = 1*1000000;

w800_cs.cs_pin = PA15;

w800_cs.wakeup_pin = PA6;

w800_cs.int_pin = PA22;

w800_cs.channel_id = 0;

w800_cs.buffer_size = 4*1024;

 

printf("network_init();\r\n");

 

wifi_w800_register(NULL, &w800_cs);

printf("wifi_w800_register();\r\n");

 

app_netmgr_hdl = netmgr_dev_wifi_init();

printf("netmgr_dev_wifi_init();\r\n");

 

if (app_netmgr_hdl) {

printf("netmgr_dev_wifi_init OK!!!\r\n");

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, WIFI_SSID, strlen(WIFI_SSID), WIFI_PASSWORD, strlen(WIFI_PASSWORD));//连接wifi

w800_packet_input_cb_register(&w800_data_receive_callback);//注册接收函数

netmgr_start(app_netmgr_hdl);

}

else{

printf("netmgr_dev_wifi_init ERR!!\r\n");

}

}

 

//自定义cmd命令

static void cmd_at_client_handler(char *wbuf, int wbuf_len, int argc, char **argv)

{

 

if(argc==2){

if(strcmp(argv[1],"0")==0){

w800_connect_remote(0, NET_TYPE_TCP_SERVER, "", 80);

}

else if(strcmp(argv[1],"1")==0){

w800_connect_remote(1, NET_TYPE_TCP_CLIENT, "192.168.0.228", 8888);

}

else {

printf("argc==2 err\r\n");

}

}

if(argc==3){

if(strcmp(argv[1],"send")==0){

const uint8_t pdata[] = "Hello RVB2601!\r\n";

int len = sizeof(pdata);

int timeout=120;

 

if(strcmp(argv[2],"0")==0){

w800_choose_id(0);

}

else if(strcmp(argv[2],"1")==0){

w800_choose_id(1);

}

w800_send_data(pdata, len, timeout);

}

else{

printf("argc==3 err\r\n");

}

}

}

 

//注册自定义的cmd命令

int cli_reg_cmd_at(void)

{

static const struct cli_command at_cmd_info = {

"tcp_client",

"tcp_client 0/1/send 0/1",

cmd_at_client_handler,

};

aos_cli_register_command(&at_cmd_info);

return 0;

}

 

void cli_reg_cmd_ping(void);

void cli_reg_cmd_ifconfig(void);

void wifi_w800_init()

{

cli_reg_cmd_ifconfig();

cli_reg_cmd_ping();

cli_reg_cmd_at();

 

event_service_init(NULL);

network_init();

 

aos_timer_new_ext(&test_timer, timer_wifi, NULL, 1, 0, 0);//初始化定时器,1ms后,单次执行,手动执行

 

/* Subscribe */

event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);

event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);

}、

 

.h文件

#ifndef _WIFI_W800_H_

#define _WIFI_W800_H_

 

#include <yoc/netmgr.h>

 

 

#define MAX_NET_RESET_ERR_TIMES 3

#define NET_RESET_DELAY_TIME 3000

 

extern netmgr_hdl_t app_netmgr_hdl;

extern uint8_t gb,re;

extern char ip[];

 

void wifi_w800_init();

void timer_wifi(void *arg1, void* arg2);

 

 

#endif

 

 

注意事项:

1.需要修改驱动文件w800_api.c文件,到

int w800_connect_remote(int id, net_conn_e type, char *srvname, uint16_t port)

{

switch (type) {

case NET_TYPE_TCP_SERVER:

//加入如下语句

ret = atparser_send(g_atparser_uservice_t, "AT+CIPSTART=%d,%s,%d", id, "tcp_server", port);

break;

}

 

2.收到浏览器访问后,不能马上回复,必须要新建一个定时器,且定时器要用aos_timer_new_ext()定时器,不能用csi_timer_init定时器,比如1ms,然后1ms后回复数据给客户端即可

 

3. 主函数中调用wifi_w800_init();

 

连入成功后,串口调试助手中可以看到

net got ip=192.168.31.180

 

表示wifi连入成功,,打开浏览器,输处http://192.168.31.180后,会出现如下画面,手机也可以哦

可以用这个遥控一台平衡小车。。。

 

最新回复

nmg
期待作品演示,哇咔咔   详情 回复 发表于 2022-6-5 20:45
点赞 关注
 
 

回复
举报

5263

帖子

236

TA的资源

管理员

沙发
 

期待作品演示,哇咔咔

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表