TT12-MCU/applications/ttTR.c

205 lines
4.1 KiB
C
Raw Normal View History

/*
* 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_DBG
#include <ulog.h>
#define BUFSZ 1024
#define RETRYCNT 10
#define URL "10.10.10.72"
#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)
{
LOG_HEX("send",27,send_data,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;
}