门禁,梯控开发串口协议文档

.术语约定

1. D0,D1,D2,D3....D7,表示数据的每1位

2. int8, Int8=有符号8bit数据; uint8, UInt8=无符号8bit数据

3. int16, Int16=有符号16bit数据; uint16, UInt16: 无符号16bit数据

4. int32, Int32:有符号32bit数据; uint32, UInt32:无符号32bit数据

5. 未指定系统的表示门禁和梯控都是通用

6. 串口波特率57600,数据位8,停止位1,校验位无

7. 数据传输高字节在前

.协议包格式:

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

N

说明

0xEA

xxxx

xxxx

xxxx

xxxx

xxxx

xxxx

xx

xx

xxxx

注意:

1.定义系统特殊字:0XE0,0xEA

凡是蓝色部分数据出现系统特殊字做特殊处理:à1byte扩展为2byte.

0XE0à0XE0, 0x00;

0xEAà0XE0, 0x0A;

[总包校验]

2byte,是从[长度]到[数据包]最后字节所有字节的CRC16校验,CRC16算法见附件。

[长度]

2Byte,整个协议包长度,从[总包校验]到[数据包]最后字节(包含[长度]本身字节)

[源地址]

2Byte,发送数据的地址

[目的地址]

2Byte,数据要到达的地址

[流水号]

2Byte,系统自动产生,具体命令再解释,未作解释的命令不用关心(直接填0000),

[命令]

2Byte

[请求/应答]

0=请求包,需要应答;

1=请求包,不需要应答;

2=应答包

//--------------------

100=数据转发,用于透传

101=数据转发,用于透传

102~120=保留

[状态]

1Byte,可以为空,只有【应答】才有,【请求】该项填0

//定义应答状态

#define  ACK_OK        0          //命令执行成功

#define  ACK_ERR       1          //命令执行失败

#define  ACK_UNDEFINE  2          //不支持该命令

#define  ACK_INVALID_DATA 3        //无效的数据

255  //保留不用

[数据包]

N Byte,可以为空

数据包具体内容参见各命令详细说明。

下面命令只解释数据包内容

■(0xFAFA)保留

■(0x0001) 清除设备内存

请求à

内   容

字节

数据

数据

0

应答à

内   容

字节

数据

数据

0

说明:主要清除注册卡数据,记录数据,其他关键数据不清除:比如IP地址等设备运行参数不清除

■(0x0002) 软件复位重启动

请求à

内   容

字节

数据

数据

0

应答à

内   容

字节

数据

数据

0

■(0x0007) 硬件复位重启动

请求à

内   容

字节

数据

数据

0

应答à

内   容

字节

数据

数据

0

说明:相当于设备重新上电

■(0x0100) 联机测试

请求à

内   容

字节

数据

数据

0

EA 84 6D 00 0E FE FE 00 01 00 00 01 00 00 00

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

0

说明

EA

84 6D

00 0E

FE FE

00 01

00 00

01 00

00

00

应答à

内   容

字节

数据

数据

0

EA E1 CC 00 0E 00 01 FE FE 00 00 01 00 02 00

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

0

说明

EA

E1 CC

00 0E

00 01

FE FE

00 00

01 00

02

00

■(0x0101) 读RTC时间

请求à

内   容

字节

数据

数据

0

到1970年1月1日 0点0分0秒的秒数

EA 44 3C 00 0E FE FE 00 01 00 00 01 01 00 00

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

0

说明

EA

44 3C

00 0E

FE FE

00 01

00 00

01 01

00

00

应答à

内   容

字节

数据

数据

4

EA F4 2B 00 12 00 01 FE FE 00 00 01 01 02 00 5E DD E6 62

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据(时间)

字节

1

2

2

2

2

2

2

1

1

4

说明

EA

F4 2B

00 12

00 01

FE FE

00 00

01 01

02

00

5E DD E6 62

■(0x0102) 写RTC时间

请求à

内   容

字节

数据

数据

4

到1970年1月1日 0点0分0秒的秒数

EA C6 E0 0A 00 12 FE FE 00 01 00 00 01 02 00 00 5E DD E6 5F

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据(时间)

字节

1

2

2

2

2

2

2

1

1

4

说明

EA

C6 E0 0A

00 12

FE FE

00 01

00 00

01 02

00

00

5E DD E6 5F

说明:C6 E0 0A实际是由:32 EA,转换而来,EA是关键字。

应答à

内   容

字节

数据

数据

0

EA 21 6D 00 0E 00 01 FE FE 00 00 01 02 02 00

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

0

说明

EA

21 6D

00 0E

00 01

FE FE

00 00

01 02

02

00

■(0x0104) 写设备版本信息

请求à

内   容

字节

数据

数据

0

应答à

内   容

字节

数据

数据

N

ASCII字符串,直接显示

根据协议包长度判断字符长度

■(0x1211) 远程呼梯.自动按键。外招【梯控专用】

请求à

内   容

字节

数据

Type类型

1

0=上楼,1=下楼

后门Floor楼层

2

0~63,实际相当于端口号,0对应最低楼层  FFFF无效

前门Floor楼层

2

0~63,实际相当于端口号,0对应最低楼层  FFFF无效

应答à

内   容

字节

数据

数据

0

说明:电梯外部上下按键响应,无前后门的系统默认使用前门

■(0x120A) 远程乘梯.自动按键。内招【梯控专用】.单个楼层

请求à

内   容

字节

数据

后门Floor楼层

2

0~63,实际相当于端口号,0对应最低楼层  FFFF无效

前门Floor楼层

2

0~63,实际相当于端口号,0对应最低楼层  FFFF无效

EA B0 EB 00 12 FE FE 00 01 00 00 12 0A 00 00 FF FF 00 03

序号

1

2

3

4

5

6

7

8

9

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

字节

1

2

2

2

2

2

2

1

1

说明

EA

B0 EB

00 12

FE FE

00 01

00 00

12 0A

00

00

内容

后门Floor楼层

前门Floor楼层

字节

2

2

说明

FF FF

00 03

说明:后门数据无效,前门第3个端口开放

应答à

内   容

字节

数据

数据

0

EA 67 E8 00 0E 00 01 FE FE 00 00 12 0A 02 00

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

0

说明

EA

67 E8

00 0E

00 01

FE FE

00 00

12 0A

02

00

说明:电梯内部楼层按键响应,自动点亮所去楼层,无前后门的系统默认使用前门

■(0x120B) 远程乘梯.手动按键。内招【梯控专用】.单个楼层

请求à

内   容

字节

数据

后门Floor楼层

2

0~63,实际相当于端口号,0对应最低楼层  FFFF无效

前门Floor楼层

2

0~63,实际相当于端口号,0对应最低楼层  FFFF无效

应答à

内   容

字节

数据

数据

0

说明:电梯内部楼层按键响应,需要手动按键,无前后门的系统默认使用前门

■(0x1203) 远程乘梯.手动按键。内招【梯控专用】.多个楼层

请求à

内   容

字节

数据

前门Floor楼层表

8

从第一个字节开始

D7D6D5D4D3D2D1D1, D7D6D5D4D3D2D1D1, D7D6D5D4D3D2D1D1.........

分别表示楼层控制板第0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,.......端口

后门Floor楼层表

8

从第一个字节开始

D7D6D5D4D3D2D1D1, D7D6D5D4D3D2D1D1, D7D6D5D4D3D2D1D1.........

分别表示楼层控制板第0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,.......端口

EA D1 10 00 1E FE FE 00 01 00 00 12 03 00 00 F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

序号

1

2

3

4

5

6

7

8

9

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

字节

1

2

2

2

2

2

2

1

1

说明

EA

D1 10

00 1E

FE FE

00 01

00 00

12 03

00

00

内容

前门Floor楼层表

后门Floor楼层表

字节

8

8

说明

F0 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

说明:FO表示前门 4个端口开放,第0,1,2,3

应答à

内   容

字节

数据

数据

0

EA 65 38 00 0E 00 01 FE FE 00 00 12 03 02 00

序号

1

2

3

4

5

6

7

8

9

10

内容

起始字

总包校验

长度

源地址

目的地址

流水号

命令

请求/应答

状态

数据

字节

1

2

2

2

2

2

2

1

1

0

说明

EA

65 38

00 0E

00 01

FE FE

00 00

12 03

02

00

说明:电梯内部楼层按键响应,需要手动按键。无前后门的系统默认使用前门

