Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
A
ademco_hb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
ademco_hb
Commits
2e893557
Commit
2e893557
authored
1 year ago
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update swig demos
parent
6a75e9e7
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
641 additions
and
637 deletions
+641
-637
CSharpDemo.cs
swig/CSharpDemo.cs
+239
-239
JavaDemo.java
swig/JavaDemo.java
+396
-394
nodejs-demo.js
swig/nodejs-demo.js
+6
-4
No files found.
swig/CSharpDemo.cs
View file @
2e893557
using
System
;
using
System.Diagnostics
;
using
System.Runtime.InteropServices
;
using
System.Text.RegularExpressions
;
using
System.Net
;
using
System.Net.Sockets
;
using
System.Text
;
using
System.Threading
;
using
System.IO
;
using
System.Collections.Concurrent
;
using
com.hb3344.ademco
;
namespace
CSharpDemo
{
class
Program
{
static
void
Main
(
string
[]
args
)
{
// test parse
{
Console
.
WriteLine
(
"test parse"
);
string
str
=
"\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"
;
byte
[]
raw
=
Encoding
.
ASCII
.
GetBytes
(
str
);
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
AdemcoPacket
pkt
=
new
AdemcoPacket
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
raw
,
(
uint
)
raw
.
Length
,
pkt
,
cb
);
Debug
.
Assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
Debug
.
Assert
(
libademco
.
size_tp_value
(
cb
)
==
(
uint
)
str
.
Length
);
Debug
.
Assert
(
pkt
.
crc
==
0xC5C3
);
Debug
.
Assert
(
pkt
.
len
==
0x0053
);
Debug
.
Assert
(
pkt
.
id
==
AdemcoPacketId
.
AID_HB
);
Debug
.
Assert
(
pkt
.
seq
==
0
);
Debug
.
Assert
(
pkt
.
acct
==
"90219125916578"
);
Debug
.
Assert
(
pkt
.
data
.
ademcoId
==
0
);
Debug
.
Assert
(
pkt
.
data
.
ademcoEvent
==
AdemcoEvent
.
EVENT_I_AM_WIRE_MACHINE
);
Debug
.
Assert
(
pkt
.
data
.
gg
==
0
);
Debug
.
Assert
(
pkt
.
data
.
zone
==
0
);
Console
.
WriteLine
(
"res={0:D}, commited={1:D}"
,
res
,
libademco
.
size_tp_value
(
cb
));
}
// test pack
{
Console
.
WriteLine
(
"test pack"
);
byte
[]
buff
=
new
byte
[
1024
];
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
1024
,
1
,
"861234567890"
,
666666
,
AdemcoEvent
.
EVENT_ARM
,
0
,
0
,
null
);
Debug
.
Assert
(
len
>
0
);
Console
.
WriteLine
(
"len={0:D}"
,
len
);
libademco
.
ademcoPrint
(
buff
,
len
);
Console
.
WriteLine
(
"test parse packed data"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
buff
,
len
,
pkt
,
cb
);
Debug
.
Assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
Debug
.
Assert
(
libademco
.
size_tp_value
(
cb
)
==
len
);
Debug
.
Assert
(
pkt
.
id
==
AdemcoPacketId
.
AID_HB
);
Debug
.
Assert
(
pkt
.
seq
==
1
);
Debug
.
Assert
(
pkt
.
acct
==
"861234567890"
);
Debug
.
Assert
(
pkt
.
data
.
ademcoId
==
666666
);
Debug
.
Assert
(
pkt
.
data
.
ademcoEvent
==
AdemcoEvent
.
EVENT_ARM
);
Debug
.
Assert
(
pkt
.
data
.
gg
==
0
);
Debug
.
Assert
(
pkt
.
data
.
zone
==
0
);
}
// test pack
// buff not enough
{
Console
.
WriteLine
(
"test pack, buff not enough"
);
Byte
[]
buff
=
new
Byte
[
10
];
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
10
,
1
,
"861234567890"
,
666666
,
AdemcoEvent
.
EVENT_ARM
,
0
,
0
,
null
);
Debug
.
Assert
(
len
==
0
);
}
Console
.
WriteLine
(
""
);
simpleServer
(
12345
);
}
static
void
simpleServer
(
int
port
)
{
Console
.
WriteLine
(
"running simpleServer {0:D}"
,
port
);
try
{
var
listener
=
new
TcpListener
(
IPAddress
.
Any
,
port
);
listener
.
Start
();
while
(
true
)
{
TcpClient
client
=
listener
.
AcceptTcpClient
();
Thread
thread
=
new
Thread
(
new
ParameterizedThreadStart
(
clientHandler
));
thread
.
Start
(
client
);
}
}
catch
(
Exception
e
)
{
Console
.
WriteLine
(
e
.
Message
);
}
}
static
byte
[]
append
(
byte
[]
origin
,
byte
[]
buf
,
int
len
)
{
byte
[]
dst
=
new
byte
[
origin
.
Length
+
len
];
Array
.
ConstrainedCopy
(
origin
,
0
,
dst
,
0
,
origin
.
Length
);
Array
.
ConstrainedCopy
(
buf
,
0
,
dst
,
origin
.
Length
,
len
);
return
dst
;
}
static
byte
[]
eat
(
byte
[]
origin
,
int
len
)
{
if
(
origin
.
Length
==
len
)
{
return
new
byte
[
0
];
}
byte
[]
dst
=
new
byte
[
origin
.
Length
-
len
];
Array
.
ConstrainedCopy
(
origin
,
len
,
dst
,
0
,
origin
.
Length
-
len
);
return
dst
;
}
static
ushort
nextSeq
(
ushort
seq
)
{
if
(++
seq
==
10000
)
{
seq
=
1
;
}
return
seq
;
}
static
void
clientHandler
(
object
cli
)
{
TcpClient
client
=
(
TcpClient
)
cli
;
NetworkStream
stream
=
client
.
GetStream
();
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
byte
[]
buff
=
new
byte
[
0
];
int
nread
=
0
;
uint
ademco_id
=
0
;
string
acct
=
""
;
HbMachineType
type
=
HbMachineType
.
HMT_INVALID
;
HbMachineStatus
status
=
HbMachineStatus
.
HMS_INVALID
;
ushort
seq
=
0
;
int
counter
=
1
;
while
(
true
)
{
byte
[]
msg
=
new
byte
[
1024
];
try
{
nread
=
stream
.
Read
(
msg
,
0
,
1024
);
}
catch
{
break
;
}
if
(
nread
==
0
)
{
break
;
}
buff
=
append
(
buff
,
msg
,
nread
);
AdemcoParseResult
res
=
AdemcoParseResult
.
RESULT_OK
;
while
(
res
==
AdemcoParseResult
.
RESULT_OK
)
{
res
=
libademco
.
ademcoPacketParse
(
buff
,
(
uint
)
buff
.
Length
,
pkt
,
cb
);
switch
(
res
)
{
case
AdemcoParseResult
.
RESULT_OK
:
Console
.
Write
(
"C:"
);
libademco
.
ademcoPrint
(
buff
,
libademco
.
size_tp_value
(
cb
));
buff
=
eat
(
buff
,
(
int
)
libademco
.
size_tp_value
(
cb
));
switch
(
pkt
.
id
)
{
case
AdemcoPacketId
.
AID_NULL
:
replyAck
(
stream
,
pkt
.
seq
,
pkt
.
acct
);
break
;
case
AdemcoPacketId
.
AID_HB
:
case
AdemcoPacketId
.
AID_ADM_CID
:
replyAck
(
stream
,
pkt
.
seq
,
pkt
.
acct
);
acct
=
pkt
.
acct
;
ademco_id
=
pkt
.
data
.
ademcoId
;
if
(
libademco
.
ademcoIsMachineTypeEvent
(
pkt
.
data
.
ademcoEvent
)
!=
0
)
{
type
=
libademco
.
hbMachineTypeFromAdemcoEvent
(
pkt
.
data
.
ademcoEvent
);
}
if
(
libademco
.
ademcoIsMachineStatusEvent
(
pkt
.
data
.
ademcoEvent
)
!=
0
)
{
status
=
libademco
.
hbMachineStatusFromAdemcoEvent
(
pkt
.
data
.
ademcoEvent
);
}
// 演示如何进行布撤防,真实项目里可以删改本段
if
(++
counter
%
5
==
0
)
{
if
(
status
==
HbMachineStatus
.
HMS_ARM
)
{
sendDisarm
(
stream
,
nextSeq
(
seq
),
acct
,
ademco_id
,
"123456"
);
}
else
{
sendArm
(
stream
,
nextSeq
(
seq
),
acct
,
ademco_id
);
}
}
break
;
default
:
break
;
}
break
;
case
AdemcoParseResult
.
RESULT_ERROR
:
buff
=
new
byte
[
0
];
break
;
}
}
}
}
static
void
replyAck
(
NetworkStream
stream
,
ushort
seq
,
string
acct
)
{
byte
[]
buff
=
new
byte
[
1024
];
uint
len
=
libademco
.
ademcoMakeAckPacket
(
buff
,
1024
,
seq
,
acct
,
0
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
(
int
)
len
);
}
static
void
sendArm
(
NetworkStream
stream
,
ushort
seq
,
string
acct
,
uint
ademcoId
)
{
byte
[]
buff
=
new
byte
[
1024
];
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
1024
,
seq
,
acct
,
ademcoId
,
AdemcoEvent
.
EVENT_ARM
,
0
,
0
,
null
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
(
int
)
len
);
}
static
void
sendDisarm
(
NetworkStream
stream
,
ushort
seq
,
string
acct
,
uint
ademcoId
,
string
pwd
)
{
byte
[]
buff
=
new
byte
[
1024
];
AdemcoXDataSegment
xdata
=
null
;
if
(!
string
.
IsNullOrEmpty
(
pwd
))
{
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
Encoding
.
ASCII
.
GetBytes
(
pwd
),
(
uint
)
pwd
.
Length
);
}
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
1024
,
seq
,
acct
,
ademcoId
,
AdemcoEvent
.
EVENT_DISARM
,
0
,
0
,
xdata
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
(
int
)
len
);
}
}
}
using
System
;
using
System.Diagnostics
;
using
System.Runtime.InteropServices
;
using
System.Text.RegularExpressions
;
using
System.Net
;
using
System.Net.Sockets
;
using
System.Text
;
using
System.Threading
;
using
System.IO
;
using
System.Collections.Concurrent
;
using
com.hb3344.ademco
;
namespace
CSharpDemo
{
class
Program
{
static
void
Main
(
string
[]
args
)
{
// test parse
{
Console
.
WriteLine
(
"test parse"
);
string
str
=
"\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"
;
byte
[]
raw
=
Encoding
.
ASCII
.
GetBytes
(
str
);
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
AdemcoPacket
pkt
=
new
AdemcoPacket
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
raw
,
(
uint
)
raw
.
Length
,
pkt
,
cb
,
null
);
Debug
.
Assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
Debug
.
Assert
(
libademco
.
size_tp_value
(
cb
)
==
(
uint
)
str
.
Length
);
Debug
.
Assert
(
pkt
.
crc
==
0xC5C3
);
Debug
.
Assert
(
pkt
.
len
==
0x0053
);
Debug
.
Assert
(
pkt
.
id
==
AdemcoPacketId
.
AID_HB
);
Debug
.
Assert
(
pkt
.
seq
==
0
);
Debug
.
Assert
(
pkt
.
acct
==
"90219125916578"
);
Debug
.
Assert
(
pkt
.
data
.
ademcoId
==
0
);
Debug
.
Assert
(
pkt
.
data
.
ademcoEvent
==
AdemcoEvent
.
EVENT_I_AM_WIRE_MACHINE
);
Debug
.
Assert
(
pkt
.
data
.
gg
==
0
);
Debug
.
Assert
(
pkt
.
data
.
zone
==
0
);
Console
.
WriteLine
(
"res={0:D}, commited={1:D}"
,
res
,
libademco
.
size_tp_value
(
cb
));
}
// test pack
{
Console
.
WriteLine
(
"test pack"
);
byte
[]
buff
=
new
byte
[
1024
];
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
1024
,
1
,
"861234567890"
,
666666
,
AdemcoEvent
.
EVENT_ARM
,
0
,
0
,
null
);
Debug
.
Assert
(
len
>
0
);
Console
.
WriteLine
(
"len={0:D}"
,
len
);
libademco
.
ademcoPrint
(
buff
,
len
);
Console
.
WriteLine
(
"test parse packed data"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
buff
,
len
,
pkt
,
cb
,
null
);
Debug
.
Assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
Debug
.
Assert
(
libademco
.
size_tp_value
(
cb
)
==
len
);
Debug
.
Assert
(
pkt
.
id
==
AdemcoPacketId
.
AID_HB
);
Debug
.
Assert
(
pkt
.
seq
==
1
);
Debug
.
Assert
(
pkt
.
acct
==
"861234567890"
);
Debug
.
Assert
(
pkt
.
data
.
ademcoId
==
666666
);
Debug
.
Assert
(
pkt
.
data
.
ademcoEvent
==
AdemcoEvent
.
EVENT_ARM
);
Debug
.
Assert
(
pkt
.
data
.
gg
==
0
);
Debug
.
Assert
(
pkt
.
data
.
zone
==
0
);
}
// test pack
// buff not enough
{
Console
.
WriteLine
(
"test pack, buff not enough"
);
Byte
[]
buff
=
new
Byte
[
10
];
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
10
,
1
,
"861234567890"
,
666666
,
AdemcoEvent
.
EVENT_ARM
,
0
,
0
,
null
);
Debug
.
Assert
(
len
==
0
);
}
Console
.
WriteLine
(
""
);
simpleServer
(
12345
);
}
static
void
simpleServer
(
int
port
)
{
Console
.
WriteLine
(
"running simpleServer {0:D}"
,
port
);
try
{
var
listener
=
new
TcpListener
(
IPAddress
.
Any
,
port
);
listener
.
Start
();
while
(
true
)
{
TcpClient
client
=
listener
.
AcceptTcpClient
();
Thread
thread
=
new
Thread
(
new
ParameterizedThreadStart
(
clientHandler
));
thread
.
Start
(
client
);
}
}
catch
(
Exception
e
)
{
Console
.
WriteLine
(
e
.
Message
);
}
}
static
byte
[]
append
(
byte
[]
origin
,
byte
[]
buf
,
int
len
)
{
byte
[]
dst
=
new
byte
[
origin
.
Length
+
len
];
Array
.
ConstrainedCopy
(
origin
,
0
,
dst
,
0
,
origin
.
Length
);
Array
.
ConstrainedCopy
(
buf
,
0
,
dst
,
origin
.
Length
,
len
);
return
dst
;
}
static
byte
[]
eat
(
byte
[]
origin
,
int
len
)
{
if
(
origin
.
Length
==
len
)
{
return
new
byte
[
0
];
}
byte
[]
dst
=
new
byte
[
origin
.
Length
-
len
];
Array
.
ConstrainedCopy
(
origin
,
len
,
dst
,
0
,
origin
.
Length
-
len
);
return
dst
;
}
static
ushort
nextSeq
(
ushort
seq
)
{
if
(++
seq
==
10000
)
{
seq
=
1
;
}
return
seq
;
}
static
void
clientHandler
(
object
cli
)
{
TcpClient
client
=
(
TcpClient
)
cli
;
NetworkStream
stream
=
client
.
GetStream
();
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
byte
[]
buff
=
new
byte
[
0
];
int
nread
=
0
;
uint
ademco_id
=
0
;
string
acct
=
""
;
HbMachineType
type
=
HbMachineType
.
HMT_INVALID
;
HbMachineStatus
status
=
HbMachineStatus
.
HMS_INVALID
;
ushort
seq
=
0
;
int
counter
=
1
;
while
(
true
)
{
byte
[]
msg
=
new
byte
[
1024
];
try
{
nread
=
stream
.
Read
(
msg
,
0
,
1024
);
}
catch
{
break
;
}
if
(
nread
==
0
)
{
break
;
}
buff
=
append
(
buff
,
msg
,
nread
);
AdemcoParseResult
res
=
AdemcoParseResult
.
RESULT_OK
;
while
(
res
==
AdemcoParseResult
.
RESULT_OK
)
{
res
=
libademco
.
ademcoPacketParse
(
buff
,
(
uint
)
buff
.
Length
,
pkt
,
cb
,
null
);
switch
(
res
)
{
case
AdemcoParseResult
.
RESULT_OK
:
Console
.
Write
(
"C:"
);
libademco
.
ademcoPrint
(
buff
,
libademco
.
size_tp_value
(
cb
));
buff
=
eat
(
buff
,
(
int
)
libademco
.
size_tp_value
(
cb
));
switch
(
pkt
.
id
)
{
case
AdemcoPacketId
.
AID_NULL
:
replyAck
(
stream
,
pkt
.
seq
,
pkt
.
acct
);
break
;
case
AdemcoPacketId
.
AID_HB
:
case
AdemcoPacketId
.
AID_ADM_CID
:
replyAck
(
stream
,
pkt
.
seq
,
pkt
.
acct
);
acct
=
pkt
.
acct
;
ademco_id
=
pkt
.
data
.
ademcoId
;
if
(
libademco
.
ademcoIsMachineTypeEvent
(
pkt
.
data
.
ademcoEvent
)
!=
0
)
{
type
=
libademco
.
hbMachineTypeFromAdemcoEvent
(
pkt
.
data
.
ademcoEvent
);
}
if
(
libademco
.
ademcoIsMachineStatusEvent
(
pkt
.
data
.
ademcoEvent
)
!=
0
)
{
status
=
libademco
.
hbMachineStatusFromAdemcoEvent
(
pkt
.
data
.
ademcoEvent
);
}
// 演示如何进行布撤防,真实项目里可以删改本段
if
(++
counter
%
5
==
0
)
{
if
(
status
==
HbMachineStatus
.
HMS_ARM
)
{
sendDisarm
(
stream
,
nextSeq
(
seq
),
acct
,
ademco_id
,
"123456"
);
}
else
{
sendArm
(
stream
,
nextSeq
(
seq
),
acct
,
ademco_id
);
}
}
break
;
default
:
break
;
}
break
;
case
AdemcoParseResult
.
RESULT_ERROR
:
buff
=
new
byte
[
0
];
break
;
}
}
}
}
static
void
replyAck
(
NetworkStream
stream
,
ushort
seq
,
string
acct
)
{
byte
[]
buff
=
new
byte
[
1024
];
uint
len
=
libademco
.
ademcoMakeAckPacket
(
buff
,
1024
,
seq
,
acct
,
0
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
(
int
)
len
);
}
static
void
sendArm
(
NetworkStream
stream
,
ushort
seq
,
string
acct
,
uint
ademcoId
)
{
byte
[]
buff
=
new
byte
[
1024
];
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
1024
,
seq
,
acct
,
ademcoId
,
AdemcoEvent
.
EVENT_ARM
,
0
,
0
,
null
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
(
int
)
len
);
}
static
void
sendDisarm
(
NetworkStream
stream
,
ushort
seq
,
string
acct
,
uint
ademcoId
,
string
pwd
)
{
byte
[]
buff
=
new
byte
[
1024
];
AdemcoXDataSegment
xdata
=
null
;
if
(!
string
.
IsNullOrEmpty
(
pwd
))
{
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
Encoding
.
ASCII
.
GetBytes
(
pwd
),
(
uint
)
pwd
.
Length
);
}
uint
len
=
libademco
.
ademcoMakeHbPacket
(
buff
,
1024
,
seq
,
acct
,
ademcoId
,
AdemcoEvent
.
EVENT_DISARM
,
0
,
0
,
xdata
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
(
int
)
len
);
}
}
}
This diff is collapsed.
Click to expand it.
swig/JavaDemo.java
View file @
2e893557
import
java.io.*
;
import
java.net.*
;
import
java.nio.ByteBuffer
;
import
java.nio.channels.SelectionKey
;
import
java.nio.channels.Selector
;
import
java.nio.channels.ServerSocketChannel
;
import
java.nio.channels.SocketChannel
;
import
java.util.*
;
import
com.hb3344.ademco.*
;
public
class
JavaDemo
{
static
{
try
{
System
.
loadLibrary
(
"ademco_java"
);
}
catch
(
UnsatisfiedLinkError
e
)
{
System
.
err
.
println
(
"Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n"
+
e
);
System
.
exit
(
1
);
}
}
private
Selector
selector
;
private
Map
<
SocketChannel
,
Client
>
clients
;
private
InetSocketAddress
listenAddr
;
public
JavaDemo
(
String
addr
,
int
port
)
throws
IOException
{
listenAddr
=
new
InetSocketAddress
(
addr
,
port
);
clients
=
new
HashMap
<
SocketChannel
,
Client
>();
}
private
void
start
()
throws
IOException
{
selector
=
Selector
.
open
();
ServerSocketChannel
channel
=
ServerSocketChannel
.
open
();
channel
.
configureBlocking
(
false
);
channel
.
socket
().
bind
(
listenAddr
);
channel
.
register
(
selector
,
SelectionKey
.
OP_ACCEPT
);
System
.
out
.
println
(
"Server started..."
);
while
(
true
)
{
selector
.
select
();
Iterator
keys
=
selector
.
selectedKeys
().
iterator
();
while
(
keys
.
hasNext
())
{
SelectionKey
key
=
(
SelectionKey
)
keys
.
next
();
keys
.
remove
();
if
(!
key
.
isValid
())
continue
;
if
(
key
.
isAcceptable
())
accept
(
key
);
else
if
(
key
.
isReadable
())
read
(
key
);
}
}
}
private
void
accept
(
SelectionKey
key
)
throws
IOException
{
ServerSocketChannel
sChannel
=
(
ServerSocketChannel
)
key
.
channel
();
SocketChannel
channel
=
sChannel
.
accept
();
channel
.
configureBlocking
(
false
);
Socket
socket
=
channel
.
socket
();
SocketAddress
addr
=
socket
.
getRemoteSocketAddress
();
System
.
out
.
println
(
"Accepted new client from:"
+
addr
);
clients
.
put
(
channel
,
new
Client
(
channel
));
channel
.
register
(
selector
,
SelectionKey
.
OP_READ
);
}
private
void
read
(
SelectionKey
key
)
throws
IOException
{
SocketChannel
channel
=
(
SocketChannel
)
key
.
channel
();
ByteBuffer
buf
=
ByteBuffer
.
allocate
(
1024
);
int
n
=
channel
.
read
(
buf
);
if
(
n
==
-
1
)
{
clients
.
get
(
channel
).
offline
();
clients
.
remove
(
channel
);
channel
.
close
();
key
.
cancel
();
return
;
}
byte
[]
data
=
new
byte
[
n
];
System
.
arraycopy
(
buf
.
array
(),
0
,
data
,
0
,
n
);
clients
.
get
(
channel
).
onMsg
(
data
);
}
public
static
void
test_libademco
()
{
// test parse
{
System
.
out
.
println
(
"testing parse..."
);
String
data
=
"\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"
;
System
.
out
.
println
(
"using data="
+
data
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
data
.
getBytes
(),
data
.
length
(),
pkt
,
cb
);
assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
assert
(
libademco
.
size_tp_value
(
cb
)
==
data
.
length
());
System
.
out
.
println
(
"parse result="
+
res
+
",cb_commited="
+
libademco
.
size_tp_value
(
cb
));
libademco
.
delete_size_tp
(
cb
);
}
// test pack
{
System
.
out
.
println
(
"testing pack..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeHbPacket2
(
pkt
,
1234
,
"861234567890"
,
666666
l
,
AdemcoEvent
.
EVENT_ARM
,
0
l
,
0
l
,
null
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test pack with xdata
{
System
.
out
.
println
(
"testing pack with xdata..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=123456"
);
AdemcoXDataSegment
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
"123456"
.
getBytes
(),
6
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeHbPacket2
(
pkt
,
1234
,
"861234567890"
,
666666
l
,
AdemcoEvent
.
EVENT_ARM
,
0
l
,
0
l
,
xdata
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test with hex xdata
{
System
.
out
.
println
(
"testing pack with hex xdata..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=EB BA 3F A1 76"
);
byte
[]
xdatacontent
=
new
byte
[
5
];
xdatacontent
[
0
]
=
(
byte
)
0xEB
;
xdatacontent
[
1
]
=
(
byte
)
0xBA
;
xdatacontent
[
2
]
=
(
byte
)
0x3F
;
xdatacontent
[
3
]
=
(
byte
)
0xA1
;
xdatacontent
[
4
]
=
(
byte
)
0x76
;
AdemcoXDataSegment
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
xdatacontent
,
5
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeHbPacket2
(
pkt
,
1234
,
"861234567890"
,
666666
l
,
AdemcoEvent
.
EVENT_ARM
,
0
l
,
0
l
,
xdata
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test pack ack
{
System
.
out
.
println
(
"testing pack ack..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeAckPacket2
(
pkt
,
1234
,
"861234567890"
,
0
l
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test pack ack without acct
{
System
.
out
.
println
(
"testing pack ack without acct..."
);
System
.
out
.
println
(
"using seq=1234, acct=\"\" ademco_id=666666"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeAckPacket2
(
pkt
,
1234
,
""
,
666666
l
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
JavaDemo
.
test_libademco
();
int
port
=
12345
;
if
(
args
.
length
>
0
)
{
port
=
Integer
.
parseInt
(
args
[
0
]);
}
// new JavaDemo("localhost", port).start();
new
JavaDemo
(
"0.0.0.0"
,
port
).
start
();
}
public
class
Client
{
SocketChannel
channel
;
byte
[]
buf
=
new
byte
[
0
];
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
HbMachineType
type
=
HbMachineType
.
HMT_INVALID
;
HbMachineStatus
status
=
HbMachineStatus
.
HMS_INVALID
;
int
seq
=
0
;
long
ademco_id
=
0
;
String
acct
=
""
;
long
lastTimeStatusChange
=
0
;
public
Client
(
SocketChannel
channel
)
{
this
.
channel
=
channel
;
}
public
void
offline
()
{
System
.
out
.
println
(
id
()
+
" is offline"
);
libademco
.
delete_size_tp
(
cb
);
}
public
void
onMsg
(
byte
[]
data
)
throws
IOException
{
buf
=
append
(
buf
,
data
);
// System.out.println(printable_bytes(buf));
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
buf
,
buf
.
length
,
pkt
,
cb
);
System
.
out
.
println
(
res
+
", "
+
libademco
.
size_tp_value
(
cb
));
switch
(
res
)
{
case
RESULT_OK:
buf
=
trim
(
buf
,
(
int
)
libademco
.
size_tp_value
(
cb
));
handleMsg
();
break
;
case
RESULT_NOT_ENOUGH:
break
;
case
RESULT_ERROR:
buf
=
new
byte
[
0
];
break
;
}
}
private
byte
[]
getRawWithLen
()
{
byte
[]
b
=
new
byte
[(
int
)
pkt
.
getRaw_len
()];
System
.
arraycopy
(
pkt
.
getRaw
(),
0
,
b
,
0
,
(
int
)
pkt
.
getRaw_len
());
return
b
;
}
private
String
id
()
{
String
str
=
"Client "
+
channel
.
socket
().
getRemoteSocketAddress
();
if
(!
acct
.
isEmpty
())
{
str
+=
" acct="
+
acct
;
}
if
(
ademco_id
!=
0
)
{
str
+=
" ademco_id="
+
ademco_id
;
}
return
str
;
}
private
int
nextSeq
()
{
seq
++;
if
(
seq
==
10000
)
{
seq
=
1
;
}
return
seq
;
}
private
void
handleMsg
()
throws
IOException
{
System
.
out
.
println
(
id
()
+
" R:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
switch
(
pkt
.
getId
())
{
case
AID_NULL:
acct
=
pkt
.
getAcct
();
replyAck
();
break
;
case
AID_ACK:
break
;
case
AID_HB:
case
AID_ADM_CID:
acct
=
pkt
.
getAcct
();
ademco_id
=
pkt
.
getData
().
getAdemcoId
();
AdemcoEvent
event
=
pkt
.
getData
().
getAdemcoEvent
();
System
.
out
.
println
(
id
()
+
" event="
+
libademco
.
ademcoEventToString
(
event
)
+
" zone="
+
pkt
.
getData
().
getZone
());
if
(
libademco
.
ademcoIsMachineStatusEvent
(
event
)
!=
0
)
{
status
=
libademco
.
hbMachineStatusFromAdemcoEvent
(
event
);
// 演示如何进行布撤防,真实项目里可以删改本段
long
now
=
System
.
currentTimeMillis
();
if
(
now
-
lastTimeStatusChange
>
5000
)
{
lastTimeStatusChange
=
now
;
if
(
status
==
HbMachineStatus
.
HMS_ARM
)
{
disarm
(
"123456"
);
}
else
{
arm
();
}
}
}
if
(
libademco
.
ademcoIsMachineTypeEvent
(
event
)
!=
0
)
{
type
=
libademco
.
hbMachineTypeFromAdemcoEvent
(
event
);
}
replyAck
();
if
(
type
==
HbMachineType
.
HMT_INVALID
&&
!
acct
.
isEmpty
()
&&
ademco_id
!=
0
)
{
askType
();
}
break
;
}
}
private
void
replyAck
()
throws
IOException
{
libademco
.
ademcoMakeAckPacket2
(
pkt
,
pkt
.
getSeq
(),
pkt
.
getAcct
(),
0
l
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
private
void
askType
()
throws
IOException
{
libademco
.
ademcoMakeHbPacket2
(
pkt
,
nextSeq
(),
acct
,
ademco_id
,
AdemcoEvent
.
EVENT_WHAT_IS_YOUR_TYPE
,
0L
,
0L
,
null
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
private
void
arm
()
throws
IOException
{
libademco
.
ademcoMakeHbPacket2
(
pkt
,
nextSeq
(),
acct
,
ademco_id
,
AdemcoEvent
.
EVENT_ARM
,
0L
,
0L
,
null
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
private
void
disarm
(
String
pwd
)
throws
IOException
{
AdemcoXDataSegment
xdata
=
null
;
if
(
pwd
!=
null
&&
!
pwd
.
isEmpty
())
{
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
pwd
.
getBytes
(),
pwd
.
length
());
}
libademco
.
ademcoMakeHbPacket2
(
pkt
,
nextSeq
(),
acct
,
ademco_id
,
AdemcoEvent
.
EVENT_DISARM
,
0L
,
0L
,
xdata
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
}
public
static
String
printable_bytes
(
byte
[]
b
)
{
return
printable_bytes
(
b
,
b
.
length
);
}
public
static
String
printable_bytes
(
byte
[]
b
,
long
length
)
{
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
byte
c
=
b
[
i
];
if
(
32
<=
c
&&
c
<=
127
)
{
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
((
b
[
i
]
>>>
4
)
&
0x0F
);
s
+=
HEX_STRING
.
charAt
(
b
[
i
]
&
0x0F
);
}
}
return
s
;
}
public
static
String
printable_bytes
(
char
[]
b
)
{
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
b
.
length
;
i
++)
{
int
c
=
b
[
i
]
&
0xFF
;
if
(
32
<=
c
&&
c
<=
127
)
{
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
(
c
>>>
4
);
s
+=
HEX_STRING
.
charAt
(
c
&
0x0F
);
}
}
return
s
;
}
public
static
String
printable_bytes
(
String
b
)
{
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
b
.
length
();
i
++)
{
char
c
=
b
.
charAt
(
i
);
if
(
32
<=
c
&&
c
<=
127
)
{
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
(
c
>>>
4
);
s
+=
HEX_STRING
.
charAt
(
c
&
0x0F
);
}
}
return
s
;
}
public
static
char
[]
append
(
char
[]
origin
,
char
[]
buf
)
{
char
[]
dst
=
new
char
[
origin
.
length
+
buf
.
length
];
System
.
arraycopy
(
origin
,
0
,
dst
,
0
,
origin
.
length
);
System
.
arraycopy
(
buf
,
0
,
dst
,
origin
.
length
,
buf
.
length
);
return
dst
;
}
public
static
byte
[]
append
(
byte
[]
origin
,
byte
[]
buf
)
{
byte
[]
dst
=
new
byte
[
origin
.
length
+
buf
.
length
];
System
.
arraycopy
(
origin
,
0
,
dst
,
0
,
origin
.
length
);
System
.
arraycopy
(
buf
,
0
,
dst
,
origin
.
length
,
buf
.
length
);
return
dst
;
}
public
byte
[]
trim
(
byte
[]
origin
,
int
pos
)
{
byte
[]
dst
=
new
byte
[
origin
.
length
-
pos
];
System
.
arraycopy
(
origin
,
pos
,
dst
,
0
,
origin
.
length
-
pos
);
return
dst
;
}
public
static
byte
[]
c2b
(
char
[]
arr
)
{
byte
[]
b
=
new
byte
[
arr
.
length
];
for
(
int
i
=
0
;
i
<
arr
.
length
;
i
++)
{
b
[
i
]
=
(
byte
)
arr
[
i
];
}
return
b
;
}
public
static
char
[]
b2c
(
byte
[]
arr
)
{
char
[]
b
=
new
char
[
arr
.
length
];
for
(
int
i
=
0
;
i
<
arr
.
length
;
i
++)
{
b
[
i
]
=
(
char
)
arr
[
i
];
}
return
b
;
}
}
import
java.io.*
;
import
java.net.*
;
import
java.nio.ByteBuffer
;
import
java.nio.channels.SelectionKey
;
import
java.nio.channels.Selector
;
import
java.nio.channels.ServerSocketChannel
;
import
java.nio.channels.SocketChannel
;
import
java.util.*
;
import
com.hb3344.ademco.*
;
public
class
JavaDemo
{
static
{
try
{
System
.
loadLibrary
(
"ademco_java"
);
}
catch
(
UnsatisfiedLinkError
e
)
{
System
.
err
.
println
(
"Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n"
+
e
);
System
.
exit
(
1
);
}
}
private
Selector
selector
;
private
Map
<
SocketChannel
,
Client
>
clients
;
private
InetSocketAddress
listenAddr
;
public
JavaDemo
(
String
addr
,
int
port
)
throws
IOException
{
listenAddr
=
new
InetSocketAddress
(
addr
,
port
);
clients
=
new
HashMap
<
SocketChannel
,
Client
>();
}
private
void
start
()
throws
IOException
{
selector
=
Selector
.
open
();
ServerSocketChannel
channel
=
ServerSocketChannel
.
open
();
channel
.
configureBlocking
(
false
);
channel
.
socket
().
bind
(
listenAddr
);
channel
.
register
(
selector
,
SelectionKey
.
OP_ACCEPT
);
System
.
out
.
println
(
"Server started..."
);
while
(
true
)
{
selector
.
select
();
Iterator
keys
=
selector
.
selectedKeys
().
iterator
();
while
(
keys
.
hasNext
())
{
SelectionKey
key
=
(
SelectionKey
)
keys
.
next
();
keys
.
remove
();
if
(!
key
.
isValid
())
continue
;
if
(
key
.
isAcceptable
())
accept
(
key
);
else
if
(
key
.
isReadable
())
read
(
key
);
}
}
}
private
void
accept
(
SelectionKey
key
)
throws
IOException
{
ServerSocketChannel
sChannel
=
(
ServerSocketChannel
)
key
.
channel
();
SocketChannel
channel
=
sChannel
.
accept
();
channel
.
configureBlocking
(
false
);
Socket
socket
=
channel
.
socket
();
SocketAddress
addr
=
socket
.
getRemoteSocketAddress
();
System
.
out
.
println
(
"Accepted new client from:"
+
addr
);
clients
.
put
(
channel
,
new
Client
(
channel
));
channel
.
register
(
selector
,
SelectionKey
.
OP_READ
);
}
private
void
read
(
SelectionKey
key
)
throws
IOException
{
SocketChannel
channel
=
(
SocketChannel
)
key
.
channel
();
ByteBuffer
buf
=
ByteBuffer
.
allocate
(
1024
);
int
n
=
channel
.
read
(
buf
);
if
(
n
==
-
1
)
{
clients
.
get
(
channel
).
offline
();
clients
.
remove
(
channel
);
channel
.
close
();
key
.
cancel
();
return
;
}
byte
[]
data
=
new
byte
[
n
];
System
.
arraycopy
(
buf
.
array
(),
0
,
data
,
0
,
n
);
clients
.
get
(
channel
).
onMsg
(
data
);
}
public
static
void
test_libademco
()
{
// test parse
{
System
.
out
.
println
(
"testing parse..."
);
String
data
=
"\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"
;
System
.
out
.
println
(
"using data="
+
data
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
AdemcoParseError
err
=
new
AdemcoParseError
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
data
.
getBytes
(),
data
.
length
(),
pkt
,
cb
,
err
);
assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
assert
(
libademco
.
size_tp_value
(
cb
)
==
data
.
length
());
System
.
out
.
println
(
"parse result="
+
res
+
",cb_commited="
+
libademco
.
size_tp_value
(
cb
));
libademco
.
delete_size_tp
(
cb
);
}
// test pack
{
System
.
out
.
println
(
"testing pack..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeHbPacket2
(
pkt
,
1234
,
"861234567890"
,
666666
l
,
AdemcoEvent
.
EVENT_ARM
,
0
l
,
0
l
,
null
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test pack with xdata
{
System
.
out
.
println
(
"testing pack with xdata..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=123456"
);
AdemcoXDataSegment
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
"123456"
.
getBytes
(),
6
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeHbPacket2
(
pkt
,
1234
,
"861234567890"
,
666666
l
,
AdemcoEvent
.
EVENT_ARM
,
0
l
,
0
l
,
xdata
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test with hex xdata
{
System
.
out
.
println
(
"testing pack with hex xdata..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=EB BA 3F A1 76"
);
byte
[]
xdatacontent
=
new
byte
[
5
];
xdatacontent
[
0
]
=
(
byte
)
0xEB
;
xdatacontent
[
1
]
=
(
byte
)
0xBA
;
xdatacontent
[
2
]
=
(
byte
)
0x3F
;
xdatacontent
[
3
]
=
(
byte
)
0xA1
;
xdatacontent
[
4
]
=
(
byte
)
0x76
;
AdemcoXDataSegment
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
xdatacontent
,
5
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeHbPacket2
(
pkt
,
1234
,
"861234567890"
,
666666
l
,
AdemcoEvent
.
EVENT_ARM
,
0
l
,
0
l
,
xdata
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test pack ack
{
System
.
out
.
println
(
"testing pack ack..."
);
System
.
out
.
println
(
"using seq=1234, acct=861234567890"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeAckPacket2
(
pkt
,
1234
,
"861234567890"
,
0
l
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
// test pack ack without acct
{
System
.
out
.
println
(
"testing pack ack without acct..."
);
System
.
out
.
println
(
"using seq=1234, acct=\"\" ademco_id=666666"
);
AdemcoPacket
pkt
=
new
AdemcoPacket
();
libademco
.
ademcoMakeAckPacket2
(
pkt
,
1234
,
""
,
666666
l
);
System
.
out
.
println
(
"data="
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
JavaDemo
.
test_libademco
();
int
port
=
12345
;
if
(
args
.
length
>
0
)
{
port
=
Integer
.
parseInt
(
args
[
0
]);
}
// new JavaDemo("localhost", port).start();
new
JavaDemo
(
"0.0.0.0"
,
port
).
start
();
}
public
class
Client
{
SocketChannel
channel
;
byte
[]
buf
=
new
byte
[
0
];
AdemcoPacket
pkt
=
new
AdemcoPacket
();
AdemcoParseError
err
=
new
AdemcoParseError
();
SWIGTYPE_p_size_t
cb
=
libademco
.
new_size_tp
();
HbMachineType
type
=
HbMachineType
.
HMT_INVALID
;
HbMachineStatus
status
=
HbMachineStatus
.
HMS_INVALID
;
int
seq
=
0
;
long
ademco_id
=
0
;
String
acct
=
""
;
long
lastTimeStatusChange
=
0
;
public
Client
(
SocketChannel
channel
)
{
this
.
channel
=
channel
;
}
public
void
offline
()
{
System
.
out
.
println
(
id
()
+
" is offline"
);
libademco
.
delete_size_tp
(
cb
);
}
public
void
onMsg
(
byte
[]
data
)
throws
IOException
{
buf
=
append
(
buf
,
data
);
// System.out.println(printable_bytes(buf));
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
buf
,
buf
.
length
,
pkt
,
cb
,
err
);
System
.
out
.
println
(
res
+
", "
+
libademco
.
size_tp_value
(
cb
));
switch
(
res
)
{
case
RESULT_OK:
buf
=
trim
(
buf
,
(
int
)
libademco
.
size_tp_value
(
cb
));
handleMsg
();
break
;
case
RESULT_NOT_ENOUGH:
break
;
case
RESULT_ERROR:
buf
=
new
byte
[
0
];
break
;
}
}
private
byte
[]
getRawWithLen
()
{
byte
[]
b
=
new
byte
[(
int
)
pkt
.
getRaw_len
()];
System
.
arraycopy
(
pkt
.
getRaw
(),
0
,
b
,
0
,
(
int
)
pkt
.
getRaw_len
());
return
b
;
}
private
String
id
()
{
String
str
=
"Client "
+
channel
.
socket
().
getRemoteSocketAddress
();
if
(!
acct
.
isEmpty
())
{
str
+=
" acct="
+
acct
;
}
if
(
ademco_id
!=
0
)
{
str
+=
" ademco_id="
+
ademco_id
;
}
return
str
;
}
private
int
nextSeq
()
{
seq
++;
if
(
seq
==
10000
)
{
seq
=
1
;
}
return
seq
;
}
private
void
handleMsg
()
throws
IOException
{
System
.
out
.
println
(
id
()
+
" R:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
switch
(
pkt
.
getId
())
{
case
AID_NULL:
acct
=
pkt
.
getAcct
();
replyAck
();
break
;
case
AID_ACK:
break
;
case
AID_HB:
case
AID_ADM_CID:
acct
=
pkt
.
getAcct
();
ademco_id
=
pkt
.
getData
().
getAdemcoId
();
AdemcoEvent
event
=
pkt
.
getData
().
getAdemcoEvent
();
System
.
out
.
println
(
id
()
+
" event="
+
libademco
.
ademcoEventToString
(
event
)
+
" zone="
+
pkt
.
getData
().
getZone
());
if
(
libademco
.
ademcoIsMachineStatusEvent
(
event
)
!=
0
)
{
status
=
libademco
.
hbMachineStatusFromAdemcoEvent
(
event
);
// 演示如何进行布撤防,真实项目里可以删改本段
long
now
=
System
.
currentTimeMillis
();
if
(
now
-
lastTimeStatusChange
>
5000
)
{
lastTimeStatusChange
=
now
;
if
(
status
==
HbMachineStatus
.
HMS_ARM
)
{
disarm
(
"123456"
);
}
else
{
arm
();
}
}
}
if
(
libademco
.
ademcoIsMachineTypeEvent
(
event
)
!=
0
)
{
type
=
libademco
.
hbMachineTypeFromAdemcoEvent
(
event
);
}
replyAck
();
if
(
type
==
HbMachineType
.
HMT_INVALID
&&
!
acct
.
isEmpty
()
&&
ademco_id
!=
0
)
{
askType
();
}
break
;
}
}
private
void
replyAck
()
throws
IOException
{
libademco
.
ademcoMakeAckPacket2
(
pkt
,
pkt
.
getSeq
(),
pkt
.
getAcct
(),
0
l
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
private
void
askType
()
throws
IOException
{
libademco
.
ademcoMakeHbPacket2
(
pkt
,
nextSeq
(),
acct
,
ademco_id
,
AdemcoEvent
.
EVENT_WHAT_IS_YOUR_TYPE
,
0L
,
0L
,
null
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
private
void
arm
()
throws
IOException
{
libademco
.
ademcoMakeHbPacket2
(
pkt
,
nextSeq
(),
acct
,
ademco_id
,
AdemcoEvent
.
EVENT_ARM
,
0L
,
0L
,
null
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
private
void
disarm
(
String
pwd
)
throws
IOException
{
AdemcoXDataSegment
xdata
=
null
;
if
(
pwd
!=
null
&&
!
pwd
.
isEmpty
())
{
xdata
=
new
AdemcoXDataSegment
();
libademco
.
ademcoMakeXData
(
xdata
,
AdemcoXDataLengthFormat
.
TWO_HEX
,
AdemcoXDataTransform
.
AdemcoXDataTransform_as_is
,
pwd
.
getBytes
(),
pwd
.
length
());
}
libademco
.
ademcoMakeHbPacket2
(
pkt
,
nextSeq
(),
acct
,
ademco_id
,
AdemcoEvent
.
EVENT_DISARM
,
0L
,
0L
,
xdata
);
channel
.
write
(
ByteBuffer
.
wrap
(
getRawWithLen
()));
System
.
out
.
println
(
id
()
+
" S:"
+
printable_bytes
(
pkt
.
getRaw
(),
pkt
.
getRaw_len
()));
}
}
public
static
String
printable_bytes
(
byte
[]
b
)
{
return
printable_bytes
(
b
,
b
.
length
);
}
public
static
String
printable_bytes
(
byte
[]
b
,
long
length
)
{
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
byte
c
=
b
[
i
];
if
(
32
<=
c
&&
c
<=
127
)
{
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
((
b
[
i
]
>>>
4
)
&
0x0F
);
s
+=
HEX_STRING
.
charAt
(
b
[
i
]
&
0x0F
);
}
}
return
s
;
}
public
static
String
printable_bytes
(
char
[]
b
)
{
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
b
.
length
;
i
++)
{
int
c
=
b
[
i
]
&
0xFF
;
if
(
32
<=
c
&&
c
<=
127
)
{
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
(
c
>>>
4
);
s
+=
HEX_STRING
.
charAt
(
c
&
0x0F
);
}
}
return
s
;
}
public
static
String
printable_bytes
(
String
b
)
{
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
b
.
length
();
i
++)
{
char
c
=
b
.
charAt
(
i
);
if
(
32
<=
c
&&
c
<=
127
)
{
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
(
c
>>>
4
);
s
+=
HEX_STRING
.
charAt
(
c
&
0x0F
);
}
}
return
s
;
}
public
static
char
[]
append
(
char
[]
origin
,
char
[]
buf
)
{
char
[]
dst
=
new
char
[
origin
.
length
+
buf
.
length
];
System
.
arraycopy
(
origin
,
0
,
dst
,
0
,
origin
.
length
);
System
.
arraycopy
(
buf
,
0
,
dst
,
origin
.
length
,
buf
.
length
);
return
dst
;
}
public
static
byte
[]
append
(
byte
[]
origin
,
byte
[]
buf
)
{
byte
[]
dst
=
new
byte
[
origin
.
length
+
buf
.
length
];
System
.
arraycopy
(
origin
,
0
,
dst
,
0
,
origin
.
length
);
System
.
arraycopy
(
buf
,
0
,
dst
,
origin
.
length
,
buf
.
length
);
return
dst
;
}
public
byte
[]
trim
(
byte
[]
origin
,
int
pos
)
{
byte
[]
dst
=
new
byte
[
origin
.
length
-
pos
];
System
.
arraycopy
(
origin
,
pos
,
dst
,
0
,
origin
.
length
-
pos
);
return
dst
;
}
public
static
byte
[]
c2b
(
char
[]
arr
)
{
byte
[]
b
=
new
byte
[
arr
.
length
];
for
(
int
i
=
0
;
i
<
arr
.
length
;
i
++)
{
b
[
i
]
=
(
byte
)
arr
[
i
];
}
return
b
;
}
public
static
char
[]
b2c
(
byte
[]
arr
)
{
char
[]
b
=
new
char
[
arr
.
length
];
for
(
int
i
=
0
;
i
<
arr
.
length
;
i
++)
{
b
[
i
]
=
(
char
)
arr
[
i
];
}
return
b
;
}
}
This diff is collapsed.
Click to expand it.
swig/nodejs-demo.js
View file @
2e893557
...
...
@@ -12,7 +12,7 @@ function test_parse() {
var
str
=
"
\n
C5C30053
\"
HENG-BO
\"
0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019
\
r"
;
var
cb
=
libademco
.
new_size_tp
();
var
pkt
=
new
libademco
.
AdemcoPacket
();
var
res
=
libademco
.
ademcoPacketParse
(
str
,
str
.
length
,
pkt
,
cb
);
var
res
=
libademco
.
ademcoPacketParse
(
str
,
str
.
length
,
pkt
,
cb
,
null
);
assert
.
strictEqual
(
res
,
libademco
.
RESULT_OK
);
assert
.
strictEqual
(
libademco
.
size_tp_value
(
cb
),
str
.
length
);
assert
.
strictEqual
(
pkt
.
crc
,
0xC5C3
);
...
...
@@ -37,7 +37,7 @@ function test_pack() {
console
.
log
(
"test parse packed data"
);
var
pkt2
=
new
libademco
.
AdemcoPacket
();
var
cb
=
libademco
.
new_size_tp
();
var
res
=
libademco
.
ademcoPacketParse
(
pkt
.
raw
,
pkt
.
raw_len
,
pkt2
,
cb
);
var
res
=
libademco
.
ademcoPacketParse
(
pkt
.
raw
,
pkt
.
raw_len
,
pkt2
,
cb
,
null
);
assert
.
strictEqual
(
res
,
libademco
.
RESULT_OK
);
assert
.
strictEqual
(
libademco
.
size_tp_value
(
cb
),
pkt
.
raw_len
);
assert
.
strictEqual
(
pkt2
.
id
,
libademco
.
AID_HB
);
...
...
@@ -58,6 +58,7 @@ class AlarmHost {
this
.
buf
=
null
;
this
.
inpkt
=
new
libademco
.
AdemcoPacket
();
this
.
outpkt
=
new
libademco
.
AdemcoPacket
();
this
.
parseErr
=
new
libademco
.
AdemcoParseError
();
this
.
cb
=
libademco
.
new_size_tp
();
this
.
ademcoId
=
0
;
this
.
acct
=
''
;
...
...
@@ -68,14 +69,15 @@ class AlarmHost {
chunk
=
Buffer
.
concat
([
this
.
buf
,
chunk
]);
}
let
res
=
libademco
.
ademcoPacketParse
(
chunk
.
toString
(),
chunk
.
length
,
this
.
inpkt
,
this
.
cb
);
let
res
=
libademco
.
ademcoPacketParse
(
chunk
.
toString
(),
chunk
.
length
,
this
.
inpkt
,
this
.
cb
,
this
.
parseErr
);
while
(
res
===
libademco
.
RESULT_OK
)
{
chunk
=
chunk
.
slice
(
libademco
.
size_tp_value
(
this
.
cb
));
this
.
handleMsg
();
res
=
libademco
.
ademcoPacketParse
(
chunk
.
toString
(),
chunk
.
length
,
this
.
inpkt
,
this
.
cb
);
res
=
libademco
.
ademcoPacketParse
(
chunk
.
toString
(),
chunk
.
length
,
this
.
inpkt
,
this
.
cb
,
this
.
parseErr
);
}
if
(
res
===
libademco
.
RESULT_ERROR
)
{
console
.
log
(
'parse error at line=%d, msg=%s'
,
this
.
parseErr
.
line
,
this
.
parseErr
.
msg
);
chunk
=
null
;
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment