人脸识别-倍加信梯控控制
门禁,梯控开发串口协议文档
.术语约定
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)保留
内 容 |
字节 |
数据 |
数据 |
0 |
内 容 |
字节 |
数据 |
数据 |
0 |
说明:主要清除注册卡数据,记录数据,其他关键数据不清除:比如IP地址等设备运行参数不清除
内 容 |
字节 |
数据 |
数据 |
0 |
内 容 |
字节 |
数据 |
数据 |
0 |
内 容 |
字节 |
数据 |
数据 |
0 |
内 容 |
字节 |
数据 |
数据 |
0 |
内 容 |
字节 |
数据 |
数据 |
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 |
内 容 |
字节 |
数据 |
数据 |
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 |
内 容 |
字节 |
数据 |
数据 |
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 |
内 容 |
字节 |
数据 |
数据 |
0 |
内 容 |
字节 |
数据 |
数据 |
N |
ASCII字符串,直接显示 |
内 容 |
字节 |
数据 |
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 |
内 容 |
字节 |
数据 |
数据 |
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 |
内 容 |
字节 |
数据 |
数据 |
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 |
说明:电梯内部楼层按键响应,需要手动按键。无前后门的系统默认使用前门
请求à 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.人为管理因素大,可疑及闲杂人员 ...
- 《战狼2》中人脸识别无人机表现不俗,军、警用果真如此高能?
"非洲某国战乱,战火蔓至海外华人,雇佣兵辣手残杀普通平民,在此危急时刻,前解放军特种兵冷锋挺身而出单刀赴会,中国海军舰队临危上线奔袭掩护-.."前不久上映的军事动作电影<战狼 ...
- 大数据+人脸识别在商业银行中的应用
在当前利率市场化.蓬勃发展.经济新常态三大因素形成共振的历史转折点上,我国商业经营模式面临着全新的变革.如何在精细化经营管理的基础上为客户提供更优质.更安全的服务体验,成为各商业银行竞争的焦点.近年来 ...
- 人脸识别应用场景不断拓展 刷脸要方便更要安全
刷脸解锁.刷脸支付.刷脸进校园--近几年,人脸识别技术不断取得突破,应用场景逐渐拓展,进一步便利了我们的生活,在疫情防控常态化阶段更是大显身手.与此同时,仍有一些问题困扰着行业发展,比如在非必要场景过 ...
- pytorch实现人脸识别_一步一步带你完成深度学习与对象检测之人脸识别
前期文章我们分享了opencv的人脸检测 人工智能-OpenCV+Python实现人脸识别 以及dlib的人脸检测与人脸识别 人工智能-Dlib+Python实现人脸识别 通过往期的分享,我们了解到人 ...
- 人脸识别技术场景应用
人脸识别技术场景应用 1.人脸识别(FR技术)产品的优势 1)非接触: 人脸图像的采集不同于指纹.掌纹需要接触指掌纹专用采集设备,指掌纹的采集除了对设备有一定的磨损外,也不卫生,容易引起被采集者的反感 ...
- AI(1 )---人脸识别在各个行业的典型盈利模式
人脸识别在各个行业的典型盈利模式 当前,人工智能的产业化发展处于井喷阶段,有人称AI已成为一种社会现象.这其中,以人脸识别为代表的计算机视觉的发展备受关注.人脸识别是基于人的脸部特征信息进行身份识别的 ...
- 安卓机+数据线,带你开发部署人脸识别应用
只有强大的数学与理论知识功底,才能进入 AI 领域吗? 大可不必! 过去我们都在谈"AI 时代,开发者 / 程序员该如何",但是,对于现在的 AI 来说,它更应该走进的并非开发者中 ...
- 人脸识别无人机燃爆《战狼2》 它真的存在吗?
这个夏天,比高温天更火爆的当数前不久上映的<战狼2>了.近日,这部军事动作影片的相关信息成功的"刷爆"了朋友圈,点燃了无数观众强烈的爱国之情.抛开影片中演员精湛的演技和 ...
- pythonopencv人脸识别考勤_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(一)...
一.设计目标:旨在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统.该系统同时具备普通用户模式.管理员模式与超级管理员模式,下面具体介绍每种模式下的功能. 1)普通用户模式 该模式可分为收集 ...
最新文章
- 为ASP.NET MVC配置基于Active Directory的表单认证方式
- 【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )
- php钩子原理和实现
- C++面试八股文快问快答のSTL篇
- php 简单的存在 (方法之间的神奇作用:容错)
- srsLTE源码学习:网络附属存储抓包nas_pcap.h
- solaris系统中的’format’程序
- [Swift A] - Using Swift with Cocoa and Objective-C--Mix and Match
- linux 配置redis密码
- js 实现pdf在线阅读
- delphi 2007 精简版
- SQL Server 2014 安装与SQL语言学习笔记(一)
- 74系列标准逻辑集成芯片分类
- 计算机网络系统技术交底,公共广播系统技术交底
- python设置随机绘图颜色_Python绘图的颜色设置
- 仿淘宝左侧菜单导航栏纯Html + css 写的
- UIImagePicketView(照相机类)的使用
- java大数据量调优(超赞值得收藏)
- UnRaid利用iGVT-g插件实现Nas宿主机、虚拟机同时使用intel核显输出或硬解(硬件加速)功能
- OOP上半部分-Java与生活