Commit b01d640a authored by captainwong's avatar captainwong

tested c# demo

parent 2dcbc8f7
generated/
c/swig/com/hb3344/ademco/
libademco_java_wrap.c
libademco_csharp_wrap.c
libademco_python_wrap.c
.vscode/
.vs/
......
......@@ -13,6 +13,28 @@
#include <ctype.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) {
return ademcoEvent == EVENT_ARM
......@@ -780,6 +802,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
do{
const uint8_t* p = buff;
if (*p++ != ADEMCO_PACKET_PREFIX) {
dline;
break;
}
......@@ -801,6 +824,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
return RESULT_NOT_ENOUGH;
}
if (len_needed >= ADEMCO_PACKET_MAX_LEN) {
dline;
return RESULT_ERROR;
}
......@@ -808,28 +832,31 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
const uint8_t* pcr = pid + pkt->len;
if (pcr - buff > len || *pcr != ADEMCO_PACKET_SUFIX) {
dline;
break;
}
pkt->crc = ademcoCRC16(pid, pkt->len);
if (pkt->crc != crc) {
dline;
break;
}
// id
if (*pid != '\"') {
dline;
break;
}
p = pid + 1;
while (p < pcr && *p != '\"') { p++; }
if (p >= pcr || *p != '\"') { break; }
if (p >= pcr || *p != '\"') { dline; break; }
pkt->id = getAdemcoPacketId((const char*)pid, ++p - pid);
if (pkt->id == AID_INVALID) { break; }
if (pkt->id == AID_INVALID) { dline; break; }
// seq
const uint8_t* pseq = 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';
pkt->seq = strtoul(temp, NULL, 10) & 0xFFFF;
if (pkt->seq >= 10000) { pkt->seq = 0; }
......@@ -838,16 +865,16 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if (*p == 'R') { // rrcvr exists
const uint8_t* prcvr = 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
} else if (*p == 'L') { // rrcvr not exits
// pass
} else {
break;
dline; break;
}
// lpref
if (*p != 'L') { break; }
if (*p != 'L') { dline; break; }
while (p < pcr && *p != '#') { p++; }
if (p >= pcr || *p != '#') { break; }
// only check if format is correct, ignore it's content
......@@ -859,15 +886,15 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
if (!isalnum(*p)) { p = NULL; break; }
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);
pkt->acct[p - pacct] = '\0';
// data
const uint8_t* pdata = p;
while (p < pcr && *p != ']') { p++; }
if (p >= pcr || *p != ']') { break; }
if (ademcoParseDataSegment(pdata, ++p - pdata, &pkt->data) != RESULT_OK) { break; }
if (p >= pcr || *p != ']') { dline; break; }
if (ademcoParseDataSegment(pdata, ++p - pdata, &pkt->data) != RESULT_OK) { dline; break; }
// *xdata
if (*p == '[') { // xdata exists
......@@ -889,7 +916,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
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.raw_len = ++p - pxdata;
memcpy(pkt->xdata.raw, pxdata, pkt->xdata.raw_len);
......@@ -898,7 +925,7 @@ AdemcoParseResult ademcoPacketParse(const uint8_t* buff, int len, AdemcoPacket*
}
// timestamp
if (pcr - p != ADEMCO_PACKET_TIMESTAMP_LEN) { break; }
if (pcr - p != ADEMCO_PACKET_TIMESTAMP_LEN) { dline; break; }
{
struct tm tm;
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*
p += ADEMCO_PACKET_TIMESTAMP_LEN;
}
if (p++ != pcr) { break; }
if (p++ != pcr) { dline; break; }
pkt->raw_len = *cb_commited = p - buff;
if (pkt->raw != buff) {
memcpy(pkt->raw, buff, pkt->raw_len);
......
......@@ -351,6 +351,9 @@ typedef struct AdemcoPacket {
// Functions
#ifdef DEBUG
void ademcoPrint(const uint8_t* buff, int len);
#endif
//! 是否主机状态事件
ADEMCO_EXPORT_SYMBOL int ademcoIsMachineStatusEvent(AdemcoEvent ademcoEvent);
//! 是否主机类型事件
......
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);
}
}
}
......@@ -13,7 +13,7 @@ import com.hb3344.ademco.*;
public class JavaDemo {
static {
try {
System.loadLibrary("ademco");
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);
......
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(), 0l);
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
%module libademco
%module libademco
%include "constraints.i"
%include "typemaps.i"
%include "cpointer.i"
%include "stdint.i"
#ifdef SWIGJAVA
%include "arrays_java.i";
%include "enums.swg" /*NB: requires JDK-1.5+
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 */
#include "../ademco.h"
%}
%{
/* Includes the header in the wrapper code */
#include "../ademco.h"
%}
#ifdef SWIGJAVA
// from arrays_java.i (signed char)
JAVA_ARRAYS_DECL(uint8_t, jbyte, Byte, Uint8)
JAVA_ARRAYS_IMPL(uint8_t, jbyte, Byte, Uint8)
JAVA_ARRAYS_TYPEMAPS(uint8_t, byte, jbyte, Uint8, "[B")
%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(uint16_t, uint16p);
%pointer_functions(uint32_t, uint32p);
/* Parse the header file to generate wrappers */
%include "../ademco.h"
/* Parse the header file to generate wrappers */
%include "../ademco.h"
......@@ -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_OS=${JAVA_INCLUDE}/linux
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
java -Djava.library.path=./ JavaDemo
\ No newline at end of file
......@@ -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_OS=${JAVA_INCLUDE}/darwin
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
java -Djava.library.path=./ JavaDemo
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
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
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
java JavaDemo
......@@ -38,6 +38,7 @@ int main()
// 解析完整数据包
{
char raw[] = "\nC5C30053\"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);
assert(res == RESULT_OK);
}
......
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