成功用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后,会出现如下画面,手机也可以哦
可以用这个遥控一台平衡小车。。。
|