Commit cedb229f authored by captainwong's avatar captainwong

update

parent f9a6118f
...@@ -22,14 +22,14 @@ ...@@ -22,14 +22,14 @@
|数据|长度|含义|说明| |数据|长度|含义|说明|
|---|----|----|----| |---|----|----|----|
|EB BA 3F 07 *P0* **A0** *P1 P2 P3* SUM|10|主机状态回应|*P0*:语音;*P1*:0布防,1半布防,2撤防,3设置;*P2:主机类型| |EB BA 3F 07 *P0* **A0** *P1 P2 P3* SUM|10|主机状态回应|*P0*:语音;*P1*:0布防,1半布防,2撤防,3设置;*P2:主机类型|
|EB BA 3F *PN* *P0* **A2** *[Z, P]xN P1* SUM|变长|主机防区数据回应|*PN*:N表示本条数据内包含多少防区,最大20<br/> *P0*:语音;Z:防区号;P:防区属性;*P1*:FF表示没有更多数据了,其他表示还有更多数据| |EB BA 3F *PN* *P0* **A2** *[Z, P]x(N-8)/2 P1* SUM|变长|主机防区数据回应|*PN*:表示本条数据内包含多少个字节,最大20,防区/属性字节对的数量为 (N-8)/2<br/> *P0*:语音;Z:防区号;P:防区属性;*P1*:FF表示没有更多数据了,其他表示还有更多数据|
|EB BA 3F 07 *P0* **A3** SUM|7|学码开始回应|*P0*:语音。因为学码时主机要等待外部无线信号(用户触发探测器),<br/> 因此先回应A3表示已经开始学码,学码成功时再回 A4| |EB BA 3F 07 *P0* **A3** SUM|7|学码开始回应|*P0*:语音。因为学码时主机要等待外部无线信号(用户触发探测器),<br/> 因此先回应A3表示已经开始学码,学码成功时再回 A4|
|EB BA 3F 0A *P0* **A4** *P1 P2 P3* SUM|10|修改防区回应|*P0*:语音;*P1*:防区号;*P2*:防区属性;*P3*:0失败,1成功,2失败-重码,3失败-空防区| |EB BA 3F 0A *P0* **A4** *P1 P2 P3* SUM|10|修改防区回应|*P0*:语音;*P1*:防区号;*P2*:防区属性;*P3*:0失败,1成功,2失败-重码,3失败-空防区|
|EB BA 3F 0F *P0* **A6** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|14|定时器回应|*P0*:语音;第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*| |EB BA 3F 0F *P0* **A6** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|14|定时器回应|*P0*:语音;第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*|
|EB BA 3F 07 *P0* **A7** SUM|7|修改定时器回应|*P0*:语音| |EB BA 3F 07 *P0* **A7** SUM|7|修改定时器回应|*P0*:语音|
|EB BA 3F 07 *P0* **A9** SUM|7|测试地址回应、激活|*P0*:语音| |EB BA 3F 07 *P0* **A9** SUM|7|测试地址回应、激活|*P0*:语音|
|EB BA 3F 09 *P0* **AB** *P1 P2* SUM|9|修改防区探头遗失/失联回应|*P0*:语音;*P1*:防区号;*P2*:0失联关,1失联开,2拒绝设置| |EB BA 3F 09 *P0* **AB** *P1 P2* SUM|9|修改防区探头遗失/失联回应|*P0*:语音;*P1*:防区号;*P2*:0失联关,1失联开,2拒绝设置|
|EB BA 3F *PN* *P0* **AD** *P1 DATA P2* SUM|变长|索要防区探头遗失/失联回应|回应所有失联开的防区。<br/> *PN*失联开防区数量*P0*:语音;<br/> *P1*:F0指示DATA以1个字节表示防区号,F1表示DATA以2个字节表示防区号;<br/> *DATA*:所有失联开的防区;<br/> *P2*:FF表示传输结束,其他表示还有更多数据| |EB BA 3F *PN* *P0* **AD** *P1 DATA P2* SUM|变长|索要防区探头遗失/失联回应|回应所有失联开的防区。<br/> *PN*本条数据包含多少字节*P0*:语音;<br/> *P1*:F0指示DATA以1个字节表示防区号,F1表示DATA以2个字节表示防区号;<br/> *DATA*:所有失联开的防区;<br/> *P2*:FF表示传输结束,其他表示还有更多数据|
|EB BA 3F 08 *P0* **AF** *P1 P2* SUM|9|三区段主机布撤防回应|*P0*:语音;*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防成功,1撤防成功| |EB BA 3F 08 *P0* **AF** *P1 P2* SUM|9|三区段主机布撤防回应|*P0*:语音;*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防成功,1撤防成功|
|EB BA 3F 08 *P0* **B1** *P1* SUM|8|三区段主机索要状态回应|*P0*:语音;<br/> *P1*:8位,7/6位主机状态,5/4位区段1状态,3/2位区段2状态,1/0位区段3状态<br/> 值为0布防,1撤防| |EB BA 3F 08 *P0* **B1** *P1* SUM|8|三区段主机索要状态回应|*P0*:语音;<br/> *P1*:8位,7/6位主机状态,5/4位区段1状态,3/2位区段2状态,1/0位区段3状态<br/> 值为0布防,1撤防|
|EB BA 3F 07 P0 A8 SUM|7|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令| |EB BA 3F 07 P0 A8 SUM|7|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令|
......
...@@ -125,6 +125,7 @@ ...@@ -125,6 +125,7 @@
<PreprocessorDefinitions>_DEBUG;_CONSOLE;ENABLE_BREAKPAD;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;ENABLE_BREAKPAD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)..\include;$(DEVLIBS)\libevent-2.1.12-stable-install-x64\include;$(DEVLIBS)\google\breakpad\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir)..\include;$(DEVLIBS)\libevent-2.1.12-stable-install-x64\include;$(DEVLIBS)\google\breakpad\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
......
...@@ -427,10 +427,10 @@ struct MachineStatusResponse3Section { ...@@ -427,10 +427,10 @@ struct MachineStatusResponse3Section {
struct Cmd { struct Cmd {
Char head[6]; Char head[6];
// 0 撤防,1 布防 // 0 撤防,1 布防
Char status : 2; Char status3 : 2;
Char status1 : 2;
Char status2 : 2; Char status2 : 2;
Char status3 : 2; Char status1 : 2;
Char status : 2;
Char sum; Char sum;
}; };
...@@ -497,7 +497,7 @@ struct ZoneResponse { ...@@ -497,7 +497,7 @@ struct ZoneResponse {
} }
/* /*
* @brief add zone to data and (if this packet isOver) calc sum * @brief maker, add zone to data and (if this packet isOver) calc sum
* @note first time zone&prop will be placed in 6&7, then second zone&prop will be in 8&9, and so on * @note first time zone&prop will be placed in 6&7, then second zone&prop will be in 8&9, and so on
* @note but the max number of zone&prop you can add is 20 * @note but the max number of zone&prop you can add is 20
* @note len is automatically added (with 2) everytime except for first time * @note len is automatically added (with 2) everytime except for first time
...@@ -512,6 +512,27 @@ struct ZoneResponse { ...@@ -512,6 +512,27 @@ struct ZoneResponse {
if (isOver) { sum(this); } if (isOver) { sum(this); }
return *this; return *this;
} }
struct ZoneAndProperty {
Char zone = 0;
ZoneProperty prop = ZoneProperty::InvalidZoneProperty;
};
typedef std::vector<ZoneAndProperty> ZoneAndProperties;
//! parser, make sure to call ResponseParser::parse first and return is A2_response to check data valid, then copy data/len to member.
bool parse(ZoneAndProperties& zps, bool& hasMore) {
if (len < 8 || data[3] != len) { return false; } // check valid again
Char sum_ = data[len - 1]; sum(data, len); if (sum_ != data[len - 1]) { return false; } // check sum again
Char count = len - 8 / 2; // zone/prop pairs
if (count == 0) { zps.clear(); hasMore = false; return true; }
for (Char i = 0; i < count; i++) {
Char zone = data[5 + i * 2];
ZoneProperty prop = zonePropertyFromChar(data[6 + i * 2]);
if (prop != ZoneProperty::InvalidZoneProperty) { zps.emplace_back(ZoneAndProperty{ zone, prop }); }
}
hasMore = data[len - 2] == 0xFF;
return true;
}
}; };
typedef ZoneResponse A2R; typedef ZoneResponse A2R;
...@@ -716,7 +737,7 @@ struct RequestParser { ...@@ -716,7 +737,7 @@ struct RequestParser {
Invalid_request = -1, Invalid_request = -1,
}; };
static RequestType parse(const Char* data, size_t len) { static RequestType parse(const Char* data, Char len) {
do { do {
if (len < 5) { break; } if (len < 5) { break; }
if (data[0] != 0xEB) { break; } if (data[0] != 0xEB) { break; }
...@@ -813,47 +834,80 @@ struct ResponseParser { ...@@ -813,47 +834,80 @@ struct ResponseParser {
Invalid_response = -1, Invalid_response = -1,
}; };
static ResponseType parse(const char* data, size_t len) { static ResponseType parse(const Char* data, Char len) {
do { do {
if (len < 7) { break; } // 所有的 response ,长度最小为 7 if (len < 7) { break; } // 所有的 response ,长度最小为 7
if (data[0] != 0xEB || data[1] != 0xBA || data[2] != 0x3F) { break; } if (data[0] != 0xEB || data[1] != 0xBA || data[2] != 0x3F) { break; }
switch (data[4]) { switch (data[5]) {
case 0xA0: // EB BA 3F 07 P0 A0 P1 P2 P3 SUM
#define define_ResponseType_case(t) \ {
case 0x ## t: \ if (len != A0R::len) { break; }
{ \ A0R resp; memcpy(resp.data, data, len); sum(resp);
if (len != t ## R::len) { break; } \ if (resp.data[len - 1] != data[len - 1]) { break; }
t##R resp; memcpy(resp.data, data, len); sum(resp); \ return ResponseType::A0_response;
if (resp.data[len - 1] != data[len - 1]) { break; } \ }
return ResponseType:: ## t ## _response; \
} case 0xA2: // EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
{
if (len != 8 + data[3] * 2) { break; }
A2R resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::A2_response;
}
case 0xA3:
{
if (len != A3R::len) { break; }
A3R resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::A3_response;
}
case 0xA4:
{
if (len != A4R::len) { break; }
A4R resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::A4_response;
}
case 0xA6:
{
if (len != A6R::len) { break; }
A6R resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::A6_response;
}
//case 0xA0: // EB BA 3F 07 P0 A0 P1 P2 P3 SUM case 0xA7:
// { {
// if (len != A0R::len) { break; } if (len != A7R::len) { break; }
// A0R resp; memcpy(resp.data, data, len); sum(resp); A7R resp; memcpy(resp.data, data, len); sum(resp);
// if (resp.data[len - 1] != data[len - 1]) { break; } if (resp.data[len - 1] != data[len - 1]) { break; }
// return ResponseType::A0_response; return ResponseType::A7_response;
// } }
case 0xA8:
{
if (len != A8R::len) { break; }
A8R resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::A8_response;
}
define_ResponseType_case(A0) case 0xA9:
define_ResponseType_case(A3) {
define_ResponseType_case(A4) // TODO
define_ResponseType_case(A6) }
define_ResponseType_case(A7)
define_ResponseType_case(A8)
//define_case(A9) TODO
define_ResponseType_case(AB)
case 0xAB:
{
if (len != ABR::len) { break; }
ABR resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::AB_response;
}
case 0xA2: // EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
{
if (len != 8 + data[3] * 2) { break; }
A2R resp; memcpy(resp.data, data, len); sum(resp);
if (resp.data[len - 1] != data[len - 1]) { break; }
return ResponseType::A2_response;
}
case 0xAD: // EB BA 3F PN P0 AD P1 DATA P2 SUM case 0xAD: // EB BA 3F PN P0 AD P1 DATA P2 SUM
{ {
Char lenExpected = 0; Char lenExpected = 0;
...@@ -876,7 +930,7 @@ case 0x ## t: \ ...@@ -876,7 +930,7 @@ case 0x ## t: \
case 0xB1: // EB BA 3F 08 P0 B1 P1 SUM case 0xB1: // EB BA 3F 08 P0 B1 P1 SUM
{ {
if (len != A0R::len) { break; } if (len != B1R::len) { break; }
B1R resp; memcpy(resp.data.data, data, len); sum(resp.data.data, resp.len); B1R resp; memcpy(resp.data.data, data, len); sum(resp.data.data, resp.len);
if (resp.data.data[len - 1] != data[len - 1]) { break; } if (resp.data.data[len - 1] != data[len - 1]) { break; }
return ResponseType::B1_response; return ResponseType::B1_response;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment