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
b01d640a
Commit
b01d640a
authored
Jul 30, 2022
by
captainwong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tested c# demo
parent
2dcbc8f7
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
295 additions
and
233 deletions
+295
-233
.gitignore
.gitignore
+2
-0
ademco.c
c/ademco.c
+39
-12
ademco.h
c/ademco.h
+3
-0
CSharpDemo.cs
c/swig/CSharpDemo.cs
+222
-0
JavaDemo.java
c/swig/JavaDemo.java
+1
-1
SimpleServerThread.java
c/swig/SimpleServerThread.java
+0
-208
libademco.swig
c/swig/libademco.swig
+18
-9
linux_java.sh
c/swig/linux_java.sh
+1
-1
mac_java.sh
c/swig/mac_java.sh
+1
-1
win_csharp.bat
c/swig/win_csharp.bat
+6
-0
win_java.bat
c/swig/win_java.bat
+1
-1
main.c
examples/ademco_demo/main.c
+1
-0
No files found.
.gitignore
View file @
b01d640a
generated/
generated/
c/swig/com/hb3344/ademco/
c/swig/com/hb3344/ademco/
libademco_java_wrap.c
libademco_java_wrap.c
libademco_csharp_wrap.c
libademco_python_wrap.c
.vscode/
.vscode/
.vs/
.vs/
...
...
c/ademco.c
View file @
b01d640a
...
@@ -13,6 +13,28 @@
...
@@ -13,6 +13,28 @@
#include <ctype.h>
#include <ctype.h>
#include <assert.h>
#include <assert.h>
#ifdef DEBUG
#define dprintf printf
#else
#define dprintf(...)
#endif
#define dline dprintf("%d\n", __LINE__);
#define dmsg dline; dprintf
#ifdef DEBUG
void
ademcoPrint
(
const
uint8_t
*
buff
,
int
len
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
if
(
isprint
(
buff
[
i
]))
{
printf
(
"%c"
,
buff
[
i
]);
}
else
{
printf
(
"
\\
x%02X"
,
buff
[
i
]);
}
}
printf
(
"
\n
"
);
}
#endif
int
ademcoIsMachineStatusEvent
(
AdemcoEvent
ademcoEvent
)
{
int
ademcoIsMachineStatusEvent
(
AdemcoEvent
ademcoEvent
)
{
return
ademcoEvent
==
EVENT_ARM
return
ademcoEvent
==
EVENT_ARM
...
@@ -780,6 +802,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -780,6 +802,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
do
{
do
{
const
uint8_t
*
p
=
buff
;
const
uint8_t
*
p
=
buff
;
if
(
*
p
++
!=
ADEMCO_PACKET_PREFIX
)
{
if
(
*
p
++
!=
ADEMCO_PACKET_PREFIX
)
{
dline
;
break
;
break
;
}
}
...
@@ -801,6 +824,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -801,6 +824,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
return
RESULT_NOT_ENOUGH
;
return
RESULT_NOT_ENOUGH
;
}
}
if
(
len_needed
>=
ADEMCO_PACKET_MAX_LEN
)
{
if
(
len_needed
>=
ADEMCO_PACKET_MAX_LEN
)
{
dline
;
return
RESULT_ERROR
;
return
RESULT_ERROR
;
}
}
...
@@ -808,28 +832,31 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -808,28 +832,31 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
const
uint8_t
*
pcr
=
pid
+
pkt
->
len
;
const
uint8_t
*
pcr
=
pid
+
pkt
->
len
;
if
(
pcr
-
buff
>
len
||
*
pcr
!=
ADEMCO_PACKET_SUFIX
)
{
if
(
pcr
-
buff
>
len
||
*
pcr
!=
ADEMCO_PACKET_SUFIX
)
{
dline
;
break
;
break
;
}
}
pkt
->
crc
=
ademcoCRC16
(
pid
,
pkt
->
len
);
pkt
->
crc
=
ademcoCRC16
(
pid
,
pkt
->
len
);
if
(
pkt
->
crc
!=
crc
)
{
if
(
pkt
->
crc
!=
crc
)
{
dline
;
break
;
break
;
}
}
// id
// id
if
(
*
pid
!=
'\"'
)
{
if
(
*
pid
!=
'\"'
)
{
dline
;
break
;
break
;
}
}
p
=
pid
+
1
;
p
=
pid
+
1
;
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'\"'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
break
;
}
if
(
p
>=
pcr
||
*
p
!=
'\"'
)
{
dline
;
break
;
}
pkt
->
id
=
getAdemcoPacketId
((
const
char
*
)
pid
,
++
p
-
pid
);
pkt
->
id
=
getAdemcoPacketId
((
const
char
*
)
pid
,
++
p
-
pid
);
if
(
pkt
->
id
==
AID_INVALID
)
{
break
;
}
if
(
pkt
->
id
==
AID_INVALID
)
{
dline
;
break
;
}
// seq
// seq
const
uint8_t
*
pseq
=
p
;
const
uint8_t
*
pseq
=
p
;
while
(
p
<
pcr
&&
*
p
!=
'R'
&&
*
p
!=
'L'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'R'
&&
*
p
!=
'L'
)
{
p
++
;
}
if
(
p
-
pseq
!=
4
||
(
*
p
!=
'R'
&&
*
p
!=
'L'
))
{
break
;
}
if
(
p
-
pseq
!=
4
||
(
*
p
!=
'R'
&&
*
p
!=
'L'
))
{
dline
;
break
;
}
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
memcpy
(
temp
,
pseq
,
4
);
temp
[
4
]
=
'\0'
;
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
)
&
0xFFFF
;
pkt
->
seq
=
strtoul
(
temp
,
NULL
,
10
)
&
0xFFFF
;
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
if
(
pkt
->
seq
>=
10000
)
{
pkt
->
seq
=
0
;
}
...
@@ -838,16 +865,16 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -838,16 +865,16 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if
(
*
p
==
'R'
)
{
// rrcvr exists
if
(
*
p
==
'R'
)
{
// rrcvr exists
const
uint8_t
*
prcvr
=
p
;
const
uint8_t
*
prcvr
=
p
;
while
(
p
<
pcr
&&
*
p
!=
'L'
&&
*
p
!=
'#'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'L'
&&
*
p
!=
'#'
)
{
p
++
;
}
if
(
p
>=
pcr
||
(
*
p
!=
'L'
&&
*
p
!=
'#'
))
{
break
;
}
if
(
p
>=
pcr
||
(
*
p
!=
'L'
&&
*
p
!=
'#'
))
{
dline
;
break
;
}
// only check if format is correct, ignore it's content
// only check if format is correct, ignore it's content
}
else
if
(
*
p
==
'L'
)
{
// rrcvr not exits
}
else
if
(
*
p
==
'L'
)
{
// rrcvr not exits
// pass
// pass
}
else
{
}
else
{
break
;
dline
;
break
;
}
}
// lpref
// lpref
if
(
*
p
!=
'L'
)
{
break
;
}
if
(
*
p
!=
'L'
)
{
dline
;
break
;
}
while
(
p
<
pcr
&&
*
p
!=
'#'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
'#'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
'#'
)
{
break
;
}
if
(
p
>=
pcr
||
*
p
!=
'#'
)
{
break
;
}
// only check if format is correct, ignore it's content
// only check if format is correct, ignore it's content
...
@@ -859,15 +886,15 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -859,15 +886,15 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if
(
!
isalnum
(
*
p
))
{
p
=
NULL
;
break
;
}
if
(
!
isalnum
(
*
p
))
{
p
=
NULL
;
break
;
}
p
++
;
p
++
;
}
}
if
(
p
==
NULL
||
p
>=
pcr
||
*
p
!=
'['
||
p
-
pacct
>=
ADEMCO_PACKET_ACCT_MAX_LEN
)
{
break
;
}
if
(
p
==
NULL
||
p
>=
pcr
||
*
p
!=
'['
||
p
-
pacct
>=
ADEMCO_PACKET_ACCT_MAX_LEN
)
{
dline
;
break
;
}
strncpy
(
pkt
->
acct
,
(
const
char
*
)
pacct
,
p
-
pacct
);
strncpy
(
pkt
->
acct
,
(
const
char
*
)
pacct
,
p
-
pacct
);
pkt
->
acct
[
p
-
pacct
]
=
'\0'
;
pkt
->
acct
[
p
-
pacct
]
=
'\0'
;
// data
// data
const
uint8_t
*
pdata
=
p
;
const
uint8_t
*
pdata
=
p
;
while
(
p
<
pcr
&&
*
p
!=
']'
)
{
p
++
;
}
while
(
p
<
pcr
&&
*
p
!=
']'
)
{
p
++
;
}
if
(
p
>=
pcr
||
*
p
!=
']'
)
{
break
;
}
if
(
p
>=
pcr
||
*
p
!=
']'
)
{
dline
;
break
;
}
if
(
ademcoParseDataSegment
(
pdata
,
++
p
-
pdata
,
&
pkt
->
data
)
!=
RESULT_OK
)
{
break
;
}
if
(
ademcoParseDataSegment
(
pdata
,
++
p
-
pdata
,
&
pkt
->
data
)
!=
RESULT_OK
)
{
dline
;
break
;
}
// *xdata
// *xdata
if
(
*
p
==
'['
)
{
// xdata exists
if
(
*
p
==
'['
)
{
// xdata exists
...
@@ -889,7 +916,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -889,7 +916,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
p
+=
2
+
valid_len
;
p
+=
2
+
valid_len
;
}
}
if
(
p
>=
pcr
||
*
p
!=
']'
||
*
(
p
+
1
)
!=
'_'
)
{
break
;
}
if
(
p
>=
pcr
||
*
p
!=
']'
||
*
(
p
+
1
)
!=
'_'
)
{
dline
;
break
;
}
pkt
->
xdata
.
lenghFormat
=
xlf
;
pkt
->
xdata
.
lenghFormat
=
xlf
;
pkt
->
xdata
.
raw_len
=
++
p
-
pxdata
;
pkt
->
xdata
.
raw_len
=
++
p
-
pxdata
;
memcpy
(
pkt
->
xdata
.
raw
,
pxdata
,
pkt
->
xdata
.
raw_len
);
memcpy
(
pkt
->
xdata
.
raw
,
pxdata
,
pkt
->
xdata
.
raw_len
);
...
@@ -898,7 +925,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -898,7 +925,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
}
}
// timestamp
// timestamp
if
(
pcr
-
p
!=
ADEMCO_PACKET_TIMESTAMP_LEN
)
{
break
;
}
if
(
pcr
-
p
!=
ADEMCO_PACKET_TIMESTAMP_LEN
)
{
dline
;
break
;
}
{
{
struct
tm
tm
;
struct
tm
tm
;
int
ret
=
sscanf
((
const
char
*
)
p
,
"_%02d:%02d:%02d,%02d-%02d-%04d"
,
int
ret
=
sscanf
((
const
char
*
)
p
,
"_%02d:%02d:%02d,%02d-%02d-%04d"
,
...
@@ -918,7 +945,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
...
@@ -918,7 +945,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
p
+=
ADEMCO_PACKET_TIMESTAMP_LEN
;
p
+=
ADEMCO_PACKET_TIMESTAMP_LEN
;
}
}
if
(
p
++
!=
pcr
)
{
break
;
}
if
(
p
++
!=
pcr
)
{
dline
;
break
;
}
pkt
->
raw_len
=
*
cb_commited
=
p
-
buff
;
pkt
->
raw_len
=
*
cb_commited
=
p
-
buff
;
if
(
pkt
->
raw
!=
buff
)
{
if
(
pkt
->
raw
!=
buff
)
{
memcpy
(
pkt
->
raw
,
buff
,
pkt
->
raw_len
);
memcpy
(
pkt
->
raw
,
buff
,
pkt
->
raw_len
);
...
...
c/ademco.h
View file @
b01d640a
...
@@ -351,6 +351,9 @@ typedef struct AdemcoPacket {
...
@@ -351,6 +351,9 @@ typedef struct AdemcoPacket {
// Functions
// Functions
#ifdef DEBUG
void
ademcoPrint
(
const
uint8_t
*
buff
,
int
len
);
#endif
//! 是否主机状态事件
//! 是否主机状态事件
ADEMCO_EXPORT_SYMBOL
int
ademcoIsMachineStatusEvent
(
AdemcoEvent
ademcoEvent
);
ADEMCO_EXPORT_SYMBOL
int
ademcoIsMachineStatusEvent
(
AdemcoEvent
ademcoEvent
);
//! 是否主机类型事件
//! 是否主机类型事件
...
...
c/swig/CSharpDemo.cs
0 → 100644
View file @
b01d640a
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_int
cb
=
libademco
.
new_intp
();
AdemcoPacket
pkt
=
new
AdemcoPacket
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
raw
,
raw
.
Length
,
pkt
,
cb
);
Debug
.
Assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
Debug
.
Assert
(
libademco
.
intp_value
(
cb
)
==
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
.
intp_value
(
cb
));
}
// test pack
{
Console
.
WriteLine
(
"test pack"
);
byte
[]
buff
=
new
byte
[
1024
];
int
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_int
cb
=
libademco
.
new_intp
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
buff
,
len
,
pkt
,
cb
);
Debug
.
Assert
(
res
==
AdemcoParseResult
.
RESULT_OK
);
Debug
.
Assert
(
libademco
.
intp_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
];
int
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_int
cb
=
libademco
.
new_intp
();
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
,
buff
.
Length
,
pkt
,
cb
);
switch
(
res
){
case
AdemcoParseResult
.
RESULT_OK
:
Console
.
Write
(
"C:"
);
libademco
.
ademcoPrint
(
buff
,
libademco
.
intp_value
(
cb
));
buff
=
eat
(
buff
,
libademco
.
intp_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
];
int
len
=
libademco
.
ademcoMakeAckPacket
(
buff
,
1024
,
seq
,
acct
,
0
);
Console
.
Write
(
"S:"
);
libademco
.
ademcoPrint
(
buff
,
len
);
stream
.
Write
(
buff
,
0
,
len
);
}
static
void
sendArm
(
NetworkStream
stream
,
ushort
seq
,
string
acct
,
uint
ademcoId
){
byte
[]
buff
=
new
byte
[
1024
];
int
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
,
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
),
pwd
.
Length
);
}
int
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
,
len
);
}
}
}
c/swig/JavaDemo.java
View file @
b01d640a
...
@@ -13,7 +13,7 @@ import com.hb3344.ademco.*;
...
@@ -13,7 +13,7 @@ import com.hb3344.ademco.*;
public
class
JavaDemo
{
public
class
JavaDemo
{
static
{
static
{
try
{
try
{
System
.
loadLibrary
(
"ademco"
);
System
.
loadLibrary
(
"ademco
_java
"
);
}
catch
(
UnsatisfiedLinkError
e
)
{
}
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
.
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
);
System
.
exit
(
1
);
...
...
c/swig/SimpleServerThread.java
deleted
100644 → 0
View file @
2dcbc8f7
import
java.io.*
;
import
java.net.*
;
import
java.util.Arrays
;
import
java.util.regex.*
;
import
com.hb3344.ademco.AdemcoPacket
;
import
com.hb3344.ademco.AdemcoPacketId
;
import
com.hb3344.ademco.AdemcoParseResult
;
import
com.hb3344.ademco.SWIGTYPE_p_int
;
import
com.hb3344.ademco.libademco
;
public
class
SimpleServerThread
extends
Thread
{
private
Socket
socket
;
private
long
lastTimeStatusChange
=
0
;
public
SimpleServerThread
(
Socket
socket
)
{
this
.
socket
=
socket
;
}
/**
* 16进制表示的字符串转换为字节数组
*
* @param s 16进制表示的字符串
* @return byte[] 字节数组
*/
public
static
byte
[]
hexStringToByteArray
(
String
s
)
{
int
len
=
s
.
length
();
byte
[]
b
=
new
byte
[
len
/
2
];
for
(
int
i
=
0
;
i
<
len
;
i
+=
2
)
{
// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
b
[
i
/
2
]
=
(
byte
)
((
Character
.
digit
(
s
.
charAt
(
i
),
16
)
<<
4
)
+
Character
.
digit
(
s
.
charAt
(
i
+
1
),
16
));
}
return
b
;
}
public
static
String
printable_bytes
(
byte
[]
b
){
String
HEX_STRING
=
"0123456789ABCDEF"
;
String
s
=
""
;
for
(
int
i
=
0
;
i
<
b
.
length
;
i
++){
byte
c
=
b
[
i
];
if
(
32
<=
c
&&
c
<=
127
){
s
+=
(
char
)
c
;
}
else
{
s
+=
"\\x"
+
HEX_STRING
.
charAt
(
b
[
i
]
>>>
4
);
s
+=
HEX_STRING
.
charAt
(
b
[
i
]
&
0x0F
);
}
}
return
s
;
}
public
void
run
()
{
try
{
InputStream
input
=
socket
.
getInputStream
();
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(
input
));
OutputStream
output
=
socket
.
getOutputStream
();
PrintWriter
writer
=
new
PrintWriter
(
output
,
true
);
// String line;
// // 创建 Pattern 对象
// String pattern1 = "\"(.+)\"(\\d{4}).+\\#(.+)\\[";
// Pattern r1 = Pattern.compile(pattern1);
// String pattern2 = "\\[\\#([\\d\\|a-fA-F]{6})\\|(\\d{4})\\s(\\d{2})\\s(\\d{3})\\]";
// Pattern r2 = Pattern.compile(pattern2);
//char[] cache = new char[0];
while
(
true
){
String
line
=
reader
.
readLine
();
System
.
out
.
println
(
line
);
//cache = append(cache, b2c(line.getBytes()));
SWIGTYPE_p_int
cb
=
libademco
.
new_intp
();
AdemcoPacket
pkt
=
new
AdemcoPacket
();
AdemcoParseResult
res
=
libademco
.
ademcoPacketParse
(
line
.
getBytes
(),
line
.
length
(),
pkt
,
cb
);
System
.
out
.
println
(
res
);
switch
(
res
)
{
case
RESULT_OK:
//cache = Arrays.copyOfRange(cache, libademco.intp_value(cb), cache.length - libademco.intp_value(cb));
handle
(
pkt
,
writer
);
break
;
case
RESULT_NOT_ENOUGH:
break
;
case
RESULT_ERROR:
//cache = new char[0];
break
;
}
//line = reader.readLine();
//if(line==null)continue;
//System.out.println(line);
// // 现在创建 matcher 对象
// Matcher m = r1.matcher(line);
// if (m.find()) {
// String id = m.group(1);
// int seq = Integer.parseInt(m.group(2));
// String acct = m.group(3);
// System.out.println("Found id: " + id);
// System.out.println("Found seq: " + seq);
// System.out.println("Found acct: " + acct);
// switch(id){
// case "ACK":break;
// case "NULL": // reply ack
// {
// String ack = lib.packAck(seq, acct);
// System.out.println("replying ack:" + ack);
// writer.write(ack);
// writer.flush();
// break;
// }
// case "HENG-BO":
// case "ADM-CID":
// {
// // reply ack
// String ack = lib.packAck(seq, acct);
// System.out.println("replying ack:" + ack);
// writer.write(ack);
// writer.flush();
// // handle event
// m = r2.matcher(line);
// if (m.find()) {
// int ademco_id16 = Integer.parseInt(m.group(1), 16);
// int ademco_event = Integer.parseInt(m.group(2));
// int gg = Integer.parseInt(m.group(3));
// int zone = Integer.parseInt(m.group(4));
// System.out.println("Found ademco_event: " + ademco_event);
// System.out.println("Found gg: " + gg);
// System.out.println("Found zone: " + zone);
// // 主机状态改变间隔超过5秒,则触发一次远程控制命令发送给主机
// if(ademco_event == 3400 || ademco_event == 1400){
// long now = System.currentTimeMillis();
// if(now - lastTimeStatusChange > 5000){
// lastTimeStatusChange = now;
// if(ademco_event == 3400){ // 布防则发撤防命令
// String cmd = lib.pack2(seq+1, acct, ademco_id16, 1400, 0, 0, "123456");
// byte[] data = hexStringToByteArray(cmd);
// System.out.println("sending 1400 command:" + printable_bytes(data));
// output.write(data);
// output.flush();
// }else{ // 撤防就发布防命令
// String cmd = lib.pack(seq+1, acct, ademco_id16, 3400, 0, 0);
// System.out.println("sending 3400 command:" + cmd);
// writer.write(ack);
// writer.flush();
// }
// }
// }
// }else{
// System.out.println("r2 NO MATCH");
// }
// break;
// }
// }
// } else {
// System.out.println("r1 NO MATCH");
// }
}
}
catch
(
IOException
ex
)
{
System
.
out
.
println
(
"Server exception: "
+
ex
.
getMessage
());
ex
.
printStackTrace
();
}
}
public
void
handle
(
AdemcoPacket
pkt
,
PrintWriter
writer
){
switch
(
pkt
.
getId
()){
case
AID_NULL:
libademco
.
ademcoMakeAckPacket2
(
pkt
,
pkt
.
getSeq
(),
pkt
.
getAcct
(),
0
l
);
writer
.
write
(
b2c
(
pkt
.
getRaw
()),
pkt
.
getRaw_len
(),
0
);
break
;
case
AID_ACK:
break
;
case
AID_HB:
case
AID_ADM_CID:
}
}
}
\ No newline at end of file
c/swig/libademco.swig
View file @
b01d640a
%module libademco
%module libademco
%include "constraints.i"
%include "constraints.i"
%include "typemaps.i"
%include "typemaps.i"
%include "cpointer.i"
%include "cpointer.i"
%include "stdint.i"
%include "stdint.i"
#ifdef SWIGJAVA
%include "arrays_java.i";
%include "arrays_java.i";
%include "enums.swg" /*NB: requires JDK-1.5+
%include "enums.swg" /*NB: requires JDK-1.5+
See: http://www.swig.org/Doc1.3/Java.html#enumerations */
See: http://www.swig.org/Doc1.3/Java.html#enumerations */
#elif defined SWIGCSHARP
%include "arrays_csharp.i";
#endif
%{
%{
/* Includes the header in the wrapper code */
/* Includes the header in the wrapper code */
#include "../ademco.h"
#include "../ademco.h"
%}
%}
#ifdef SWIGJAVA
// from arrays_java.i (signed char)
// from arrays_java.i (signed char)
JAVA_ARRAYS_DECL(uint8_t, jbyte, Byte, Uint8)
JAVA_ARRAYS_DECL(uint8_t, jbyte, Byte, Uint8)
JAVA_ARRAYS_IMPL(uint8_t, jbyte, Byte, Uint8)
JAVA_ARRAYS_IMPL(uint8_t, jbyte, Byte, Uint8)
JAVA_ARRAYS_TYPEMAPS(uint8_t, byte, jbyte, Uint8, "[B")
JAVA_ARRAYS_TYPEMAPS(uint8_t, byte, jbyte, Uint8, "[B")
%apply uint8_t[] { uint8_t* }
%apply uint8_t[] { uint8_t* }
#elif defined SWIGCSHARP
%apply uint8_t INPUT[] {const uint8_t*}
%apply uint8_t OUTPUT[] {uint8_t*}
#endif
%pointer_functions(int, intp);
%pointer_functions(int, intp);
%pointer_functions(uint16_t, uint16p);
%pointer_functions(uint16_t, uint16p);
%pointer_functions(uint32_t, uint32p);
%pointer_functions(uint32_t, uint32p);
/* Parse the header file to generate wrappers */
/* Parse the header file to generate wrappers */
%include "../ademco.h"
%include "../ademco.h"
c/swig/linux_java.sh
View file @
b01d640a
...
@@ -5,6 +5,6 @@ swig -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_jav
...
@@ -5,6 +5,6 @@ swig -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_jav
JAVA_INCLUDE
=
/usr/lib/jvm/java-8-openjdk-amd64/include
JAVA_INCLUDE
=
/usr/lib/jvm/java-8-openjdk-amd64/include
JAVA_INCLUDE_OS
=
${
JAVA_INCLUDE
}
/linux
JAVA_INCLUDE_OS
=
${
JAVA_INCLUDE
}
/linux
cc
-fpic
-c
../ademco.c libademco_java_wrap.c
-I
"../"
-I
${
JAVA_INCLUDE
}
-I
${
JAVA_INCLUDE_OS
}
cc
-fpic
-c
../ademco.c libademco_java_wrap.c
-I
"../"
-I
${
JAVA_INCLUDE
}
-I
${
JAVA_INCLUDE_OS
}
ld
-shared
ademco.o libademco_java_wrap.o
-o
libademco.so
ld
-shared
ademco.o libademco_java_wrap.o
-o
libademco
_java
.so
javac JavaDemo.java
javac JavaDemo.java
java
-Djava
.library.path
=
./ JavaDemo
java
-Djava
.library.path
=
./ JavaDemo
\ No newline at end of file
c/swig/mac_java.sh
View file @
b01d640a
...
@@ -5,6 +5,6 @@ swig -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_jav
...
@@ -5,6 +5,6 @@ swig -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_jav
JAVA_INCLUDE
=
/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/include
JAVA_INCLUDE
=
/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/include
JAVA_INCLUDE_OS
=
${
JAVA_INCLUDE
}
/darwin
JAVA_INCLUDE_OS
=
${
JAVA_INCLUDE
}
/darwin
gcc
-fpic
-c
../ademco.c libademco_java_wrap.c
-I
"../"
-I
${
JAVA_INCLUDE
}
-I
${
JAVA_INCLUDE_OS
}
gcc
-fpic
-c
../ademco.c libademco_java_wrap.c
-I
"../"
-I
${
JAVA_INCLUDE
}
-I
${
JAVA_INCLUDE_OS
}
gcc
-shared
ademco.o libademco_java_wrap.o
-o
libademco.dylib
gcc
-shared
ademco.o libademco_java_wrap.o
-o
libademco
_java
.dylib
javac JavaDemo.java
javac JavaDemo.java
java
-Djava
.library.path
=
./ JavaDemo
java
-Djava
.library.path
=
./ JavaDemo
c/swig/win_csharp.bat
0 → 100644
View file @
b01d640a
mkdir com\hb3344\ademco
"C:\Users\Jack\Downloads\swigwin-3.0.12\swig.exe" -DDEBUG=1 -csharp -namespace com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_csharp_wrap.c libademco.swig
cl -c -DDEBUG=1 ../ademco.c libademco_csharp_wrap.c -I"../"
cl -LD ademco.obj libademco_csharp_wrap.obj -o libademco.dll
csc CSharpDemo.cs -recurse:com/hb3344/ademco/*.cs
CSharpDemo.exe
c/swig/win_java.bat
View file @
b01d640a
mkdir com\hb3344\ademco
mkdir com\hb3344\ademco
"C:\Users\Jack\Downloads\swigwin-3.0.12\swig.exe" -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_java_wrap.c libademco.swig
"C:\Users\Jack\Downloads\swigwin-3.0.12\swig.exe" -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_java_wrap.c libademco.swig
cl -c ../ademco.c libademco_java_wrap.c -I"../" -I"%JAVA_HOME%include" -I"%JAVA_HOME%include/win32"
cl -c ../ademco.c libademco_java_wrap.c -I"../" -I"%JAVA_HOME%include" -I"%JAVA_HOME%include/win32"
cl -LD ademco.obj libademco_java_wrap.obj -o ademco.dll
cl -LD ademco.obj libademco_java_wrap.obj -o ademco
_java
.dll
javac -encoding utf-8 JavaDemo.java
javac -encoding utf-8 JavaDemo.java
java JavaDemo
java JavaDemo
examples/ademco_demo/main.c
View file @
b01d640a
...
@@ -38,6 +38,7 @@ int main()
...
@@ -38,6 +38,7 @@ int main()
// 解析完整数据包
// 解析完整数据包
{
{
char
raw
[]
=
"
\n
C5C30053
\"
HENG-BO
\"
0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019
\r
"
;
char
raw
[]
=
"
\n
C5C30053
\"
HENG-BO
\"
0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019
\r
"
;
//char raw[] = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#90219125916578|1737 00 000]_09:11:19,08-05-2019\r";
AdemcoParseResult
res
=
ademcoPacketParse
(
raw
,
(
int
)
strlen
(
raw
),
&
pkt
,
&
cb_commited
);
AdemcoParseResult
res
=
ademcoPacketParse
(
raw
,
(
int
)
strlen
(
raw
),
&
pkt
,
&
cb_commited
);
assert
(
res
==
RESULT_OK
);
assert
(
res
==
RESULT_OK
);
}
}
...
...
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