ss

■(0x1212) 设置梯控状态【梯控专用】

请求à EA 95 38 00 0F FE FE 00 01 00 00 12 12 00 00 00

EA 55 f9 00 0F FE FE 00 01 00 00 12 12 00 00 01

内   容

字节

数据

Type类型

1

0=进入梯控状态,刷卡,刷人脸等才可以使用电梯

1=退出梯控状态,不刷卡,不刷人脸等也可以使用电梯

2=强制接管,禁止刷卡和按键

应答à

内   容

字节

数据

数据

0

代码部分:

//doordu_ladder_control.c
/**********************************************************************************      Copyright:  (C) 2019 maxshion*                  All rights reserved.**       Filename:  usart.c*    Description:  uart handle*                 *        Version:  1.0.0(08/07/2019)*         Author:  maxshion*      ChangeLog:  1, Release initial version on "08/03/2019 17:28:51 PM"*                 ********************************************************************************/
#include "stdio.h"
#include"doordu_ladder_control.h"
#include "gpio.h"
#include "pthread.h"
#include "string.h"
#include "face.h"
#include "person.h"#define LOG_TAG "rs485"
#include <log/log.h>Boolean is_uart_sending = UART_FALSE;
static int uart2_fd = -1;
static unsigned char out[33];/*CRC 计算表1*/
const u8 _CRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40
};
/*CRC 计算表2*/
const u8 _CRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,0x41, 0x81, 0x80, 0x40
};u16 ladder_check_crc16(u8 *Buff, u16 Len)
{u8 CRCHi = 0xFF;u8 CRCLo = 0xFF;u16 index;u16 i = 0;while ((Len--) > 0){index = CRCLo ^ (u8)Buff[i++];CRCLo = (u8)(CRCHi ^ _CRCHi[index]);CRCHi = _CRCLo[index];}return (u16)(CRCHi << 8 | CRCLo);
}int UART2_Open(int fd, char *port)
{fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);if (fd < 0) {perror("Can't Open Serial Port");return(UART_FALSE);}if (fcntl(fd, F_SETFL, 0) < 0) {printf("fcntl failed!\n");return(UART_FALSE);} else {printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));}/*  *  if (0 == isatty(STDIN_FILENO)) {*      printf("standard input is not a terminal device\n");*     return(UART_FALSE);*  } else*   printf("isatty success!\n");*  */printf("fd->open=%d\n", fd);return fd;
}void UART2_Close(int fd)
{close(fd);
}int UART2_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
{int i;int speed_arr[] = { B115200, B57600, B19200, B9600, B4800, B2400, B1200, B300};int name_arr[] = {115200, 57600, 19200, 9600, 4800, 2400, 1200, 300};struct termios options;if (tcgetattr(fd, &options) != 0) {perror("SetupSerial 1");return (UART_FALSE);}for (i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {if (speed == name_arr[i]) {cfsetispeed(&options, speed_arr[i]);cfsetospeed(&options, speed_arr[i]);}}options.c_cflag |= CLOCAL;options.c_cflag |= CREAD;switch (flow_ctrl) {case 0:options.c_cflag &= ~CRTSCTS;break;case 1:options.c_cflag |= CRTSCTS;break;case 2:options.c_cflag |= IXON | IXOFF | IXANY;break;}options.c_cflag &= ~CSIZE;switch (databits) {case 5:options.c_cflag |= CS5;break;case 6:options.c_cflag |= CS6;break;case 7:options.c_cflag |= CS7;break;case 8:options.c_cflag |= CS8;break;default:fprintf(stderr,"Unsupported data size\n");return (UART_FALSE);}switch (parity) {case 'n':case 'N':options.c_cflag &= ~PARENB;options.c_iflag &= ~INPCK;break;case 'o':case 'O':options.c_cflag |= (PARODD | PARENB);options.c_iflag |= INPCK;break;case 'e':case 'E':options.c_cflag |= PARENB;options.c_cflag &= ~PARODD;options.c_iflag |= INPCK;break;case 's':case 'S':options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;break;default:fprintf(stderr,"Unsupported parity\n");return (UART_FALSE);}switch (stopbits) {case 1:options.c_cflag &= ~CSTOPB;break;case 2:options.c_cflag |= CSTOPB;break;default:fprintf(stderr,"Unsupported stop bits\n");return (UART_FALSE);}options.c_oflag &= ~OPOST;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_cc[VTIME] = 1;options.c_cc[VMIN] = 0;tcflush(fd, TCIFLUSH);if (tcsetattr(fd, TCSANOW, &options) != 0) {perror("com set error!\n");return (UART_FALSE);}return (UART_TRUE);
}int UART2_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)
{if (UART2_Set(fd, speed, 0, 8, 1, 'N') == UART_FALSE) {return UART_FALSE;} else {return UART_TRUE;}
}int UART2_Recv(int fd, u8 *rcv_buf,int data_len, Boolean no_wait)
{int len, fs_sel;fd_set fs_read;struct timeval time;int ret = -1;ret = gpio_set_output_level(87, 0);if (ret)ALOGE("%s %d set gpio is failed\n", __func__, __LINE__);FD_ZERO(&fs_read);FD_SET(fd, &fs_read);time.tv_sec = 20;time.tv_usec = 0;ALOGE("%s %d -TEST_LADDER-\n", __func__, __LINE__);if (no_wait) {fs_sel = 1;} else {fs_sel = select(fd+1, &fs_read, NULL, NULL, &time);if (fs_sel) {usleep(100*1000);}}if (fs_sel) {len = read(fd, rcv_buf, data_len);if (len > 0) {ALOGE("read len= %d\n", len);}return len;} else {return UART_FALSE;}
}int UART2_Send(int fd, u8 *send_buf,int data_len)
{int len = 0;int total_len = 0;int ret = -1;is_uart_sending = UART_TRUE;ret = gpio_set_output_level(87, 1);if (ret)ALOGE("%s %d set gpio is failed\n", __func__, __LINE__);while (total_len < data_len) {len = write(fd, send_buf, data_len);total_len += len;ALOGE("UART write len= %d,total_len= %d,\n", len, total_len);sleep(1);if (len <= 0) {ALOGE("write len <= 0\n");break;}}is_uart_sending = UART_FALSE;if (len == data_len ){ALOGE("send data is %s\n", send_buf);return len;}else{tcflush(fd, TCOFLUSH);return UART_FALSE;}}int StringToHex(char *str, unsigned char *out, unsigned int *outlen)
{char *p = str;char high = 0, low = 0;int tmplen = strlen(p), cnt = 0;tmplen = strlen(p);while(cnt < (tmplen / 2)){high = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;low = (*(++ p) > '9' && ((*p <= 'F') || (*p <= 'f'))) ? *(p) - 48 - 7 : *(p) - 48;out[cnt] = ((high & 0x0f) << 4 | (low & 0x0f));p ++;cnt ++;}if(tmplen % 2 != 0) out[cnt] = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;if(outlen != NULL) *outlen = tmplen / 2 + tmplen % 2;return tmplen / 2 + tmplen % 2;
}u8 *string_convent_to_hex(char *ladder_buf)
{int cnt;unsigned int outlen = 0;StringToHex(ladder_buf, out, &outlen);for(cnt = 0; cnt < outlen; cnt ++){ALOGE("%s %d %02X", __func__, __LINE__, out[cnt]);}putchar(10);return out;
}char *ladder_str_replace_by_str(char *str,char *oldstr,char *newstr)
{char bstr[strlen(str)];memset(bstr,0,sizeof(bstr));ALOGE("%s %d\n", __func__, __LINE__);for(int i = 0;i < strlen(str);i++){ALOGE("%s %d\n", __func__, __LINE__);if(!strncmp(str+i,oldstr,strlen(oldstr))){ALOGE("%s %d\n", __func__, __LINE__);strcat(bstr,newstr);ALOGE("%s %d\n", __func__, __LINE__);i += strlen(oldstr) - 1;ALOGE("%s %d\n", __func__, __LINE__);}else{ALOGE("%s %d\n", __func__, __LINE__);strncat(bstr,str+i,1);ALOGE("%s %d\n", __func__, __LINE__);}}ALOGE("%s %d\n", __func__, __LINE__);strcpy(str,bstr);ALOGE("%s %d\n", __func__, __LINE__);return str;
}void dd_ladder_data_parse(int floor[128], int count_floor)
{char string_to_hex[256];char hex_buf[256];u16 crc16;u8 *crc16_hex_string = NULL;u8 *ladder_open_cmd = NULL;u16 lenth = 0;u64 all_count = 0;char oldstr[] = "ea";char newstr[] = "e00a";char *floor_exclude_ea_str = NULL;char *crc16_exclude_ea_str = NULL;char temp_crc16_str[10];char temp_floor_str[128];int i = 0;int ladder_floor = 0;u64 num_1 = 1;if (floor == NULL || count_floor == 0)return;memset(string_to_hex, 0x00, sizeof(string_to_hex));memset(hex_buf, 0x00, sizeof(hex_buf));memset(temp_crc16_str, 0x00, sizeof(temp_crc16_str));memset(temp_floor_str, 0x00, sizeof(temp_floor_str));/* only allow to one floor */if (count_floor == 1){ladder_floor = floor[0] - 1;snprintf(string_to_hex, sizeof(string_to_hex), ONE_FLOOR_STRING_TO_HEX, ladder_floor);lenth = 16;}/* allow to Multiple floors */else if (1 < count_floor){all_count = all_count | 0x8000000000000000;do {all_count = all_count | (num_1<<(64 - floor[i]));i++;} while (i < count_floor);lenth = 28;snprintf(string_to_hex, sizeof(string_to_hex), MANY_FLOOR_STRING_TO_HEX, all_count);}/* package convent to hex */crc16_hex_string = string_convent_to_hex(string_to_hex);crc16 = ladder_check_crc16(crc16_hex_string, lenth);/* check if the "ea" exists and convent to "e00a" */snprintf(temp_crc16_str, sizeof(temp_crc16_str), "%x", crc16);snprintf(temp_floor_str, sizeof(temp_floor_str), "%llx", all_count);crc16_exclude_ea_str = ladder_str_replace_by_str(temp_crc16_str, oldstr, newstr);floor_exclude_ea_str = ladder_str_replace_by_str(temp_floor_str, oldstr, newstr);ALOGE("%s %d -TEST_LADDER-crc16:%hx lenth:%hd floors_hex:%llx crc16_exclude_ea:%s floor_exclude_ea:%s\n",__func__, __LINE__, crc16, lenth, all_count, crc16_exclude_ea_str, floor_exclude_ea_str);/* combine into protocol package */if (count_floor == 1)snprintf(hex_buf, sizeof(hex_buf), ONE_FLOOR_CMD_HEX,crc16_exclude_ea_str, ladder_floor);else if (count_floor > 1) {snprintf(hex_buf, sizeof(hex_buf), MANY_FLOOR_CMD_HEX,crc16_exclude_ea_str, floor_exclude_ea_str);}ALOGE("%s %d -TEST_LADDER-send_buf:%s\n", __func__, __LINE__, hex_buf);ladder_open_cmd = string_convent_to_hex(hex_buf);UART2_Send(uart2_fd, ladder_open_cmd, strlen(ladder_open_cmd));
}void *rs485_parse_start()
{int err;int len;int total_len;u8 rcv_buf[128];do {sleep(1);uart2_fd = UART2_Open(uart2_fd, "/dev/ttySLB2");err = UART2_Init(uart2_fd, 57600, 0, 8, 1, 'N');if(UART_FALSE == err) {UART2_Close(uart2_fd);}ALOGE("Set Port Exactly! err:%d, fd:%d\n",err,uart2_fd);} while (UART_FALSE == err || UART_FALSE == uart2_fd);while(1){total_len = 0;/* callback elevator data parse */face_get_floor_num_cb(dd_ladder_data_parse);memset(rcv_buf, 0, sizeof(rcv_buf));for ( ; ;) {len = UART2_Recv(uart2_fd, &rcv_buf[total_len],sizeof(rcv_buf) - total_len, total_len > 0);if (len < 0)break;}}UART2_Close(uart2_fd);return NULL;}int rs485_parse_init(void)
{pthread_t rs485_parse_thread;if (pthread_create(&rs485_parse_thread, NULL, rs485_parse_start, NULL)) {ALOGE("pthread_create rs485_parse_thread thread failed!!\n");return -1;}pthread_detach(rs485_parse_thread);return 0;
}//doordu_ladder_control.h/**********************************************************************************      Copyright:  (C) 2019 maxshion*                  All rights reserved.**       Filename:  doordu_ladder_control.h*    Description:  doordu_ladder_control*                 *        Version:  1.0.0(08/07/2019)*         Author:  maxshion*      ChangeLog:  1, Release initial version on "08/03/2019 17:28:51 PM"*                 ********************************************************************************/#ifndef __DOORDU_LADDER_CONTROL_H__
#define __DOORDU_LADDER_CONTROL_H__#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>
#include<string.h>#ifndef u8
#define u8 unsigned char
#endif#ifndef u16
#define u16 unsigned short
#endif#ifndef u32
#define u32 unsigned int
#endif
#ifndef u64
#define u64 unsigned long long
#endif#define ONE_FLOOR_STRING_TO_HEX "0012FEFE00010000120A0000FFFF00%x"
#define MANY_FLOOR_STRING_TO_HEX "001EFEFE0001000012030000%llx0000000000000000"
#define ONE_FLOOR_CMD_HEX "EA%s0012FEFE00010000120A0000FFFF00%x"
#define MANY_FLOOR_CMD_HEX "EA%s001EFEFE0001000012030000%s0000000000000000"typedef enum {UART_FALSE = 0,UART_TRUE = 1
} Boolean;typedef struct {u8 start_byte;u8 ack;u8 state;u16 total_package_check;u16 length;u16 origin_address;u16 dest_adress;u16 serial_number;u16 cmd;u16 front_door;u16 back_door;
}ladder_data;typedef enum {ACK_OK = 0,     //命令执行成功ACK_ERR,        //命令执行失败ACK_UNDEFINE,       //不支持该命令ACK_INVALID_DATA,   //无效的数据
} Ack_state;void dd_ladder_data_parse(int floor[128], int count_floor);
void *rs485_parse_start();
int rs485_parse_init(void);
int UART2_Open(int fd,char *port);
void UART2_Close(int fd) ;
int UART2_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity);
int UART2_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity) ;
int UART2_Recv(int fd, u8 *rcv_buf,int data_len, Boolean no_wait);
int UART2_Send(int fd, u8 *send_buf,int data_len);#endif//解析后台下发的楼层信息:
int person_parse_floor_auth(char *floorNumber, floor_auth_t *auth_info)
{const char *floor_no = NULL;char temp_no[16];int pos = 0, len = 0;if (floorNumber == NULL || auth_info == NULL)return -1;if (strlen(floorNumber) == 0)return -1;do {memset(temp_no, 0, sizeof(temp_no));floor_no = strstr(floorNumber + pos, ",");if (floor_no) {len = floor_no - floorNumber - pos;if (len) {strncpy(temp_no, floorNumber + pos, len);auth_info->floor_no[auth_info->auth_count] =atoi(temp_no);auth_info->auth_count++;}pos = pos + len + 1;} else {auth_info->floor_no[auth_info->auth_count] =atoi(floorNumber + pos);auth_info->auth_count++;}if (pos >= strlen(floorNumber))break;}while (floor_no);for (int i = 0; i < auth_info->auth_count; i++)ALOGD("floor_no[%d]:%d\n", i, auth_info->floor_no[i]);return 0;
}

