Commit 45b3a25c authored by captainwong's avatar captainwong

com

parent 4be54893
......@@ -132,6 +132,7 @@
|1737|我是网线主机|I_AM_WIRE_MACHINE|
|1747|我是WiFi主机|I_AM_WIFI_MACHINE|
|1757|我是三区段主机|I_AM_3_SECTION_MACHINE|
|1767|我是物联卡主机|I_AM_IOT_MACHINE|
|1709|手机用户SOS|SOS|
|1711|手机用户消警|PHONE_USER_CANCLE_ALARM|
|1712|主机进入设置状态|ENTER_SETTING_MODE|
......
# 串口透传协议
## 发给主机
|数据|长度|含义|说明|
|---|----|----|----|
|EB AB 3F **A0** 75|5|索要主机状态|
|EB AB 3F **A1** 76|5|索要防区|第一次索要时发送|
|EB AB 3F **A2** 77|5|索要防区|在主机回应“还有更多防区”时发送此命令继续索要|
|EB CB 3F 09 **A3** *P1* *P2* *P3* SUM|9|修改防区|*P1*:防区号,*P2*:防区属性,*P3*:操作码:0删除,1学码,2结束学码,3修改属性|
|EB AB 3F **A5** 7A|5|索要定时器|
|EB CB 3F 0E **A7** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|13|设置定时器|第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*|
|EB CB 3F 08 **A9** *DH DL* SUM|8|测试地址|*DH*:测试地址高位,*DL*:测试地址低位|
|EB CB 3F 08 **AA** *P1 P2* SUM|8|修改防区探头遗失/失联|*P1*:防区号;*P2*: 0失联关,1失联开|
|EB AB 3F **AC** 81|5|索要防区探头遗失/失联|第一次索要时发送|
|EB AB 3F **AD** 82|5|索要防区探头遗失/失联|在主机回应“还有更多数据”时发送此命令继续索要|
|EB CB 3F 08 **AE** *P1 P2* SUM|8|三区段主机布撤防|*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防,1撤防|
|EB CB 3F 06 **B0** AB|5|索要三区段主机状态||
## 主机回应
|数据|长度|含义|说明|
|---|----|----|----|
|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 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 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* **A9** SUM|7|测试地址回应、激活|*P0*:语音|
|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 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 07 P0 A8 SUM|7|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令|
......@@ -29,6 +29,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bench_client", "bench_clien
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen_event_md", "gen_event_md\gen_event_md.vcxproj", "{FED919A9-19E0-4D4A-972F-DDF537F5DEFE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "include", "include", "{332EE094-40C5-4E48-AD90-286EA3ACDD81}"
ProjectSection(SolutionItems) = preProject
..\include\ademco_detail.h = ..\include\ademco_detail.h
..\include\ademco_event.h = ..\include\ademco_event.h
..\include\ademco_packet.h = ..\include\ademco_packet.h
..\include\hb_detail.h = ..\include\hb_detail.h
..\include\hb_helper.h = ..\include\hb_helper.h
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......
......@@ -70,7 +70,7 @@ ADEMCO_EVENT privateEvents[] = {
EVENT_SUB_MACHINE_POWER_EXCEPTION,
EVENT_SUB_MACHINE_POWER_RESUME,
EVENT_RETRIEVE_ZONE_OR_SUB_MACHINE,
EVENT_COM_PASSTHROUGH,
EVENT_ENTER_SET_MODE,
EVENT_STOP_RETRIEVE,
......@@ -83,6 +83,7 @@ ADEMCO_EVENT privateEvents[] = {
EVENT_I_AM_WIRE_MACHINE,
EVENT_I_AM_WIFI_MACHINE,
EVENT_I_AM_3_SECTION_MACHINE,
EVENT_I_AM_IOT_MACHINE,
EVENT_PHONE_USER_SOS,
EVENT_PHONE_USER_CANCLE_ALARM,
......
......@@ -3,6 +3,10 @@
#include "ademco_event.h"
#include <assert.h>
#include <string.h> // memset
#include <ctype.h>
#include <time.h>
#include <vector>
#include <string>
#if defined(DISABLE_JLIB_LOG2) && !defined(JLIB_DISABLE_LOG)
#define JLIB_DISABLE_LOG
......@@ -400,5 +404,4 @@ static std::string toString(const std::vector<char>& data, // 数据
}
} // namespace detail
} // namespace ademco
This diff is collapsed.
......@@ -2,6 +2,9 @@
#include "ademco_event.h"
#include "ademco_detail.h"
#include <vector>
#include <string>
#include <memory>
#include <iterator>
namespace ademco
......@@ -444,7 +447,7 @@ static std::string xdataToString(const XDataPtr& xdata, detail::ToStringOption o
}
// data
str += toString(xdata->data_, option, true, false);
str += detail::toString(xdata->data_, option, true, false);
str += "]";
......@@ -816,7 +819,7 @@ struct AdemcoPacket
memcpy(len_pos, len_.data_, len_.length);
}
std::string toString() {
std::string toString(detail::ToStringOption xdataToStringOpt = detail::ToStringOption::TRY_IS_ALNUM_FIRST) {
char buf[1024] = { 0 };
auto sz = make(buf, sizeof(buf));
buf[sz] = '\0';
......@@ -834,7 +837,7 @@ struct AdemcoPacket
memcpy(pos, &ademcoData_.data_[0], ademcoData_.size()); pos += ademcoData_.size();
if (xdata_) {
for (auto c : xdataToString(xdata_)) {
for (auto c : xdataToString(xdata_, xdataToStringOpt)) {
*pos++ = c;
}
}
......
This diff is collapsed.
#pragma once
#include "hb_detail.h"
namespace hb
{
//! 安定宝ID范围
static constexpr size_t MinAdemcoId = 1;
static constexpr size_t MaxAdemcoId = 999999; // 兼容性考虑,最大安定宝 ID 为 0x0F423F
static constexpr size_t AdemcoIdSentinel = MaxAdemcoId + 1;
static constexpr bool isValidAdemcoId(size_t ademcoId) { return MinAdemcoId <= ademcoId && ademcoId <= MaxAdemcoId; }
/******** 结合 hb 与 ademco ******/
//! 从事件码推出主机类型
static common::MachineType machineTypeFromAdemcoEvent(ademco::ADEMCO_EVENT e) {
switch (e) {
case ademco::EVENT_I_AM_NET_MODULE: return common::MachineType::NetMod;
case ademco::EVENT_I_AM_GPRS: return common::MachineType::Gprs;
case ademco::EVENT_I_AM_LCD_MACHINE: return common::MachineType::Lcd;
case ademco::EVENT_I_AM_WIRE_MACHINE: return common::MachineType::Wired;
case ademco::EVENT_I_AM_WIFI_MACHINE: return common::MachineType::WiFi;
case ademco::EVENT_I_AM_3_SECTION_MACHINE: return common::MachineType::ThreeSection;
default: return common::MachineType::InvalidMachineType;
}
}
//! 从主机类型推出事件码
static ademco::ADEMCO_EVENT ademcoEventFromMachineType(common::MachineType type)
{
switch (type) {
case common::MachineType::NetMod: return ademco::EVENT_I_AM_NET_MODULE;
case common::MachineType::Gprs: return ademco::EVENT_I_AM_GPRS;
case common::MachineType::Lcd: return ademco::EVENT_I_AM_LCD_MACHINE;
case common::MachineType::Wired: return ademco::EVENT_I_AM_WIRE_MACHINE;
case common::MachineType::WiFi: return ademco::EVENT_I_AM_WIFI_MACHINE;
case common::MachineType::ThreeSection: return ademco::EVENT_I_AM_3_SECTION_MACHINE;
default: return ademco::EVENT_INVALID_EVENT;
}
}
//! 从事件码推出主机状态
static common::MachineStatus machienStatusFromAdemcoEvent(ademco::ADEMCO_EVENT e)
{
switch (e) {
case ademco::EVENT_ARM: return common::MachineStatus::Arm;
case ademco::EVENT_DISARM: return common::MachineStatus::Disarm;
case ademco::EVENT_HALFARM:
case ademco::EVENT_HALFARM_1456:
return common::MachineStatus::HalfArm;
case ademco::EVENT_ENTER_SETTING_MODE:
case ademco::EVENT_ENTER_SET_MODE:
return common::MachineStatus::Setting;
default: return common::MachineStatus::InvalidMachineStatus;
}
}
//! 从主机状态推出事件码
static ademco::ADEMCO_EVENT ademcoEventFromMachineStatus(common::MachineStatus status)
{
switch (status) {
case common::MachineStatus::Arm: return ademco::EVENT_ARM;
case common::MachineStatus::Disarm: return ademco::EVENT_DISARM;
case common::MachineStatus::HalfArm: return ademco::EVENT_HALFARM; // ademco::EVENT_HALFARM_1456
case common::MachineStatus::Setting: return ademco::EVENT_ENTER_SETTING_MODE; // ademco::EVENT_ENTER_SET_MODE
default: return ademco::EVENT_INVALID_EVENT;
}
}
//! 从防区属性推出防区应该触发什么警情事件码
static ademco::ADEMCO_EVENT ademcoEventFromZoneProperty(common::ZoneProperty zp)
{
switch (zp) {
case hb::common::BuglarGlobal: return ademco::EVENT_BURGLAR;
case hb::common::BuglarHalf: return ademco::EVENT_BURGLAR;
case hb::common::Emergency: return ademco::EVENT_EMERGENCY;
case hb::common::Fire: return ademco::EVENT_FIRE;
case hb::common::Duress: return ademco::EVENT_DURESS;
case hb::common::Gas: return ademco::EVENT_GAS;
case hb::common::Water: return ademco::EVENT_WATER;
case hb::common::DoorRing: return ademco::EVENT_DOORRINGING;
case hb::common::SubMachine:
case hb::common::RemoteControl:
case hb::common::Shield:
case hb::common::Reserved0B:
case hb::common::Reserved0C:
case hb::common::Reserved0D:
case hb::common::Reserved0E:
case hb::common::Bypass:
case hb::common::ZonePropertyCount:
case hb::common::InvalidZoneProperty:
default: return ademco::EVENT_INVALID_EVENT;
}
}
//! 从防区属性推出应该发送什么警情事件码
static ademco::ADEMCO_EVENT ademcoEventFromZonePropertyOld(old::ZoneProperty zp)
{
switch (zp) {
case hb::old::ZP_GLOBAL: return ademco::EVENT_BURGLAR;
case hb::old::ZP_HALF: return ademco::EVENT_HALFARM;
case hb::old::ZP_EMERGENCY: return ademco::EVENT_EMERGENCY;
case hb::old::ZP_DOORRING: return ademco::EVENT_DOORRINGING;
case hb::old::ZP_FIRE: return ademco::EVENT_FIRE;
case hb::old::ZP_DURESS: return ademco::EVENT_DURESS;
case hb::old::ZP_GAS: return ademco::EVENT_GAS;
case hb::old::ZP_WATER: return ademco::EVENT_WATER;
case hb::old::ZP_SHIELD:
default: return ademco::EVENT_INVALID_EVENT;
}
}
//! 获取主机防区数量的格式化字符串
static const char* getZoneFormatString(common::MachineType type)
{
auto zone = common::zoneMax(type);
if (zone < 10) { return "%d"; }
else if (zone < 100) { return "%02d"; }
else if (zone < 1000) { return "%03d"; }
else { return "%d"; }
}
//! 获取主机防区数量的格式化字符串
static const wchar_t* getZoneFormatStringW(common::MachineType type)
{
auto zone = common::zoneMax(type);
if (zone < 10) { return L"%d"; }
else if (zone < 100) { return L"%02d"; }
else if (zone < 1000) { return L"%03d"; }
else { return L"%d"; }
}
} // namespace hb
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