Commit 8580363c authored by captainwong's avatar captainwong

update server_demo

parent e4c9168c
...@@ -9,23 +9,24 @@ ...@@ -9,23 +9,24 @@
#define socklen_t int #define socklen_t int
#define close closesocket #define close closesocket
#else // linux #else // linux
#include <unistd.h> #include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SOCKET int #define SOCKET int
#define INVALID_SOCKET -1 #define INVALID_SOCKET -1
#endif #endif
#define DISABLE_JLIB_LOG2 #define DISABLE_JLIB_LOG2
#include <string.h>
#include <mutex>
#include <thread> #include <thread>
#include <vector> #include <vector>
#include <mutex>
#include <string.h>
#include "../../ademco.h"
#include "../../ademco.h"
void op_usage() { void op_usage() {
printf("Press A for Arm, D for Disarm, E for Emergency, Q for Quit\n"); printf("Press A for Arm, D for Disarm, E for Emergency, Q for Quit\n");
...@@ -110,7 +111,9 @@ int main(int argc, char** argv) { ...@@ -110,7 +111,9 @@ int main(int argc, char** argv) {
printf("Listening on %s:%d\n", inet_ntoa(sAddrIn.sin_addr), ntohs(sAddrIn.sin_port)); printf("Listening on %s:%d\n", inet_ntoa(sAddrIn.sin_addr), ntohs(sAddrIn.sin_port));
auto do_accept = [&serverSock]() { auto do_accept = [&serverSock]() {
if (clientSock != INVALID_SOCKET) { return; } if (clientSock != INVALID_SOCKET) {
return;
}
struct sockaddr_in sForeignAddrIn; struct sockaddr_in sForeignAddrIn;
socklen_t nLength = sizeof(struct sockaddr_in); socklen_t nLength = sizeof(struct sockaddr_in);
...@@ -118,7 +121,7 @@ int main(int argc, char** argv) { ...@@ -118,7 +121,7 @@ int main(int argc, char** argv) {
fd_set rfd; fd_set rfd;
FD_ZERO(&rfd); FD_ZERO(&rfd);
FD_SET(serverSock, &rfd); FD_SET(serverSock, &rfd);
timeval timeout = { 1, 0 }; timeval timeout = {1, 0};
int nfds = select((int)(serverSock + 1), &rfd, (fd_set*)0, (fd_set*)0, &timeout); int nfds = select((int)(serverSock + 1), &rfd, (fd_set*)0, (fd_set*)0, &timeout);
printf("do_accept, select ret=%d\n", nfds); printf("do_accept, select ret=%d\n", nfds);
if (nfds > 0) { if (nfds > 0) {
...@@ -133,7 +136,8 @@ int main(int argc, char** argv) { ...@@ -133,7 +136,8 @@ int main(int argc, char** argv) {
}; };
auto do_handle = []() -> ademco_parse_result_t { auto do_handle = []() -> ademco_parse_result_t {
ademco_packet_t pkt; size_t cb = 0; ademco_packet_t pkt;
size_t cb = 0;
ademco_parse_result_t result = ademco_parse_packet(clientBuffer.buff + clientBuffer.rpos, ademco_parse_result_t result = ademco_parse_packet(clientBuffer.buff + clientBuffer.rpos,
clientBuffer.wpos - clientBuffer.rpos, clientBuffer.wpos - clientBuffer.rpos,
&pkt, &pkt,
...@@ -141,11 +145,11 @@ int main(int argc, char** argv) { ...@@ -141,11 +145,11 @@ int main(int argc, char** argv) {
nullptr); nullptr);
switch (result) { switch (result) {
case ademco_parse_result_t::ADEMCO_PARSE_RESULT_OK: case ademco_parse_result_t::ADEMCO_PARSE_RESULT_OK: {
{
clientBuffer.rpos += cb; clientBuffer.rpos += cb;
//printf("id=%s\n", ap.id_.data()); // printf("id=%s\n", ap.id_.data());
printf("C:"); ademco_print(pkt.raw, pkt.raw_len); printf("C:");
ademco_print(pkt.raw, pkt.raw_len);
switch (pkt.id) { switch (pkt.id) {
case AID_ACK: case AID_ACK:
// success // success
...@@ -155,26 +159,35 @@ int main(int argc, char** argv) { ...@@ -155,26 +159,35 @@ int main(int argc, char** argv) {
{ {
char ack[1024]; char ack[1024];
size_t len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0); size_t len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademco_print(ack, len); printf("S:");
ademco_print(ack, len);
send(clientSock, (const char*)ack, len, 0); send(clientSock, (const char*)ack, len, 0);
break; break;
} }
case AID_HB: // event report case AID_HB: // event report
case AID_ADM_CID: case AID_ADM_CID: {
{
clientAcct = pkt.acct; clientAcct = pkt.acct;
clientAdemcoId = pkt.dat.ademco_id; clientAdemcoId = pkt.dat.ademco_id;
// handle event
// reply ack // reply ack
{ {
char ack[1024]; char ack[1024];
int len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0); int len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademco_print(ack, len); printf("S:");
ademco_print(ack, len);
send(clientSock, (const char*)ack, len, 0); send(clientSock, (const char*)ack, len, 0);
} }
// handle event
switch (pkt.dat.ademco_event) {
case EVENT_BURGLAR: // 盗警
case EVENT_FIRE: // 火警
// case ...
printf("zone %03d triggered %s\n", pkt.dat.zone, ademco_event_to_string(pkt.dat.ademco_event));
break;
}
break; break;
} }
...@@ -201,7 +214,7 @@ int main(int argc, char** argv) { ...@@ -201,7 +214,7 @@ int main(int argc, char** argv) {
auto do_read = [&do_handle]() { auto do_read = [&do_handle]() {
if (clientSock == INVALID_SOCKET) return; if (clientSock == INVALID_SOCKET) return;
timeval tv = { 0, 1000000 }; timeval tv = {0, 1000000};
fd_set fd_read; fd_set fd_read;
FD_ZERO(&fd_read); FD_ZERO(&fd_read);
FD_SET(clientSock, &fd_read); FD_SET(clientSock, &fd_read);
...@@ -211,7 +224,9 @@ int main(int argc, char** argv) { ...@@ -211,7 +224,9 @@ int main(int argc, char** argv) {
} }
int bRead = FD_ISSET(clientSock, &fd_read); int bRead = FD_ISSET(clientSock, &fd_read);
if (!bRead) { return; } if (!bRead) {
return;
}
char* temp = clientBuffer.buff + clientBuffer.wpos; char* temp = clientBuffer.buff + clientBuffer.wpos;
size_t dwLenToRead = BUFF_SIZE - clientBuffer.wpos; size_t dwLenToRead = BUFF_SIZE - clientBuffer.wpos;
...@@ -225,7 +240,8 @@ int main(int argc, char** argv) { ...@@ -225,7 +240,8 @@ int main(int argc, char** argv) {
if (bytes_transfered <= 0) { if (bytes_transfered <= 0) {
printf("Client %d offline\n", (int)clientSock); printf("Client %d offline\n", (int)clientSock);
close(clientSock); clientSock = INVALID_SOCKET; close(clientSock);
clientSock = INVALID_SOCKET;
clientBuffer.clear(); clientBuffer.clear();
} else { } else {
clientBuffer.wpos += bytes_transfered; clientBuffer.wpos += bytes_transfered;
...@@ -242,13 +258,16 @@ int main(int argc, char** argv) { ...@@ -242,13 +258,16 @@ int main(int argc, char** argv) {
if (clientBuffer.wpos == BUFF_SIZE) { if (clientBuffer.wpos == BUFF_SIZE) {
memmove(clientBuffer.buff, clientBuffer.buff + clientBuffer.rpos, bytes_not_commited); memmove(clientBuffer.buff, clientBuffer.buff + clientBuffer.rpos, bytes_not_commited);
memset(clientBuffer.buff + bytes_not_commited, 0, BUFF_SIZE - bytes_not_commited); memset(clientBuffer.buff + bytes_not_commited, 0, BUFF_SIZE - bytes_not_commited);
clientBuffer.wpos -= clientBuffer.rpos; clientBuffer.rpos = 0; clientBuffer.wpos -= clientBuffer.rpos;
clientBuffer.rpos = 0;
result = do_handle(); result = do_handle();
} else { } else {
result = do_handle(); result = do_handle();
} }
if (result == ademco_parse_result_t::ADEMCO_PARSE_RESULT_NOT_ENOUGH) { break; } if (result == ademco_parse_result_t::ADEMCO_PARSE_RESULT_NOT_ENOUGH) {
break;
}
} }
} }
}; };
...@@ -269,14 +288,15 @@ int main(int argc, char** argv) { ...@@ -269,14 +288,15 @@ int main(int argc, char** argv) {
ademco_xdata_t xdata; ademco_xdata_t xdata;
ademco_make_xdata(&xdata, ADEMCO_XDATA_LENGTH_FMT_TWO_HEX, ADEMCO_XDATA_TRANSFORM_AS_IS, pwd, 6); ademco_make_xdata(&xdata, ADEMCO_XDATA_LENGTH_FMT_TWO_HEX, ADEMCO_XDATA_TRANSFORM_AS_IS, pwd, 6);
int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, &xdata); int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, &xdata);
printf("S:"); ademco_print(buf, len); printf("S:");
ademco_print(buf, len);
send(clientSock, (const char*)buf, len, 0); send(clientSock, (const char*)buf, len, 0);
} else { } else {
int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, nullptr); int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, nullptr);
printf("S:"); ademco_print(buf, len); printf("S:");
ademco_print(buf, len);
send(clientSock, (const char*)buf, len, 0); send(clientSock, (const char*)buf, len, 0);
} }
} }
evntsWaiting4Send.clear(); evntsWaiting4Send.clear();
} }
......
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