编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • Android提升进阶

    • 库的解读

    • 专栏博客

    • 智能硬件

      • README
      • 实体卡开发和实践
      • 继电器和韦根协议
        • 01.继电器工作设计
          • 1.1 继电器做什么
          • 1.2 继电器硬件连接
          • 1.3 开发怎么做
          • 1.4 开门和关门
          • 1.5 注意点说明
          • 1.6 继电器测试
          • 1.7 继电器工作原理
        • 02.Wiegand开发是什么
          • 2.1 了解韦根协议
          • 2.2 硬件读卡器设计
          • 2.3 控制器设计
          • 2.4 常见应用场景
          • 2.5 韦根协议范围
          • 2.2 步骤和注意事项
          • 2.3 数据格式解析
          • 2.4 校验位验证
        • 03.Wiegand原理技术
          • 3.1 物理层特性详解
          • 3.2 数据传输方式
          • 3.3 电平逻辑
          • 3.4 韦根协议数据格式
        • 04.控制门禁开门技术
          • 4.1 传输过程
          • 4.2 刷卡动作
          • 4.3 门禁控制器工作逻辑
        • 04.Wiegand数据格式
          • 4.1 Wiegand26位输出格式
          • 4.2 Wiegand34位输出格式
          • 4.3 32位输出格式
        • 05.测试和调试
          • 5.1 硬件测试
          • 5.2 软件测试
          • 5.3 兼容性测试
        • 参考
      • 设备串口通信实践
      • USB开发设计实践
      • UVC相机设计实践
      • 原生相机采集图片库
      • 蓝牙开发业务实践
  • iOS开发和进阶

  • Web开发和进阶

  • Linux应用开发

  • Apps
  • Android提升进阶
  • 智能硬件
杨充
2025-08-25
目录

继电器和韦根协议

# 02.继电器和韦根协议

# 目录介绍

  • 01.继电器工作设计
    • 1.1 继电器做什么
    • 1.2 继电器硬件连接
    • 1.3 开发怎么做
    • 1.4 开门和关门
    • 1.5 注意点说明
    • 1.6 继电器测试

# 01.继电器工作设计

# 1.1 继电器做什么

继电器在门禁系统中常用于控制门的开关操作。通过继电器的开关状态,可以控制电磁锁或电机等设备的通电和断电,从而实现门的开启和关闭。

# 1.2 继电器硬件连接

以下是继电器与门禁系统的基本连接方式:

继电器线圈:连接到控制信号(如单片机、PLC 或 QML 控制的 GPIO 引脚)。

继电器触点:连接到电磁锁或电机的电源电路。

其实质是:通过发送高电平和低电平来开门和关门!

# 1.3 开发怎么做

核心思路:读取厂商设备系统中file文件,然后通过io流写入数据来发送数据。

TODO:要跟厂商明确,读什么文件。然后写入什么数据,表示发送开门和关门信号。

比如南亿继电器开门和关门,核心实现如下所示:

//继电器开门,这个是发送高电平
boolean isOpen = writeGpio(6, 1);
//继电器关门,这个是发送低电平
boolean isClose =writeGpio(6, 0);

