TT12-MCU/applications/ttTR.c
murmur 5af0888b3b demo.c 添加线程接收用例
添加 ttTR.c ,基本完成发送功能
2023-05-30 16:53:31 +08:00

204 lines
4.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-05-30 murmur the first version
*/
#include <rtthread.h>
#include <sys/socket.h> /* 使用BSD socket需要包含socket.h头文件 */
#include <netdb.h>
#include <string.h>
#define LOG_TAG "ttTR"
#define LOG_LVL LOG_LVL_INFO
#include <ulog.h>
#define BUFSZ 1024
#define RETRYCNT 10
#define URL "http://192.168.0.232"
#define PORT 8005
int sock=0;
static void tcpClose(void)
{
/* 关闭这个连接 */
if (sock) {
closesocket(sock);
}
}
static int tcpInit(void)
{
int ret;
const char *url = URL;
int port = PORT;
/* 通过函数入口参数url获得host地址如果是域名会做域名解析 */
struct hostent *host;
host = gethostbyname(url);
/* 创建一个socket类型是SOCKET_STREAMTCP类型 */
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
/* 创建socket失败 */
LOG_E("Socket error");
return RT_ERROR;
}
/* 初始化预连接的服务端地址 */
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(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)) == -1)
{
/* 连接失败 */
LOG_E("Connect fail!\n");
tcpClose();
return RT_ERROR;
}
else {
return RT_EOK;
}
}
static int tcpSend(const rt_uint8_t *send_data, size_t len)
{
/* 发送数据到sock连接 */
int ret = send(sock, send_data, len, 0);
if (ret == len)
{
ret = RT_EOK;
}
else
{
LOG_E("Send error, send function return %d", ret);
ret = RT_ERROR;
}
return ret;
}
static int tcpRec()
{
/* 分配用于存放接收数据的缓冲 */
char *recv_data;
recv_data = rt_malloc(BUFSZ);
if (recv_data == RT_NULL)
{
LOG_E("No memory.");
return RT_ENOMEM;
}
int ret=RT_ERROR;
size_t cnt = RETRYCNT;//尝试次数
while (cnt--)
{
/* 从sock连接中接收最大BUFSZ - 1字节数据 */
int bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
if (bytes_received) {
LOG_HEX("rec data",16,recv_data,bytes_received);
//check response
rt_uint8_t rec_good[] = { 0x88, 0xAA, 0xBB, 0x88 };//前四字节
if (rt_memcmp(recv_data, rec_good, 4))
{
ret = RT_EOK;
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
}
else {
LOG_E("received error.");
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
rt_thread_delay(100);
}
return ret;
}
/**
* 发送一维数组
* @param msg 待发数据
* @param len 数组长度
* @return 成功返回0
*/
int sendMsg(const rt_uint8_t *msg, size_t len)
{
if (tcpInit() != RT_EOK)
{
return RT_ERROR;
}
if (tcpSend(msg, len) != RT_EOK)
{
tcpClose();
return RT_ERROR;
}
if (tcpRec() != RT_EOK)
{
tcpClose();
return RT_ERROR;
};
tcpClose();
return RT_EOK;
}
/**
* 发送二维数组
* @param msg 待发二维数组
* @param s 各纬度数组长度
* @param row 数组长度
* @return 成功返回0
*/
int sendMsgs(const rt_uint8_t (*msg)[200], char *s, size_t row)
{
if (tcpInit() != RT_EOK)
{
return RT_ERROR;
}
for (size_t var = 0; var < row; var++)
{
if (tcpSend(msg[var], s[row]) != RT_EOK)
{
tcpClose();
return RT_ERROR;
}
if (tcpRec() != RT_EOK)
{
tcpClose();
return RT_ERROR;
};
}
tcpClose();
return RT_EOK;
}