人脸识别-倍加信梯控控制相关推荐

  1. 智慧园区建设新方案:人脸识别智能门禁+手机梯控+访客管理系统

    传统的园区门卫管理存在安全漏洞多,服务水平低,频频发生的园区安全事件,使得园区提高自身治安手段和防范能力已经迫在眉睫. 办公园区等公共场所访客管理人员登记方式缺点: 1.人为管理因素大,可疑及闲杂人员 ...

  2. 《战狼2》中人脸识别无人机表现不俗,军、警用果真如此高能?

    "非洲某国战乱,战火蔓至海外华人,雇佣兵辣手残杀普通平民,在此危急时刻,前解放军特种兵冷锋挺身而出单刀赴会,中国海军舰队临危上线奔袭掩护-.."前不久上映的军事动作电影<战狼 ...

  3. 大数据+人脸识别在商业银行中的应用

    在当前利率市场化.蓬勃发展.经济新常态三大因素形成共振的历史转折点上,我国商业经营模式面临着全新的变革.如何在精细化经营管理的基础上为客户提供更优质.更安全的服务体验,成为各商业银行竞争的焦点.近年来 ...

  4. 人脸识别应用场景不断拓展 刷脸要方便更要安全

    刷脸解锁.刷脸支付.刷脸进校园--近几年,人脸识别技术不断取得突破,应用场景逐渐拓展,进一步便利了我们的生活,在疫情防控常态化阶段更是大显身手.与此同时,仍有一些问题困扰着行业发展,比如在非必要场景过 ...

  5. pytorch实现人脸识别_一步一步带你完成深度学习与对象检测之人脸识别

    前期文章我们分享了opencv的人脸检测 人工智能-OpenCV+Python实现人脸识别 以及dlib的人脸检测与人脸识别 人工智能-Dlib+Python实现人脸识别 通过往期的分享,我们了解到人 ...

  6. 人脸识别技术场景应用

    人脸识别技术场景应用 1.人脸识别(FR技术)产品的优势 1)非接触: 人脸图像的采集不同于指纹.掌纹需要接触指掌纹专用采集设备,指掌纹的采集除了对设备有一定的磨损外,也不卫生,容易引起被采集者的反感 ...

  7. AI(1 )---人脸识别在各个行业的典型盈利模式

    人脸识别在各个行业的典型盈利模式 当前,人工智能的产业化发展处于井喷阶段,有人称AI已成为一种社会现象.这其中,以人脸识别为代表的计算机视觉的发展备受关注.人脸识别是基于人的脸部特征信息进行身份识别的 ...

  8. 安卓机+数据线,带你开发部署人脸识别应用

    只有强大的数学与理论知识功底,才能进入 AI 领域吗? 大可不必! 过去我们都在谈"AI 时代,开发者 / 程序员该如何",但是,对于现在的 AI 来说,它更应该走进的并非开发者中 ...

  9. 人脸识别无人机燃爆《战狼2》 它真的存在吗?

    这个夏天,比高温天更火爆的当数前不久上映的<战狼2>了.近日,这部军事动作影片的相关信息成功的"刷爆"了朋友圈,点燃了无数观众强烈的爱国之情.抛开影片中演员精湛的演技和 ...

  10. pythonopencv人脸识别考勤_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(一)...

    一.设计目标:旨在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统.该系统同时具备普通用户模式.管理员模式与超级管理员模式,下面具体介绍每种模式下的功能. 1)普通用户模式 该模式可分为收集 ...

