1362|3

155

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【平头哥RVB2601创意应用开发】使用体验05 -- TCP Client [复制链接]

  本帖最后由 sonicfirr 于 2022-4-7 18:22 编辑

RVB2601Wi-Fi模块工作起来后,自然就是利用其进行通信,最常见的模式就是TCP协议,配置板子作为TCP Client连接PC机运行的TCP Server(网络助手),此篇记录相关过程。

1、网络连接组件介绍

如果说网络管理器netmgr”实现了接入模块适配,那么套接字适配层SAL就是与协议栈的适配接口(这里面有个大坑,关于NTP,下篇再讲)。

CH2601 SDK中,SAL向下通过drv_wifi_at_w800组件与W800模块适配,向上则桥接于lwip协议栈。

 

5-1 SAL框架示意图

 

进而,RVB2601实现联网通信,尤其是传输层通信,既可以通过lwipAPI,也可以通过drv_wifi_at_w800API

对于用户来说,drv_wifi_at_w800组件可能更加直接。其中的“w800_api.c”文件定义了主要的网络通信接口等函数。

 

5-2 drv_wifi_at_w800组件主要源文件

 

5-3 w800_api.c中部分API

 

而对于lwip接口来说,按照其API使用方式就可以实现功能,不过这里需要提到的一个“坑”,就是SAL适配的lwip并不完整,如果尝试再添加单独的lwip组件(IDE中支持)这样做,不仅不会补全功能,还会因为存在两套组件源码(即SAL不全版和导入lwip pack)而出现大量报错。

SAL通过sal_opt_t结构体,封装主要的通信功能接口,在w800_devops.c中,w800_dev_open()函数完成了全局sal_opt_t变量——w800_sal_driver的注册。

 

5-4 RVB2601中的sal接口定义

2TCP Client实现案例

本篇利用drv_wifi_at_w800组件实现了TCP Client连接。案例还是基于“Hello World”修改,并在上篇基础上扩充。

init.c中定义接收回调函数,业务逻辑比较简单,就是将接收内容串口打印输出。

 

//w800 input callback function
void aita_w800in_cb(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports) {
        uint8_t* d;
        d = (uint8_t *)data;
        printf("linkid: %d\n", linkid);
        printf("len: %d\n", len);
        printf("remote_ip: %s\n", remote_ip);
        printf("remote_port: %d\n", remote_ports);
        printf("data:%s\n", d);
}

 

网络初始化函数还是上篇建立的aita_InitNetwork(),现在添加一句注册回调函数的代码。

 

//network init: open w800, 
void aita_InitNetwork(void) {
        /*
         * by AITA Mr.Fei
         * w800 interface struct
         */
    w800_wifi_param_t w800_param;
    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;
        /*
         * by AITA Mr.Fei
         * from w800_devops.c(drv_wifi_at_w800 pack),
         * include w800_module_init(but there is no task, so create a new one) & driver_register.
         */
    wifi_w800_register(NULL, &w800_param);
        /*
         * by AITA Mr.Fei
         * register uservice for wifi, 
         * init netmgr_uservice struct then return the pointer
         */
    app_netmgr_hdl = netmgr_dev_wifi_init();
    if(app_netmgr_hdl) {
                //init uservice for wifi
        utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
        netmgr_service_init(task);
                //join AP, WIFI_SSID & WIFI_PSW both are Macro
        netmgr_config_wifi(app_netmgr_hdl, WIFI_SSID, 10, WIFI_PSW, 10);
                //init w800 AT parser
                w800_module_init(task, &w800_param);
                //register input event callback for w800 module -- 添加此句代码
                w800_packet_input_cb_register(&aita_w800in_cb);
                //start uservice
        netmgr_start(app_netmgr_hdl);
                //subscribe events which is managed by netmgr uservice
        event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
        event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
    }
}

 

再编写一个TCP连接的测试函数,非常简单,建立TCP Server(手机APP实现),然后发送一条信息,当然连接建立后短时间不会断开,Server也可以回传信息,通过回调函数接收。

 

//tcp client test func
void aita_tcpclienttest(void) {
        char buf[] = "hello from RVB2601 by W800\n";
        
        int ret = -1;        
        ret = w800_connect_remote(0, NET_TYPE_TCP_CLIENT, GW_IP, GW_PORT);
        if(ret < 0) return;
        
        int stat;
        w800_get_status(&stat);  //[  16.360]<D>w800_api link status 2 已获取到ip
        LOGD(TAG, "connect status: %d\n", stat);

        w800_send_data(buf, sizeof(buf), 3000);
}

 

为了测试方便,cli_cmd.c中添加代码,将aita_tcpclienttest()注册为一条控制台命令,代码如下。

 

void aita_tcpclienttest(void);
static void cmd_tcp_client_handler(char *wbuf, int wbuf_len, int argc, char **argv) {
        aita_tcpclienttest();
}
int cli_reg_cmd_tcp(void) {
    static const struct cli_command tcp_cmd_info = {
        "tcptest",
        "tcp client test",
        cmd_tcp_client_handler,
    };
    aos_cli_register_command(&tcp_cmd_info);
    return 0;
}

void board_cli_init()
{
    aos_cli_init();

    extern void cli_reg_cmd_ps(void);
    cli_reg_cmd_ps();

    extern void cli_reg_cmd_free(void);
    cli_reg_cmd_free();
        
        extern void cli_reg_cmd_ping(void);
        cli_reg_cmd_ping();
        
        extern void cli_reg_cmd_ifconfig(void);
    cli_reg_cmd_ifconfig();
        
        //register tcp client test command
        cli_reg_cmd_tcp();
}

 

5-5 tcptest命令测试效果

 

5-6 TCP Server接收效果

 

 

最新回复

我原来想用mqtt来做的,去阿里发了工单,也没结果,想外挂NBIOT串口又不够,难呀!  详情 回复 发表于 2022-4-7 16:19
点赞 关注
 
 

回复
举报

6842

帖子

11

TA的资源

版主

沙发
 
我原来想用mqtt来做的,去阿里发了工单,也没结果,想外挂NBIOT串口又不够,难呀!

点评

要是用过OneNet的话,可以尝试一下平台的MQTT旧版,有官方提供的一个SDK(封装数据包)的,应该可以用一下。移植难度不太大。  详情 回复 发表于 2022-4-7 18:16
 
 
 

回复

155

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
lugl4313820 发表于 2022-4-7 16:19 我原来想用mqtt来做的,去阿里发了工单,也没结果,想外挂NBIOT串口又不够,难呀!

要是用过OneNet的话,可以尝试一下平台的MQTT旧版,有官方提供的一个SDK(封装数据包)的,应该可以用一下。移植难度不太大。

 
 
 

回复

155

帖子

1

TA的资源

一粒金砂(高级)

4
 
我再也不做图片居中了,富文本编辑器不好用
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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