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

.术语约定

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. React Native之ViewPagerAndroid跳转页面问题
  2. shell脚本编写乘法口诀
  3. intel服务器修复两个漏洞,游戏厂商:修复Intel处理器漏洞后 服务器超卡
  4. shiro与springMVC整合
  5. 16 导出pcb各网络的布线长度_PCB原理图常见错误分析
  6. C++中各种智能指针的实现及弊端(四)
  7. 产品开发过程问题及解决方案汇总
  8. AJAX,只是一种过渡技术吗?
  9. 数组重复次数最多的元素递归_在不使用递归的情况下计算链接列表中元素的出现次数...
  10. jboss4中手动部署EJB(jboss4.0.2+ejb2.0+j2sdk5.0+xpsp2)
  11. 应用程序工程文件组织重要性
  12. 简述springmvc过程_Springmvc执行流程
  13. PHP调用powershell权限,浏览器挂起执行运行Powershell的PHP
  14. 用户交互系统BBS功能展示(手机端)
  15. 估值20亿美元 快狗打车将成“货运第一股”?
  16. QT之调用百度地图离线API
  17. 有什么蓝牙耳机好用又不贵?适合学生党的平价蓝牙耳机推荐
  18. C#如何判断某个日期是否为今天
  19. c++函数模板--(函数模板的定义)
  20. 【金猿产品展】荣联冷冻电镜数据分析平台——助力生物医疗科研创新

热门文章

  1. jdk和jre安装配置
  2. Linux(centos7下载安装)
  3. java基础习题_Java基础知识练习题及答案
  4. 使用Python获取键盘的输入
  5. android 第三方键盘,6款Android平台第三方输入法横评
  6. idea maven tomcat 热部署
  7. STM8L IAP升级过程记录
  8. win10 保护计算机 密码,在win10中这样设置用户密码过期时间,可以保证电脑安全...
  9. Windows文件传输小工具,网络传输文件,内网传输
  10. 最新VMware虚拟机安装kali Linux详细教程