rt-thread+SAL+W5500 以太网Socket通信

最终工程下载地址

首先获取rt-thread-master
进入stm32f103-fire-arbitrary的bsp目录:
rt-thread+SAL+W5500 以太网Socket通信_第1张图片

pkgs --upgrade先更新一下软件源:
rt-thread+SAL+W5500 以太网Socket通信_第2张图片
在在线包中选中Wiznet:
rt-thread+SAL+W5500 以太网Socket通信_第3张图片
保存退出,pkgs --update下载包:
rt-thread+SAL+W5500 以太网Socket通信_第4张图片
menuconfig重新进行配置,启用SAL:
rt-thread+SAL+W5500 以太网Socket通信_第5张图片
比对bsp原理图,得知开发板上的INT连接的是93号引脚,RST连接的是132号引脚,使用的是spi2。
rt-thread+SAL+W5500 以太网Socket通信_第6张图片
rt-thread+SAL+W5500 以太网Socket通信_第7张图片
修改硬件配置:
rt-thread+SAL+W5500 以太网Socket通信_第8张图片
启用spi2:
rt-thread+SAL+W5500 以太网Socket通信_第9张图片
保存的时候会有警告,不去管它:
rt-thread+SAL+W5500 以太网Socket通信_第10张图片
scons --target=mdk5生成keil工程,下载运行:
rt-thread+SAL+W5500 以太网Socket通信_第11张图片
DHCP超时,因为是PC直连,没有办法自动分配IP。
关闭DHCP,设置静态IP:
rt-thread+SAL+W5500 以太网Socket通信_第12张图片
rt-thread+SAL+W5500 以太网Socket通信_第13张图片
重新生成代码并运行。初始化成功:
rt-thread+SAL+W5500 以太网Socket通信_第14张图片
电脑端IP设置:
rt-thread+SAL+W5500 以太网Socket通信_第15张图片
电脑ping通:
rt-thread+SAL+W5500 以太网Socket通信_第16张图片
开发板可ping通电脑:
rt-thread+SAL+W5500 以太网Socket通信_第17张图片
有数据包:
rt-thread+SAL+W5500 以太网Socket通信_第18张图片

粘贴rt-thread文档中的Demo到工程中:

#include 
#include 

#include 
#include  
#include 

/* RT-Thread 官网,支持 TLS 功能 */
#define SAL_TLS_HOST    "www.rt-thread.org"
#define SAL_TLS_PORT    443
#define SAL_TLS_BUFSZ   1024

static const char *send_data = "GET /download/rt-thread.txt HTTP/1.1\r\n"
    "Host: www.rt-thread.org\r\n"
    "User-Agent: rtthread/4.0.1 rtt\r\n\r\n";

void sal_tls_test(void)
{
    int ret, i;
    char *recv_data;
    struct hostent *host;
    int sock = -1, bytes_received;
    struct sockaddr_in server_addr;

    /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
    host = gethostbyname(SAL_TLS_HOST);

    recv_data = rt_calloc(1, SAL_TLS_BUFSZ);
    if (recv_data == RT_NULL)
    {
        rt_kprintf("No memory\n");
        return;
    }

    /* 创建一个socket,类型是SOCKET_STREAM,TCP 协议, TLS 类型 */
    if ((sock = socket(AF_INET, SOCK_STREAM, PROTOCOL_TLS)) < 0)
    {
        rt_kprintf("Socket error\n");
        goto __exit;
    }

    /* 初始化预连接的服务端地址 */
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SAL_TLS_PORT);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

    if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
    {
        rt_kprintf("Connect fail!\n");
        goto __exit;
    }

    /* 发送数据到 socket 连接 */
    ret = send(sock, send_data, strlen(send_data), 0);
    if (ret <= 0)
    {
        rt_kprintf("send error,close the socket.\n");
        goto __exit;
    }

    /* 接收并打印响应的数据,使用加密数据传输 */
    bytes_received = recv(sock, recv_data, SAL_TLS_BUFSZ  - 1, 0);
    if (bytes_received <= 0)
    {
        rt_kprintf("received error,close the socket.\n");
        goto __exit;
    }

    rt_kprintf("recv data:\n");
    for (i = 0; i < bytes_received; i++)
    {
        rt_kprintf("%c", recv_data[i]);
    }

__exit:
    if (recv_data)
        rt_free(recv_data);

    if (sock >= 0)
        closesocket(sock);
}

#ifdef FINSH_USING_MSH
#include 
MSH_CMD_EXPORT(sal_tls_test, SAL TLS function test);
#endif /* FINSH_USING_MSH */

直接编译会出错,这里把参数PROTOCOL_TLS修改成0就行了。(博主debug后发现这个参数并没有使用到)
rt-thread+SAL+W5500 以太网Socket通信_第19张图片
按照网上的一种说法:

有了地址类型和数据传输方式,还不足以决定采用哪种协议吗?为什么还需要第三个参数呢?
正如大家所想,一般情况下有了 af 和 type 两个参数就可以创建套接字了,操作系统会自动推演出协议类型,除非遇到这样的情况:有两种不同的协议支持同一种地址类型和数据传输类型。如果我们不指明使用哪种协议,操作系统是没办法自动推演的。
本教程使用 IPv4 地址,参数 af 的值为 PF_INET。如果使用 SOCK_STREAM 传输数据,那么满足这两个条件的协议只有 TCP,因此可以这样来调用 socket() 函数:
int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //IPPROTO_TCP表示TCP协议
这种套接字称为 TCP 套接字。
如果使用 SOCK_DGRAM 传输方式,那么满足这两个条件的协议只有 UDP,因此可以这样来调用 socket() 函数:
int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //IPPROTO_UDP表示UDP协议
这种套接字称为 UDP 套接字。
上面两种情况都只有一种协议满足条件,可以将 protocol 的值设为 0,系统会自动推演出应该使用什么协议,如下所示:
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0); //创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字
后面的教程中多采用这种简化写法。

后面两个参数共同限定作为TCP还是UDP传输,所以直接写0就可以了。
修改HOST的IP和PORT:
rt-thread+SAL+W5500 以太网Socket通信_第20张图片
重新编译下载运行。
上位机开启Server监听:
rt-thread+SAL+W5500 以太网Socket通信_第21张图片
MSH调用测试程序:
rt-thread+SAL+W5500 以太网Socket通信_第22张图片
网络调试助手收到消息:
rt-thread+SAL+W5500 以太网Socket通信_第23张图片
网络调试助手回一个消息:
rt-thread+SAL+W5500 以太网Socket通信_第24张图片
X-Shell收到消息:
rt-thread+SAL+W5500 以太网Socket通信_第25张图片
socket通信完成!

你可能感兴趣的:(rt-thread)