|
@@ -203,7 +203,7 @@ bool TCLCommand::ParseCommandFromString(std::string str, CommandParam &cmdParam)
|
|
{
|
|
{
|
|
ParseKeyValuePairs(cmdParam.name, name, _T("name"));
|
|
ParseKeyValuePairs(cmdParam.name, name, _T("name"));
|
|
ParseKeyValuePairs(cmdParam.head, head, _T("head"));
|
|
ParseKeyValuePairs(cmdParam.head, head, _T("head"));
|
|
- ParseKeyValuePairs(cmdParam.code, code, _T("cmd"));
|
|
|
|
|
|
+ ParseKeyValuePairs(cmdParam.cmd, code, _T("cmd"));
|
|
ParseKeyValuePairs(cmdParam.param, param, _T("param"));
|
|
ParseKeyValuePairs(cmdParam.param, param, _T("param"));
|
|
|
|
|
|
std::string value;
|
|
std::string value;
|
|
@@ -336,7 +336,7 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
|
|
nPacketLen = (byte)data[2] << 8 | (byte)data[3];
|
|
nPacketLen = (byte)data[2] << 8 | (byte)data[3];
|
|
if (data.size() < 255 && data[2] != 0) {
|
|
if (data.size() < 255 && data[2] != 0) {
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
- cmdPara._rtnError = utils::_dprintf(_T("返回数据长度异常"));
|
|
|
|
|
|
+ cmdPara._rtnError = utils::_dprintf(_T("返回数据长度异常"));
|
|
#elif _MSC_VER >= 1500
|
|
#elif _MSC_VER >= 1500
|
|
cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
|
|
cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
|
|
#endif
|
|
#endif
|
|
@@ -365,139 +365,58 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
|
|
}
|
|
}
|
|
#endif
|
|
#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
|
|
#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
|
|
#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
|
|
#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
|
|
#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
|
|
#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
|
|
#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
|
|
#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
|
|
#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
|
|
#endif
|
|
return false;
|
|
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) {
|
|
if (cmdPara.returnParam) {
|
|
// 返回的指令参数
|
|
// 返回的指令参数
|
|
std::string rtnParam = data.substr(nDataPos, cmdPara.param.size()/2);
|
|
std::string rtnParam = data.substr(nDataPos, cmdPara.param.size()/2);
|
|
rtnParam = utils::BytesToHexString((byte*)rtnParam.c_str(), rtnParam.size());
|
|
rtnParam = utils::BytesToHexString((byte*)rtnParam.c_str(), rtnParam.size());
|
|
if (_tcsicmp(cmdPara.param.c_str(), rtnParam.c_str()) != 0) {
|
|
if (_tcsicmp(cmdPara.param.c_str(), rtnParam.c_str()) != 0) {
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
#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
|
|
#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] 返回的指令参数错误, %s, %s"), __FUNCTION__, cmdPara.param.c_str(), rtnParam.c_str());
|
|
#endif
|
|
#endif
|
|
- return false;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
nDataPos += rtnParam.size()/2;// 指令参数码占一字节;
|
|
nDataPos += rtnParam.size()/2;// 指令参数码占一字节;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
|
|
cmdPara._rtnData = data.substr(nDataPos, nPacketLen - nDataPos - 2); //2 = crc;
|
|
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());
|
|
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 (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1])
|
|
{
|
|
{
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
#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
|
|
#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("[%s] CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
|
|
#endif
|
|
#endif
|
|
- return false;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
if (data.size() > nPacketLen)
|
|
if (data.size() > nPacketLen)
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
#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
|
|
#elif _MSC_VER >= 1500
|
|
utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
|
|
utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
|
|
#endif
|
|
#endif
|
|
@@ -526,7 +445,7 @@ bool TCLCommand::TheSecondPartForFC(CommandParam& cmdPara, std::string data)
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
#if _MSC_VER >= 1200 && _MSC_VER < 1500
|
|
cmdPara._rtnError = utils::_dprintf("返回码错误:%02X", (byte)data[0]);
|
|
cmdPara._rtnError = utils::_dprintf("返回码错误:%02X", (byte)data[0]);
|
|
#elif _MSC_VER >= 1500
|
|
#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
|
|
#endif
|
|
return false;
|
|
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.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 )
|
|
if ( cmdPara.param.size()%2 == 0 )
|
|
command.append(utils::HexStringToBytes(cmdPara.param, 2).c_str(), cmdPara.param.size() / 2);
|
|
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;
|
|
break;
|
|
case CMDOPT_Get:
|
|
case CMDOPT_Get:
|
|
case CMDOPT_Set:
|
|
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;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|