最新文章

  1. 为ASP.NET MVC配置基于Active Directory的表单认证方式
  2. 【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )
  3. php钩子原理和实现
  4. C++面试八股文快问快答のSTL篇
  5. php 简单的存在 (方法之间的神奇作用:容错)
  6. srsLTE源码学习:网络附属存储抓包nas_pcap.h
  7. solaris系统中的’format’程序
  8. [Swift A] - Using Swift with Cocoa and Objective-C--Mix and Match
  9. linux 配置redis密码
  10. js 实现pdf在线阅读
  11. delphi 2007 精简版
  12. SQL Server 2014 安装与SQL语言学习笔记(一)
  13. 74系列标准逻辑集成芯片分类
  14. 计算机网络系统技术交底,公共广播系统技术交底
  15. python设置随机绘图颜色_Python绘图的颜色设置
  16. 仿淘宝左侧菜单导航栏纯Html + css 写的
  17. UIImagePicketView(照相机类)的使用
  18. java大数据量调优(超赞值得收藏)
  19. UnRaid利用iGVT-g插件实现Nas宿主机、虚拟机同时使用intel核显输出或硬解(硬件加速)功能
  20. OOP上半部分-Java与生活

热门文章

  1. my android机器人作文,机器人作文400字
  2. 外行也看得懂!了解量子计算的奇迹
  3. protoc java out_protoc 命令参数
  4. 房屋户型图设计工具Room Arranger for Mac
  5. 清明上河图对计算机技术的启发,《清明上河图》鉴定故事的启示
  6. 关于成本核算方法、步骤、成本分析的简单回复
  7. Linux的LCD驱动
  8. Oracle建表规范
  9. 推荐12个优秀的 HTML5 网站设计案例欣赏
  10. 修航片调卫片,不会PS的GISer不是一个好“美工“