RT-Thread esp8266 at udp server 实现

项目场景:

最近在调试esp8266 udp server 发现 rttthread 的sal socket 不支持,应该说有bug,记录一下修改内容


问题描述

rtthread 实现了sal socket, 支持bsp socket 使用at指令实现udp/tcp的server和client,拥抱开源吧,谢谢那些大神的付出。在实现udp server的时候发现,udp server 没有监听设置的端口,一直以为没有支持,看了代码又发现是支持的,那就奇了怪了,于是跟踪pakages的 at_socket_esp8266 发现,esp8266_socket_connect 接口在实现AT+CIPSTART 指令时,传入的port 并不是初始化时设置的port

int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)
{
   .......

    /* if the socket type is UDP, need to connect socket first */
    if (from && sock->type == AT_SOCKET_UDP && sock->state == AT_SOCKET_OPEN)
    {
        ip_addr_t remote_addr;
        uint16_t remote_port = 0;
        char ipstr[16] = { 0 };

        socketaddr_to_ipaddr_port(from, &remote_addr, &remote_port);
        ipaddr_to_ipstr(from, ipstr);

        if (sock->ops->at_connect(sock, ipstr, remote_port, sock->type, RT_FALSE) < 0)
        {
            result = -1;
            goto __exit;
        }
        sock->state = AT_SOCKET_CONNECT;
    }
.....

    while (1)
    {
        /* wait the receive semaphore */
        if (rt_sem_take(sock->recv_notice, timeout) < 0)
        {
            .....
        }
        else
        {

        .....
        }
    }

__exit:

    if (sock != RT_NULL)
    {
      ....
    }

    return result;
}

原因分析:

1、esp8266 rtthread 的pakages里面的esp8266 at组件esp8266_socket_connect 接口中server指令

f (at_obj_exec_cmd(device->client, resp, "AT+CIPSTART=%d,\"UDP\",\"%s\",%d", device_socket, ip, port) < 0) 

AT+ CIPSTART 标准入参,ip remote_port,local_port 但是上面的封装少了一个port,这就是udp server 一直无法实现的原因

2、at socket 通过下面接口调用at 命令的封装,此处传入的port 又是remote port

 if (sock->ops->at_connect(sock, ipstr, remote_port, sock->type, RT_FALSE) < 0)


解决方案:

1、if (sock->ops->at_connect(sock, ipstr, sock->listen.port, sock->type, RT_FALSE) < 0)

将at_connet 的port 入参修改为sock->listen.port (这个就是我们初始化的时候传入的port)

2、修改at命令封装,填入local_port

if (at_obj_exec_cmd(device->client, resp,

                                "AT+CIPSTART=%d,\"UDP\",\"%s\",%d,%d", device_socket, ip,port, port) < 0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vincent_zhaozhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值