first commit
This commit is contained in:
+182
@@ -0,0 +1,182 @@
|
||||
#include "network.h"
|
||||
#include "work.h"
|
||||
|
||||
Socket_t context;
|
||||
|
||||
#define SOCKET_QUEUE_SEND_NUM 100000 //SOCKET接收队列长度
|
||||
#define SOCKET_QUEUE_RECV_NUM 100000 //SOCKET发送队列长度
|
||||
|
||||
QueueHandle_t SocketRecvQueue;
|
||||
QueueHandle_t SocketSendQueue;
|
||||
|
||||
void NetLoopTask(void *p);
|
||||
void NetReciveTask(void *p);
|
||||
void NetAnalysis(char *data);
|
||||
void NetPkgSend(char *data);
|
||||
void NetReciveQueueTask(void *p);
|
||||
void NetSendQueueTask(void *p);
|
||||
|
||||
Status NetProcessInit(uint32_t Port)
|
||||
{
|
||||
//初始化
|
||||
if (xSocketInitEnvironment() == SOCKET_SUCCESS)
|
||||
{
|
||||
printf("socket init success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("socket init error\n");
|
||||
return ERROR;
|
||||
}
|
||||
// 创建
|
||||
context = xSocketCreateUDP();
|
||||
// 绑定
|
||||
if (xSocketBind(context,Port) == SOCKET_SUCCESS)
|
||||
{
|
||||
printf("socket listen success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("socket listen error\n");
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
SocketRecvQueue = xQueueCreate(SOCKET_QUEUE_RECV_NUM, PKG_LEN);
|
||||
SocketSendQueue = xQueueCreate(SOCKET_QUEUE_SEND_NUM, PKG_LEN);
|
||||
|
||||
//开启任务
|
||||
xTaskCreate(NetReciveTask, /*!< 任务函数 */
|
||||
"NetReciveTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
|
||||
xTaskCreate(NetReciveQueueTask, /*!< 任务函数 */
|
||||
"NetReciveQueueTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
|
||||
xTaskCreate(NetSendQueueTask, /*!< 任务函数 */
|
||||
"NetSendQueueTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
|
||||
//网络循环执行任务
|
||||
xTaskCreate(NetLoopTask, /*!< 任务函数 */
|
||||
"NetLoopTask", /*!< 任务名 */
|
||||
1024, /*!< stack大小,单位word,也就是4字节 */
|
||||
NULL, /*!< 任务参数 */
|
||||
0, /*!< 任务优先级, 数字越大优先级越高*/
|
||||
NULL); /*!< 任务句柄 */
|
||||
}
|
||||
|
||||
//udp接收任务
|
||||
void NetReciveTask(void *p)
|
||||
{
|
||||
char PcRecvBuf[PKG_LEN]; // 接收缓冲区
|
||||
char PcRemoteIP[16]; // 存放谁发过来的 IP
|
||||
uint16_t PcRemotePort; //存放谁发过来的端口
|
||||
int PkgLen; //接收长度
|
||||
|
||||
while (1)
|
||||
{
|
||||
PkgLen = xSocketReceiveFrom(context,PcRecvBuf,PKG_LEN,PcRemoteIP,&PcRemotePort);
|
||||
if (PkgLen == PKG_LEN)
|
||||
{
|
||||
xQueueSend(SocketRecvQueue,PcRecvBuf,portMAX_DELAY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//udp解析函数
|
||||
void NetAnalysis(char *data)
|
||||
{
|
||||
switch (data[1])
|
||||
{
|
||||
case PKG_OPEN_CAN:
|
||||
//打开CAN
|
||||
CanFuncRegister(data[2]);
|
||||
CanFuncOpen(data[3]);
|
||||
break;
|
||||
case PKG_CLOSE_CAN:
|
||||
//关闭CAN
|
||||
break;
|
||||
case PKG_CTRL_CAN:
|
||||
//收发CAN
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//心跳包
|
||||
void NetHeart(void)
|
||||
{
|
||||
static char heart[PKG_LEN];
|
||||
heart[0] = PHEAD;
|
||||
heart[1] = PKG_HEART;
|
||||
heart[2] = work.status;
|
||||
heart[3] = work.product;
|
||||
heart[4] = work.chnlNum;
|
||||
heart[5] = work.canFd;
|
||||
|
||||
for (uint8_t i = 6; i < PKG_LEN; i++)
|
||||
{
|
||||
heart[i] = DISABLE;
|
||||
}
|
||||
|
||||
heart[PKG_LEN - 1] = PEND;
|
||||
|
||||
NetPkgSend(heart);
|
||||
}
|
||||
|
||||
//网络循环任务
|
||||
void NetLoopTask(void *p)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
//发送心跳包
|
||||
// NetHeart();
|
||||
vTaskDelay(500);
|
||||
}
|
||||
}
|
||||
|
||||
//udp队列接收任务
|
||||
void NetReciveQueueTask(void *p)
|
||||
{
|
||||
char PcRecvBuf[PKG_LEN]; // 接收缓冲区
|
||||
|
||||
while(1)
|
||||
{
|
||||
xQueueReceive(SocketRecvQueue,&PcRecvBuf,portMAX_DELAY);
|
||||
|
||||
NetAnalysis(PcRecvBuf);
|
||||
}
|
||||
}
|
||||
|
||||
//网络数据包发送
|
||||
void NetPkgSend(char *data)
|
||||
{
|
||||
data[0] = PHEAD;
|
||||
data[PKG_LEN - 1] = PEND;
|
||||
xQueueSend(SocketSendQueue,data,portMAX_DELAY);
|
||||
}
|
||||
|
||||
//网络数据包发送队列
|
||||
void NetSendQueueTask(void *p)
|
||||
{
|
||||
static uint16_t SendPort = SEND_PORT;
|
||||
char PcSendBuf[PKG_LEN]; // 接收缓冲区
|
||||
|
||||
while(1)
|
||||
{
|
||||
xQueueReceive(SocketSendQueue,&PcSendBuf,portMAX_DELAY);
|
||||
|
||||
xSocketSendTo(context,PcSendBuf,PKG_LEN,"127.0.0.1",SendPort);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user