新建项目

This commit is contained in:
gitea committed 2023-04-29 09:09:12 +08:00
1 parent 5e2e890cfc
commit 633d9b872b
1351 files changed
+730564

No files matched your search

+589
View File
@@ -0,0 +1,589 @@
#include "net-app.h"
//#include "eth-board.h"
//#include "ec200-board.h"
//#include "uart-board.h"
//#include "stm32l0xx_hal.h"
//#include "save-board.h"
//#include "sysinfo-app.h"
#include "proto-sl651.h"
//#include "sluice-control.h"
//#include "base64.h"
//#include "log.h"
//#include "ff-collected.h"
#include "fifo-board.h"
#if !defined(LOG_TAG)
#define LOG_TAG "NET"
#endif
#include <elog.h>
// 这里处理网络通信的数据,不管是以太网还是4g都在这里处理
#define UTH uEth
typedef enum
{
YmodmApplication,
YmodemToDo,
YmodmSendFileName,
YmodmAck,
YmodmC,
YmodmHead,
Ymodm1024,
YmodmERROR,
YmodmEOT,
YModmIdle
} YmodemState_t; // = YmodmApplication;
NetPacket_t g_fifo_netpacket[10];
static int IsInitialized = 0;
static struct
{
uint32_t unifTimer; // 时段报时间
uint32_t linkTimer; // 心跳报时间
uint32_t flowTimer; // 流量计时间
int retryCount;
YmodemState_t State;
int Error;
int IsFirstConnection; // 第一次链接成功
int UpdateLock; // 升级锁
} g_netinfo;
static struct
{
char updatePacket[64]; // 升级请求 包
int delayTimer; // 收到升级命令后延迟5s 进入升级
int PacketSize; // 数据报大小
uint32_t ssNumber;
uint32_t cTimer;
} g_ymodeinfo;
#pragma pack(1) /*1字节对齐*/
static struct rx_data_t
{
uint8_t header[2];
uint8_t devid[5];
uint8_t centerid;
uint8_t password[2];
uint8_t type;
uint8_t flag;
uint8_t payloadsize;
uint8_t payStart;
struct
{
uint16_t synNum;
uint8_t payLoad[512];
} Payload;
uint8_t payStop;
uint16_t crc;
} g_rx_data;
#pragma pack()/*还原默认对齐*/
static Fifo_t g_NetFifo;
static NetFunc_t NetFunc;
static uint16_t ymodemCRC16 (uint8_t *Pushdata, uint16_t length);
//static int NETModifyPara(char *data, int length);
//static int NETReadPara(char *data, int max);
//static int netDownloadHandle (uint8_t type, char *data, int length);
static int netUploadHandle (char *data);
static void netSendPacket (void);
static void netInit (void);
// 上报基础参数
static void netWritebaseParams (void);
static void netWriteInterfaceParams (void);
static void netWriteSluiceParams (void);
static void netWriteWaterParams (void);
void NetSystemTick (void)
{
if (g_netinfo.unifTimer > 1)
{
g_netinfo.unifTimer--;
}
if (g_netinfo.flowTimer > 1)
{
g_netinfo.flowTimer--;
}
if (g_netinfo.linkTimer > 1)
{
g_netinfo.linkTimer--;
}
if (g_ymodeinfo.delayTimer > 1)
{
g_ymodeinfo.delayTimer--;
}
if (g_ymodeinfo.cTimer > 1)
{
g_ymodeinfo.cTimer--;
}
}
// 如下为网络队列调用函数,wirebuffer 不等于多个writebyte
void NET_FifoWritebuffer (char *buffer, int size)
{
NetPacket_t packet;
packet.data_size = size;
memcpy (packet.data, buffer, size);
FifoWrite (&g_NetFifo, (char *) &packet, sizeof (packet)); // 数据写入队列中去
}
void NET_FifoWriteByte (char byte)
{
NetPacket_t packet;
packet.data_size = 1;
packet.data[0] = byte;
FifoWrite (&g_NetFifo, (char *) &packet, sizeof (packet)); // 数据写入队列中去
}
// N 1024 filename <<<<<<<<<<<<<<<<<<<< 文件名,切包大小
// 06 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// C C <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// SOH[128] 00 >>>>>>>>>>>>>>>>>>>>>>>>> CRC //第一报
// ACK <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// STX[256/1024] 01 >>>>>>>>>>>>>>>>>>>> CRC //第一报
// ACK <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// STX[256/1024] 01 >>>>>>>>>>>>>>>>>>>> CRC //第一报
// ACK <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// EOT >>>>>>>>>>>>>>>>>>>> CRC //第一报
// NAK <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 17 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**
* @brief Receive a file using the ymodem protocol
* @param buf: Address of the first byte
* @retval -1: error 1 first packet received 2: 1024 packet received 5:EOT packet received
*/
int32_t Ymodem_Receive (uint8_t *buf, int length)
{
// 获取序号
g_ymodeinfo.ssNumber = buf[1];
// g_ssNumber = buf[1];
uint16_t rCrc, cCrc;
int ret = 0;
// 计算CRC校验
cCrc = ymodemCRC16 (buf, length - 2);
rCrc = ( (uint16_t) buf[length - 2] << 8) + (uint16_t) buf[length - 1];
log_d ("CCRC:%04X rCrc:%04X\r\n", cCrc, rCrc);
if (cCrc != rCrc)
{
for (int i = 0; i < length; i++)
{
log_d ("%02X ", buf[i]);
}
return -1; // 升级失败
}
log_d ("\r\n");
log_d ("....................%d\r\n", buf[1]);
if (buf[0] == SOH)
{
log_d ("FileName:%s\r\n", &buf[3]);
//SaveWriteFirmware (g_ymodeinfo.ssNumber, &buf[3], 128);
ret = 1;
}
else if (buf[0] == STX)
{
if (g_ymodeinfo.PacketSize == 1024)
{
//SaveWriteFirmware (g_ymodeinfo.ssNumber, &buf[3], 1024);
}
else if (g_ymodeinfo.PacketSize == 256)
{
//SaveWriteFirmware256 (g_ymodeinfo.ssNumber, &buf[3], 256);
}
ret = 2;
}
else
{
ret = -1;
}
return ret;
}
static uint16_t ymodemCRC16 (uint8_t *Pushdata, uint16_t length)
{
uint16_t crc = 0;
while (length--)
{
crc ^= (uint16_t) (* (Pushdata++)) << 8;
for (int i = 0; i < 8; i++)
{
if (crc & 0x8000)
{
crc = (crc << 1) ^ 0x1021;
}
else
{
crc = crc << 1;
}
}
}
return crc;
}
extern int netDownloadHandle (uint8_t type, char *data, int length);
void NetTask (void)
{
char rxdata[1200];
//char rxdata_decode[256];
int rsize, tx_size;//rdsize = 0, ;
char tx_data[256];
int ret = 0;
uint16_t paysize;
// int payloadsize = 0;
//char * p;
// 初始化网络驱动
if (IsInitialized == 0)
{
netInit();
g_netinfo.State = YmodmApplication;
IsInitialized = 1;
log_d ("Initializing network...");
}
// 验证网络驱动是否初始化成功
if (NetFunc.Init == NULL)
{
log_d ("NetFunc.Init failed\n");
return;
}
if (NetFunc.IsIdle() == 1) // 网络空闲 发送网络数据
{
// dbg_printf("NetFunc.IsIdle\n");
netSendPacket();
}
switch (g_netinfo.State)
{
case YmodmApplication: // 走业务数据
if (NetFunc.IsReady() == 1)
{
/* 处理接受到的数据--------------------------------------------*/
memset (rxdata, 0, 1200);
rsize = NetFunc.ReadData (rxdata, 1200);
// 解析数据
//hexstr_to_hexbyte (rxdata, (char *) &g_rx_data, rsize);
//dbg_printf("%s\r\n",rxdata);
//dbg_printf("%04X\r\n",g_rx_data.payloadsize);
paysize = ( (uint16_t) (g_rx_data.flag & 0x0F) << 8) + (uint16_t) g_rx_data.payloadsize ;
//g_rx_data.payloadsize = (g_rx_data.payloadsize & 0x0FFF) ;
g_rx_data.payStop = g_rx_data.Payload.payLoad[paysize - 2];
g_rx_data.crc = ( (uint16_t) g_rx_data.Payload.payLoad[paysize - 1] << 8) + (uint16_t) g_rx_data.Payload.payLoad[paysize];
//g_rx_data.Payload.payLoad[paysize] = 0;
log_d ("<<<<<<<<<<<<rx_size:%d\r\n", paysize);
log_d ("Header: %X%X\r\n", g_rx_data.header[0], g_rx_data.header[1]);
log_d ("devid: %02X%02X%02X%02X%02X\r\n",
g_rx_data.devid[0],
g_rx_data.devid[1],
g_rx_data.devid[2],
g_rx_data.devid[3],
g_rx_data.devid[4]);
log_d ("center: %d,pass:%02X%02X,type:%02X,flag:%04X\r\n", g_rx_data.centerid, g_rx_data.password[0], g_rx_data.password[1], g_rx_data.type, g_rx_data.flag);
log_d ("payloadsize:%d\r\n", paysize);
log_d ("start:%d,seq:%d\r\n", g_rx_data.payStart, g_rx_data.Payload.synNum);
for (int i = 0; i < paysize - 2; i++)
{
log_d ("%02X ", g_rx_data.Payload.payLoad[i]);
}
log_d ("\r\n");
log_d ("payStop:%d,crc:%04x\r\n", g_rx_data.payStop, g_rx_data.crc);
//log3_printf("center: %d,pass:%02X%02X,type:%02X,flag:%02X\r\n", g_rx_data.centerid, g_rx_data.password[0],g_rx_data.password[1],g_rx_data.type,g_rx_data.flag);
// 校验CRC
// 数据长度
// payloadsize = rxdata_decode[12]-2; // 取payloadsize 去掉两位序列号
// log3_printf("Header:%X%X\r\n",rxdata_decode[0],rxdata_decode[1]);
// log3_printf("DevAddr%02X%02X%02X%02X%02X\r\n",rxdata_decode[2],rxdata_decode[3],rxdata_decode[4],rxdata_decode[5],rxdata_decode[6]);
// log3_printf("Payload size:%X\r\n",payloadsize);
// // 接受到远程升级命令
if (netDownloadHandle (g_rx_data.type, (char *) g_rx_data.Payload.payLoad, paysize - 2) == 0xE0)
{
g_netinfo.State = YmodemToDo;
g_ymodeinfo.delayTimer = 5000;
}
}
// tx_size = netUploadHandle (tx_data);
// if (tx_size > 0)
// {
// FifoWritebuffer (tx_data, tx_size);
// }
break;
case YmodemToDo: // 已经接受到升级命令,等待5S业务数据发送完成,进入升级
{
if (g_ymodeinfo.delayTimer == 1) // 升级时间到
{
g_ymodeinfo.delayTimer = 0;
NetFunc.ReSubTopic ("update"); // 链接到升级服务器
g_netinfo.State = YmodmSendFileName;
g_netinfo.retryCount = 5;
}
break;
}
case YmodmSendFileName:
if (NetFunc.IsIdle() == 1)
{
g_netinfo.retryCount--;
// packet.data_size = PP_AddHeader (0x2F, state, 4, packet.data) ;
// FifoWrite (&g_NetFifo, (char *) &packet, sizeof(packet)); // 数据写入队列中去
NET_FifoWritebuffer (g_ymodeinfo.updatePacket, strlen (g_ymodeinfo.updatePacket));
g_netinfo.State = YmodmAck; /// g_isStart = 2;
g_ymodeinfo.delayTimer = 3000; // 等待 3s
}
if (g_netinfo.retryCount == 0) // 如果超过5次尝试没有链接升级服务器,就认为升级失败
{
NET_FifoWriteByte (YMFILD);
// packet.data_size = 1;
// packet.data[0] = lFAIL;
// FifoWrite(&g_NetFifo, (char *)&packet, sizeof(packet)); // 数据写入队列中去
g_ymodeinfo.delayTimer = 1000;
g_netinfo.State = YmodmERROR;
}
break;
case YmodmAck:
if (NetFunc.IsReady() == 1)
{
rsize = NetFunc.ReadData (rxdata, 1200);
if (rxdata[0] == 0x06 && rsize == 1)
{
g_netinfo.State = YmodmC;
log_d ("YmodemState = YmodmC\r\n");
g_ymodeinfo.cTimer = 1000;
}
}
// 如果超过1s 没有收到服务器的应答,重复发送文件名,尝试再次升级
if (g_ymodeinfo.delayTimer == 1)
{
g_ymodeinfo.delayTimer = 0;
g_netinfo.State = YmodmSendFileName;
}
break;
case YmodmC: // 收到服务器的应答后,进入升级
if (g_ymodeinfo.cTimer == 1)
{
g_ymodeinfo.cTimer = 2000;
NET_FifoWriteByte ('C');
}
if (NetFunc.IsReady() == 1) //接受到C的应答
{
g_netinfo.State = YmodmHead;
log_d ("YmodemState = YmodmHead\r\n");
}
break;
case YmodmHead:
rsize = NetFunc.ReadData (rxdata, 1200);
ret = Ymodem_Receive ( (uint8_t *) rxdata, rsize);
if (ret == 1)
{
g_netinfo.State = Ymodm1024; //
NET_FifoWriteByte (ACK);
NET_FifoWriteByte ('C');
g_ymodeinfo.delayTimer = 3000;
log_d ("YmodemState = Ymodm1024\r\n");
}
else // 数据获取失败,重新发起文件链接请求
{
g_netinfo.State = YmodmSendFileName;
}
break;
case Ymodm1024:
if (NetFunc.IsReady() == 1)
{
g_ymodeinfo.delayTimer = 3000;
rsize = NetFunc.ReadData (rxdata, 1200);
if (rsize == 1 && rxdata[0] == EOT) // 升级错误
{
g_netinfo.State = YmodmEOT;
log_d ("YmodemState = YmodmEOT1\r\n");
break;
}
// -1: error 1 first packet received 2: 1024 packet received 5:EOT packet received
ret = Ymodem_Receive ( (uint8_t *) rxdata, rsize);
if (ret == 2)
{
NET_FifoWriteByte (ACK);
break;
}
else if (ret == -1)
{
NET_FifoWriteByte (YMFILD);
g_ymodeinfo.delayTimer = 1000;
g_netinfo.State = YmodmERROR;
}
}
if (g_ymodeinfo.delayTimer == 1)
{
g_ymodeinfo.delayTimer = 0;
log_d ("YmodemState = YmodmERROR\r\n");
}
break;
case YmodmEOT:
NET_FifoWriteByte (NAK);
NET_FifoWriteByte (YMSUCCE);
g_netinfo.State = YModmIdle;
g_ymodeinfo.delayTimer = 1000; // 等待 1S 数据结束后重启
break;
case YmodmERROR:
{
if (g_ymodeinfo.delayTimer == 1)
{
g_ymodeinfo.delayTimer = 0;
//NetFunc.ReSubTopic (SysInfo.baseTopic);
g_netinfo.State = YmodmApplication; //();
}
// 发送错误,上报升级失败,切换到 业务层等待重新升级
break;
}
case YModmIdle:
{
if (g_ymodeinfo.delayTimer == 1)
{
//FactorySetFlashUpdate(); // 进入升级
//HAL_NVIC_SystemReset(); // 重启
g_ymodeinfo.delayTimer = 0;
}
break;
}
default:
break;
}
if (NetFunc.IsConnected() == 1)
{
if (g_netinfo.IsFirstConnection == 0)
{
g_netinfo.IsFirstConnection = 1;
//NETSendRegist();
log_d ("First join network\r\n");
}
}
NetFunc.Task(); // NetFunc.Task();
}
static void netSendPacket (void)
{
NetPacket_t packet;
if (FifoRead (&g_NetFifo, (char *) &packet, sizeof (NetPacket_t)) == 0)
{
NetFunc.WriteData (packet.data, packet.data_size);
log_d ("tx:>>>>>>>>>>>>>>>>>>%d\r\n", packet.data_size);
}
}
// 上报回调数据
static int netUploadHandle (char *data)
{
char payload[128] = {0};
int payload_size = 0;
int size = 0;
if (g_netinfo.unifTimer == 1)
{
// payload_size = PP_PacketUnifData (payload); // 打包业务层数据
// size = PP_AddHeader (0x31, payload, payload_size, data);
// g_netinfo.unifTimer = SL651_TIME_UNIF;
}
else if (g_netinfo.linkTimer == 1)
{
// if (FF_ReadEcodeData() == 0XFFFFFFFF)
// {
// payload[0] = 0;
// }
// else
// {
// payload[0] = 1;
// }
// if (FF_ReadLeveData() == 0XFFFFFFFF)
// {
// payload[1] = 0;
// }
// else
// {
// payload[1] = 1;
// }
size = PP_AddHeader (0x2F, payload, 4, data);
g_netinfo.linkTimer = SL651_TIME_HEART;
}
else if (g_netinfo.flowTimer == 1) // 请求流量计数据
{
g_netinfo.flowTimer = SL651_TIME_FLOW;
}
else
{
size = 0;
}
return size;
}
static void netInit (void)
{
// if (SysInfo.baseNetDev == EC200_MQTT) // EC200
// {
// NetFunc.Init = EC200Init;
// NetFunc.IsConnected = EC200IsConnected;
// NetFunc.IsReady = EC200RxIsReady;
// NetFunc.ReadData = EC200ReadData;
// NetFunc.WriteData = EC200WriteData;
// NetFunc.IsIdle = EC200IsIdle;
// NetFunc.ReSubTopic = EC200ReSubTopic;
// NetFunc.Task = EC200Task;
// g_ymodeinfo.PacketSize = 1024;
// }
// else if (SysInfo.baseNetDev == ETH_MQTT) // ETH
// {
// NetFunc.Init = EthMqttInit;
// NetFunc.IsConnected = EthMqttIsConnect;
// NetFunc.IsReady = EthMqttIsReady;
// NetFunc.ReadData = EthMqttReadData;
// NetFunc.WriteData = EthMqttWriteData;
// NetFunc.IsIdle = EthMqttIsIdle;
// NetFunc.ReSubTopic = EthMqttReSubTopic;
// NetFunc.Task = EthMqttTask;
// g_ymodeinfo.PacketSize = 1024;
// }
// else
// {
// //
// return;
// }
NetFunc.Init();
FifoInit (&g_NetFifo, (char *) g_fifo_netpacket, 3);
log_d ("fifo Init\n");
// g_netinfo.unifTimer = SL651_TIME_UNIF;
// g_netinfo.linkTimer = SL651_TIME_HEART;
// g_netinfo.flowTimer = SL651_TIME_FLOW;
}
//// 将要发送的数据写入队列
//void NET_WriteBuffer(NetPacket_t packet)
//{
// FifoWritebuffer (packet.data, packet.data_size);
// //return 0;
//}
//// 应答E3 回复读取的数据
//void NETSendConfig (char *data)
//{
// NetPacket_t packet;
// packet.data_size = PP_AddHeader (0xE3, data, strlen (data), packet.data);
// FifoWrite (&g_NetFifo, (char *) &packet, sizeof (packet));
//}
+98
View File
@@ -0,0 +1,98 @@
#ifndef _NET_APP_H
#define _NET_APP_H
// 远程升级宏
#define ETH_MQTT 1
#define EC200_MQTT 0
typedef struct netWorkInterface_t
{
void (*Init) (void);
int (*IsConnected) (void);
void (*WriteData) (char *, int);
int (*ReadData) (char *, int);
int (*IsReady) (void);
int (*IsIdle) (void);
int (*ReSubTopic) (char *);
void (*Task) (void);
} netWorkInterface_t;
typedef struct NetPacket_t
{
int data_size;
char data[512];
} NetPacket_t;
#define PACKET_SEQNO_INDEX (1)
#define PACKET_SEQNO_COMP_INDEX (2)
#define PACKET_HEADER (3)
#define PACKET_TRAILER (2)
#define PACKET_OVERHEAD (PACKET_HEADER + PACKET_TRAILER)
#define PACKET_SIZE (128)
#define PACKET_1K_SIZE (1024)
#define FILE_NAME_LENGTH (256)
#define FILE_SIZE_LENGTH (16)
#define SOH (0x01) /* start of 128-byte data packet */
#define STX (0x02) /* start of 1024-byte data packet */
#define EOT (0x04) /* end of transmission */
#define ACK (0x06) /* acknowledge */
#define NAK (0x15) /* negative acknowledge */
#define CA (0x18) /* two of these in succession aborts transfer */
#define CC (0x43) /* 'C' == 0x43, request 16-bit CRC */
#define ABORT1 (0x41) /* 'A' == 0x41, abort by user */
#define ABORT2 (0x61) /* 'a' == 0x61, abort by user */
#define YMFILD 0x19
#define YMSUCCE 0x17
#define NAK_TIMEOUT (0x100000)
#define MAX_ERRORS (5)
// SL651 定义宏
#define SL651_TIME_HEART 60000 // 1分钟
#define SL651_TIME_LOST 90000
#define SL651_TIME_UNIF 1000*5*60 // 均匀时段,默认5分钟上报一次
#define SL651_TIME_FLOW 60000 // 均匀时段,默认5分钟上报一次
void NetTask (void);
void NetAppInit (void);
//void NETSendSluiceUp (void);
//void NETSendDataUnif (void);
//void NETSendSluiceAck (void);
//void NETSendConfigAck (int k);
//void NETSendConfig (char *data);
//// 应答E0 回复发送的数据
//void NETSendUpdateAck (int k);
//// 应答E3 回复读取的数据
//void NETSendRegist (void);
//// 应答E3 打印日志
//void NETSendLog (char *data);
// 如下为网络队列调用函数,wirebuffer 不等于多个writebyte
void NET_FifoWritebuffer (char *buffer, int size);
void NET_FifoWriteByte (char byte) ;
#endif
+160
View File
@@ -0,0 +1,160 @@
#include "main.h"
#include <string.h>
// 下行数据回调函数
// 应答 type
int netDownloadHandle (uint8_t type, char *data, int length)
{
int IntData;//filenamesize = 0;
char filename[32] = {0};
char buffer[100];
switch (type)
{
case 0x4E: // 闸门操作
{
//data += 2; // 去掉流水号和闸门操作方式
//IntData = ty_byte2int (data, 4);
//sprintf(buffer,"open:%02X%02X%02X%02X\r\n",data[0],data[1],data[2],data[3]);
//NETSendLog(buffer);
// sprintf(buffer,"open:%02X%02X%02X%02Xopen:%u\r\n",data[0],data[1],data[2],data[3],IntData);
// NETSendLog(buffer);
// MM_SluiceSetOpen (IntData / 100);
// MM_SluiceStart();
//IntData = IntData;
// NETSendSluiceAck();
// dbg_printf("remote sluice%d\r\n",IntData);
break;
}
case 0xE0: // 远程升级
{
// todo : 发起升级请求
// memset (g_ymodeinfo.updatePacket, 0, 64);
// memset (filename, 0, 32);
// memcpy (filename, data, length); // 去掉帧尾和校验=
// sprintf (g_ymodeinfo.updatePacket, "N %s,%d", filename, g_ymodeinfo.PacketSize);
// dbg_printf ("g_ymodeinfo.fileName:%s\r\n", g_ymodeinfo.updatePacket);
// NETSendUpdateAck (1);
// dbg_printf ("Jump To Remote Update Firmware\r\n");
break;
}
case 0xE1: // 停止执行
{
//MM_SluiceStop();
// SluiceScram();
break;
}
case 0xE2: // 远程修改参数
{
// SysInfoConfig_t config ;
// data[length] = 0;
// // 设置参数
// int k = Json651UnpackInfo (data, length, &config);
// if (k < 0)
// {
// fmtprintf ("ERROR +CME:%d\r\n", k);
// }
// else
// {
// if (config.type == 1) // 基础参数配置
// {
// SysWriteBaseConfig (config.info.base);
// SysInfoWriteParam();
// NETSendConfigAck (1);
// }
// else if (config.type == 2) // 接口参数配置
// {
// SysWriteInterfaceInfo (config.info.interface);
// SysInfoWriteParam();
// NETSendConfigAck (1);
// }
// else if (config.type == 3) // 闸门参数配置
// {
// SysWriteSluiceInfo (config.info.sluice);
// SysInfoWriteParam();
// NETSendConfigAck (1);
// }
// else if (config.type == 4) // 闸门参数配置
// {
// SysWriteWaterInfo (config.info.water);
// SysInfoWriteParam();
// NETSendConfigAck (1);
// }
// else
// {
// NETSendConfigAck (2);
// }
// }
// break;
}
case 0xE3: // 远程读取参数
{
// if (data[0] == 1) // 上报基础参数
// {
// netWritebaseParams();
// }
// else if (data[0] == 2) //
// {
// netWriteInterfaceParams();
// }
// else if (data[0] == 3) // 保存
// {
// netWriteSluiceParams();
// }
// else if (data[0] == 4) // 保存
// {
// //static void netWriteWaterParams (void)
// netWriteWaterParams();
// }
// break;
}
case 0xE4: //远程读取流量计数据
{
// memset(data, 0, 256);
// memcpy(data, &rxdata_decode[14], dataLength);
// instantSpeed = MyJsonReadNumber(data, "instantSpeed", dataLength);
// instantFlow = MyJsonReadNumber(data, "instantFlow", dataLength);
// waterLevel = MyJsonReadNumber(data, "waterLevel", dataLength);
}
case 0XE5:
{
HAL_NVIC_SystemReset();
break;
}
case 0XE6: // 上升
{
//sluice_run_motor(SysInfo.SlMotorType,RunOpen);
//NETSendLog("debug runopen");
break;
}
case 0XE7: // 下降
{
//sluice_run_motor(SysInfo.SlMotorType,RunClose);
//NETSendLog("debug runclose");
break;
}
case 0XE8: // 停止
{
//sluice_run_motor(SysInfo.SlMotorType,RunStop);
//NETSendLog("debug runstop");
break;
}
case 0XE9: // 召测开度
{
//sprintf(buffer,"open:%u,%u,%u,%u\r\n",FF_ReadEcodeData(),FF_ReadCalcEcodeData(),FF_ReadMaxEcodeData(),FF_ReadMinEcodeData());
//NETSendLog(buffer);
break;
}
default:
break;
}
return type;
}
+215
View File
@@ -0,0 +1,215 @@
#include "net-app.h"
#include "proto-sl651.h"
#include <string.h>
#include <stdio.h>
#include <elog.h>
// 网络上报线程
void net_task(void)
{
}
// 上升过程中上报数据
void netWriteSluiceUp (void)
{
char data[128];
// char tx_data[128];
int tx_size = 0;
// tx_size = PP_AddHeader (0x4E, data, tx_size, tx_data);
tx_size = _651PacketDataSluiceUp (data);
NetPacket_t packet;
packet.data_size = PP_AddHeader (0x4E, data, tx_size, packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
//FifoWrite (&g_NetFifo, (char *) &packet, sizeof (packet));
// FifoWrite (&g_NetFifo, (unsigned char *) tx_data, tx_size);
}
// 向平台请求流量数据
void netWriteFlowReq (void)
{
// char data[128];
// // char tx_data[128];
// int tx_size = 0;
// tx_size = PP_PacketUnifDatadata);
// NetPacket_t packet;
// packet.data_size = PP_AddHeader(0x31, data, tx_size, packet.data);
// FifoWrite(&g_NetFifo, (char *)&packet, sizeof(packet));
// tx_size = PP_AddHeader (0x31, data, tx_size, tx_data);
// FifoWrite (&g_NetFifo, (unsigned char *) tx_data, tx_size);
}
// E0 升级应答 E2 配置应答
// 应答E0 回复发送的数据
void netWriteAck (uint8_t funccode,int k)
{
NetPacket_t packet;
if (k == 1)
{
packet.data_size = PP_AddHeader (0xE0, "{\"result\":\"ok\"}", strlen ("{\"result\":\"ok\"}"), packet.data);
}
else
{
packet.data_size = PP_AddHeader (0xE0, "{\"result\":\"error\"}", strlen ("{\"result\":\"error\"}"), packet.data);
}
NET_FifoWritebuffer(packet.data,packet.data_size);
//FifoWrite (&g_NetFifo, (char *) &packet, sizeof (packet));
}
//// 应答E3 回复发送的数据
//void NETSendConfigAck (int k)
//{
// // char tx_data[256];
// // int tx_size = 0;
// NetPacket_t packet;
// if (k == 1)
// {
// packet.data_size = PP_AddHeader (0xE2, "{\"result\":\"ok\"}", strlen ("{\"result\":\"ok\"}"), packet.data);
// }
// else
// {
// packet.data_size = PP_AddHeader (0xE2, "{\"result\":\"error\"}", strlen ("{\"result\":\"error\"}"), packet.data);
// }
// // FifoWrite (&g_NetFifo, (unsigned char *) tx_data, tx_size);
// NET_FifoWritebuffer(packet.data,packet.data_size);
//}
void NETSendSluiceAck (void)
{
char data[128];
int tx_size = 0;
tx_size = _651PacketDataSluiceAck (data);
NetPacket_t packet;
packet.data_size = PP_AddHeader (0x4E, data, tx_size, packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
}
// 应答EF 打印日志
void NETSendLog (char *data)
{
NetPacket_t packet;
packet.data_size = PP_AddHeader (0xEF, data, strlen (data), packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
}
// 应答E3 回复读取的数据
void NETSendRegist (void)
{
char data[128];
memset (data, 0, 128);
sprintf (data, "{\"iccid\":\"%s\",\"version\":\"%s\"}", "1234567890", "V1.0.1");
NetPacket_t packet;
packet.data_size = PP_AddHeader (0xE4, data, strlen (data), packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
}
void netWriteUnifData (void)
{
char data[128];
int tx_size = 0;
tx_size = PP_PacketUnifData (data);
NetPacket_t packet;
packet.data_size = PP_AddHeader (0x31, data, tx_size, packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
}
void netWriteHeartData(void)
{
char data[128];
int tx_size = 0;
tx_size = PP_PacketUnifData (data);
NetPacket_t packet;
packet.data_size = PP_AddHeader (0x2F, data, 4, packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
}
//- 上报参数API
// 上报基础参数
void netWritebaseParams (void)
{
NetPacket_t packet;
char data[512];
memset (data, 0, 512);
int tx_size = 0;
tx_size = Json651PacketBaseInfo (data, 512);
packet.data_size = PP_AddHeader (0xE3, data, strlen (data), packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
//packet.data_size = PP_AddHeader(0xE3, data, strlen(data), packet.data);
log_d ("tx_size = %d\r\n", tx_size);
log_d ("data = %s\r\n", data);
}
//- 上报参数API
// 上报接口参数
void netWriteInterfaceParams (void)
{
NetPacket_t packet;
char data[512];
memset (data, 0, 512);
int tx_size = 0;
tx_size = Json651PacketInterfaceInfo (data, 512);
packet.data_size = PP_AddHeader (0xE3, data, strlen (data), packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
log_d ("tx_size = %d\r\n", tx_size);
log_d ("data = %s\r\n", data);
}
//- 上报参数API
// 上报闸门参数
void netWriteSluiceParams (void)
{
NetPacket_t packet;
char data[512];
memset (data, 0, 512);
int tx_size = 0;
tx_size = Json651PacketSluiceInfo (data, 512);
packet.data_size = PP_AddHeader (0xE3, data, strlen (data), packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
log_d ("tx_size = %d\r\n", tx_size);
log_d ("data = %s\r\n", data);
}
//- 上报参数API
// 上报水位流量关系表
void netWriteWaterParams (void)
{
NetPacket_t packet;
char data[512];
memset (data, 0, 512);
int tx_size = 0;
tx_size = Json651PacketWaterInfo (data, 512);
packet.data_size = PP_AddHeader (0xE3, data, strlen (data), packet.data);
NET_FifoWritebuffer(packet.data,packet.data_size);
log_d ("tx_size = %d\r\n", tx_size);
log_d ("data = %s\r\n", data);
}
+48
View File
@@ -0,0 +1,48 @@
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
#include "os-app.h"
#include <stdio.h>
#include "modbus-m.h"
#include "net-app.h"
#
osThreadId_t NetworkThreadHandle; // Óû§×Ô¶¨ÒåÏß³Ì
const osThreadAttr_t NetworkThread_attributes = {
.name = "networkThread",
.priority = (osPriority_t) osPriorityLow,
.stack_size = 1024 * 4
};
static netWorkInterface_t s_interface;
enum {
}
void NetworkTask(void * argument)
{
if (s_interface.Init != NULL)
{
s_interface.Init();
}
while (1)
{
osDelay(5000);
}
}
+511
View File
@@ -0,0 +1,511 @@
//#include "sysinfo-app.h"
#include "proto-sl651.h"
#include "rtc.h"
//#include "ff-collected.h"
//#include "mjson.h"
#include "elog.h"
//#include "base64.h"
// static uint8_t g_651txbuff[255];
// static uint16_t g_651txbuff_length;
static union //如果是切换页面,显示为页面ID
{
uint32_t Int;
uint8_t Byte[4];
} Int;
static int g_syn_number = 0;
// 打包数据帧
int PP_AddHeader (uint8_t func, char *data, int length, char *txbuff)
{
int tx_size = 0;
uint16_t crc = 0;
txbuff[tx_size++] = 0x7E;
txbuff[tx_size++] = 0x7E;
txbuff[tx_size++] = 0x02; // 根据中心站地址区分版本号
txbuff[tx_size++] = 0xFF;
txbuff[tx_size++] = 0xFF;
txbuff[tx_size++] = 0;//SysInfo.baseAddr[0];
txbuff[tx_size++] = 0;//SysInfo.baseAddr[1]; //(uint8_t) ( (SysInfo.Addr >> 24) & 0x000000FF);
txbuff[tx_size++] = 0;//SysInfo.baseAddr[2]; //(uint8_t) ( (SysInfo.Addr >> 16) & 0x000000FF);
txbuff[tx_size++] = 0;//SysInfo.baseAddr[3]; //(uint8_t) ( (SysInfo.Addr >> 8) & 0x000000FF);
txbuff[tx_size++] = 0;//SysInfo.baseAddr[4]; //(uint8_t) (SysInfo.Addr & 0x000000FF);
txbuff[tx_size++] = func;
txbuff[tx_size++] = 0x00;
txbuff[tx_size++] = length; // 长度
txbuff[tx_size++] = _651_STX;
// dbg_printf ("sizeof (_651_U_Header_t):%d\r\n", tx_size);
for (int i = 0; i < length; i++)
{
txbuff[tx_size++] = data[i];
}
txbuff[tx_size++] = 0x03;
crc = 0;//bsp_crc_calc16 ( (uint8_t *) txbuff, tx_size);
txbuff[tx_size++] = (crc >> 8) & 0x00FF;
txbuff[tx_size++] = crc & 0x00FF;
return tx_size;
//
// 计算校验
}
// 均匀时段报
int PP_PacketUnifData (char *tx_data)
{
uint8_t powerdata[26];
//RtcTime rtcTime;
//Get_Time (&rtcTime);
int tx_size = 0;
g_syn_number++;
tx_data[tx_size++] = (g_syn_number >> 8) & 0x00FF;
tx_data[tx_size++] = g_syn_number & 0xFF;
tx_data[tx_size++] = 0x00; // 要素1 瞬时流速
tx_data[tx_size++] = 0x00; // 要素1 瞬时流速
tx_data[tx_size++] = 0x00; // 要素1 瞬时流速
tx_data[tx_size++] = 0x00; // 要素1 瞬时流速
tx_data[tx_size++] = 0x00; // 要素2 瞬时流量
tx_data[tx_size++] = 0x00; // 要素2 瞬时流量
tx_data[tx_size++] = 0x00; // 要素2 瞬时流量
tx_data[tx_size++] = 0x00; // 要素2 瞬时流量
tx_data[tx_size++] = 0x00; // 要素3 累计流量
tx_data[tx_size++] = 0x00; // 要素3 累计流量
tx_data[tx_size++] = 0x00; // 要素3 累计流量
tx_data[tx_size++] = 0x00; // 要素3 累计流量
Int.Int = 0;//= (FF_ReadEcodeData() - SysInfo.SlMinEcode) / SysInfo.SlEcodeCoeff * 100 ;
tx_data[tx_size++] = Int.Byte[3]; // 要素4 闸门开度
tx_data[tx_size++] = Int.Byte[2]; // 要素4 闸门开度
tx_data[tx_size++] = Int.Byte[1]; // 要素4 闸门开度
tx_data[tx_size++] = Int.Byte[0]; // 要素4 闸门开度
Int.Int = 0;// (int) bsp_rng_get_number (1000, 1200) * 100; // MbusReadSensorValue (EcodeType) * 100;
tx_data[tx_size++] = 0x00; // 要素5 闸门荷重
tx_data[tx_size++] = 0x00; // 要素5 闸门荷重
tx_data[tx_size++] = 0x00; // 要素5 闸门荷重
tx_data[tx_size++] = 0x00; // 要素5 闸门荷重
// 要素6 最大开度
Int.Int = 0;// SysInfo.SlMaxOpen * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 要素7 电池电压
Int.Int = 23.5 * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 要素8 机箱温度
Int.Int = 52.6 * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 要素9 闸前水位
Int.Int = 0 * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 要素10 充电控制器数据
//FF_ReadPowerData (powerdata) ;
for (int i = 0; i < 26; i++)
{
tx_data[tx_size++] = powerdata[i];
}
return tx_size;
}
// 闸门状态自报
int _651PacketDataSluiceUp (char *tx_data)
{
// RtcTime rtcTime;
// Get_Time (&rtcTime);
int tx_size = 0;
g_syn_number++;
tx_data[tx_size++] = (g_syn_number >> 8) & 0x00FF;
tx_data[tx_size++] = g_syn_number & 0xFF;
tx_data[tx_size++] = 0x01;
tx_data[tx_size++] = 0x01;
// 闸门开度
// Int.Int = MbusReadSensorValue (EcodeType) * 100;
//dbg_printf ("%d\r\n", Int.Int);
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 闸门荷重
Int.Int = 0;//(int) bsp_rng_get_number (1200, 1400) * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 闸前水位
Int.Int = 0 * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
// 瞬时流量
Int.Int = 0 * 100;
tx_data[tx_size++] = Int.Byte[3];
tx_data[tx_size++] = Int.Byte[2];
tx_data[tx_size++] = Int.Byte[1];
tx_data[tx_size++] = Int.Byte[0];
return tx_size;
}
int _651PacketDataSluiceAck (char *tx_data)
{
// RtcTime rtcTime;
// Get_Time (&rtcTime);
int tx_size = 0;
g_syn_number++;
tx_data[tx_size++] = (g_syn_number >> 8) & 0x00FF;
tx_data[tx_size++] = g_syn_number & 0xFF;
tx_data[tx_size++] = 0;//rtcTime.year;
tx_data[tx_size++] = 0;//rtcTime.month;
tx_data[tx_size++] = 0;//rtcTime.day;
tx_data[tx_size++] = 0;//rtcTime.hour;
tx_data[tx_size++] = 0;//rtcTime.minute;
tx_data[tx_size++] = 0;//rtcTime.second;
tx_data[tx_size++] = 0;//SysInfo.baseAddr[0];
tx_data[tx_size++] = 0;//SysInfo.baseAddr[1]; //(uint8_t) ( (SysInfo.Addr >> 24) & 0x000000FF);
tx_data[tx_size++] = 0;//SysInfo.baseAddr[2]; //(uint8_t) ( (SysInfo.Addr >> 16) & 0x000000FF);
tx_data[tx_size++] = 0;//SysInfo.baseAddr[3]; //(uint8_t) ( (SysInfo.Addr >> 8) & 0x000000FF);
tx_data[tx_size++] = 0;//SysInfo.baseAddr[4]; //(uint8_t) (SysInfo.Addr & 0x000000FF);
return tx_size;
}
// 打包 基础参数
int Json651PacketBaseInfo (char *outBuffer, int length)
{
// char devidstr[11];
// int k = 0;
// memset (devidstr, 0, sizeof (devidstr));
// hexbyte_to_hex_str (SysInfo.baseAddr, devidstr, 5);
// // puthex ( (uint8_t *) devidstr, SysInfo.baseAddr, 5);
// struct mjson_fixedbuf fb = { (char *) outBuffer, length - 1, 0};
// k = mjson_printf (&mjson_print_fixed_buf, &fb, "{%Q:%d,%Q:%Q,%Q:%d,%Q:%Q,%Q:%Q,%Q:%Q,%Q:%Q,%Q:%Q,%Q:%Q,%Q:%d,%Q:%d,%Q:%d,%Q:%u}",
// "type", 1,
// "baseaddr", devidstr,
// "bute", 9600,
// "remoteAddr", SysInfo.baseRemoteAddr,
// "remoteUser", SysInfo.baseRemoteuser,
// "remotePass", SysInfo.baseRemotepass,
// "userPass", SysInfo.baseUserPassword,
// "sysPass", SysInfo.baseSysPassword,
// "topic", SysInfo.baseTopic,
// "remotePort", SysInfo.baseRemotePort,
// "LogInfo", SysInfo.baseLogInfo,
// "NetDev", SysInfo.baseNetDev,
// "StandTime", SysInfo.baseStandbyTime);
// return k;
return 0;
}
// 接口参数设置
int Json651PacketInterfaceInfo (char *outBuffer, int length)
{
// char u4851funstr[17], u4852funstr[17];
// int k = 0;
// memset (u4851funstr, 0, sizeof (u4851funstr));
// memset (u4852funstr, 0, sizeof (u4852funstr));
// hexbyte_to_hex_str ( (char *) SysInfo.u4851Func, u4851funstr, 8);
// hexbyte_to_hex_str ( (char *) SysInfo.u4852Func, u4852funstr, 8);
// // puthex ( (uint8_t *) devidstr, SysInfo.baseAddr, 5);
// struct mjson_fixedbuf fb = { (char *) outBuffer, length - 1, 0};
// k = mjson_printf (&mjson_print_fixed_buf, &fb, "{%Q:%d,%Q:%Q,%Q:%d,%Q:%d,%Q:%d,%Q:%Q,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d}",
// "type", 2,
// "u4851fun", u4851funstr,
// "u4851num", SysInfo.u4851FuncNum,
// "u4851bute", SysInfo.u4851Bute,
// "u4851para", SysInfo.u4851Para,
// "u4852fun", u4852funstr,
// "u4852num", SysInfo.u4852FuncNum,
// "u4852bute", SysInfo.u4852Bute,
// "u4852para", SysInfo.u4852Para,
// "di1", SysInfo.DIFunc[0],
// "di2", SysInfo.DIFunc[1],
// "di3", SysInfo.DIFunc[2],
// "di4", SysInfo.DIFunc[3],
// "pi1", SysInfo.PIFunc[0],
// "pi2", SysInfo.PIFunc[1],
// "pi3", SysInfo.PIFunc[2],
// "pi4", SysInfo.PIFunc[3],
// "ai1", SysInfo.AIFunc[0],
// "ai2", SysInfo.AIFunc[1],
// "k1", SysInfo.KEYFunc[0],
// "k2", SysInfo.KEYFunc[1],
// "pwm1", SysInfo.PWMFunc[0],
// "pwm2", SysInfo.PWMFunc[1],
// "pwm3", SysInfo.PWMFunc[2],
// "pwm4", SysInfo.PWMFunc[3]);
// return k;
return 0;
}
int Json651PacketSluiceInfo (char *outBuffer, int length)
{
// char devidstr[11];
// int k = 0;
// memset (devidstr, 0, sizeof (devidstr));
// hexbyte_to_hex_str (SysInfo.baseAddr, devidstr, 5);
// // puthex ( (uint8_t *) devidstr, SysInfo.baseAddr, 5);
// struct mjson_fixedbuf fb = { (char *) outBuffer, length - 1, 0};
// k = mjson_printf (&mjson_print_fixed_buf, &fb, "{%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d,%Q:%d}",
// "type", 3,
// "maxopen", SysInfo.SlMaxOpen,
// "maxcode", SysInfo.SlMaxEcode,
// "mincode", SysInfo.SlMinEcode,
// "codecoff", SysInfo.SlEcodeCoeff,
// "codetype", SysInfo.SlEcodeType,
// "loadtype", SysInfo.SlLoadType,
// "motortype", SysInfo.SlMotorType,
// "flowtype", SysInfo.SlFlowType,
// "motorspeed", SysInfo.SlMotorSpeed);
// return k;
return 0;
}
// uint16_t WTWidth;// = 100; // 宽度 cm
// Uint16_t WTSpeed[16];// = 100.0; // 流速 cm/s
// Uint16_t WTSenLoc[16]; //
// Uint16_t WTFlow[16]; // 流量
// uint8_t WTSenCount;// 层数
int Json651PacketWaterInfo (char *outBuffer, int length)
{
// int k = 0;
// char flowbuff[64];
// char speedbuff[64];
// char locbuff[64];
// memset (flowbuff, 0, 64);
// memset (speedbuff, 0, 64);
// memset (locbuff, 0, 64);
// B64Encode ( (uint8_t *) SysInfo.WTFlow, 32, flowbuff, 64);
// B64Encode ( (uint8_t *) SysInfo.WTSpeed, 32, speedbuff, 64);
// B64Encode ( (uint8_t *) SysInfo.WTSenLoc, 32, locbuff, 64);
// struct mjson_fixedbuf fb = { (char *) outBuffer, length - 1, 0};
// k = mjson_printf (&mjson_print_fixed_buf, &fb, "{%Q:%d,%Q:%d,%Q:%d,%Q:%Q,%Q:%Q,%Q:%Q}",
// "type", 4,
// "wtwidth", SysInfo.WTWidth,
// "wtsencount", SysInfo.WTSenCount,
// "wtflow", flowbuff,
// "wtspeed", speedbuff,
// "wtsenloc", locbuff
// );
// return k;
return 0;
}
//int Json651UnpackInfo (char *input, int length, SysInfoConfig_t *info)
//{
// double Number;
// int responce, resonces[32] = {0};
// char acs_data[64];
// int k = 0;
// //char test[64] = {0};
// if (mjson ( (char const *) input, strlen ( (char const *) input), NULL, NULL) != strlen ( (char const *) input))
// {
// // 乱码或者格式不对
// dbg_printf ("&&&&&&&&&&&&&&&&&\r\n");
// return -1;
// }
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.type", &Number);
// info->type = Number;
// if (info->type == 1) // base info
// {
// // 设备编码
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.baseaddr", (char*) acs_data, sizeof (acs_data) - 1) ;
// resonces[k++] = responce;
// hexstr_to_hexbyte (acs_data, info->info.base.baseAddr, responce);
// // 波特率
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.bute", &Number);
// info->info.base.baseBute = Number;
// // 远程地址
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.remoteAddr", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// memcpy (info->info.base.baseRemoteAddr, acs_data, 32);
// //mqtt用户
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.remoteUser", (char*) acs_data, sizeof (acs_data) - 1) ;
// resonces[k++] = responce;
// memcpy (info->info.base.baseRemoteuser, acs_data, 32);
// //mqtt密码
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.remotePass", (char*) acs_data, sizeof (acs_data) - 1) ;
// resonces[k++] = responce;
// memcpy (info->info.base.baseRemotepass, acs_data, 32);
// //屏幕用户登录密码
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.userPass", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// memcpy (info->info.base.baseUserPassword, acs_data, 32);
// //屏幕管理员登录密码
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.sysPass", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// memcpy (info->info.base.baseSysPassword, acs_data, 32);
// //订阅topic
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.topic", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// memcpy (info->info.base.baseTopic, acs_data, 32);
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.remotePort", &Number);
// info->info.base.baseRemotePort = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.LogInfo", &Number);
// info->info.base.baseLogInfo = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.NetDev", &Number);
// info->info.base.baseNetDev = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.StandTime", &Number);
// info->info.base.baseStandbyTime = Number;
// }
// else if (info->type == 2) //
// {
// // 4851 func
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.u4851fun", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// hexstr_to_hexbyte (acs_data, (char *) info->info.interface.u4851Func, responce);
// // 4852 func
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.u4852fun", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// hexstr_to_hexbyte (acs_data, (char *) info->info.interface.u4852Func, responce);
// //memcpy(info->info.interface.u4851Func,acs_data,32);
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.u4851num", &Number);
// info->info.interface.u4851FuncNum = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.u4852num", &Number);
// info->info.interface.u4852FuncNum = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.u4851para", &Number);
// info->info.interface.u4851Para = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.u4852para", &Number);
// info->info.interface.u4852Para = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.u4851bute", &Number);
// info->info.interface.u4851Bute = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.u4852bute", &Number);
// info->info.interface.u4852Bute = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.di1", &Number);
// info->info.interface.DI1Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.di2", &Number);
// info->info.interface.DI2Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.di3", &Number);
// info->info.interface.DI3Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.di4", &Number);
// info->info.interface.DI4Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pi1", &Number);
// info->info.interface.PI1Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pi2", &Number);
// info->info.interface.PI2Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pi3", &Number);
// info->info.interface.PI3Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pi4", &Number);
// info->info.interface.PI4Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.ai1", &Number);
// info->info.interface.AI1Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.ai2", &Number);
// info->info.interface.AI2Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.k1", &Number);
// info->info.interface.KEY1Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.k2", &Number);
// info->info.interface.KEY2Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pwm1", &Number);
// info->info.interface.PWM1Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pwm2", &Number);
// info->info.interface.PWM2Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pwm3", &Number);
// info->info.interface.PWM3Func = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.pwm4", &Number);
// info->info.interface.PWM4Func = Number;
// }
// else if (info->type == 3) //
// {
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.maxopen", &Number);
// info->info.sluice.SlMaxOpen = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.mincode", &Number);
// info->info.sluice.SlMinEcode = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.maxcode", &Number);
// info->info.sluice.SlMaxEcode = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.codecoff", &Number);
// info->info.sluice.SlEcodeCoeff = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.codetype", &Number);
// info->info.sluice.SlEcodeType = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.loadtype", &Number);
// info->info.sluice.SlLoadType = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.flowtype", &Number);
// info->info.sluice.SlFlowType = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.motorspeed", &Number);
// info->info.sluice.SlMotorSpeed = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.motortype", &Number);
// info->info.sluice.SlMotorType = Number;
//// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.motortype", &Number);
//// info->info.sluice.SlMotorType = Number;
// }
// else if (info->type == 4) //
// {
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.wtwidth", &Number);
// info->info.water.WTWidth = Number;
// resonces[k++] = mjson_get_number ( (char const *) input, strlen ( (char const *) input), "$.wtsencount", &Number);
// info->info.water.WTSenCount = Number;
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.wtflow", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// B64Decode (acs_data, responce, (uint8_t *) info->info.water.WTFlow);
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.wtspeed", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// B64Decode (acs_data, responce, (uint8_t *) info->info.water.WTSpeed);
// memset (acs_data, 0, 64);
// responce = mjson_get_string ( (char const*) input, strlen ( (char const*) input), "$.wtsenloc", (char*) acs_data, sizeof (acs_data) - 1);
// resonces[k++] = responce;
// dbg_printf ("%s\r\n", acs_data);
// B64Decode (acs_data, responce, (uint8_t *) info->info.water.WTSenLoc);
// //memcpy((uint8_t *)info->info.water.WTSenLoc,test,32);
//// for(int i =0;i <32;i++)
//// {
//// dbg_printf("%02X ",test[i]);
//// }
//// dbg_printf("\r\n");
// //dbg_printf("%u,%u,%u,%u\r\n",info->info.water.WTSenLoc[0],info->info.water.WTSenLoc[1],info->info.water.WTSenLoc[2],info->info.water.WTSenLoc[3]) ;
// //hexstr_to_hexbyte (acs_data, (char *) info->info.interface.u4852Func, responce);
// }
// else
// {
// return -1;
// }
// for (int t = 0; t < k; t++)
// {
// if (resonces[t] < 0)
// return -2;
// }
// return 0;
//return 0;
//}
+68
View File
@@ -0,0 +1,68 @@
#ifndef _PROTO_SL651_H
#define _PROTO_SL651_H
#include <stdint.h>
// 上行统一使用M1模式,无确认
// 下行统一使用M2模式一次确认
#define _651_STX 2
#define _651_ETX 3
#define _651_ETB 23
#define STATION_TYPE 0x5A // 遥测站分类码
#define U_LINKCHECK_MSG 0x2F // 链路维持报
#define U_USER_TEST_MSG 0x30 // 测试报
#define U_UNIF_TIME_MSG 0x31 // 均匀时段报
#define U_TIMINGTT_MSG 0x32 // 定时报
#define U_MANUAL_MSG 0x33 // 加报报,由时间和事件触发的上报
#define U_TIME_HOUR_MSG 0X34 // 小时报
#define D_MD_BASEPARA_MSG 0X40
#define D_MD_BASEPARA_MSG 0X40
#pragma pack (1)
typedef struct _651_U_Header_t
{
uint16_t Head;
uint8_t CentAddr;
uint8_t DeviAddr[5];
uint16_t Pass;
uint8_t FuncCode;
uint16_t TypeLength;
uint8_t Stx;
} _651_U_Header_t;
typedef struct _651_D_Header_t
{
uint16_t Head;
uint8_t DeviAddr[5];
uint8_t CentAddr;
uint16_t Pass;
uint8_t FuncCode;
uint16_t Type: 4;
uint16_t Length: 12;
uint8_t Stx;
} _651_D_Header_t;
#pragma pack ()
int PP_AddHeader (uint8_t func, char * data, int length, char * txbuff);
int PP_PacketUnifData (char * tx_data);
// 闸门状态自报
int _651PacketDataSluiceUp (char * tx_data);
int _651PacketDataSluiceAck (char * tx_data);
int Json651PacketBaseInfo (char * outBuffer, int length);
int Json651PacketInterfaceInfo (char * outBuffer, int length);
int Json651PacketSluiceInfo (char * outBuffer, int length);
//int Json651UnpackInfo (char *input, int length, SysInfoConfig_t *info);
int Json651PacketWaterInfo (char *outBuffer, int length);
#endif