Bladeren bron

删除关于FC单独处理的函数,可合并入之前的处理:cmd处理FC时,要再带一个字节,组成双字节的ucCommand就能符合协议规则。

JeffWang 2 jaren geleden
bovenliggende
commit
bc895bd4ef

+ 29 - 113
TCLCommand/TCLCommand/Command.cpp

@@ -203,7 +203,7 @@ bool TCLCommand::ParseCommandFromString(std::string str, CommandParam &cmdParam)
     {
         ParseKeyValuePairs(cmdParam.name, name, _T("name"));
         ParseKeyValuePairs(cmdParam.head, head, _T("head"));
-        ParseKeyValuePairs(cmdParam.code, code, _T("cmd"));
+        ParseKeyValuePairs(cmdParam.cmd, code, _T("cmd"));
         ParseKeyValuePairs(cmdParam.param, param, _T("param"));
 
         std::string value;
@@ -336,7 +336,7 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
             nPacketLen = (byte)data[2] << 8 | (byte)data[3];
             if (data.size() < 255 && data[2] != 0) {
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-				cmdPara._rtnError = utils::_dprintf(_T("返回数据长度异常"));
+                cmdPara._rtnError = utils::_dprintf(_T("返回数据长度异常"));
 #elif _MSC_VER >= 1500
                 cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
 #endif
@@ -365,139 +365,58 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
         }
 #endif
 
-        if (_tcsicmp(cmdPara.code.c_str(), utils::ByteToChars((byte)data[nDataPos] - 1).c_str()) != 0) {
-#if _MSC_VER >= 1200 && _MSC_VER < 1500
-			cmdPara._rtnError = utils::_dprintf(_T("返回的指令码错误, 正确:%02X, 当前:%02X"), utils::TwoHexCharToInteger(cmdPara.code[0],cmdPara.code[1])+1, (byte)data[nDataPos]);
-#elif _MSC_VER >= 1500
-            cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令码错误, 正确:%02X, 当前:%02X"), __FUNCTION__, utils::TwoHexCharToInteger(cmdPara.code[0],cmdPara.code[1])+1, (byte)data[nDataPos]);
-#endif
-            return false;
-        }
-
-        // 返回的数据;
-        ++nDataPos;// 返回码占一字节;
-        if (cmdPara.returnParam) {
-            // 返回的指令参数
-            std::string rtnParam = data.substr(nDataPos, cmdPara.param.size()/2);
-            rtnParam = utils::BytesToHexString((byte*)rtnParam.c_str(), rtnParam.size());
-            if (_tcsicmp(cmdPara.param.c_str(), rtnParam.c_str()) != 0) {
+        if (cmdPara.cmd.size() > 2 ) {// 当cmd不是2个十六进制字符时(Moka协议);
+            if (_tcsicmp(cmdPara.cmd.substr(0,2).c_str(), utils::ByteToChars((byte)data[nDataPos]).c_str()) != 0) {
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-				cmdPara._rtnError = utils::_dprintf(_T("返回的指令参数错误, %s, %s"), cmdPara.param.c_str(), rtnParam.c_str());
+				cmdPara._rtnError = utils::_dprintf(_T("返回的指令码错误, 正确:%02X, 当前:%02X"), utils::TwoHexCharToInteger(cmdPara.code[0], cmdPara.code[1]) + 1, (byte)data[nDataPos]);
 #elif _MSC_VER >= 1500
-                cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令参数错误, %s, %s"), __FUNCTION__, cmdPara.param.c_str(), rtnParam.c_str());
+				cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令码错误, 正确:%02X, 当前:%02X"), __FUNCTION__, utils::TwoHexCharToInteger(cmdPara.cmd[0], cmdPara.cmd[1]) + 1, (byte)data[nDataPos]);
 #endif
-				return false;
+                return false;
             }
 
-            nDataPos += rtnParam.size()/2;// 指令参数码占一字节;
-        }
-
-        cmdPara._rtnData = data.substr(nDataPos, nPacketLen - nDataPos - 2); //2 = crc;
-        utils::_dprintf(_T("rtnData=%s"), utils::BytesToHexString((byte*)cmdPara._rtnData.c_str(), cmdPara._rtnData.size(), ' ').c_str());
-
-        // 校验crc;
-        unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
-        if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1])
-        {
+			if (_tcsicmp(cmdPara.cmd.substr(2, 4).c_str(), utils::ByteToChars((byte)data[nDataPos + 1] - 1).c_str()) != 0) {
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-			cmdPara._rtnError = utils::_dprintf("CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
+				cmdPara._rtnError = utils::_dprintf(_T("返回的指令码错误, 正确:%02X, 当前:%02X"), utils::TwoHexCharToInteger(cmdPara.code[0], cmdPara.code[1]) + 1, (byte)data[nDataPos]);
 #elif _MSC_VER >= 1500
-            cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
+				cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令码错误, 正确:%02X, 当前:%02X"), __FUNCTION__, utils::TwoHexCharToInteger(cmdPara.cmd[0], cmdPara.cmd[1]) + 1, (byte)data[nDataPos]);
 #endif
-			return false;
-        }
-
-        if (data.size() > nPacketLen)
-#if _MSC_VER >= 1200 && _MSC_VER < 1500
-			utils::_dprintf(_T("带有脏数据:%s"), data.substr(nPacketLen));
-#elif _MSC_VER >= 1500
-            utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
-#endif
-    }
-    else 
-    {
-#if _MSC_VER >= 1200 && _MSC_VER < 1500
-        cmdPara._rtnError = utils::_dprintf("返回码错误:%02X", (byte)data[0]);
-#elif _MSC_VER >= 1500
-		cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
-#endif
-        return false;
-    }
-
-    return true;
-}
+                return false;
+			}
 