public static boolean writeGpio(int io, int value) {
    // KLog.d("当前IO"+io+"\n当前value" + value);
    boolean fileExists = AppFileUtils.isFileExists("/proc/driver/ext2_gpio");
    if(!fileExists) return false;
    String str = "0x" + io + value + "\n";
    File file = new File("/proc/driver/ext2_gpio");
    file.setExecutable(true);
    file.setReadable(true);
    file.setWritable(true);
    try {
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(str.getBytes());
        fos.close();
    } catch (IOException var5) {
        var5.printStackTrace();
        return false;
    }
    return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

比如盛思达继电器开门和关门,核心实现如下所示:

//
// Created by 杨充 on 2024/5/21.
//

#include <iostream>
#include <string>
#define RELAY_PATH "/sys/ex_ctl/relay_switch'

class RelayDevice {
public:
    //继电器的状态:"on"或"off"
    static bool setRelaystate(const std::string &filename, const std::string &state);
    //开门
    static bool openDoor();
    //关门
    static bool closeDoor();
};

//
// Created by 杨充 on 2024/5/21.
//

#include "RelayDevice.h"

bool RelayDevice::setRelaystate(const std::string &filename, const std::string &state) {
    // 验证状态参数
    if (state != "on" && state != "off") {
        std::cerr << "Invalid argument, need use 'on' or 'off'" << std::endl;
        return false;
    }
    // 尝试打开设备文件
    std::ofstream file(filename);
    if (!file.is_open()) {
        std::cerr << "Can't open: " << filename << std::endl;
        return false;
    }
    // 写入状态值 (1 = on, 0 = off)
    file << (state == "on" ? "1" : "0");
    file.close();
    return true;
}

bool RelayDevice::openDoor() {
    return setRelaystate(RELAY_PATH,"on");
}

bool RelayDevice::closeDoor() {
    return setRelaystate(RELAY_PATH,"off");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# 1.4 开门和关门

注意:开门后,延迟3秒左右,发送关门。这个不要直接sleep线程(不要阻塞线程),在Android中是handler发送延迟消息执行,在qt中看看是否是使用Timer!

// 开门操作
if (RelayDevice::openDoor()) {
  std::cout << "Door opened successfully." << std::endl;
} else {
  std::cerr << "Failed to open door." << std::endl;
}

// 延迟3秒。建议这个时间动态配置比较好
handler.postDelay(3000);

// 关门操作
if (RelayDevice::closeDoor()) {
  std::cout << "Door closed successfully." << std::endl;
} else {
  std::cerr << "Failed to close door." << std::endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 1.5 注意点说明

开门动作:1.发送高电平【开门】——>2.延迟3秒——>3.发送低电平【关门】

延迟时间建议动态配置,比如巴西之前设置2秒,印尼设置3秒,广州某学校设置5秒。根据测试效果来!

# 1.6 继电器测试

这块不太好测试,需要用实际门禁做测试最佳!

# 1.7 继电器工作原理

代码会向 继电器file(比如/sys/ex_ctl/relay_switch) 文件写入数据。这个文件通常是一个虚拟文件,由内核驱动程序提供,用于与硬件 GPIO 引脚进行交互。

第一步:文件写入

代码通过 FileOutputStream 向 /proc/driver/ext2_gpio 文件写入数据(如 0x61\n 或 0x60\n)。

第二步:内核驱动程序处理

内核驱动程序会捕获对文件的写入操作,并解析数据。

第三步:硬件操作

驱动程序通过操作 GPIO 控制器(如寄存器)将指定的 GPIO 引脚设置为高电平或低电平。

第四步:继电器响应

GPIO 引脚的电平变化会直接控制继电器的状态:高电平:继电器线圈通电,触点闭合或断开,触发开门操作。低电平:继电器线圈断电,触点恢复默认状态,触发关门操作。

# 02.Wiegand开发是什么

# 2.1 了解韦根协议

Wiegand 是一种常用于门禁系统和访问控制系统的数据传输协议。

它使用两根线(通常是一根数据线和一根地线)来传输数据,其中一根线用于传输二进制数据的高电平信号,另一根线用于传输二进制数据的低电平信号。

Wiegand(韦根)协议是由摩托罗拉公司制定的一种通讯协议,门禁系统的读卡器、IC卡常用到这种协议。

# 2.2 硬件读卡器设计

读卡器设计:

  1. 实现韦根协议的信号输出(DATA0 和 DATA1)。
  2. 支持常见的卡片类型(如 EM4102、Mifare 等)。
  3. 提供电源、信号指示灯等硬件接口。

# 2.3 控制器设计

控制器设计:

  1. 接收并解析韦根协议的数据。
  2. 实现门禁控制逻辑(如开门、报警等)。
  3. 提供与其他设备(如服务器、摄像头)的通信接口。

# 2.4 常见应用场景

门禁系统:用于办公楼、小区、学校等场所的门禁控制。支持刷卡、密码、指纹等多种验证方式。

考勤系统:用于记录员工的上下班时间。支持数据导出和报表生成。

停车场管理:用于车辆的进出管理。支持车牌识别和支付功能。

安防系统:用于监控和报警系统的集成。支持与其他安防设备的联动。

# 2.5 韦根协议范围

韦根协议,一般是26位和34位。韦根号一般是十进制数字【有的是十六进制】

  1. 26位韦根模式传输数值范围:0~16777215
  2. 32位韦根模式传输数值范围: 0~1073741823
  3. 34位韦根模式传输数值范围: 0~4294967295

这里注意一个问题,也是前场用户经常遇到的一个问题。韦根号的取值范围不能超过所设置的韦根协议。比如1073741824,就不能用韦根26位和32位!

# 2.2 步骤和注意事项

进行 Wiegand 开发,以下是一些步骤和注意事项:

  1. 硬件设备:首先,您需要了解您所使用的硬件设备,例如读卡器和控制器。这些设备通常具有 Wiegand 接口,可以与其他设备进行数据交换。
  2. 数据格式:Wiegand 协议有不同的数据格式,如 26 位【最常见】、34 位、37 位等。您需要了解您所使用的具体数据格式,并根据需要解析和处理相应的数据。
  3. 数据传输:Wiegand 使用两根线来传输数据,一根线用于高电平信号,一根线用于低电平信号。您需要了解如何读取和解析这些信号,并将其转换为可用的数据。
  4. 数据处理:一旦您成功读取到 Wiegand 数据,您可以根据需要进行进一步的处理。这可能包括验证卡片信息、与数据库进行交互、控制门禁设备等。

标准26-bit 格式是一个开放式的格式:

这就意味着任何人都可以购买某一特定格式的HID卡,并且这些特定格式的种类是公开可选的。

26-Bit格式就是一个广泛使用的工业标准,并且对所有HID的用户开放。几乎所有的门禁控制系统都接受标准的26-Bit格式。

# 2.3 数据格式解析

数据格式解析:解析韦根协议的数据位(如 26 位、34 位)。提取卡号或标识符。

韦根Wiegand数据格式:起始位(Start Bit)、数据位(Data Bits)和校验位(Parity Bit)

# 2.4 校验位验证

校验位验证:计算并验证前校验位(Even Parity)和后校验位(Odd Parity)。主要是确保数据的正确性。

# 03.Wiegand原理技术

# 3.1 物理层特性详解

韦根协议通过两根信号线——DATA0和DATA1,以二进制方式传输信息。其工作原理简单而可靠,被广泛应用于26位、34位等格式的卡号传输中。

韦根协议的数据输出由两根信号线共同完成,这两根线分别代表二进制中的‘0’和‘1’输出。当输出为‘0’时,DATA0线上会产生一个负脉冲,其宽度TP固定为100微秒,周期TW则为1600微秒;而输出为‘1’时,则在DATA1线上产生相同宽度的负脉冲。

这种脉冲式的传输方式,确保了韦根协议在传输过程中的稳定性和准确性。

# 3.2 数据传输方式

韦根协议通过两根数据线——DATA0和DATA1来进行数据传输。在无数据传输状态下,这两根数据线均维持高电平,通常为+5V。

当需要传输数据时,会根据发送的数据位在相应线路上产生低电平脉冲。

具体来说,若发送的数据位为0,则DATA0线上会出现低电平脉冲,而DATA1线保持高电平;若发送的数据位为1,则相反,DATA1线上会出现低电平脉冲,而DATA0线保持高电平。

这种传输方式有助于确保韦根协议在数据传输过程中的稳定性和准确性。

# 3.3 电平逻辑

当D0线上的电平从高变为低时,这表示传输的二进制数据为0。这种电平变化在韦根协议的数据传输中具有重要意义,因为它直接关联着二进制数据的表示和解读。

当D1线上的电平从高降至低时,这同样具有重要意义,因为它标志着二进制数据的另一关键转变。这种下降沿的出现,在韦根协议的数据传输中,同样被紧密关联着二进制数据的解读与表示。

# 3.4 韦根协议数据格式

以一个26位韦根协议的数据格式示例:8位厂商码(Facility Code)紧接着16位用户码(Card ID),最后再加上2位校验位,共同构成了韦根协议的数据格式。

在解析这些数据时,我们采用特定的校验机制:前12位数据(即厂商码与用户码的前半部分)使用偶校验,而后12位数据(包括用户码的后半部分和校验位)则采用奇校验。

通过这种方式,我们可以确保在接收韦根信号并按照协议规则解码出完整的卡号时,数据的传输是准确无误的。

# 04.控制门禁开门技术

# 4.1 传输过程

当读卡器检测到卡片时,它会将卡号转换为韦根格式。这种格式通过D0和D1线逐位发送数据,而控制器则负责接收并验证这些数据的准确性。

韦根协议在门禁系统中主要扮演着传输刷卡信息的角色,如卡号或用户ID,从读卡器传递到控制器。

# 4.2 刷卡动作

当用户刷卡时,读卡器会感应并读取卡内芯片或磁条中存储的唯一卡号。这一动作是门禁系统中识别用户身份的关键步骤。

读卡器将感应到的卡号进行转换,形成特定格式的数据,例如韦根格式的26位或34位数据。这一转换过程是门禁系统进行后续处理的重要环节。

# 4.3 门禁控制器工作逻辑

门禁控制器在接收到读卡器传输的数据后,会首先解析出卡号,并将其与内部预先存储的授权列表进行比对。如果卡号是合法的,控制器会向电锁或磁力锁发送断电信号,从而解锁门禁;而如果卡号非法,控制器则会选择忽略该请求或触发警报系统。

在实际操作中,当有人刷卡时,门禁刷卡继电器的状态会发生改变,从常闭转为常开,导致整个线路断开。这时,电磁锁失去电源,门禁得以开启。

# 04.Wiegand数据格式

Wiegand 数据格式使用两个独立的线路(通常是一根称为D0的数据线和一根称为D1的数据线)来传输数据,二根线分别将0或1输出。

数据以二进制形式编码,通常由一串0和1的脉冲表示。每个脉冲的持续时间表示一个特定的位(0或1)。输出0时:DATA0线上出现负脉冲; 输出1时:DATA1线上出现负脉冲。

Wiegand 数据格式通常由三个主要部分组成:起始位(Start Bit)、数据位(Data Bits)和校验位(Parity Bit)。

起始位用于标识数据传输的开始,数据位包含实际的用户或卡片数据,而校验位用于验证数据的准确性。

# 4.1 Wiegand26位输出格式

Wiegand 26位各数据位的含义如下:

  • 第1 位:为输出数据2-13位的偶校验位
  • 第2-9位:ID卡的HID码的低8位
  • 第10-25位:1D卡的PID号码
  • 第 26 位:为输出数据14-25位的奇校验位

例如:一只HID:16385(0x4001),PID:00004的电子卡其26位韦根输出为:

  • 第1位为2-13位的偶校验位 ---------------1
  • 第2-9位对应与电子卡HID码的低8位 0 0 0 0 0 0 0 1
  • 第10-25位对应电子卡的PID号码 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
  • 第26位为14-25位的奇校验位 0

读出的数据是:1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0

# 4.2 Wiegand34位输出格式

Wiegand 34位各数据位的含义如下:

  • 第 1 位: 为输出第2—17位的偶校验位
  • 第 2-17 位: ID卡的HID码
  • 第18-33位: ID卡的PID号码
  • 第 34 位: 为输出第18-33位的奇校验位
  • 数据输出顺序:HID码和PID码均为高位在前,低位在后。

例:一张ID卡内容为:

  • HID:32769 PID:34953 (假设卡面印字为:2147584137 001 34953 )
  • 相应的二进制为:
  • HID:1000 0000 0000 0001
  • PID:1000 1000 1000 1001

输出如下:

12                     1718                     33  34

0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 10 0 0 1 0 0 0 1 0 0 1   0
1
2
3

# 4.3 32位输出格式

# 05.测试和调试

# 5.1 硬件测试

硬件测试: 测试读卡器和控制器的信号输出和接收。 确保硬件符合韦根协议的标准。

# 5.2 软件测试

软件测试: 测试协议解析的正确性。 验证门禁系统的功能是否正常。

# 5.3 兼容性测试

兼容性测试: 测试与不同品牌、型号设备的兼容性。

# 参考

  • Android系统韦根调试从驱动到应用(一)
    • https://blog.csdn.net/blueheart05/article/details/106116954
  • 韦根26和34格式怎么算数据,和开发相关知识。
    • https://blog.csdn.net/pawnxi/article/details/138218873
  • 探索韦根协议在门禁系统中的应用与控制
    • https://baijiahao.baidu.com/s?id=1829284602356914438&wfr=spider&for=pc
上次更新: 2026/06/10, 11:13:41
实体卡开发和实践
设备串口通信实践

← 实体卡开发和实践 设备串口通信实践→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式