一,文档描述
最近有客户想要一个RT1170 LWIP socket client的代码,但是实际做下来总是遇到一些问题,所以小编自己在SDK的基础上做了一个简单的例程,并分享出来。
二,代码修改
代码平台:
MIMXRT1170-EVKB
SDK_2_13_1_MIMXRT1170-EVKB
MCUXpresso IDE v11.7.1
代码基于SDK工程lwip_ping_freertos_cm7.
这个代码本身已经添加了socket的相关文件,所以修改起来很简单,只需要添加socket的相关头文件,还有应用任务皆可。
在原有代码基础上:
添加socket服务器地址,端口,以及发送信息。
#define INIT_THREAD_STACKSIZE 1024
/*! @brief Priority of the temporary lwIP initialization thread. */
#define INIT_THREAD_PRIO DEFAULT_THREAD_PRIO
#define HOST_NAME "192.168.0.100"
#define BUF_LEN 100
uint8_t senddata[]= "Socket client test";
#define PORT 54321
#define IP_ADDR "192.168.0.100"
屏蔽stack_init中ping的调用:
// ping_init(&netif_gw);
添加 socketclient线程:
sys_thread_new("socketclient", socketclient_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
线程函数如下:
static void socketclient_thread(void *arg)
{
int sock = -1,rece;
struct sockaddr_in client_addr;
char* host_ip;
ip4_addr_t dns_ip;
err_t err;
uint32_t *pSDRAM= pvPortMalloc(BUF_LEN);//
host_ip = HOST_NAME ;
PRINTF("host name : %s , host_ip : %s\r\n",HOST_NAME,host_ip);
// while(1)
// {
PRINTF("Start server Connect !\r\n");
// create connection
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
PRINTF("Socket error\n");
vTaskDelay(10);
// continue;
}
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(PORT);
client_addr.sin_addr.s_addr = inet_addr(host_ip);
memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));
if (connect(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1)
{
PRINTF("Connect failed!\r\n");
closesocket(sock);
vTaskDelay(10);
// continue;
}
PRINTF("Connect to server successful!\r\n");
// PRINTF("\r\n************************************************************\n\r");
// PRINTF("\r\n Begin write\n\r");
write(sock,senddata,sizeof(senddata));
while (1)
{
//receive data
rece = recv(sock, (uint8_t*)pSDRAM, BUF_LEN, 0);//BUF_LEN
if (rece <= 0)
break;
PRINTF("recv %d len data\r\n",rece);
PRINTF("%.*s\r\n",rece,(uint8_t*)pSDRAM);
write(sock,pSDRAM,rece);
}
//rec data process
memset(pSDRAM,0,BUF_LEN);
closesocket(sock);
vTaskDelay(10000);//about 10s //10000
// }
}
三,测试结果
首先使用电脑配置以太网IP为服务器IP:
192.168.0.100
配置好之后,结合测试软件USR-TCP232-Test, 配置成 TCP server,local IP为:192.168.0.100, host port为:54321,进入侦听模式:
代码运行起来之后,可以看到服务器这边可以检测到客户端的IP为192.168.0.102, 连接成功后,client会发送一个socket client test信息。
然后可以接收主机发送来的信息打印到串口,并且把收到的信息再回传给服务器。
代码:evkbmimxrt1170_lwip_socket_client_freertos_cm7.7z