-bool TCLCommand::TheSecondPartForFC(CommandParam& cmdPara, std::string data)
-{
-    // 数据起始位;
-    int nDataPos = 0;
-    // 数据包长度;
-    int nPacketLen = 0;
-    if ((byte)data[0] == cmdPara._rtnCode) {
-        // 获取长度;
-        if ((byte)data[1] == 0xFE) {
-            nDataPos = 4;
-            nPacketLen = (byte)data[2] << 8 | (byte)data[3];
-            if (data.size() < 255 && data[2] != 0) {
+            nDataPos += 2;
+        }
+        else 
+        { 
+            // 当cmd只有2个十六进制字符时;            
+            if (_tcsicmp(cmdPara.cmd.c_str(), utils::ByteToChars((byte)data[nDataPos] - 1).c_str()) != 0) {
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-                cmdPara._rtnError = utils::_dprintf(_T("返回数据长度异常"));
+                cmdPara._rtnError = utils::_dprintf(_T("返回的指令码错误, 正确:%02X, 当前:%02X"), utils::TwoHexCharToInteger(cmdPara.code[0], cmdPara.code[1]) + 1, (byte)data[nDataPos]);
 #elif _MSC_VER >= 1500
-                cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
+                cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令码错误, 正确:%02X, 当前:%02X"), __FUNCTION__, utils::TwoHexCharToInteger(cmdPara.cmd[0], cmdPara.cmd[1]) + 1, (byte)data[nDataPos]);
 #endif
                 return false;
             }
-        }
-        else
-        {
-            nDataPos = 2;
-            nPacketLen = (byte)data[1];
-#if 0 // 如果数据包含有非协议包内的数据,会判断异常;
-            if (data.size() > 255) {
-                //nPackageLen = data[1] << 8 | data[2];
-                cmdPara._rtnError = _dprintf(_T("长度异常"));
-                return false;
-            }
-#endif
-        }
 
-#if 1
-        // 计算出的长度,必等于包长;// 如果包含有其他非包数据,会判断异常;
-        if (nPacketLen > data.size())
-        {
-            cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的数据长度错误, 计算:%d > 实际:%d"), __FUNCTION__, nPacketLen, data.size());
-            return false;
-        }
-#endif
-
-        // FireTV的Code是与Write时一样;
-        if (_tcsicmp(cmdPara.code.c_str(), utils::ByteToChars((byte)data[nDataPos]).c_str()) != 0) {
-#if _MSC_VER >= 1200 && _MSC_VER < 1500
-            cmdPara._rtnError = utils::_dprintf(_T("返回的指令码错误, 正确:%02X, 当前:%02X"), utils::TwoHexCharToInteger(cmdPara.code[0],cmdPara.code[1]), (byte)data[nDataPos]);
-#elif _MSC_VER >= 1500
-            cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令码错误, 正确:%02X, 当前:%02X"), __FUNCTION__, utils::TwoHexCharToInteger(cmdPara.code[0],cmdPara.code[1]), (byte)data[nDataPos]);
-#endif
-            return false;
+            ++nDataPos;
         }
 
         // 返回的数据;
-        ++nDataPos;// code返回码占一字节;
-#if 0 // FireTV的返回的指令参数与code没有规律对应;returnParam要外部根据协议来判断;
         if (cmdPara.returnParam) {
             // 返回的指令参数
             std::string rtnParam = data.substr(nDataPos, cmdPara.param.size()/2);
             rtnParam = utils::BytesToHexString((byte*)rtnParam.c_str(), rtnParam.size());
             if (_tcsicmp(cmdPara.param.c_str(), rtnParam.c_str()) != 0) {
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-                cmdPara._rtnError = utils::_dprintf(_T("返回的指令参数错误, %s, %s"), cmdPara.param.c_str(), rtnParam.c_str());
+				cmdPara._rtnError = utils::_dprintf(_T("返回的指令参数错误, %s, %s"), cmdPara.param.c_str(), rtnParam.c_str());
 #elif _MSC_VER >= 1500
                 cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令参数错误, %s, %s"), __FUNCTION__, cmdPara.param.c_str(), rtnParam.c_str());
 #endif
-                return false;
+				return false;
             }
 
             nDataPos += rtnParam.size()/2;// 指令参数码占一字节;
         }
-#endif
 
         cmdPara._rtnData = data.substr(nDataPos, nPacketLen - nDataPos - 2); //2 = crc;
         utils::_dprintf(_T("rtnData=%s"), utils::BytesToHexString((byte*)cmdPara._rtnData.c_str(), cmdPara._rtnData.size(), ' ').c_str());
@@ -507,16 +426,16 @@ bool TCLCommand::TheSecondPartForFC(CommandParam& cmdPara, std::string data)
         if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1])
         {
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-            cmdPara._rtnError = utils::_dprintf("CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
+			cmdPara._rtnError = utils::_dprintf("CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
 #elif _MSC_VER >= 1500
             cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
 #endif
-            return false;
+			return false;
         }
 
         if (data.size() > nPacketLen)
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
-            utils::_dprintf(_T("带有脏数据:%s"), data.substr(nPacketLen));
+			utils::_dprintf(_T("带有脏数据:%s"), data.substr(nPacketLen));
 #elif _MSC_VER >= 1500
             utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
 #endif
@@ -526,7 +445,7 @@ bool TCLCommand::TheSecondPartForFC(CommandParam& cmdPara, std::string data)
 #if _MSC_VER >= 1200 && _MSC_VER < 1500
         cmdPara._rtnError = utils::_dprintf("返回码错误:%02X", (byte)data[0]);
 #elif _MSC_VER >= 1500
-        cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
+		cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
 #endif
         return false;
     }
@@ -541,7 +460,7 @@ void TCLCommand::PackingCommand(CommandParam& cmdPara, LPCVOID data, const int&
     // 命令头标识位;
     command.append(utils::HexStringToBytes(cmdPara.head, 2).c_str(), cmdPara.head.size() / 2);
     // 命令码;
-    command.append(utils::HexStringToBytes(cmdPara.code, 2).c_str(), cmdPara.code.size() / 2);
+    command.append(utils::HexStringToBytes(cmdPara.cmd, 2).c_str(), cmdPara.cmd.size() / 2);
     // 命令码参数;
     if ( cmdPara.param.size()%2 == 0 )
         command.append(utils::HexStringToBytes(cmdPara.param, 2).c_str(), cmdPara.param.size() / 2);
@@ -616,10 +535,7 @@ bool TCLCommand::ParseResultString(CommandParam& cmdPara, std::string data, cons
         break;
     case CMDOPT_Get:
     case CMDOPT_Set:
-        if ( _tcsicmp(cmdPara.code.c_str(), _T("FC")) )
-            return TheSecondPart(cmdPara, data.substr(5));
-        else
-            return TheSecondPartForFC(cmdPara, data.substr(5));
+        return TheSecondPart(cmdPara, data.substr(5));
         break;
     default:
         break;

+ 0 - 1
TCLCommand/TCLCommand/Command.h

@@ -22,7 +22,6 @@ private:
 
     bool TheFirstPart(CommandParam& cmdPara, std::string data);
     bool TheSecondPart(CommandParam& cmdPara, std::string data);
-    bool TheSecondPartForFC(CommandParam& cmdPara, std::string data);
     bool ParseResultString(CommandParam& cmdPara, std::string data, const int& dataLen);
 public:
     void SetInternalCMDParams(DWORD dwResouceID);

+ 2 - 2
TCLCommand/TCLCommand/CommandParam.h

@@ -9,7 +9,7 @@ enum CMDOPT {
 typedef struct __CMDPARAM__ {
     std::string name;        // 命令描述;
     std::string head;        // 命令头;
-    std::string code;        // 命令码;
+    std::string cmd;         // 命令码;
     std::string param;       // 命令码参数;
     // 命令属性类型:
     // 0=None,只返回一段数据包;
@@ -42,7 +42,7 @@ typedef struct __CMDPARAM__ {
         if (this != &cls) {
             name = cls.name;
             head = cls.head;
-            code = cls.code;
+            cmd = cls.cmd;
             param = cls.param;
             nOption = cls.nOption;
             returnParam = cls.returnParam;

+ 8 - 0
TCLCommand/TCLCommand/utils.h

@@ -1,4 +1,12 @@
 #pragma once
+
+
+#ifdef _UNICODE
+typedef std::wstring TString;
+#else
+typedef std::string TString;
+#endif
+
 namespace utils
 {
     std::string& trim(std::string& str);