1567|3

274

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

【平头哥RVB2601创意应用开发】 第六篇 建立TCP客户端 [复制链接]

 

wifi的使用不太顺利,源代码的结构很乱,使用代码的跳转功能,发现socket的函数在sal和socket的头文件之间跳来跳去,成了一个循环,找不到具体在哪里实现的,放弃了。

后来参考多位坛友的分享,使用w800里的函数,创建了一个TCP的客户端。

创建过程如下:

1.连接wifi

整个代码的修改是在"ch2601_webplayer_demo"的例程下进行修改的。首先在"init.c"里的"static void network_init()"修改自己wifi的ssid和密码:

netmgr_config_wifi(app_netmgr_hdl, "ChinaNet-JvAb", strlen("ChinaNet-JvAb"), "s3fackxx", strlen("s3fackxx"));

2.增加收到数据的回调函数

回调函数如下:

void w800_in(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)
{
    uint8_t* d;
    uint8_t speed;
    d=(uint8_t *)data;
    printf("rev:%sn",data);
    // do sth. in here
}

注册回调函数,注册的位置也放到了"init.c"里的"static void network_init()"中,完整的"static void network_init()"函数如下:

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, "ChinaNet-JvAb", strlen("ChinaNet-JvAb"), "s3fackxx", strlen("s3fackxx"));
		w800_packet_input_cb_register(&w800_in);  // 注册回调函数
        netmgr_start(app_netmgr_hdl);
    }
}

3. 当连上wifi后建立TCP客户端

在"app_main.c"的"main.c"中,注册了2个事件,分别是获取到IP地址和断开连接时的事件。

int main(void)
{
    board_yoc_init();
    pwm_io_init();

    /* Subscribe */
    event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
    event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);  
}

在获取到IP地址的事件中,建立TCP客户端

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_connect_remote(0,2,REMOTE_IP,REMOTE_PORT); //连接到服务器
		aos_task_new("dht12_task",dht12_task,NULL,2*1024);  //新建线程用于处理数据
        break;
    case EVENT_NETMGR_NET_DISCON:
        LOGD(TAG, "net disconnect");
        break;
    }

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

void dht12_task(void *paras)
{
	char str[50];
	unsigned char buf[10];
	dht12_init();
	while(1){
		dht12_get_data(buf);
		sprintf(str,"temperature:%d.%d;humity:%d.%d;\n",buf[2],buf[3],buf[0],buf[1]);
		w800_send_data(str,strlen(str),1000); //使用此函数实现数据的发送
		aos_msleep(5000);
	}
}

注意要添加头文件 "#include <devices/w800.h>"。使用函数"int w800_send_data(const uint8_t *pdata, int len,int timeout)"实现数据的发送,然后结合第2步中的接收回调函数,就可以实现TCP客户端的任务了。

最后要感谢在前方的坛友,提供了很多特别出色的经验分享。

 

最新回复

wifi联网是不是很难弄呀     详情 回复 发表于 2022-5-11 15:58
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 
弄好了,加油。下步把http弄会呗

点评

[attachimg]603623[/attachimg] 我把项目完结了之后试一试    详情 回复 发表于 2022-5-4 08:59
 
 
 

回复

274

帖子

8

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2022-5-3 19:48 弄好了,加油。下步把http弄会呗

 我把项目完结了之后试一试  

 
 
 

回复

153

帖子

0

TA的资源

一粒金砂(中级)

4
 

wifi联网是不是很难弄呀

 

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表