Commit 2e893557 authored by captainwong's avatar captainwong

update swig demos

parent 6a75e9e7
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);
}
}
}
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", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, 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", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, 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", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, 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", 0l);
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, "", 666666l);
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(), 0l);
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", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, 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", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, 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", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, 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", 0l);
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, "", 666666l);
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(), 0l);
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;
}
}
......@@ -12,7 +12,7 @@ function test_parse() {
var str = "\nC5C30053\"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;
}
......
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