增加了通信协议解析的功能

This commit is contained in:
zjk
2024-11-19 09:58:31 +08:00
parent 590662d7a5
commit 4693ce2619
15 changed files with 924 additions and 169 deletions
+401
View File
@@ -0,0 +1,401 @@
#!/bin/bash
if [ -d "$2$1" ]; then
echo "$2$1 already exists... quitting."
exit 1
fi
if [ -z "$1" ] ; then
echo "GenMOOSApp: usage: $0 [app-name] [prefix]"
exit 0
fi
if [ -z "$2" ] ; then
echo "GenMOOSApp: usage: $0 [app-name] [prefix]"
exit 0
fi
#if [ -z "$3" ] ; then
# $3="YOUR-NAME-HERE"
#fi
mkdir $2$1
cd $2$1
cat > CMakeLists.txt <<EOF
#--------------------------------------------------------
# The CMakeLists.txt for: $2$1
# Author(s): $3
#--------------------------------------------------------
SET(SRC
${1}.cpp
${1}_Info.cpp
main.cpp
)
ADD_EXECUTABLE($2$1 \${SRC})
TARGET_LINK_LIBRARIES($2$1
\${MOOS_LIBRARIES}
mbutil
m
pthread)
EOF
cat > ${1}.h <<EOF
/************************************************************/
/* NAME: $3 */
/* ORGN: MIT */
/* FILE: ${1}.h */
/* DATE: */
/************************************************************/
#ifndef ${1}_HEADER
#define ${1}_HEADER
#include "MOOS/libMOOS/MOOSLib.h"
class ${1} : public CMOOSApp
{
public:
${1}();
~${1}();
protected: // Standard MOOSApp functions to overload
bool OnNewMail(MOOSMSG_LIST &NewMail);
bool Iterate();
bool OnConnectToServer();
bool OnStartUp();
protected:
void RegisterVariables();
private: // Configuration variables
private: // State variables
};
#endif
EOF
cat > main.cpp <<EOF
/************************************************************/
/* NAME: $3 */
/* ORGN: MIT */
/* FILE: main.cpp */
/* DATE: */
/************************************************************/
#include <string>
#include "MBUtils.h"
#include "ColorParse.h"
#include "${1}.h"
#include "${1}_Info.h"
using namespace std;
int main(int argc, char *argv[])
{
string mission_file;
string run_command = argv[0];
for(int i=1; i<argc; i++) {
string argi = argv[i];
if((argi=="-v") || (argi=="--version") || (argi=="-version"))
showReleaseInfoAndExit();
else if((argi=="-e") || (argi=="--example") || (argi=="-example"))
showExampleConfigAndExit();
else if((argi == "-h") || (argi == "--help") || (argi=="-help"))
showHelpAndExit();
else if((argi == "-i") || (argi == "--interface"))
showInterfaceAndExit();
else if(strEnds(argi, ".moos") || strEnds(argi, ".moos++"))
mission_file = argv[i];
else if(strBegins(argi, "--alias="))
run_command = argi.substr(8);
else if(i==2)
run_command = argi;
}
if(mission_file == "")
showHelpAndExit();
cout << termColor("green");
cout << "${2}${1} launching as " << run_command << endl;
cout << termColor() << endl;
${1} ${1};
${1}.Run(run_command.c_str(), mission_file.c_str());
return(0);
}
EOF
cat > $2${1}.moos <<EOF
//------------------------------------------------
// ${2}${1} config block
ProcessConfig = ${2}${1}
{
AppTick = 4
CommsTick = 4
}
EOF
cat > ${1}.cpp <<EOF
/************************************************************/
/* NAME: $3 */
/* ORGN: MIT */
/* FILE: ${1}.cpp */
/* DATE: */
/************************************************************/
#include <iterator>
#include "MBUtils.h"
#include "${1}.h"
using namespace std;
//---------------------------------------------------------
// Constructor
${1}::${1}()
{
}
//---------------------------------------------------------
// Destructor
${1}::~${1}()
{
}
//---------------------------------------------------------
// Procedure: OnNewMail
bool ${1}::OnNewMail(MOOSMSG_LIST &NewMail)
{
MOOSMSG_LIST::iterator p;
for(p=NewMail.begin(); p!=NewMail.end(); p++) {
CMOOSMsg &msg = *p;
#if 0 // Keep these around just for template
string key = msg.GetKey();
string comm = msg.GetCommunity();
double dval = msg.GetDouble();
string sval = msg.GetString();
string msrc = msg.GetSource();
double mtime = msg.GetTime();
bool mdbl = msg.IsDouble();
bool mstr = msg.IsString();
#endif
}
return(true);
}
//---------------------------------------------------------
// Procedure: OnConnectToServer
bool ${1}::OnConnectToServer()
{
RegisterVariables();
return(true);
}
//---------------------------------------------------------
// Procedure: Iterate()
// happens AppTick times per second
bool ${1}::Iterate()
{
return(true);
}
//---------------------------------------------------------
// Procedure: OnStartUp()
// happens before connection is open
bool ${1}::OnStartUp()
{
list<string> sParams;
m_MissionReader.EnableVerbatimQuoting(false);
if(m_MissionReader.GetConfiguration(GetAppName(), sParams)) {
list<string>::iterator p;
for(p=sParams.begin(); p!=sParams.end(); p++) {
string line = *p;
string param = tolower(biteStringX(line, '='));
string value = line;
if(param == "foo") {
//handled
}
else if(param == "bar") {
//handled
}
}
}
RegisterVariables();
return(true);
}
//---------------------------------------------------------
// Procedure: RegisterVariables
void ${1}::RegisterVariables()
{
// Register("FOOBAR", 0);
}
EOF
cat > ${1}_Info.h <<EOF
/****************************************************************/
/* NAME: ${3} */
/* ORGN: MIT Cambridge MA */
/* FILE: ${1}_Info.h */
/* DATE: Dec 29th 1963 */
/****************************************************************/
#ifndef ${1}_INFO_HEADER
#define ${1}_INFO_HEADER
void showSynopsis();
void showHelpAndExit();
void showExampleConfigAndExit();
void showInterfaceAndExit();
void showReleaseInfoAndExit();
#endif
EOF
cat > ${1}_Info.cpp <<EOF
/****************************************************************/
/* NAME: ${3} */
/* ORGN: MIT Cambridge MA */
/* FILE: ${1}_Info.cpp */
/* DATE: Dec 29th 1963 */
/****************************************************************/
#include <cstdlib>
#include <iostream>
#include "${1}_Info.h"
#include "ColorParse.h"
#include "ReleaseInfo.h"
using namespace std;
//----------------------------------------------------------------
// Procedure: showSynopsis
void showSynopsis()
{
blk("SYNOPSIS: ");
blk("------------------------------------ ");
blk(" The ${2}${1} application is used for ");
blk(" ");
blk(" ");
blk(" ");
blk(" ");
}
//----------------------------------------------------------------
// Procedure: showHelpAndExit
void showHelpAndExit()
{
blk(" ");
blu("=============================================================== ");
blu("Usage: ${2}${1} file.moos [OPTIONS] ");
blu("=============================================================== ");
blk(" ");
showSynopsis();
blk(" ");
blk("Options: ");
mag(" --alias","=<ProcessName> ");
blk(" Launch ${2}${1} with the given process name ");
blk(" rather than ${2}${1}. ");
mag(" --example, -e ");
blk(" Display example MOOS configuration block. ");
mag(" --help, -h ");
blk(" Display this help message. ");
mag(" --interface, -i ");
blk(" Display MOOS publications and subscriptions. ");
mag(" --version,-v ");
blk(" Display the release version of ${2}${1}. ");
blk(" ");
blk("Note: If argv[2] does not otherwise match a known option, ");
blk(" then it will be interpreted as a run alias. This is ");
blk(" to support pAntler launching conventions. ");
blk(" ");
exit(0);
}
//----------------------------------------------------------------
// Procedure: showExampleConfigAndExit
void showExampleConfigAndExit()
{
blk(" ");
blu("=============================================================== ");
blu("${2}${1} Example MOOS Configuration ");
blu("=============================================================== ");
blk(" ");
blk("ProcessConfig = ${2}${1} ");
blk("{ ");
blk(" AppTick = 4 ");
blk(" CommsTick = 4 ");
blk(" ");
blk("} ");
blk(" ");
exit(0);
}
//----------------------------------------------------------------
// Procedure: showInterfaceAndExit
void showInterfaceAndExit()
{
blk(" ");
blu("=============================================================== ");
blu("${2}${1} INTERFACE ");
blu("=============================================================== ");
blk(" ");
showSynopsis();
blk(" ");
blk("SUBSCRIPTIONS: ");
blk("------------------------------------ ");
blk(" NODE_MESSAGE = src_node=alpha,dest_node=bravo,var_name=FOO, ");
blk(" string_val=BAR ");
blk(" ");
blk("PUBLICATIONS: ");
blk("------------------------------------ ");
blk(" Publications are determined by the node message content. ");
blk(" ");
exit(0);
}
//----------------------------------------------------------------
// Procedure: showReleaseInfoAndExit
void showReleaseInfoAndExit()
{
showReleaseInfo("${2}${1}", "gpl");
exit(0);
}
EOF
echo "$2${1} generated"
+19
View File
@@ -0,0 +1,19 @@
#--------------------------------------------------------
# The CMakeLists.txt for: appPowerMangerGui
# Author(s):
#--------------------------------------------------------
SET(SRC
PowerMangerGui.cpp
PowerMangerGui_Info.cpp
main.cpp
)
ADD_EXECUTABLE(appPowerMangerGui ${SRC})
TARGET_LINK_LIBRARIES(appPowerMangerGui
${MOOS_LIBRARIES}
mbutil
m
pthread)
+106
View File
@@ -0,0 +1,106 @@
/************************************************************/
/* NAME: */
/* ORGN: MIT */
/* FILE: PowerMangerGui.cpp */
/* DATE: */
/************************************************************/
#include <iterator>
#include "MBUtils.h"
#include "PowerMangerGui.h"
using namespace std;
//---------------------------------------------------------
// Constructor
PowerMangerGui::PowerMangerGui()
{
}
//---------------------------------------------------------
// Destructor
PowerMangerGui::~PowerMangerGui()
{
}
//---------------------------------------------------------
// Procedure: OnNewMail
bool PowerMangerGui::OnNewMail(MOOSMSG_LIST &NewMail)
{
MOOSMSG_LIST::iterator p;
for(p=NewMail.begin(); p!=NewMail.end(); p++) {
CMOOSMsg &msg = *p;
#if 0 // Keep these around just for template
string key = msg.GetKey();
string comm = msg.GetCommunity();
double dval = msg.GetDouble();
string sval = msg.GetString();
string msrc = msg.GetSource();
double mtime = msg.GetTime();
bool mdbl = msg.IsDouble();
bool mstr = msg.IsString();
#endif
}
return(true);
}
//---------------------------------------------------------
// Procedure: OnConnectToServer
bool PowerMangerGui::OnConnectToServer()
{
RegisterVariables();
return(true);
}
//---------------------------------------------------------
// Procedure: Iterate()
// happens AppTick times per second
bool PowerMangerGui::Iterate()
{
return(true);
}
//---------------------------------------------------------
// Procedure: OnStartUp()
// happens before connection is open
bool PowerMangerGui::OnStartUp()
{
list<string> sParams;
m_MissionReader.EnableVerbatimQuoting(false);
if(m_MissionReader.GetConfiguration(GetAppName(), sParams)) {
list<string>::iterator p;
for(p=sParams.begin(); p!=sParams.end(); p++) {
string line = *p;
string param = tolower(biteStringX(line, '='));
string value = line;
if(param == "foo") {
//handled
}
else if(param == "bar") {
//handled
}
}
}
RegisterVariables();
return(true);
}
//---------------------------------------------------------
// Procedure: RegisterVariables
void PowerMangerGui::RegisterVariables()
{
// Register("FOOBAR", 0);
}
+33
View File
@@ -0,0 +1,33 @@
/************************************************************/
/* NAME: */
/* ORGN: MIT */
/* FILE: PowerMangerGui.h */
/* DATE: */
/************************************************************/
#ifndef PowerMangerGui_HEADER
#define PowerMangerGui_HEADER
#include "FL/Fl.H"
#include "MOOS/libMOOS/MOOSLib.h"
class PowerMangerGui : public CMOOSApp {
public:
PowerMangerGui();
~PowerMangerGui();
bool minWindows();
protected: // Standard MOOSApp functions to overload
bool OnNewMail(MOOSMSG_LIST &NewMail);
bool Iterate();
bool OnConnectToServer();
bool OnStartUp();
protected:
void RegisterVariables();
private: // Configuration variables
private: // State variables
};
#endif
@@ -0,0 +1,115 @@
/****************************************************************/
/* NAME: */
/* ORGN: MIT Cambridge MA */
/* FILE: PowerMangerGui_Info.cpp */
/* DATE: Dec 29th 1963 */
/****************************************************************/
#include <cstdlib>
#include <iostream>
#include "PowerMangerGui_Info.h"
#include "ColorParse.h"
#include "ReleaseInfo.h"
using namespace std;
//----------------------------------------------------------------
// Procedure: showSynopsis
void showSynopsis()
{
blk("SYNOPSIS: ");
blk("------------------------------------ ");
blk(" The appPowerMangerGui application is used for ");
blk(" ");
blk(" ");
blk(" ");
blk(" ");
}
//----------------------------------------------------------------
// Procedure: showHelpAndExit
void showHelpAndExit()
{
blk(" ");
blu("=============================================================== ");
blu("Usage: appPowerMangerGui file.moos [OPTIONS] ");
blu("=============================================================== ");
blk(" ");
showSynopsis();
blk(" ");
blk("Options: ");
mag(" --alias","=<ProcessName> ");
blk(" Launch appPowerMangerGui with the given process name ");
blk(" rather than appPowerMangerGui. ");
mag(" --example, -e ");
blk(" Display example MOOS configuration block. ");
mag(" --help, -h ");
blk(" Display this help message. ");
mag(" --interface, -i ");
blk(" Display MOOS publications and subscriptions. ");
mag(" --version,-v ");
blk(" Display the release version of appPowerMangerGui. ");
blk(" ");
blk("Note: If argv[2] does not otherwise match a known option, ");
blk(" then it will be interpreted as a run alias. This is ");
blk(" to support pAntler launching conventions. ");
blk(" ");
exit(0);
}
//----------------------------------------------------------------
// Procedure: showExampleConfigAndExit
void showExampleConfigAndExit()
{
blk(" ");
blu("=============================================================== ");
blu("appPowerMangerGui Example MOOS Configuration ");
blu("=============================================================== ");
blk(" ");
blk("ProcessConfig = appPowerMangerGui ");
blk("{ ");
blk(" AppTick = 4 ");
blk(" CommsTick = 4 ");
blk(" ");
blk("} ");
blk(" ");
exit(0);
}
//----------------------------------------------------------------
// Procedure: showInterfaceAndExit
void showInterfaceAndExit()
{
blk(" ");
blu("=============================================================== ");
blu("appPowerMangerGui INTERFACE ");
blu("=============================================================== ");
blk(" ");
showSynopsis();
blk(" ");
blk("SUBSCRIPTIONS: ");
blk("------------------------------------ ");
blk(" NODE_MESSAGE = src_node=alpha,dest_node=bravo,var_name=FOO, ");
blk(" string_val=BAR ");
blk(" ");
blk("PUBLICATIONS: ");
blk("------------------------------------ ");
blk(" Publications are determined by the node message content. ");
blk(" ");
exit(0);
}
//----------------------------------------------------------------
// Procedure: showReleaseInfoAndExit
void showReleaseInfoAndExit()
{
showReleaseInfo("appPowerMangerGui", "gpl");
exit(0);
}
@@ -0,0 +1,18 @@
/****************************************************************/
/* NAME: */
/* ORGN: MIT Cambridge MA */
/* FILE: PowerMangerGui_Info.h */
/* DATE: Dec 29th 1963 */
/****************************************************************/
#ifndef PowerMangerGui_INFO_HEADER
#define PowerMangerGui_INFO_HEADER
void showSynopsis();
void showHelpAndExit();
void showExampleConfigAndExit();
void showInterfaceAndExit();
void showReleaseInfoAndExit();
#endif
@@ -0,0 +1,9 @@
//------------------------------------------------
// appPowerMangerGui config block
ProcessConfig = appPowerMangerGui
{
AppTick = 4
CommsTick = 4
}
+52
View File
@@ -0,0 +1,52 @@
/************************************************************/
/* NAME: */
/* ORGN: MIT */
/* FILE: main.cpp */
/* DATE: */
/************************************************************/
#include <string>
#include "MBUtils.h"
#include "ColorParse.h"
#include "PowerMangerGui.h"
#include "PowerMangerGui_Info.h"
using namespace std;
int main(int argc, char *argv[])
{
string mission_file;
string run_command = argv[0];
for(int i=1; i<argc; i++) {
string argi = argv[i];
if((argi=="-v") || (argi=="--version") || (argi=="-version"))
showReleaseInfoAndExit();
else if((argi=="-e") || (argi=="--example") || (argi=="-example"))
showExampleConfigAndExit();
else if((argi == "-h") || (argi == "--help") || (argi=="-help"))
showHelpAndExit();
else if((argi == "-i") || (argi == "--interface"))
showInterfaceAndExit();
else if(strEnds(argi, ".moos") || strEnds(argi, ".moos++"))
mission_file = argv[i];
else if(strBegins(argi, "--alias="))
run_command = argi.substr(8);
else if(i==2)
run_command = argi;
}
if(mission_file == "")
showHelpAndExit();
cout << termColor("green");
cout << "appPowerMangerGui launching as " << run_command << endl;
cout << termColor() << endl;
PowerMangerGui PowerMangerGui;
PowerMangerGui.Run(run_command.c_str(), mission_file.c_str());
return(0);
}
+8 -6
View File
@@ -181,6 +181,7 @@ bool PowerManger::ListenLoopCCU()
{
unsigned char Buff[MAX_UDP_PKT_SIZE];
cout << "------------------" << endl;
cout << "SIZEOF" << sizeof(msg_CcuStateFbMsg) << endl;
while(!m_ListenThread.IsQuitRequested())
{
int nRead = m_pCcuUdpComm->iRecieveMessage(Buff,sizeof(Buff));
@@ -201,16 +202,17 @@ bool PowerManger::ListenLoopCCU()
//处理消息
switch (id)
{
case 0x0051: //CCU_STATE_FB 0x0051
case CCU_STATE_FB_ID: //CCU_STATE_FB 0x0051
msg_CcuStateFbMsg s;
if(m_udpComm.getCcuState((char *)Buff,s))
{
cout << "------------------" << endl;
cout << "id:" << s.header.id << endl;
// cout << "id:" << s.header.id << endl;
cout << "currentWorkCondition:" << (double)s.currentWorkCondition << endl;
cout << "fcuState:" << s.fcuState << endl;
cout << "fcuFaultLeve:" << s.fcuFaultLeve << endl;
cout << "powerLimit:" << s.powerLimit << endl;
cout << "fcuState:" << (double)s.fcuState << endl;
cout << "fcuFaultLeve:" << (double)s.fcuFaultLeve << endl;
cout << "powerLimit:" << (double)s.powerLimit << endl;
cout << "checkCode:" << (double)s.checkCode << endl;
}
else
{
@@ -219,7 +221,7 @@ bool PowerManger::ListenLoopCCU()
m_udpComm.sError.clear();
}
break;
case 0x0040: //CCU_SET_PARM_FB 0x0040
case CCU_SET_PARM_FB_ID: //CCU_SET_PARM_FB 0x0040
msg_CcuSetParmFbMsg p;
if(m_udpComm.getCcuSetParmFb((char *)Buff,p))
{
+6
View File
@@ -47,6 +47,12 @@ class PowerManger : public AppCastingMOOSApp
protected: // app function
// bool _ListenCB();
XPCUdpSocket* setUdpScoket(long lPort);
//
bool buildStateReport();
bool buildEquipmentReport();
bool buildDisributionReport();
bool buildSubDistributionReport();
bool buildPredictionReport();
protected: // app variables
long m_lPort;
+7
View File
@@ -1,6 +1,12 @@
#ifndef CCUUDPMSG__H
#define CCUUDPMSG__H
#define CCU_UDPMSG_START1 0x20
#define CCU_UDPMSG_START2 0x20
#define CCU_STATE_FB_ID 0x0051
#define CCU_SET_PARM_ID 0x0040
#define CCU_SET_PARM_FB_ID 0x0041
#pragma pack (1)
typedef unsigned int Checksum;
typedef struct {
@@ -177,5 +183,6 @@ typedef struct {
float placeholder5;
Checksum checkCode;
} msg_CcuStateFbMsg;
#pragma pack ()
#endif
+16 -31
View File
@@ -4,13 +4,24 @@
udpComm::udpComm() {}
udpComm::~udpComm() {}
Checksum udpComm::calculateChecksum(const unsigned char* data, int size)
{
Checksum checksum = 0;
int size_data = size - sizeof(Checksum);
for (int i = 0; i < size_data; i++) {
checksum += data[i];
}
return checksum;
}
bool udpComm::getMsgId(char *m,unsigned short &id)
{
m_header h;
h = *reinterpret_cast<m_header *>(m);
// 判断消息是否有效
if (h.start1!= 0x20 || h.start2!= 0x20) {
// sError.push_back("Msg Header errar");
sError.push_back("Msg Header errar");
return false;
}
id = h.id;
@@ -31,39 +42,13 @@ bool udpComm::getCcuState(char *m, msg_CcuStateFbMsg &s) {
}
if (h.id != 0x0051) {
sError.push_back("CcuState Msg ID error");
// std::cout << "-------" <<h.id << std::endl;
return false;
}
sum =
h.id + h.length + h.start1 + h.start2 + p->currentWorkCondition +
p->fcuState + p->fcuFaultLeve + p->powerLimit + p->totalPowerGeneration +
p->ch4o + p->o2 + p->fcuVoltage + p->fcuCurrent + p->o2Level +
p->placeholder1 + p->exchangerTemperature + p->fcuOutPower +
p->fcuOutIns + p->fcuVoltageIns + p->fcuVoltagePower + p->fcuCurrentIns +
p->fcuCurrentPower + p->h2Concentration1 + p->h2Concentration2 +
p->o2Concentration1 + p->o2Concentration2 + p->ch4oConcentration1 +
p->ch4oConcentration2 + p->backpressure1 + p->backpressure2 +
p->flameDetection + p->fcuGZ_1L + p->fcuGZ_1H + p->fcuGZ_2L +
p->fcuGZ_2H + p->fcuGZ_3L + p->fcuGZ_3H + p->insPosRelayState +
p->insNegRelayState + p->powerNegRelayState + p->powerPosRelayState +
p->insBatLimit + p->powerBatLimit + p->insBatSoc + p->powerBatSoc +
p->insBatTotalElectricity + p->powerBatTotalElectricity +
p->insBatCurrentElectricity + p->powerBatCurrentElectricity +
p->insChargeState + p->powerChargeState + p->insLinkVoltage +
p->insPackVoltage + p->insCurrent + p->insPosInsulationResistance +
p->insNegInsulationResistance + p->powerLinkVoltage +
p->powerPackVoltage + p->powerCurrent + p->powerPosInsulationResistance +
p->powerNegInsulationResistance + p->insEmergencyStatusWord +
p->powerEmergencyStatusWord + p->insAlarmIdentificationWord +
p->powerAlarmIdentificationWord + p->insCurrentSocHold1 +
p->insCurrentSocHold2 + p->insCurrentSocHold3 + p->fcuCurrentToInsLimit1 +
p->fcuCurrentToinsLimit2 + p->powerCurrentSocHold1 +
p->powerCurrentSocHold2 + p->powerCurrentSocHold3 +
p->powerCurrentToInsLimit1 + p->powerCurrentToinsLimit2 +
p->placeholder2 + p->placeholder3 + p->placeholder5;
sum = calculateChecksum((unsigned char*)m, sizeof(msg_CcuStateFbMsg));
if (sum != p->checkCode) {
sError.push_back("CcuStat Msg Check error");
//return false; TODO: 暂时不校验
return false;
}
s = *p;
return true;
@@ -90,7 +75,7 @@ bool udpComm::getCcuSetParmFb(char *m, msg_CcuSetParmFbMsg &s)
return false;
}
sum = h.id + h.length + h.start1 + h.start2 + p->flag + p->failureCode;
sum = calculateChecksum((unsigned char*)m, sizeof(msg_CcuSetParmFbMsg));
if (sum!= p->checkCode) {
sError.push_back("CcuSetParm Msg Check error");
+3
View File
@@ -14,6 +14,9 @@ public:
bool getCcuSetParmFb(char *m, msg_CcuSetParmFbMsg &s);
bool sendCcuColCmd(const msg_CcuColCmdMsg m);
bool sendCcuSetParmCmd(const msg_CcuSetParmMsg m);
Checksum calculateChecksum(const unsigned char* data, int size);
std::vector<std::string> sError;
private:
+2 -2
View File
@@ -33,11 +33,11 @@ for i in range(num_messages):
sock.sendto(message, (target_ip, target_port))
# 打印发送的信息和目标地址
print(f"Sent message to {target_ip}:{target_port}: {message}")
print(f"Sent message to {target_ip}:{target_port}")
# 等待一段时间
time.sleep(interval)
sock.sendto(valid_msg2, (target_ip, target_port))
# sock.sendto(valid_msg2, (target_ip, target_port))
time.sleep(interval)
# 关闭套接字
+129 -130
View File
@@ -5,83 +5,83 @@ class msg_CcuStateFbMsg:
self.start1 = 0x20
self.start2 = 0x20
self.id = 0x0051
self.length = 0x5A
self.currentWorkCondition = 0x01
self.length = 0x0000
self.currentWorkCondition = 0x00
self.fcuState = 0x01
self.fcuFaultLeve = 0x01
self.powerLimit = 0x01
self.totalPowerGeneration = 0x01
self.ch4o = 0x01
self.o2 = 0x01
self.fcuVoltage = 0x01
self.fcuCurrent = 0x01
self.o2Level = 0x01
self.placeholder1 = 0x01
self.exchangerTemperature = 0x01
self.fcuOutPower = 0x01
self.fcuOutIns = 0x01
self.fcuVoltageIns = 0x01
self.fcuVoltagePower = 0x01
self.fcuCurrentIns = 0x01
self.fcuCurrentPower = 0x01
self.h2Concentration1 = 0x01
self.h2Concentration2 = 0x01
self.o2Concentration1 = 0x01
self.o2Concentration2 = 0x01
self.ch4oConcentration1 = 0x01
self.ch4oConcentration2 = 0x01
self.backpressure1 = 0x01
self.backpressure2 = 0x01
self.flameDetection = 0x01
self.fcuGZ_1L = 0x01
self.fcuGZ_1H = 0x01
self.fcuGZ_2L = 0x01
self.fcuGZ_2H = 0x01
self.fcuGZ_3L = 0x01
self.fcuGZ_3H = 0x01
self.insPosRelayState = 0x01
self.insNegRelayState = 0x01
self.powerPosRelayState = 0x01
self.powerNegRelayState = 0x01
self.insBatLimit = 0x01
self.powerBatLimit = 0x01
self.insBatSoc = 0x01
self.powerBatSoc = 0x01
self.insBatTotalElectricity = 0x01
self.powerBatTotalElectricity = 0x01
self.insBatCurrentElectricity = 0x01
self.powerBatCurrentElectricity = 0x01
self.insChargeState = 0x01
self.powerChargeState = 0x01
self.insLinkVoltage = 0x01
self.insPackVoltage = 0x01
self.insCurrent = 0x01
self.insPosInsulationResistance = 0x01
self.insNegInsulationResistance = 0x01
self.powerLinkVoltage = 0x01
self.powerPackVoltage = 0x01
self.powerCurrent = 0x01
self.powerPosInsulationResistance = 0x01
self.powerNegInsulationResistance = 0x01
self.insEmergencyStatusWord = 0x01
self.powerEmergencyStatusWord = 0x01
self.insAlarmIdentificationWord = 0x01
self.powerAlarmIdentificationWord = 0x01
self.insCurrentSocHold1 = 0x01
self.insCurrentSocHold2 = 0x01
self.insCurrentSocHold3 = 0x01
self.fcuCurrentToInsLimit1 = 0x01
self.fcuCurrentToinsLimit2 = 0x01
self.powerCurrentSocHold1 = 0x01
self.powerCurrentSocHold2 = 0x01
self.powerCurrentSocHold3 = 0x01
self.powerCurrentToInsLimit1 = 0x01
self.powerCurrentToinsLimit2 = 0x01
self.placeholder2 = 0x01
self.placeholder3 = 0x01
self.placeholder4 = 0x01
self.placeholder5 = 0x01
self.checkCode = 0x01
self.fcuFaultLeve = 0x20
self.powerLimit = 0x00
self.totalPowerGeneration = 0x00
self.ch4o = 0x00
self.o2 = 0x00
self.fcuVoltage = 0x00
self.fcuCurrent = 0x00
self.o2Level = 0x00
self.placeholder1 = 0x00
self.exchangerTemperature = 0x00
self.fcuOutPower = 0x00
self.fcuOutIns = 0x00
self.fcuVoltageIns = 0x00
self.fcuVoltagePower = 0x00
self.fcuCurrentIns = 0x00
self.fcuCurrentPower = 0x00
self.h2Concentration1 = 0x00
self.h2Concentration2 = 0x00
self.o2Concentration1 = 0x00
self.o2Concentration2 = 0x00
self.ch4oConcentration1 = 0x00
self.ch4oConcentration2 = 0x00
self.backpressure1 = 0x00
self.backpressure2 = 0x00
self.flameDetection = 0x00
self.fcuGZ_1L = 0x00
self.fcuGZ_1H = 0x00
self.fcuGZ_2L = 0x00
self.fcuGZ_2H = 0x00
self.fcuGZ_3L = 0x00
self.fcuGZ_3H = 0x00
self.insPosRelayState = 0x00
self.insNegRelayState = 0x00
self.powerPosRelayState = 0x00
self.powerNegRelayState = 0x00
self.insBatLimit = 0x00
self.powerBatLimit = 0x00
self.insBatSoc = 0x00
self.powerBatSoc = 0x00
self.insBatTotalElectricity = 0x00
self.powerBatTotalElectricity = 0x00
self.insBatCurrentElectricity = 0x00
self.powerBatCurrentElectricity = 0x00
self.insChargeState = 0x00
self.powerChargeState = 0x00
self.insLinkVoltage = 0x00
self.insPackVoltage = 0x00
self.insCurrent = 0x00
self.insPosInsulationResistance = 0x00
self.insNegInsulationResistance = 0x00
self.powerLinkVoltage = 0x00
self.powerPackVoltage = 0x00
self.powerCurrent = 0x00
self.powerPosInsulationResistance = 0x00
self.powerNegInsulationResistance = 0x00
self.insEmergencyStatusWord = 0x00
self.powerEmergencyStatusWord = 0x00
self.insAlarmIdentificationWord = 0x00
self.powerAlarmIdentificationWord = 0x00
self.insCurrentSocHold1 = 0x00
self.insCurrentSocHold2 = 0x00
self.insCurrentSocHold3 = 0x00
self.fcuCurrentToInsLimit1 = 0x00
self.fcuCurrentToinsLimit2 = 0x00
self.powerCurrentSocHold1 = 0x00
self.powerCurrentSocHold2 = 0x00
self.powerCurrentSocHold3 = 0x00
self.powerCurrentToInsLimit1 = 0x00
self.powerCurrentToinsLimit2 = 0x00
self.placeholder2 = 0x00
self.placeholder3 = 0x00
self.placeholder4 = 0x00
self.placeholder5 = 0x00
self.checkCode = 0x00
@@ -89,27 +89,7 @@ class msg_CcuStateFbMsg:
def pack(self):
# 初始化数据
self.length = 0x0000
self.checkCode = self.start1 + self.start2 + self.id + self.length
+ self.currentWorkCondition + self.fcuState + self.fcuFaultLeve
+ self.powerLimit + self.totalPowerGeneration + self.ch4o + self.o2
+ self.fcuVoltage + self.fcuCurrent + self.o2Level + self.placeholder1
+ self.exchangerTemperature + self.fcuOutPower + self.fcuOutIns + self.fcuVoltageIns
+ self.fcuVoltagePower + self.fcuCurrentIns + self.fcuCurrentPower + self.h2Concentration1
+ self.h2Concentration2 + self.o2Concentration1 + self.o2Concentration2 + self.ch4oConcentration1
+ self.ch4oConcentration2 + self.backpressure1 + self.backpressure2 + self.flameDetection + self.fcuGZ_1L
+ self.fcuGZ_1H + self.fcuGZ_2L + self.fcuGZ_2H + self.fcuGZ_3L + self.fcuGZ_3H + self.insPosRelayState
+ self.insNegRelayState + self.powerPosRelayState + self.powerNegRelayState + self.insBatLimit
+ self.powerBatLimit + self.insBatSoc + self.powerBatSoc + self.insBatTotalElectricity
+ self.powerBatTotalElectricity + self.insBatCurrentElectricity + self.powerBatCurrentElectricity
+ self.insChargeState + self.powerChargeState + self.insLinkVoltage + self.insPackVoltage
+ self.insCurrent + self.insPosInsulationResistance + self.insNegInsulationResistance
+ self.powerLinkVoltage + self.powerPackVoltage + self.powerCurrent + self.powerPosInsulationResistance
+ self.powerNegInsulationResistance + self.insEmergencyStatusWord + self.powerEmergencyStatusWord
+ self.insAlarmIdentificationWord + self.powerAlarmIdentificationWord + self.insCurrentSocHold1 + self.insCurrentSocHold2
+ self.insCurrentSocHold3 + self.fcuCurrentToInsLimit1 + self.fcuCurrentToinsLimit2 + self.powerCurrentSocHold1
+ self.powerCurrentSocHold2 + self.powerCurrentSocHold3 + self.powerCurrentToInsLimit1 + self.powerCurrentToinsLimit2
+ self.placeholder2 + self.placeholder3 + self.placeholder4 + self.placeholder5
self.checkCode = 0x0000
data = struct.pack('<B', self.start1)
data += struct.pack('<B', self.start2)
@@ -120,29 +100,29 @@ class msg_CcuStateFbMsg:
data += struct.pack('<B', self.currentWorkCondition)
data += struct.pack('<B', self.fcuState)
data += struct.pack('<B', self.fcuFaultLeve)
data += struct.pack('<I', self.powerLimit)
data += struct.pack('<I', self.totalPowerGeneration)
data += struct.pack('<I', self.ch4o)
data += struct.pack('<I', self.o2)
data += struct.pack('<I', self.fcuVoltage)
data += struct.pack('<I', self.fcuCurrent)
data += struct.pack('<I', self.o2Level)
data += struct.pack('<I', self.placeholder1)
data += struct.pack('<I', self.exchangerTemperature)
data += struct.pack('<I', self.fcuOutPower)
data += struct.pack('<I', self.fcuOutIns)
data += struct.pack('<I', self.fcuVoltageIns)
data += struct.pack('<I', self.fcuVoltagePower)
data += struct.pack('<I', self.fcuCurrentIns)
data += struct.pack('<I', self.fcuCurrentPower)
data += struct.pack('<I', self.h2Concentration1)
data += struct.pack('<I', self.h2Concentration2)
data += struct.pack('<I', self.o2Concentration1)
data += struct.pack('<I', self.o2Concentration2)
data += struct.pack('<I', self.ch4oConcentration1)
data += struct.pack('<I', self.ch4oConcentration2)
data += struct.pack('<I', self.backpressure1)
data += struct.pack('<I', self.backpressure2)
data += struct.pack('<f', self.powerLimit)
data += struct.pack('<f', self.totalPowerGeneration)
data += struct.pack('<f', self.ch4o)
data += struct.pack('<f', self.o2)
data += struct.pack('<f', self.fcuVoltage)
data += struct.pack('<f', self.fcuCurrent)
data += struct.pack('<f', self.o2Level)
data += struct.pack('<f', self.placeholder1)
data += struct.pack('<f', self.exchangerTemperature)
data += struct.pack('<f', self.fcuOutPower)
data += struct.pack('<f', self.fcuOutIns)
data += struct.pack('<f', self.fcuVoltageIns)
data += struct.pack('<f', self.fcuVoltagePower)
data += struct.pack('<f', self.fcuCurrentIns)
data += struct.pack('<f', self.fcuCurrentPower)
data += struct.pack('<f', self.h2Concentration1)
data += struct.pack('<f', self.h2Concentration2)
data += struct.pack('<f', self.o2Concentration1)
data += struct.pack('<f', self.o2Concentration2)
data += struct.pack('<f', self.ch4oConcentration1)
data += struct.pack('<f', self.ch4oConcentration2)
data += struct.pack('<f', self.backpressure1)
data += struct.pack('<f', self.backpressure2)
data += struct.pack('<B', self.flameDetection)
data += struct.pack('<B', self.fcuGZ_1L)
data += struct.pack('<B', self.fcuGZ_1H)
@@ -188,14 +168,26 @@ class msg_CcuStateFbMsg:
data += struct.pack('<B', self.powerCurrentSocHold3)
data += struct.pack('<B', self.powerCurrentToInsLimit1)
data += struct.pack('<B', self.powerCurrentToinsLimit2)
data += struct.pack('<I', self.placeholder2)
data += struct.pack('<I', self.placeholder3)
data += struct.pack('<I', self.placeholder4)
data += struct.pack('<I', self.placeholder5)
data += struct.pack('<H', self.checkCode)
data += struct.pack('<f', self.placeholder2)
data += struct.pack('<f', self.placeholder3)
data += struct.pack('<f', self.placeholder4)
data += struct.pack('<f', self.placeholder5)
for i in range(len(data)):
self.checkCode += data[i]
print(self.checkCode)
data += struct.pack('<I', self.checkCode)
last_index = len(data)
print(struct.unpack('<i',data[last_index-4:last_index]))
print(len(data))
return data
import struct
class msg_CcuSetParamFbMsg:
def __init__(self):
@@ -209,8 +201,8 @@ class msg_CcuSetParamFbMsg:
def pack(self):
# 初始化数据
self.checkCode = self.start1 + self.start2 + self.id + self.length + self.flag + self.failvreCode
# self.checkCode = self.start1 + self.start2 + self.id + self.length + self.flag + self.failvreCode
self.checkCode = 0x0000
data = struct.pack('<B', self.start1)
data += struct.pack('<B', self.start2)
data += struct.pack('<H', self.id)
@@ -220,5 +212,12 @@ class msg_CcuSetParamFbMsg:
data += struct.pack('<B', self.flag)
data += struct.pack('<B', self.failvreCode)
# 其他参数...
data += struct.pack('<H', self.checkCode)
return data
for i in range(len(data)):
self.checkCode += data[i]
data += struct.pack('<I', self.checkCode)
return data
if __name__ == "__main__":
msg = msg_CcuStateFbMsg()
msg.pack()