20230201_1811_emb/1811Project_LPc/Src/Usr/Task/Task-GuangDian/UpcCommTask.c

841 lines
39 KiB
C
Raw Normal View History

#include "UpcCommTask.h"
#include "RtcTask.h"
#include "RtcDrv.h"
#include "RunEnvTask.h"
#include "OutPutGpioTask.h"
#include "arch/ZtmsLwip.h"
#include "lwip/sys.h"
#include "netif/tivaif.h"
#include "driverlib/sysctl.h"
#include "ToolCheck.h"
#include "WatchdogTask.h"
#include "FileSysTask.h"
#include "ToolDelay.h"
#include <stdio.h>
#include <string.h>
#include "McuBspEeprom.h"
#include "EepromTaskConf.h"
#define TASK_COMM_RECV_DATA_BUFLEN 4200 // TCP接收缓存
#define TASK_COMM_HANDLE_DATA_BUFLEN 2100 // 数据处理存放缓存
#define TASK_COMM_HANDLE_DATA_COUNT 10 // 数据缓存条数
#define TASK_COMM_SEND_DATA_BUFLEN 2100
#define TASK_COMM_DATA_IDLING 0 // 空闲态
#define TASK_COMM_DATA_SORTING 1 // 分拣态
#define TASK_COMM_DATA_HANDLING 2 // 处理态
/********************************类型定义************************************/
typedef struct{
unsigned char HandleDataBuf[TASK_COMM_HANDLE_DATA_BUFLEN];
unsigned char HandleFlag;
unsigned short HandleCount;
} TASK_COMM_HANDLE;
char gLoaclAddrBuf[150] = {0};
/***************************设备类型与设备ID**********************************/
static unsigned int gDeviceType = 201; // 设备类型
static unsigned int gDeviceId = 6; // 设备ID
/****************************网络连接参数*************************************/
static ZTMS_NETWORK_IPADDR gLocalIpAddr = {192,168,1,150}; // 本机默认IP地址
static unsigned short gLocalIpPort = 55000; // 本系统通信的默认IP地址
static ZTMS_NETWORK_IPADDR gMaskAddr = {255,255,255,0}; // 本机默认子网掩码
static ZTMS_NETWORK_IPADDR gGwAddr = {192,168,1,1}; // 本机默认网关
static unsigned int gIpSetFlag = 0;
//static ZTMS_NETWORK_IPADDR gDestIpAddr = {41,244,68,56}; // 目标默认IP地址
static unsigned short gDestIpPort = 0; // 目标默认端口号
static ip_addr_t gDestIp; // 目标默认IP的转换地址
static struct netconn *gTaskUpcCommTcpNetconn = NULL;
static struct netconn *gTaskUpcCommTcpClientNetconn = NULL;
/*****************************标志状态位************************************/
static int gTaskUpcCommRecvWatchdogId = -1; // 网络通信任务的看门狗ID
static int gTaskUpcCommExtractWatchdogId = -1; // 网络通信任务的看门狗ID
static int gTaskUpcCommHandleWatchdogId = -1; // 网络通信任务的看门狗ID
static int gTaskNetPortSta = 0; // 关于物理网口部分连接状态
static int gTaskTcpConnSta = 0; // TCP通信连接的状态
/******************************接收发送缓存*********************************/
static unsigned char gTaskUpcCommRecvDataBuf[TASK_COMM_RECV_DATA_BUFLEN] = {0}; //TCP接收缓存
static unsigned short gTaskUpcCommRecvDataBufRecvLocal = 0; // 接收的数据缓存的当前下标
static unsigned short gTaskUpcCommRecvDataBufHandleLocal = 0; // 处理的数据缓存当前下标
static unsigned char gTaskUpcCommSendDataBuf[TASK_COMM_SEND_DATA_BUFLEN] = {0}; //TCP发送缓存
// 存放一定数量已经初步处理过的缓存
static TASK_COMM_HANDLE gTaskUpcCommHandleDataBuf[TASK_COMM_HANDLE_DATA_COUNT] = {{0}};
/********************************静态函数声明*******************************/
static void TaskUpcCommTcpSocketConn(void); // TCP连接函数
static void TaskUpcCommStartRecv(void);
static void TaskUpcCommClearDataStatus(unsigned char CountId); // 清楚数据内部处理状态
static void TaskUpcCommNormalAck(unsigned short PlatNum, unsigned short PlatId, uint8_t Result); // ACK回复
static unsigned char gSendBufTmp[1050] = {0}; // 临时发送数据保存
void TaskUpcCommRecv(void *arg)
{
unsigned int RealWbyte;
int ret;
/* 将通信接收任务开启写入日志 */
do {
ret = TaskFileLogWrite("TaskUpcCommRecv: Join in!!\n", strlen("TaskUpcCommRecv: Join in!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
OSTimeDly(1);
} while (ret > 0);
while (1) {
/* 建立TCP连接 */
TaskUpcCommTcpSocketConn();
/* TCP连接成功 */
do {
ret = TaskFileLogWrite("TaskUpcCommRecv: TCP connect!!\n", strlen("TaskUpcCommRecv: TCP connect!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
OSTimeDly(1); // 需要TCP不停处于接收态
} while (ret > 0);
/* 开始接收 */
TaskUpcCommStartRecv();
}
}
/* 从接收缓存中提取一组完成的数据 */
void TaskUpcCommExtractData(void* arg)
{
int i = 0;
unsigned int RealWbyte;
int ret;
/* 将接收缓存提取数据任务开启写入日志 */
do {
ret = TaskFileLogWrite("TaskUpcCommExtractData: Join in!!\n", strlen("TaskUpcCommExtractData: Join in!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommExtractWatchdogId);
OSTimeDly(1);
} while (ret > 0);
while (1) {
TaskWatchdogFreed(gTaskUpcCommExtractWatchdogId);
OSTimeDly(1);
if (gTaskUpcCommRecvDataBufHandleLocal == gTaskUpcCommRecvDataBufRecvLocal) {
continue;
}
if (gTaskUpcCommRecvDataBuf[gTaskUpcCommRecvDataBufHandleLocal] == 0x7f) {
for (i = 0; i < TASK_COMM_HANDLE_DATA_COUNT; i++) {
if (gTaskUpcCommHandleDataBuf[i].HandleFlag == TASK_COMM_DATA_SORTING) {
if (gTaskUpcCommHandleDataBuf[i].HandleCount < 18) { // 18为数据包最小单位长度
/* 该帧数据错误,将该帧数据变成空闲态,并清空内部长度 */
gTaskUpcCommHandleDataBuf[i].HandleFlag = TASK_COMM_DATA_IDLING;
gTaskUpcCommHandleDataBuf[i].HandleCount = 0;
break;
} else {
/* 将数据保存在帧数据中,表示一帧数据的完成 */
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[gTaskUpcCommHandleDataBuf[i].HandleCount] = gTaskUpcCommRecvDataBuf[gTaskUpcCommRecvDataBufHandleLocal];
gTaskUpcCommHandleDataBuf[i].HandleCount++;
gTaskUpcCommHandleDataBuf[i].HandleFlag = TASK_COMM_DATA_HANDLING;
break;
}
}
}
if ((i < TASK_COMM_HANDLE_DATA_COUNT) && (gTaskUpcCommHandleDataBuf[i].HandleFlag == TASK_COMM_DATA_HANDLING)) {
gTaskUpcCommRecvDataBufHandleLocal++; // 数据处理完成的跳出之一,因此该字节处理完成,且为完成一帧数据获取的跳出
gTaskUpcCommRecvDataBufHandleLocal = (unsigned short)(gTaskUpcCommRecvDataBufHandleLocal % TASK_COMM_RECV_DATA_BUFLEN);
continue;
}
for (i = 0; i < TASK_COMM_HANDLE_DATA_COUNT; i++) {
/* 上面的逻辑排除了接收态,所以只剩空闲态 */
if (gTaskUpcCommHandleDataBuf[i].HandleFlag == TASK_COMM_DATA_IDLING) {
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[gTaskUpcCommHandleDataBuf[i].HandleCount] = gTaskUpcCommRecvDataBuf[gTaskUpcCommRecvDataBufHandleLocal];
gTaskUpcCommHandleDataBuf[i].HandleCount++;
gTaskUpcCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskUpcCommHandleDataBuf[i].HandleCount % TASK_COMM_HANDLE_DATA_BUFLEN);
gTaskUpcCommHandleDataBuf[i].HandleFlag = TASK_COMM_DATA_SORTING;
break;
}
}
/* 如果没有空闲态,则写入日志文件 */
if (i >= TASK_COMM_HANDLE_DATA_COUNT) {
do {
ret = TaskFileLogWrite("TaskUpcCommExtractData: Buf Full!!\n", strlen("TaskUpcCommExtractData: Buf Full!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommExtractWatchdogId);
OSTimeDly(1);
} while (ret > 0);
}
} else {
for (i = 0; i < TASK_COMM_HANDLE_DATA_COUNT; i++) {
if (gTaskUpcCommHandleDataBuf[i].HandleFlag == TASK_COMM_DATA_SORTING) {
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[gTaskUpcCommHandleDataBuf[i].HandleCount] = gTaskUpcCommRecvDataBuf[gTaskUpcCommRecvDataBufHandleLocal];
gTaskUpcCommHandleDataBuf[i].HandleCount++;
gTaskUpcCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskUpcCommHandleDataBuf[i].HandleCount % TASK_COMM_HANDLE_DATA_BUFLEN);
break;
}
}
}
gTaskUpcCommRecvDataBufHandleLocal++; // 数据处理完成的跳出之一,因此该字节处理完成
gTaskUpcCommRecvDataBufHandleLocal = (unsigned short)(gTaskUpcCommRecvDataBufHandleLocal % TASK_COMM_RECV_DATA_BUFLEN);
}
}
/* 从一组完整的数据中解析数据 */
void TaskUpcCommHandleData(void* arg)
{
unsigned int RealWbyte;
int ret;
unsigned char i;
int k;
int j;
unsigned char crc = 0;
unsigned int TmpId;
unsigned int TmpType;
unsigned short MessageId;
unsigned short MessageNum;
unsigned short MessageLen;
/* 将解析数据任务开启写入日志 */
do {
ret = TaskFileLogWrite("TaskUpcCommHandleData: Join in!!\n", strlen("TaskUpcCommHandleData: Join in!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
while (1) {
OSTimeDly(10);
k = 0;
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
for (i = 0; i < TASK_COMM_HANDLE_DATA_COUNT; i++) {
if (gTaskUpcCommHandleDataBuf[i].HandleFlag == TASK_COMM_DATA_HANDLING) {
break;
}
}
if (i >= TASK_COMM_HANDLE_DATA_COUNT) {
continue;
}
/* 进行数据包解析 */
for (j = 1; j < gTaskUpcCommHandleDataBuf[i].HandleCount - 1; j++) {
if (gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j] == 0x7f) {
TaskUpcCommClearDataStatus(i);
break;
} else if (gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j] == 0x7e) {
j++;
if (gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j] == 0x01) {
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[k] = 0x7e;
} else if (gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j] == 0x02) {
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[k] = 0x7f;
} else {
TaskUpcCommClearDataStatus(i);
break;
}
} else {
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[k] = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j];
}
k++;
}
if (j < gTaskUpcCommHandleDataBuf[i].HandleCount - 1) {
continue;
}
/* 提取消息中的终端消息ID */
MessageId = (unsigned short)((gTaskUpcCommHandleDataBuf[i].HandleDataBuf[0] << 8) |
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[1]);
/* 提取消息中的终端类型 */
TmpType = (((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[2]) << 24) |
(((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[3]) << 16) |
(((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[4]) << 8) |
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[5];
/* 提取消息中的终端ID */
TmpId = (((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[6]) << 24) |
(((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[7]) << 16) |
(((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[8]) << 8) |
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[9];
/* 提取消息中的终端消息流水号 */
MessageNum = (unsigned short)((gTaskUpcCommHandleDataBuf[i].HandleDataBuf[14] << 8) |
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[15]);
/* 提取消息的消息体长度 */
MessageLen = (unsigned short)((((unsigned short)(gTaskUpcCommHandleDataBuf[i].HandleDataBuf[10] & 0x03)) << 8) |
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[11]);
crc = 0;
/* 比对终端类型与终端ID和测试软件是不是一致 */
if ((TmpType != gDeviceType) || (TmpId != gDeviceId)) {
TaskUpcCommClearDataStatus(i);
continue;
}
/* 判断使用的校验方式并进行校验目前只支持Crc0x131的校验方式 */
if ((gTaskUpcCommHandleDataBuf[i].HandleDataBuf[10] & 0x0c) == 0x0c) {
ToolCheckCrc8_0x31(gTaskUpcCommHandleDataBuf[i].HandleDataBuf, k - 1, &crc);
if (crc != gTaskUpcCommHandleDataBuf[i].HandleDataBuf[k - 1]) {
TaskUpcCommClearDataStatus(i);
continue;
}
} else {
TaskUpcCommClearDataStatus(i);
continue;
}
if ((gTaskUpcCommHandleDataBuf[i].HandleDataBuf[10] & 0x20) == 0x20) {
if (MessageLen != (k - 19)) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
} else {
j = 18;
}
} else {
if (MessageLen != (k - 17)) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
} else {
j = 16;
}
}
if (MessageId == PLAT_ACK_MESSAGE_ID) {
/* 下面是对平台ACK的处理 */
TaskUpcCommClearDataStatus(i); // 不对ACK进行处理
} else if (MessageId == PLAT_CONF_TERMINAL_TIME_MESSAGE_ID) {
uint64_t Time;
DRV_RTC_TIME RtcTime;
do {
ret = TaskFileLogWrite("TaskUpcComm: CMD TIME SYNC!!\n", strlen("TaskUpcComm: CMD TIME SYNC!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
if (MessageLen != 8) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
}
Time = (((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j]) << 56) |
(((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 1]) << 48) |
(((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 2]) << 40) |
(((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 3]) << 32) |
(((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 24) |
(((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 5]) << 16) |
(((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
((uint64_t)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 7]);
RtcTime.year = Time / 10000000000;
RtcTime.month = (Time / 100000000) % 100;
RtcTime.date = (Time / 1000000) % 100;
RtcTime.hour = (Time / 10000) % 100;
RtcTime.minute = (Time / 100) % 100;
RtcTime.second = Time % 100;
if (0 > TaskRtcSyncSet(&RtcTime)) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
}
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_TERMINAL_DATA_MESSAGE_ID) {
/* 平台请求数据 */
unsigned short ConfMessage;
unsigned char Num;
do {
ret = TaskFileLogWrite("TaskUpcComm: CMD ASK DATA!!\n", strlen("TaskUpcComm: CMD ASK DATA!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
ConfMessage = (((unsigned short)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j]) << 8) |
((unsigned short)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 1]);
Num = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 2];
if (ConfMessage == TASK_RUN_ENV_MESSGAE_ID) {
if (Num == 0x01) {
TaskRunEnvEnable();
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
}
} else if (ConfMessage == TASK_OUTPUT_GPIO_MESSGAE_ID) {
if (Num == 0x01) {
TaskOutPutGpioEnable();
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
}
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
}
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_TERMINAL_FILE_MESSAGE_ID) {
/* 平台请求终端文件 */
int rt;
unsigned char FileType;
unsigned char FileOperation;
unsigned int time;
unsigned short Year;
unsigned char Mon;
unsigned char Day;
do {
ret = TaskFileLogWrite("TaskUpcComm: CMD ASK FILE!!\n", strlen("TaskUpcComm: CMD ASK FILE!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
if (0 == gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j]) {
FileType = FILE_LOG_TYPE;
} else if (5 == gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j]) {
FileType = FILE_DATA_TYPE;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
TaskUpcCommClearDataStatus(i);
continue;
}
if (0 == gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 1]) {
FileOperation = FILE_UPLOAD;
} else if (1 == gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 1]) {
FileOperation = FILE_DELETE;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
continue;
}
time = (((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 2]) << 24) |
(((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 3]) << 16) |
(((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 8) |
((unsigned int)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 5]);
Year = time / 10000;
Mon = (time % 10000) / 100;
Day = time % 100;
if (FileType == FILE_DATA_TYPE) {
if (TASK_RUN_ENV_MESSGAE_ID == ((((unsigned short)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
((unsigned short)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 7]))) {
while (1) {
rt = TaskFileEnableSend(FILE_DATA_TYPE, Year, Mon, Day, FileOperation, TASK_RUN_FILE_TYPE);
if (rt == 0) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
break;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
break;
}
}
} else if (TASK_OUTPUT_GPIO_MESSGAE_ID == ((((unsigned short)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
((unsigned short)gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 7]))) {
while (1) {
rt = TaskFileEnableSend(FILE_DATA_TYPE, Year, Mon, Day, FileOperation, TASK_OUTPUT_GPIO_FILE_TYPE);
if (rt == 0) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
break;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
break;
}
}
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
TaskUpcCommClearDataStatus(i);
continue;
}
} else if (FileType == FILE_LOG_TYPE) {
while (1) {
rt = TaskFileEnableSend(FILE_LOG_TYPE, Year, Mon, Day, FileOperation, NULL);
if (rt == 0) {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
break;
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
break;
}
}
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
}
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_TERMINAL_RESTART_MESSAGE_ID) {
do {
ret = TaskFileLogWrite("TaskUpcComm: CMD ASK RESTART!!\n", strlen("TaskUpcComm: CMD ASK RESTART!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
/* 平台请求重启设备 */
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskUpcCommClearDataStatus(i);
ToolDelayMs(1000);
SysCtlReset();
} else if (MessageId == PLAT_CONF_RELAY_CONTROL_MESSAGE_ID) {
do {
ret = TaskFileLogWrite("TaskUpcComm: CMD CTRL GPIO!!\n", strlen("TaskUpcComm: CMD CTRL GPIO!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
TaskOutPutGpioSet(OTN_CHANNEL_ID, gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j]);
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
TaskUpcCommClearDataStatus(i);
} else if (MessageId == PLAT_ASK_MODIFY_NET_MESSAGE_ID) {
unsigned int Addr;
unsigned int RealWbyte;
do {
ret = TaskFileLogWrite("TaskUpcComm: CMD ASK MODIFY NET CONF!!\n", strlen("TaskUpcComm: CMD ASK MODIFY NET CONF!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommHandleWatchdogId);
OSTimeDly(1);
} while (ret > 0);
/* 写入EEPROM的IP地址 */
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j];
McuBspEepromSaveValue(LOCAL_IP1_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 1];
McuBspEepromSaveValue(LOCAL_IP2_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 2];
McuBspEepromSaveValue(LOCAL_IP3_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 3];
McuBspEepromSaveValue(LOCAL_IP4_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的MASK地址 */
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 6];
McuBspEepromSaveValue(LOCAL_MASK1_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 7];
McuBspEepromSaveValue(LOCAL_MASK2_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 8];
McuBspEepromSaveValue(LOCAL_MASK3_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 9];
McuBspEepromSaveValue(LOCAL_MASK4_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的GW地址 */
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 10];
McuBspEepromSaveValue(LOCAL_GW1_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 11];
McuBspEepromSaveValue(LOCAL_GW2_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 12];
McuBspEepromSaveValue(LOCAL_GW3_EEPROM_ADDR, &Addr, 4);
Addr = gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 13];
McuBspEepromSaveValue(LOCAL_GW4_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的PORT */
Addr = ((uint16_t)(gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 8) | ((uint16_t)(gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 5])) ;
McuBspEepromSaveValue(LOCAL_TCP_PROT1_EEPROM_ADDR, &Addr, 4);
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
sprintf(gLoaclAddrBuf, "Set---LocalIP:%u.%u.%u.%u\nSet---Port:%u\nSet---MASKIP:%u.%u.%u.%u\nSet---GWIP:%u.%u.%u.%u\n",
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j],gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 1],
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 2],gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 3], Addr,
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 6],gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 7],
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 8],gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 9],
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 10],gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 11],
gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 12],gTaskUpcCommHandleDataBuf[i].HandleDataBuf[j + 13]);
TaskFileLogWrite(gLoaclAddrBuf, strlen(gLoaclAddrBuf), &RealWbyte);
ToolDelayMs(1000);
SysCtlReset();
} else {
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
TaskUpcCommClearDataStatus(i);
}
}
}
/* 发送函数 */
uint32_t TaskUpcCommSendMessage(uint16_t MessageId, uint16_t *Serial, uint8_t *SendBuf, uint32_t SendBufLen)
{
uint32_t i = 0;
uint32_t j = 0;
uint32_t k = 0;
uint32_t e =0;
unsigned int SendLen = 0;
uint32_t RealSendLen = 0;
uint16_t SendPiece = 0; // 发送条数,用来记录是否具有分包
uint16_t MessageProperties = 0; // 消息属性
if (Serial == NULL) {
return 0;
}
SendPiece = (SendBufLen / 1023) + 1; //计算总共需要发几条信息
for (i = 0; i < SendPiece; i++) {
if (SendPiece != 1) {
if (i != (SendPiece - 1)) {
MessageProperties = 0x2000 | 0x0c00 | 1023;
} else {
MessageProperties = 0x2000 | 0x0c00 | (SendBufLen % 1023);
}
} else {
MessageProperties = 0x0000 | 0x0c00 | SendBufLen;
}
j = 0;
/* 消息ID */
gSendBufTmp[j] = (uint8_t)((MessageId & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(MessageId & 0x00ff);
j++;
/* 设备类型 */
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0xff000000) >> 24);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0x00ff0000) >> 16);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0x0000ff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(gDeviceType & 0x000000ff);
j++;
/* 设备ID号 */
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0xff000000) >> 24);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0x00ff0000) >> 16);
j++;
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0x0000ff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(gDeviceId & 0x000000ff);
j++;
/* 消息体属性 */
gSendBufTmp[j] = (uint8_t)((MessageProperties & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(MessageProperties & 0x00ff);
j++;
/* 协议版本号 */
gSendBufTmp[j] = 0x00;
j++;
gSendBufTmp[j] = 0x01;
j++;
/* 消息流水号 */
gSendBufTmp[j] = (uint8_t)(((*Serial) & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)((*Serial) & 0x00ff);
j++;
/* 消息包装项 + 消息内容 */
if (SendPiece != 1) {
/* 消息总包数 */
gSendBufTmp[j] = (uint8_t)((SendPiece & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)(SendPiece & 0x00ff);
j++;
/* 包序号 */
gSendBufTmp[j] = (uint8_t)(((i + 1) & 0xff00) >> 8);
j++;
gSendBufTmp[j] = (uint8_t)((i + 1) & 0x00ff);
j++;
if (i != (SendPiece - 1)) {
memcpy(&gSendBufTmp[j], &(SendBuf[1023 * i]), 1023);
j += 1023;
} else {
memcpy(&gSendBufTmp[j], &(SendBuf[1023 * i]), SendBufLen % 1023);
j += (SendBufLen % 1023);
}
} else {
if ((SendBuf != NULL) && (SendBufLen != 0)) {
memcpy(&gSendBufTmp[j], SendBuf, SendBufLen);
j += SendBufLen;
}
}
/* 进行校验 */
gSendBufTmp[j] = 0;
ToolCheckCrc8_0x31(gSendBufTmp, j, &gSendBufTmp[j]);
j++;
/* 进行转义 */
e = 0;
gTaskUpcCommSendDataBuf[e] = 0x7f; // 标志位
e++;
for (k = 0; k < j; k++) {
if (gSendBufTmp[k] == 0x7e) {
gTaskUpcCommSendDataBuf[e] = 0x7e;
e++;
gTaskUpcCommSendDataBuf[e] = 0x01;
e++;
} else if (gSendBufTmp[k] == 0x7f) {
gTaskUpcCommSendDataBuf[e] = 0x7e;
e++;
gTaskUpcCommSendDataBuf[e] = 0x02;
e++;
} else {
gTaskUpcCommSendDataBuf[e] = gSendBufTmp[k];
e++;
}
}
gTaskUpcCommSendDataBuf[e] = 0x7f; // 标志位
e++;
/* 发送数据 */
if (gTaskTcpConnSta == 1) {
netconn_write_partly(gTaskUpcCommTcpClientNetconn, gTaskUpcCommSendDataBuf, e, NETCONN_COPY, &SendLen);
RealSendLen += SendLen;
} else {
return 0;
}
RealSendLen += e;
}
return RealSendLen;
}
/* 初始化网口任务 */
void TaskUpcCommInit(void)
{
err_t err = ERR_OK;
uint64_t Mac;
unsigned int Addr;
struct ip_addr ip_addr;
/* 获取IP */
McuBspEepromReadValue(LOCAL_IP_SET_FLAG_EEPROM_ADDR, &gIpSetFlag, sizeof(gIpSetFlag));
if (gIpSetFlag != 1) {
/* 写入EEPROM的IP地址 */
Addr = gLocalIpAddr.Addr0;
McuBspEepromSaveValue(LOCAL_IP1_EEPROM_ADDR, &Addr, 4);
Addr = gLocalIpAddr.Addr1;
McuBspEepromSaveValue(LOCAL_IP2_EEPROM_ADDR, &Addr, 4);
Addr = gLocalIpAddr.Addr2;
McuBspEepromSaveValue(LOCAL_IP3_EEPROM_ADDR, &Addr, 4);
Addr = gLocalIpAddr.Addr3;
McuBspEepromSaveValue(LOCAL_IP4_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的MASK地址 */
Addr = gMaskAddr.Addr0;
McuBspEepromSaveValue(LOCAL_MASK1_EEPROM_ADDR, &Addr, 4);
Addr = gMaskAddr.Addr1;
McuBspEepromSaveValue(LOCAL_MASK2_EEPROM_ADDR, &Addr, 4);
Addr = gMaskAddr.Addr2;
McuBspEepromSaveValue(LOCAL_MASK3_EEPROM_ADDR, &Addr, 4);
Addr = gMaskAddr.Addr3;
McuBspEepromSaveValue(LOCAL_MASK4_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的GW地址 */
Addr = gGwAddr.Addr0;
McuBspEepromSaveValue(LOCAL_GW1_EEPROM_ADDR, &Addr, 4);
Addr = gGwAddr.Addr1;
McuBspEepromSaveValue(LOCAL_GW2_EEPROM_ADDR, &Addr, 4);
Addr = gGwAddr.Addr2;
McuBspEepromSaveValue(LOCAL_GW3_EEPROM_ADDR, &Addr, 4);
Addr = gGwAddr.Addr3;
McuBspEepromSaveValue(LOCAL_GW4_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的PORT */
Addr = gLocalIpPort;
McuBspEepromSaveValue(LOCAL_TCP_PROT1_EEPROM_ADDR, &Addr, 4);
/* 写入EEPROM的FLAG */
gIpSetFlag = 1;
McuBspEepromSaveValue(LOCAL_IP_SET_FLAG_EEPROM_ADDR, &gIpSetFlag, 4);
} else {
/* 读取EEPROM的IP地址 */
McuBspEepromReadValue(LOCAL_IP1_EEPROM_ADDR, &Addr, sizeof(Addr));
gLocalIpAddr.Addr0 = Addr;
McuBspEepromReadValue(LOCAL_IP2_EEPROM_ADDR, &Addr, sizeof(Addr));
gLocalIpAddr.Addr1 = Addr;
McuBspEepromReadValue(LOCAL_IP3_EEPROM_ADDR, &Addr, sizeof(Addr));
gLocalIpAddr.Addr2 = Addr;
McuBspEepromReadValue(LOCAL_IP4_EEPROM_ADDR, &Addr, sizeof(Addr));
gLocalIpAddr.Addr3 = Addr;
/* 读取EEPROM的MASK地址 */
McuBspEepromReadValue(LOCAL_MASK1_EEPROM_ADDR, &Addr, sizeof(Addr));
gMaskAddr.Addr0 = Addr;
McuBspEepromReadValue(LOCAL_MASK2_EEPROM_ADDR, &Addr, sizeof(Addr));
gMaskAddr.Addr1 = Addr;
McuBspEepromReadValue(LOCAL_MASK3_EEPROM_ADDR, &Addr, sizeof(Addr));
gMaskAddr.Addr2 = Addr;
McuBspEepromReadValue(LOCAL_MASK4_EEPROM_ADDR, &Addr, sizeof(Addr));
gMaskAddr.Addr3 = Addr;
/* 读取EEPROM的GW地址 */
McuBspEepromReadValue(LOCAL_GW1_EEPROM_ADDR, &Addr, sizeof(Addr));
gGwAddr.Addr0 = Addr;
McuBspEepromReadValue(LOCAL_GW2_EEPROM_ADDR, &Addr, sizeof(Addr));
gGwAddr.Addr1 = Addr;
McuBspEepromReadValue(LOCAL_GW3_EEPROM_ADDR, &Addr, sizeof(Addr));
gGwAddr.Addr2 = Addr;
McuBspEepromReadValue(LOCAL_GW4_EEPROM_ADDR, &Addr, sizeof(Addr));
gGwAddr.Addr3 = Addr;
/* 读取EEPROM的TCP端口号 */
McuBspEepromReadValue(LOCAL_TCP_PROT1_EEPROM_ADDR, &Addr, sizeof(Addr));
gLocalIpPort = (unsigned short)Addr;
}
ip_addr.addr = htonl((((uint32_t)gLocalIpAddr.Addr0) << 24) |
(((uint32_t)gLocalIpAddr.Addr1) << 16) |
(((uint32_t)gLocalIpAddr.Addr2) << 8) |
((uint32_t)gLocalIpAddr.Addr3));
/* 初始化网口 */
Mac = 1811 + gDeviceType + gDeviceId; // 项目代号 + 设备类型 + 设备ID
ZtmsLwipInit(gLocalIpAddr, gMaskAddr, gGwAddr, Mac);
/* 创建TCP通信套接字 */
do {
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
gTaskUpcCommTcpNetconn = netconn_new(NETCONN_TCP);
} while (gTaskUpcCommTcpNetconn == NULL);
/* 绑定IP端口号 */
do {
err = netconn_bind(gTaskUpcCommTcpNetconn, &ip_addr, gLocalIpPort);
} while (err != ERR_OK);
/* 监听IP端口号 */
do {
err = netconn_listen(gTaskUpcCommTcpNetconn); // 已将内部的监听宏定义的监听个数改成了1如果有多连接需要则改称其他量
} while (err != ERR_OK);
/* 设置接收超时时间200ms */
gTaskUpcCommTcpNetconn->recv_timeout = 200;
/* 注册看门狗 */
gTaskUpcCommRecvWatchdogId = TaskWatchdogRegEvent("TaskUpcCommRecv");
gTaskUpcCommExtractWatchdogId = TaskWatchdogRegEvent("TaskUpcCommExtract");
gTaskUpcCommHandleWatchdogId = TaskWatchdogRegEvent("TaskUpcCommHandle");
}
static void TaskUpcCommStartRecv(void)
{
struct netbuf *RecvNetBuf = NULL;
err_t err = ERR_OK;
unsigned int RealWbyte;
int ret;
while ((gTaskNetPortSta == 1) && (gTaskTcpConnSta == 1)) {
err = netconn_recv(gTaskUpcCommTcpClientNetconn, &RecvNetBuf);
/* 如果接收不等于超时也不等于接收成功 */
if (err != ERR_TIMEOUT && err != ERR_OK) {
gTaskTcpConnSta = 0;
netbuf_delete(RecvNetBuf);
gTaskNetPortSta = ZtmsGetNetStatus();
continue; // 进行条件判断时会自动跳出
}
if (err == ERR_OK) {
int i;
CPU_SR_ALLOC();
OS_ENTER_CRITICAL(); //关中断
for (i = 0; i < RecvNetBuf->p->len; i++) {
gTaskUpcCommRecvDataBuf[gTaskUpcCommRecvDataBufRecvLocal] = ((unsigned char *)RecvNetBuf->p->payload)[i];
gTaskUpcCommRecvDataBufRecvLocal++;
gTaskUpcCommRecvDataBufRecvLocal = gTaskUpcCommRecvDataBufRecvLocal % TASK_COMM_RECV_DATA_BUFLEN;
}
OS_EXIT_CRITICAL();
}
gTaskNetPortSta = ZtmsGetNetStatus();
netbuf_delete(RecvNetBuf);
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
OSTimeDly(1); // 需要TCP不停处于接收态
}
gTaskTcpConnSta = 0;
/* 当接收循环跳出时,代表着出现了错误,写入日志文件 */
do {
ret = TaskFileLogWrite("TaskUpcCommStartRecv: TCP Disconnect or Cable Disconnect!!\n", strlen("TaskUpcCommStartRecv: TCP Disconnect or Cable Disconnect!!\n"), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
OSTimeDly(1);
} while (ret > 0);
/* 关闭连接 */
netconn_close(gTaskUpcCommTcpClientNetconn);
netconn_delete(gTaskUpcCommTcpClientNetconn);
gTaskUpcCommTcpClientNetconn = NULL;
}
/* 创建TCP服务器 */
static void TaskUpcCommTcpSocketConn(void)
{
err_t err = ERR_OK;
int ret;
unsigned int RealWbyte;
do {
/* 等待网络口初始化完成 */
do {
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
OSTimeDly(10);
gTaskNetPortSta = ZtmsGetNetStatus();
} while (gTaskNetPortSta == 0);
/* 接收连接 */
err = netconn_accept(gTaskUpcCommTcpNetconn, &gTaskUpcCommTcpClientNetconn);
} while (err != ERR_OK);
gTaskUpcCommTcpClientNetconn->recv_timeout = 200;
gTaskUpcCommTcpClientNetconn->pcb.tcp->so_options |= SOF_KEEPALIVE;
/* 接收到TCP之后将连接的对方IP写入文件中 */
if (ERR_OK == netconn_getaddr(gTaskUpcCommTcpClientNetconn, &gDestIp, &gDestIpPort, 0)) {
do {
char buf[50] = {0};
uint32_t Destaddr;
Destaddr = ntohl(gDestIp.addr);
sprintf(buf, "ConnectIP:%u.%u.%u.%u,Port:%u!!\n", (unsigned char)((Destaddr & 0xff000000) >> 24), (unsigned char)((Destaddr & 0x00ff0000) >> 16),
(unsigned char)((Destaddr & 0x0000ff00) >> 8), (unsigned char)Destaddr & 0x000000ff, (unsigned short)gDestIpPort);
ret = TaskFileLogWrite(buf, strlen(buf), &RealWbyte);
TaskWatchdogFreed(gTaskUpcCommRecvWatchdogId);
OSTimeDly(1);
} while (ret > 0);
}
gTaskTcpConnSta = 1;
}
static void TaskUpcCommClearDataStatus(unsigned char CountId)
{
gTaskUpcCommHandleDataBuf[CountId].HandleFlag = TASK_COMM_DATA_IDLING;
gTaskUpcCommHandleDataBuf[CountId].HandleCount = 0;
}
static void TaskUpcCommNormalAck(unsigned short PlatNum, unsigned short PlatId, uint8_t Result)
{
uint8_t Ack[5] = {0};
static unsigned short Serial = 0;
Ack[0] = (uint8_t)((PlatNum & 0xff00) >> 8);
Ack[1] = (uint8_t)(PlatNum & 0x00ff);
Ack[2] = (uint8_t)((PlatId & 0xff00) >> 8);
Ack[3] = (uint8_t)(PlatId & 0x00ff);
Ack[4] = Result;
TaskUpcCommSendMessage(0x0000, &Serial, Ack, sizeof(Ack));
Serial++;
}