Commit 2e893557 authored by captainwong's avatar captainwong

update swig demos

parent 6a75e9e7
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.IO; using System.IO;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using com.hb3344.ademco; using com.hb3344.ademco;
namespace CSharpDemo namespace CSharpDemo
{ {
class Program class Program
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
// test parse // test parse
{ {
Console.WriteLine("test parse"); Console.WriteLine("test parse");
string str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"; string str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r";
byte[] raw = Encoding.ASCII.GetBytes(str); byte[] raw = Encoding.ASCII.GetBytes(str);
SWIGTYPE_p_size_t cb = libademco.new_size_tp(); SWIGTYPE_p_size_t cb = libademco.new_size_tp();
AdemcoPacket pkt = new AdemcoPacket(); AdemcoPacket pkt = new AdemcoPacket();
AdemcoParseResult res = libademco.ademcoPacketParse(raw, (uint)raw.Length, pkt, cb); AdemcoParseResult res = libademco.ademcoPacketParse(raw, (uint)raw.Length, pkt, cb, null);
Debug.Assert(res == AdemcoParseResult.RESULT_OK); Debug.Assert(res == AdemcoParseResult.RESULT_OK);
Debug.Assert(libademco.size_tp_value(cb) == (uint)str.Length); Debug.Assert(libademco.size_tp_value(cb) == (uint)str.Length);
Debug.Assert(pkt.crc == 0xC5C3); Debug.Assert(pkt.crc == 0xC5C3);
Debug.Assert(pkt.len == 0x0053); Debug.Assert(pkt.len == 0x0053);
Debug.Assert(pkt.id == AdemcoPacketId.AID_HB); Debug.Assert(pkt.id == AdemcoPacketId.AID_HB);
Debug.Assert(pkt.seq == 0); Debug.Assert(pkt.seq == 0);
Debug.Assert(pkt.acct == "90219125916578"); Debug.Assert(pkt.acct == "90219125916578");
Debug.Assert(pkt.data.ademcoId == 0); Debug.Assert(pkt.data.ademcoId == 0);
Debug.Assert(pkt.data.ademcoEvent == AdemcoEvent.EVENT_I_AM_WIRE_MACHINE); Debug.Assert(pkt.data.ademcoEvent == AdemcoEvent.EVENT_I_AM_WIRE_MACHINE);
Debug.Assert(pkt.data.gg == 0); Debug.Assert(pkt.data.gg == 0);
Debug.Assert(pkt.data.zone == 0); Debug.Assert(pkt.data.zone == 0);
Console.WriteLine("res={0:D}, commited={1:D}", res, libademco.size_tp_value(cb)); Console.WriteLine("res={0:D}, commited={1:D}", res, libademco.size_tp_value(cb));
} }
// test pack // test pack
{ {
Console.WriteLine("test pack"); Console.WriteLine("test pack");
byte[] buff = new byte[1024]; byte[] buff = new byte[1024];
uint len = libademco.ademcoMakeHbPacket(buff, 1024, 1, "861234567890", 666666, AdemcoEvent.EVENT_ARM, 0, 0, null); uint len = libademco.ademcoMakeHbPacket(buff, 1024, 1, "861234567890", 666666, AdemcoEvent.EVENT_ARM, 0, 0, null);
Debug.Assert(len > 0); Debug.Assert(len > 0);
Console.WriteLine("len={0:D}", len); Console.WriteLine("len={0:D}", len);
libademco.ademcoPrint(buff, len); libademco.ademcoPrint(buff, len);
Console.WriteLine("test parse packed data"); Console.WriteLine("test parse packed data");
AdemcoPacket pkt = new AdemcoPacket(); AdemcoPacket pkt = new AdemcoPacket();
SWIGTYPE_p_size_t cb = libademco.new_size_tp(); SWIGTYPE_p_size_t cb = libademco.new_size_tp();
AdemcoParseResult res = libademco.ademcoPacketParse(buff, len, pkt, cb); AdemcoParseResult res = libademco.ademcoPacketParse(buff, len, pkt, cb, null);
Debug.Assert(res == AdemcoParseResult.RESULT_OK); Debug.Assert(res == AdemcoParseResult.RESULT_OK);
Debug.Assert(libademco.size_tp_value(cb) == len); Debug.Assert(libademco.size_tp_value(cb) == len);
Debug.Assert(pkt.id == AdemcoPacketId.AID_HB); Debug.Assert(pkt.id == AdemcoPacketId.AID_HB);
Debug.Assert(pkt.seq == 1); Debug.Assert(pkt.seq == 1);
Debug.Assert(pkt.acct == "861234567890"); Debug.Assert(pkt.acct == "861234567890");
Debug.Assert(pkt.data.ademcoId == 666666); Debug.Assert(pkt.data.ademcoId == 666666);
Debug.Assert(pkt.data.ademcoEvent == AdemcoEvent.EVENT_ARM); Debug.Assert(pkt.data.ademcoEvent == AdemcoEvent.EVENT_ARM);
Debug.Assert(pkt.data.gg == 0); Debug.Assert(pkt.data.gg == 0);
Debug.Assert(pkt.data.zone == 0); Debug.Assert(pkt.data.zone == 0);
} }
// test pack // test pack
// buff not enough // buff not enough
{ {
Console.WriteLine("test pack, buff not enough"); Console.WriteLine("test pack, buff not enough");
Byte[] buff = new Byte[10]; Byte[] buff = new Byte[10];
uint len = libademco.ademcoMakeHbPacket(buff, 10, 1, "861234567890", 666666, AdemcoEvent.EVENT_ARM, 0, 0, null); uint len = libademco.ademcoMakeHbPacket(buff, 10, 1, "861234567890", 666666, AdemcoEvent.EVENT_ARM, 0, 0, null);
Debug.Assert(len == 0); Debug.Assert(len == 0);
} }
Console.WriteLine(""); Console.WriteLine("");
simpleServer(12345); simpleServer(12345);
} }
static void simpleServer(int port) static void simpleServer(int port)
{ {
Console.WriteLine("running simpleServer {0:D}", port); Console.WriteLine("running simpleServer {0:D}", port);
try try
{ {
var listener = new TcpListener(IPAddress.Any, port); var listener = new TcpListener(IPAddress.Any, port);
listener.Start(); listener.Start();
while (true) while (true)
{ {
TcpClient client = listener.AcceptTcpClient(); TcpClient client = listener.AcceptTcpClient();
Thread thread = new Thread(new ParameterizedThreadStart(clientHandler)); Thread thread = new Thread(new ParameterizedThreadStart(clientHandler));
thread.Start(client); thread.Start(client);
} }
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine(e.Message); Console.WriteLine(e.Message);
} }
} }
static byte[] append(byte[] origin, byte[] buf, int len) static byte[] append(byte[] origin, byte[] buf, int len)
{ {
byte[] dst = new byte[origin.Length + len]; byte[] dst = new byte[origin.Length + len];
Array.ConstrainedCopy(origin, 0, dst, 0, origin.Length); Array.ConstrainedCopy(origin, 0, dst, 0, origin.Length);
Array.ConstrainedCopy(buf, 0, dst, origin.Length, len); Array.ConstrainedCopy(buf, 0, dst, origin.Length, len);
return dst; return dst;
} }
static byte[] eat(byte[] origin, int len) static byte[] eat(byte[] origin, int len)
{ {
if (origin.Length == len) { return new byte[0]; } if (origin.Length == len) { return new byte[0]; }
byte[] dst = new byte[origin.Length - len]; byte[] dst = new byte[origin.Length - len];
Array.ConstrainedCopy(origin, len, dst, 0, origin.Length - len); Array.ConstrainedCopy(origin, len, dst, 0, origin.Length - len);
return dst; return dst;
} }
static ushort nextSeq(ushort seq) static ushort nextSeq(ushort seq)
{ {
if (++seq == 10000) { seq = 1; } if (++seq == 10000) { seq = 1; }
return seq; return seq;
} }
static void clientHandler(object cli) static void clientHandler(object cli)
{ {
TcpClient client = (TcpClient)cli; TcpClient client = (TcpClient)cli;
NetworkStream stream = client.GetStream(); NetworkStream stream = client.GetStream();
AdemcoPacket pkt = new AdemcoPacket(); AdemcoPacket pkt = new AdemcoPacket();
SWIGTYPE_p_size_t cb = libademco.new_size_tp(); SWIGTYPE_p_size_t cb = libademco.new_size_tp();
byte[] buff = new byte[0]; byte[] buff = new byte[0];
int nread = 0; int nread = 0;
uint ademco_id = 0; uint ademco_id = 0;
string acct = ""; string acct = "";
HbMachineType type = HbMachineType.HMT_INVALID; HbMachineType type = HbMachineType.HMT_INVALID;
HbMachineStatus status = HbMachineStatus.HMS_INVALID; HbMachineStatus status = HbMachineStatus.HMS_INVALID;
ushort seq = 0; ushort seq = 0;
int counter = 1; int counter = 1;
while (true) while (true)
{ {
byte[] msg = new byte[1024]; byte[] msg = new byte[1024];
try try
{ {
nread = stream.Read(msg, 0, 1024); nread = stream.Read(msg, 0, 1024);
} }
catch catch
{ {
break; break;
} }
if (nread == 0) { break; } if (nread == 0) { break; }
buff = append(buff, msg, nread); buff = append(buff, msg, nread);
AdemcoParseResult res = AdemcoParseResult.RESULT_OK; AdemcoParseResult res = AdemcoParseResult.RESULT_OK;
while (res == AdemcoParseResult.RESULT_OK) while (res == AdemcoParseResult.RESULT_OK)
{ {
res = libademco.ademcoPacketParse(buff, (uint)buff.Length, pkt, cb); res = libademco.ademcoPacketParse(buff, (uint)buff.Length, pkt, cb, null);
switch (res) switch (res)
{ {
case AdemcoParseResult.RESULT_OK: case AdemcoParseResult.RESULT_OK:
Console.Write("C:"); libademco.ademcoPrint(buff, libademco.size_tp_value(cb)); Console.Write("C:"); libademco.ademcoPrint(buff, libademco.size_tp_value(cb));
buff = eat(buff, (int)libademco.size_tp_value(cb)); buff = eat(buff, (int)libademco.size_tp_value(cb));
switch (pkt.id) switch (pkt.id)
{ {
case AdemcoPacketId.AID_NULL: case AdemcoPacketId.AID_NULL:
replyAck(stream, pkt.seq, pkt.acct); replyAck(stream, pkt.seq, pkt.acct);
break; break;
case AdemcoPacketId.AID_HB: case AdemcoPacketId.AID_HB:
case AdemcoPacketId.AID_ADM_CID: case AdemcoPacketId.AID_ADM_CID:
replyAck(stream, pkt.seq, pkt.acct); replyAck(stream, pkt.seq, pkt.acct);
acct = pkt.acct; acct = pkt.acct;
ademco_id = pkt.data.ademcoId; ademco_id = pkt.data.ademcoId;
if (libademco.ademcoIsMachineTypeEvent(pkt.data.ademcoEvent) != 0) if (libademco.ademcoIsMachineTypeEvent(pkt.data.ademcoEvent) != 0)
{ {
type = libademco.hbMachineTypeFromAdemcoEvent(pkt.data.ademcoEvent); type = libademco.hbMachineTypeFromAdemcoEvent(pkt.data.ademcoEvent);
} }
if (libademco.ademcoIsMachineStatusEvent(pkt.data.ademcoEvent) != 0) if (libademco.ademcoIsMachineStatusEvent(pkt.data.ademcoEvent) != 0)
{ {
status = libademco.hbMachineStatusFromAdemcoEvent(pkt.data.ademcoEvent); status = libademco.hbMachineStatusFromAdemcoEvent(pkt.data.ademcoEvent);
} }
// 演示如何进行布撤防,真实项目里可以删改本段 // 演示如何进行布撤防,真实项目里可以删改本段
if (++counter % 5 == 0) if (++counter % 5 == 0)
{ {
if (status == HbMachineStatus.HMS_ARM) if (status == HbMachineStatus.HMS_ARM)
{ {
sendDisarm(stream, nextSeq(seq), acct, ademco_id, "123456"); sendDisarm(stream, nextSeq(seq), acct, ademco_id, "123456");
} }
else else
{ {
sendArm(stream, nextSeq(seq), acct, ademco_id); sendArm(stream, nextSeq(seq), acct, ademco_id);
} }
} }
break; break;
default: default:
break; break;
} }
break; break;
case AdemcoParseResult.RESULT_ERROR: case AdemcoParseResult.RESULT_ERROR:
buff = new byte[0]; buff = new byte[0];
break; break;
} }
} }
} }
} }
static void replyAck(NetworkStream stream, ushort seq, string acct) static void replyAck(NetworkStream stream, ushort seq, string acct)
{ {
byte[] buff = new byte[1024]; byte[] buff = new byte[1024];
uint len = libademco.ademcoMakeAckPacket(buff, 1024, seq, acct, 0); uint len = libademco.ademcoMakeAckPacket(buff, 1024, seq, acct, 0);
Console.Write("S:"); Console.Write("S:");
libademco.ademcoPrint(buff, len); libademco.ademcoPrint(buff, len);
stream.Write(buff, 0, (int)len); stream.Write(buff, 0, (int)len);
} }
static void sendArm(NetworkStream stream, ushort seq, string acct, uint ademcoId) static void sendArm(NetworkStream stream, ushort seq, string acct, uint ademcoId)
{ {
byte[] buff = new byte[1024]; byte[] buff = new byte[1024];
uint len = libademco.ademcoMakeHbPacket(buff, 1024, seq, acct, ademcoId, AdemcoEvent.EVENT_ARM, 0, 0, null); uint len = libademco.ademcoMakeHbPacket(buff, 1024, seq, acct, ademcoId, AdemcoEvent.EVENT_ARM, 0, 0, null);
Console.Write("S:"); Console.Write("S:");
libademco.ademcoPrint(buff, len); libademco.ademcoPrint(buff, len);
stream.Write(buff, 0, (int)len); stream.Write(buff, 0, (int)len);
} }
static void sendDisarm(NetworkStream stream, ushort seq, string acct, uint ademcoId, string pwd) static void sendDisarm(NetworkStream stream, ushort seq, string acct, uint ademcoId, string pwd)
{ {
byte[] buff = new byte[1024]; byte[] buff = new byte[1024];
AdemcoXDataSegment xdata = null; AdemcoXDataSegment xdata = null;
if (!string.IsNullOrEmpty(pwd)) if (!string.IsNullOrEmpty(pwd))
{ {
xdata = new AdemcoXDataSegment(); xdata = new AdemcoXDataSegment();
libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX, AdemcoXDataTransform.AdemcoXDataTransform_as_is, Encoding.ASCII.GetBytes(pwd), (uint)pwd.Length); 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); uint len = libademco.ademcoMakeHbPacket(buff, 1024, seq, acct, ademcoId, AdemcoEvent.EVENT_DISARM, 0, 0, xdata);
Console.Write("S:"); Console.Write("S:");
libademco.ademcoPrint(buff, len); libademco.ademcoPrint(buff, len);
stream.Write(buff, 0, (int)len); stream.Write(buff, 0, (int)len);
} }
} }
} }
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey; import java.nio.channels.SelectionKey;
import java.nio.channels.Selector; import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel; import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
import java.util.*; import java.util.*;
import com.hb3344.ademco.*; import com.hb3344.ademco.*;
public class JavaDemo { public class JavaDemo {
static { static {
try { try {
System.loadLibrary("ademco_java"); System.loadLibrary("ademco_java");
} catch (UnsatisfiedLinkError e) { } catch (UnsatisfiedLinkError e) {
System.err.println( System.err.println(
"Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" "Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n"
+ e); + e);
System.exit(1); System.exit(1);
} }
} }
private Selector selector; private Selector selector;
private Map<SocketChannel, Client> clients; private Map<SocketChannel, Client> clients;
private InetSocketAddress listenAddr; private InetSocketAddress listenAddr;
public JavaDemo(String addr, int port) throws IOException { public JavaDemo(String addr, int port) throws IOException {
listenAddr = new InetSocketAddress(addr, port); listenAddr = new InetSocketAddress(addr, port);
clients = new HashMap<SocketChannel, Client>(); clients = new HashMap<SocketChannel, Client>();
} }
private void start() throws IOException { private void start() throws IOException {
selector = Selector.open(); selector = Selector.open();
ServerSocketChannel channel = ServerSocketChannel.open(); ServerSocketChannel channel = ServerSocketChannel.open();
channel.configureBlocking(false); channel.configureBlocking(false);
channel.socket().bind(listenAddr); channel.socket().bind(listenAddr);
channel.register(selector, SelectionKey.OP_ACCEPT); channel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Server started..."); System.out.println("Server started...");
while (true) { while (true) {
selector.select(); selector.select();
Iterator keys = selector.selectedKeys().iterator(); Iterator keys = selector.selectedKeys().iterator();
while (keys.hasNext()) { while (keys.hasNext()) {
SelectionKey key = (SelectionKey) keys.next(); SelectionKey key = (SelectionKey) keys.next();
keys.remove(); keys.remove();
if (!key.isValid()) if (!key.isValid())
continue; continue;
if (key.isAcceptable()) if (key.isAcceptable())
accept(key); accept(key);
else if (key.isReadable()) else if (key.isReadable())
read(key); read(key);
} }
} }
} }
private void accept(SelectionKey key) throws IOException { private void accept(SelectionKey key) throws IOException {
ServerSocketChannel sChannel = (ServerSocketChannel) key.channel(); ServerSocketChannel sChannel = (ServerSocketChannel) key.channel();
SocketChannel channel = sChannel.accept(); SocketChannel channel = sChannel.accept();
channel.configureBlocking(false); channel.configureBlocking(false);
Socket socket = channel.socket(); Socket socket = channel.socket();
SocketAddress addr = socket.getRemoteSocketAddress(); SocketAddress addr = socket.getRemoteSocketAddress();
System.out.println("Accepted new client from:" + addr); System.out.println("Accepted new client from:" + addr);
clients.put(channel, new Client(channel)); clients.put(channel, new Client(channel));
channel.register(selector, SelectionKey.OP_READ); channel.register(selector, SelectionKey.OP_READ);
} }
private void read(SelectionKey key) throws IOException { private void read(SelectionKey key) throws IOException {
SocketChannel channel = (SocketChannel) key.channel(); SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buf = ByteBuffer.allocate(1024); ByteBuffer buf = ByteBuffer.allocate(1024);
int n = channel.read(buf); int n = channel.read(buf);
if (n == -1) { if (n == -1) {
clients.get(channel).offline(); clients.get(channel).offline();
clients.remove(channel); clients.remove(channel);
channel.close(); channel.close();
key.cancel(); key.cancel();
return; return;
} }
byte[] data = new byte[n]; byte[] data = new byte[n];
System.arraycopy(buf.array(), 0, data, 0, n); System.arraycopy(buf.array(), 0, data, 0, n);
clients.get(channel).onMsg(data); clients.get(channel).onMsg(data);
} }
public static void test_libademco() { public static void test_libademco() {
// test parse // test parse
{ {
System.out.println("testing parse..."); System.out.println("testing parse...");
String data = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"; String data = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r";
System.out.println("using data=" + data); System.out.println("using data=" + data);
AdemcoPacket pkt = new AdemcoPacket(); AdemcoPacket pkt = new AdemcoPacket();
SWIGTYPE_p_size_t cb = libademco.new_size_tp(); SWIGTYPE_p_size_t cb = libademco.new_size_tp();
AdemcoParseResult res = libademco.ademcoPacketParse(data.getBytes(), data.length(), pkt, cb); AdemcoParseError err = new AdemcoParseError();
assert (res == AdemcoParseResult.RESULT_OK); AdemcoParseResult res = libademco.ademcoPacketParse(data.getBytes(), data.length(), pkt, cb, err);
assert (libademco.size_tp_value(cb) == data.length()); assert (res == AdemcoParseResult.RESULT_OK);
System.out.println("parse result=" + res + ",cb_commited=" + libademco.size_tp_value(cb)); assert (libademco.size_tp_value(cb) == data.length());
libademco.delete_size_tp(cb); System.out.println("parse result=" + res + ",cb_commited=" + libademco.size_tp_value(cb));
} libademco.delete_size_tp(cb);
}
// test pack
{ // test pack
System.out.println("testing pack..."); {
System.out.println("using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0"); System.out.println("testing pack...");
AdemcoPacket pkt = new AdemcoPacket(); System.out.println("using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0");
libademco.ademcoMakeHbPacket2(pkt, 1234, "861234567890", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, null); AdemcoPacket pkt = new AdemcoPacket();
System.out.println("data=" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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
{ // test pack with xdata
System.out.println("testing pack with xdata..."); {
System.out.println( System.out.println("testing pack with xdata...");
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=123456"); System.out.println(
AdemcoXDataSegment xdata = new AdemcoXDataSegment(); "using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=123456");
libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX, AdemcoXDataSegment xdata = new AdemcoXDataSegment();
AdemcoXDataTransform.AdemcoXDataTransform_as_is, "123456".getBytes(), 6); libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX,
AdemcoPacket pkt = new AdemcoPacket(); AdemcoXDataTransform.AdemcoXDataTransform_as_is, "123456".getBytes(), 6);
libademco.ademcoMakeHbPacket2(pkt, 1234, "861234567890", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, xdata); AdemcoPacket pkt = new AdemcoPacket();
System.out.println("data=" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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
{ // test with hex xdata
System.out.println("testing pack with hex xdata..."); {
System.out.println( System.out.println("testing pack with hex xdata...");
"using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=EB BA 3F A1 76"); System.out.println(
byte[] xdatacontent = new byte[5]; "using seq=1234, acct=861234567890, ademco_id=666666, event=3400, zone=0, gg=0, xdata=EB BA 3F A1 76");
xdatacontent[0] = (byte) 0xEB; byte[] xdatacontent = new byte[5];
xdatacontent[1] = (byte) 0xBA; xdatacontent[0] = (byte) 0xEB;
xdatacontent[2] = (byte) 0x3F; xdatacontent[1] = (byte) 0xBA;
xdatacontent[3] = (byte) 0xA1; xdatacontent[2] = (byte) 0x3F;
xdatacontent[4] = (byte) 0x76; xdatacontent[3] = (byte) 0xA1;
AdemcoXDataSegment xdata = new AdemcoXDataSegment(); xdatacontent[4] = (byte) 0x76;
libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX, AdemcoXDataSegment xdata = new AdemcoXDataSegment();
AdemcoXDataTransform.AdemcoXDataTransform_as_is, xdatacontent, 5); libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX,
AdemcoPacket pkt = new AdemcoPacket(); AdemcoXDataTransform.AdemcoXDataTransform_as_is, xdatacontent, 5);
libademco.ademcoMakeHbPacket2(pkt, 1234, "861234567890", 666666l, AdemcoEvent.EVENT_ARM, 0l, 0l, xdata); AdemcoPacket pkt = new AdemcoPacket();
System.out.println("data=" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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
{ // test pack ack
System.out.println("testing pack ack..."); {
System.out.println("using seq=1234, acct=861234567890"); System.out.println("testing pack ack...");
AdemcoPacket pkt = new AdemcoPacket(); System.out.println("using seq=1234, acct=861234567890");
libademco.ademcoMakeAckPacket2(pkt, 1234, "861234567890", 0l); AdemcoPacket pkt = new AdemcoPacket();
System.out.println("data=" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); libademco.ademcoMakeAckPacket2(pkt, 1234, "861234567890", 0l);
} System.out.println("data=" + printable_bytes(pkt.getRaw(), pkt.getRaw_len()));
}
// test pack ack without acct
{ // test pack ack without acct
System.out.println("testing pack ack without acct..."); {
System.out.println("using seq=1234, acct=\"\" ademco_id=666666"); System.out.println("testing pack ack without acct...");
AdemcoPacket pkt = new AdemcoPacket(); System.out.println("using seq=1234, acct=\"\" ademco_id=666666");
libademco.ademcoMakeAckPacket2(pkt, 1234, "", 666666l); AdemcoPacket pkt = new AdemcoPacket();
System.out.println("data=" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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(); public static void main(String[] args) throws Exception {
int port = 12345; JavaDemo.test_libademco();
if (args.length > 0) { int port = 12345;
port = Integer.parseInt(args[0]); if (args.length > 0) {
} port = Integer.parseInt(args[0]);
}
// new JavaDemo("localhost", port).start();
new JavaDemo("0.0.0.0", port).start(); // new JavaDemo("localhost", port).start();
} new JavaDemo("0.0.0.0", port).start();
}
public class Client {
SocketChannel channel; public class Client {
byte[] buf = new byte[0]; SocketChannel channel;
AdemcoPacket pkt = new AdemcoPacket(); byte[] buf = new byte[0];
SWIGTYPE_p_size_t cb = libademco.new_size_tp(); AdemcoPacket pkt = new AdemcoPacket();
HbMachineType type = HbMachineType.HMT_INVALID; AdemcoParseError err = new AdemcoParseError();
HbMachineStatus status = HbMachineStatus.HMS_INVALID; SWIGTYPE_p_size_t cb = libademco.new_size_tp();
int seq = 0; HbMachineType type = HbMachineType.HMT_INVALID;
long ademco_id = 0; HbMachineStatus status = HbMachineStatus.HMS_INVALID;
String acct = ""; int seq = 0;
long lastTimeStatusChange = 0; long ademco_id = 0;
String acct = "";
public Client(SocketChannel channel) { long lastTimeStatusChange = 0;
this.channel = channel;
} public Client(SocketChannel channel) {
this.channel = channel;
public void offline() { }
System.out.println(id() + " is offline");
libademco.delete_size_tp(cb); 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)); public void onMsg(byte[] data) throws IOException {
AdemcoParseResult res = libademco.ademcoPacketParse(buf, buf.length, pkt, cb); buf = append(buf, data);
System.out.println(res + ", " + libademco.size_tp_value(cb)); // System.out.println(printable_bytes(buf));
switch (res) { AdemcoParseResult res = libademco.ademcoPacketParse(buf, buf.length, pkt, cb, err);
case RESULT_OK: System.out.println(res + ", " + libademco.size_tp_value(cb));
buf = trim(buf, (int) libademco.size_tp_value(cb)); switch (res) {
handleMsg(); case RESULT_OK:
break; buf = trim(buf, (int) libademco.size_tp_value(cb));
case RESULT_NOT_ENOUGH: handleMsg();
break; break;
case RESULT_ERROR: case RESULT_NOT_ENOUGH:
buf = new byte[0]; break;
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()); private byte[] getRawWithLen() {
return b; 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()) { private String id() {
str += " acct=" + acct; String str = "Client " + channel.socket().getRemoteSocketAddress();
} if (!acct.isEmpty()) {
if (ademco_id != 0) { str += " acct=" + acct;
str += " ademco_id=" + ademco_id; }
} if (ademco_id != 0) {
return str; str += " ademco_id=" + ademco_id;
} }
return str;
private int nextSeq() { }
seq++;
if (seq == 10000) { private int nextSeq() {
seq = 1; seq++;
} if (seq == 10000) {
return seq; seq = 1;
} }
return seq;
private void handleMsg() throws IOException { }
System.out.println(id() + " R:" + printable_bytes(pkt.getRaw(), pkt.getRaw_len()));
switch (pkt.getId()) { private void handleMsg() throws IOException {
case AID_NULL: System.out.println(id() + " R:" + printable_bytes(pkt.getRaw(), pkt.getRaw_len()));
acct = pkt.getAcct(); switch (pkt.getId()) {
replyAck(); case AID_NULL:
break; acct = pkt.getAcct();
replyAck();
case AID_ACK: break;
break;
case AID_ACK:
case AID_HB: break;
case AID_ADM_CID:
acct = pkt.getAcct(); case AID_HB:
ademco_id = pkt.getData().getAdemcoId(); case AID_ADM_CID:
AdemcoEvent event = pkt.getData().getAdemcoEvent(); acct = pkt.getAcct();
System.out.println(id() + " event=" + libademco.ademcoEventToString(event) + " zone=" ademco_id = pkt.getData().getAdemcoId();
+ pkt.getData().getZone()); AdemcoEvent event = pkt.getData().getAdemcoEvent();
if (libademco.ademcoIsMachineStatusEvent(event) != 0) { System.out.println(id() + " event=" + libademco.ademcoEventToString(event) + " zone="
status = libademco.hbMachineStatusFromAdemcoEvent(event); + pkt.getData().getZone());
// 演示如何进行布撤防,真实项目里可以删改本段 if (libademco.ademcoIsMachineStatusEvent(event) != 0) {
long now = System.currentTimeMillis(); status = libademco.hbMachineStatusFromAdemcoEvent(event);
if (now - lastTimeStatusChange > 5000) { // 演示如何进行布撤防,真实项目里可以删改本段
lastTimeStatusChange = now; long now = System.currentTimeMillis();
if (status == HbMachineStatus.HMS_ARM) { if (now - lastTimeStatusChange > 5000) {
disarm("123456"); lastTimeStatusChange = now;
} else { if (status == HbMachineStatus.HMS_ARM) {
arm(); disarm("123456");
} } else {
} arm();
} }
if (libademco.ademcoIsMachineTypeEvent(event) != 0) { }
type = libademco.hbMachineTypeFromAdemcoEvent(event); }
} if (libademco.ademcoIsMachineTypeEvent(event) != 0) {
replyAck(); type = libademco.hbMachineTypeFromAdemcoEvent(event);
if (type == HbMachineType.HMT_INVALID && !acct.isEmpty() && ademco_id != 0) { }
askType(); replyAck();
} if (type == HbMachineType.HMT_INVALID && !acct.isEmpty() && ademco_id != 0) {
break; askType();
} }
} break;
}
private void replyAck() throws IOException { }
libademco.ademcoMakeAckPacket2(pkt, pkt.getSeq(), pkt.getAcct(), 0l);
channel.write(ByteBuffer.wrap(getRawWithLen())); private void replyAck() throws IOException {
System.out.println(id() + " S:" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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); private void askType() throws IOException {
channel.write(ByteBuffer.wrap(getRawWithLen())); libademco.ademcoMakeHbPacket2(pkt, nextSeq(), acct, ademco_id, AdemcoEvent.EVENT_WHAT_IS_YOUR_TYPE, 0L, 0L,
System.out.println(id() + " S:" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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())); private void arm() throws IOException {
System.out.println(id() + " S:" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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()) { private void disarm(String pwd) throws IOException {
xdata = new AdemcoXDataSegment(); AdemcoXDataSegment xdata = null;
libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX, if (pwd != null && !pwd.isEmpty()) {
AdemcoXDataTransform.AdemcoXDataTransform_as_is, pwd.getBytes(), pwd.length()); xdata = new AdemcoXDataSegment();
} libademco.ademcoMakeXData(xdata, AdemcoXDataLengthFormat.TWO_HEX,
libademco.ademcoMakeHbPacket2(pkt, nextSeq(), acct, ademco_id, AdemcoEvent.EVENT_DISARM, 0L, 0L, xdata); AdemcoXDataTransform.AdemcoXDataTransform_as_is, pwd.getBytes(), pwd.length());
channel.write(ByteBuffer.wrap(getRawWithLen())); }
System.out.println(id() + " S:" + printable_bytes(pkt.getRaw(), pkt.getRaw_len())); 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) {
return printable_bytes(b, b.length);
public static String printable_bytes(byte[] b, long length) { }
String HEX_STRING = "0123456789ABCDEF";
String s = ""; public static String printable_bytes(byte[] b, long length) {
for (int i = 0; i < length; i++) { String HEX_STRING = "0123456789ABCDEF";
byte c = b[i]; String s = "";
if (32 <= c && c <= 127) { for (int i = 0; i < length; i++) {
s += (char) c; byte c = b[i];
} else { if (32 <= c && c <= 127) {
s += "\\x" + HEX_STRING.charAt((b[i] >>> 4) & 0x0F); s += (char) c;
s += HEX_STRING.charAt(b[i] & 0x0F); } else {
} s += "\\x" + HEX_STRING.charAt((b[i] >>> 4) & 0x0F);
} s += HEX_STRING.charAt(b[i] & 0x0F);
return s; }
} }
return s;
public static String printable_bytes(char[] b) { }
String HEX_STRING = "0123456789ABCDEF";
String s = ""; public static String printable_bytes(char[] b) {
for (int i = 0; i < b.length; i++) { String HEX_STRING = "0123456789ABCDEF";
int c = b[i] & 0xFF; String s = "";
if (32 <= c && c <= 127) { for (int i = 0; i < b.length; i++) {
s += (char) c; int c = b[i] & 0xFF;
} else { if (32 <= c && c <= 127) {
s += "\\x" + HEX_STRING.charAt(c >>> 4); s += (char) c;
s += HEX_STRING.charAt(c & 0x0F); } else {
} s += "\\x" + HEX_STRING.charAt(c >>> 4);
} s += HEX_STRING.charAt(c & 0x0F);
return s; }
} }
return s;
public static String printable_bytes(String b) { }
String HEX_STRING = "0123456789ABCDEF";
String s = ""; public static String printable_bytes(String b) {
for (int i = 0; i < b.length(); i++) { String HEX_STRING = "0123456789ABCDEF";
char c = b.charAt(i); String s = "";
if (32 <= c && c <= 127) { for (int i = 0; i < b.length(); i++) {
s += (char) c; char c = b.charAt(i);
} else { if (32 <= c && c <= 127) {
s += "\\x" + HEX_STRING.charAt(c >>> 4); s += (char) c;
s += HEX_STRING.charAt(c & 0x0F); } else {
} s += "\\x" + HEX_STRING.charAt(c >>> 4);
} s += HEX_STRING.charAt(c & 0x0F);
return s; }
} }
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); public static char[] append(char[] origin, char[] buf) {
System.arraycopy(buf, 0, dst, origin.length, buf.length); char[] dst = new char[origin.length + buf.length];
return dst; 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); public static byte[] append(byte[] origin, byte[] buf) {
System.arraycopy(buf, 0, dst, origin.length, buf.length); byte[] dst = new byte[origin.length + buf.length];
return dst; 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); public byte[] trim(byte[] origin, int pos) {
return dst; 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++) { public static byte[] c2b(char[] arr) {
b[i] = (byte) arr[i]; byte[] b = new byte[arr.length];
} for (int i = 0; i < arr.length; i++) {
return b; 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++) { public static char[] b2c(byte[] arr) {
b[i] = (char) arr[i]; char[] b = new char[arr.length];
} for (int i = 0; i < arr.length; i++) {
return b; b[i] = (char) arr[i];
} }
} return b;
}
}
...@@ -12,7 +12,7 @@ function test_parse() { ...@@ -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 str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r";
var cb = libademco.new_size_tp(); var cb = libademco.new_size_tp();
var pkt = new libademco.AdemcoPacket(); 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(res, libademco.RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), str.length); assert.strictEqual(libademco.size_tp_value(cb), str.length);
assert.strictEqual(pkt.crc, 0xC5C3); assert.strictEqual(pkt.crc, 0xC5C3);
...@@ -37,7 +37,7 @@ function test_pack() { ...@@ -37,7 +37,7 @@ function test_pack() {
console.log("test parse packed data"); console.log("test parse packed data");
var pkt2 = new libademco.AdemcoPacket(); var pkt2 = new libademco.AdemcoPacket();
var cb = libademco.new_size_tp(); 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(res, libademco.RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), pkt.raw_len); assert.strictEqual(libademco.size_tp_value(cb), pkt.raw_len);
assert.strictEqual(pkt2.id, libademco.AID_HB); assert.strictEqual(pkt2.id, libademco.AID_HB);
...@@ -58,6 +58,7 @@ class AlarmHost { ...@@ -58,6 +58,7 @@ class AlarmHost {
this.buf = null; this.buf = null;
this.inpkt = new libademco.AdemcoPacket(); this.inpkt = new libademco.AdemcoPacket();
this.outpkt = new libademco.AdemcoPacket(); this.outpkt = new libademco.AdemcoPacket();
this.parseErr = new libademco.AdemcoParseError();
this.cb = libademco.new_size_tp(); this.cb = libademco.new_size_tp();
this.ademcoId = 0; this.ademcoId = 0;
this.acct = ''; this.acct = '';
...@@ -68,14 +69,15 @@ class AlarmHost { ...@@ -68,14 +69,15 @@ class AlarmHost {
chunk = Buffer.concat([this.buf, chunk]); 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) { while (res === libademco.RESULT_OK) {
chunk = chunk.slice(libademco.size_tp_value(this.cb)); chunk = chunk.slice(libademco.size_tp_value(this.cb));
this.handleMsg(); 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) { if (res === libademco.RESULT_ERROR) {
console.log('parse error at line=%d, msg=%s', this.parseErr.line, this.parseErr.msg);
chunk = null; 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