Commit 89614f16 authored by captainwong's avatar captainwong

Xdata convert

parent 1faef439
...@@ -63,6 +63,7 @@ struct Session { ...@@ -63,6 +63,7 @@ struct Session {
int fd = 0; int fd = 0;
int thread_id = 0; int thread_id = 0;
bufferevent* bev = nullptr; bufferevent* bev = nullptr;
event* timer = nullptr;
int id = 0; int id = 0;
std::string acct = {}; std::string acct = {};
size_t ademco_id = 0; size_t ademco_id = 0;
...@@ -174,6 +175,7 @@ void timer_cb(evutil_socket_t fd, short what, void* arg) ...@@ -174,6 +175,7 @@ void timer_cb(evutil_socket_t fd, short what, void* arg)
//bufferevent_free(bev); //bufferevent_free(bev);
//evutil_closesocket(fd); //evutil_closesocket(fd);
session->timer = nullptr;
bufferevent_disable(session->bev, EV_WRITE); bufferevent_disable(session->bev, EV_WRITE);
// SHUT_WR // SHUT_WR
shutdown(session->fd, 1); shutdown(session->fd, 1);
...@@ -197,14 +199,14 @@ void eventcb(struct bufferevent* bev, short events, void* user_data) ...@@ -197,14 +199,14 @@ void eventcb(struct bufferevent* bev, short events, void* user_data)
session->lastTimePacketSize = session->packet.make_null(buf, sizeof(buf), session->seq, session->acct, session->ademco_id); session->lastTimePacketSize = session->packet.make_null(buf, sizeof(buf), session->seq, session->acct, session->ademco_id);
evbuffer_add(bufferevent_get_output(bev), buf, session->lastTimePacketSize); evbuffer_add(bufferevent_get_output(bev), buf, session->lastTimePacketSize);
auto base = bufferevent_get_base(bev); auto base = bufferevent_get_base(bev);
auto timer = event_new(base, -1, EV_TIMEOUT, timer_cb, session); session->timer = event_new(base, -1, EV_TIMEOUT, timer_cb, session);
if (!timer) { if (!session->timer) {
fprintf(stderr, "create timer failed\n"); fprintf(stderr, "create timer failed\n");
event_base_loopbreak(base); event_base_loopbreak(base);
return; return;
} }
struct timeval tv = { timeout, 0 }; struct timeval tv = { timeout, 0 };
event_add(timer, &tv); event_add(session->timer, &tv);
if (++ctx->session_start < ctx->session_end) { if (++ctx->session_start < ctx->session_end) {
ctx->connectNext(); ctx->connectNext();
...@@ -246,6 +248,10 @@ void eventcb(struct bufferevent* bev, short events, void* user_data) ...@@ -246,6 +248,10 @@ void eventcb(struct bufferevent* bev, short events, void* user_data)
} }
} }
if (session->timer) {
event_del(session->timer);
session->timer = nullptr;
}
delete session; delete session;
bufferevent_free(bev); bufferevent_free(bev);
//event_base_loopbreak(bufferevent_get_base(bev)); //event_base_loopbreak(bufferevent_get_base(bev));
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LocalDebuggerCommandArguments>192.168.1.166 12345 6 18000 150</LocalDebuggerCommandArguments> <LocalDebuggerCommandArguments>192.168.1.90 12345 6 1200 30</LocalDebuggerCommandArguments>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
......
...@@ -301,7 +301,7 @@ struct XData ...@@ -301,7 +301,7 @@ struct XData
enum class DataFormat { enum class DataFormat {
AS_IS, //! 原样打包 AS_IS, //! 原样打包
TO_ASCII, //! 一个字节的HEX值转换为两个ASCII字符,如 6 转为 00 06 TO_ASCII, //! 一个字节的HEX值转换为两个ASCII字符,如 6 转为 "06", '6' 转为 "36"
}; };
LengthFormat lengthFormat_ = LengthFormat::TWO_HEX; LengthFormat lengthFormat_ = LengthFormat::TWO_HEX;
...@@ -320,11 +320,52 @@ struct XData ...@@ -320,11 +320,52 @@ struct XData
size_t size() const { return data_.size(); } size_t size() const { return data_.size(); }
size_t rawSize() const { return rawData_.size(); } size_t rawSize() const { return rawData_.size(); }
bool valid() const {
if (data_.empty() || rawData_.empty()) { return false; }
size_t len = 0;
if (lengthFormat_ == LengthFormat::TWO_HEX) {
if (rawData_.size() < 4) { return false; }
len = (rawData_[1] << 8) | rawData_[2];
if (len != data_.size() || (data_.size() + 4 != rawData_.size())) { return false; }
} else {
if (rawData_.size() < 6) { return false; }
len = ademco::detail::HexCharArrayToDec(rawData_.data() + 1, 4);
if ((len != data_.size()) || (data_.size() + 6 != rawData_.size())) { return false; }
}
return true;
}
bool operator==(const XData& rhs) const { bool operator==(const XData& rhs) const {
return lengthFormat_ == rhs.lengthFormat_ return lengthFormat_ == rhs.lengthFormat_
&& data_ == rhs.data_; && data_ == rhs.data_;
} }
bool convert(LengthFormat lengthFormat = LengthFormat::TWO_HEX) {
if (!valid()) { return false; }
if (lengthFormat_ == lengthFormat) { return true; }
lengthFormat_ = lengthFormat;
if (lengthFormat_ == LengthFormat::TWO_HEX) {
std::vector<char> tmp(data_.size() / 2);
detail::ConvertHiLoAsciiToHexCharArray(&tmp[0], data_.data(), data_.size());
data_ = tmp;
rawData_.resize(data_.size() + 4);
rawData_[0] = '[';
rawData_[1] = (data_.size() >> 8) & 0xFF;
rawData_[2] = data_.size() & 0xFF;
memcpy(&rawData_[3], data_.data(), data_.size());
rawData_.back() = ']';
} else {
auto tmp = detail::toString(data_, detail::ToStringOption::ALL_CHAR_AS_HEX, false, false);
data_.clear();
std::copy(tmp.begin(), tmp.end(), std::back_inserter(data_));
rawData_.resize(data_.size() + 6);
rawData_[0] = '[';
detail::Dec2HexCharArray_4(data_.size(), &rawData_[1], false);
memcpy(&rawData_[5], data_.data(), data_.size());
rawData_.back() = ']';
}
return true;
}
}; };
typedef std::shared_ptr<XData> XDataPtr; typedef std::shared_ptr<XData> XDataPtr;
......
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