钉钉蓝牙打卡

世代继承的意志,时代的变迁,人的梦想,这些都是无法阻止的。只要人们继续追求自由的答案,这一切都将永不停止!
——哥尔·D·罗杰

参考:

介绍

  钉钉蓝牙打卡是通过验证打卡设备的mac地址广播数据实现的,所以为了实现远程打卡,我们需要使用一个设备修改mac地址模拟考勤机发送广播。
  按照广播数据的类型来分类的话,钉钉蓝牙打卡设备分为两类,分别为静态蓝牙广播设备动态蓝牙广播设备,无论是哪种打卡设备,都需要mac地址与考勤蓝牙设备相同
  实现远程蓝牙打卡的具体思路为通过使用自己的蓝牙设备模拟考勤机发送广播从而实现远程打卡,如果考勤机的广播数据是动态生成的我们还需要额外一个设备放在考勤机旁用于获取动态的广播数据并将数据上传至服务器,然后我们获取广播数据并应用于我们自己的模拟打卡设备,于是我们可以实现远程打卡

准备

  1. 两块esp32C3开发板和两根typeC数据线
  2. 科学上网;部分软件的下载需要科学上网,如果这对你来说有些困难请向我寻求帮助(微信: wxid_6ya9agafv47222;QQ:2680613764
  3. 软件下载: Arduino mqtt客户端 nRF connect

下载的软件功能如下:

需要准备的工具并不必须为esp32C3开发板,只需要是能发送和扫描广播数据的设备都可以,你也可以实现适合你自己的蓝牙打卡方案。

蓝牙广播 优点 缺点
手机广播 用软件模拟蓝牙广播,图形化操作界面,无需编写代码
esp32C3广播 便宜 门槛较高,过程相对复杂

对于动态蓝牙广播设备来说,你需要一个额外的设备进行蓝牙广播数据的获取,那么如何判断考勤机是否是动态蓝牙广播设备呢?从实用角度出发,我们可以简单地通过观察广播数据来作出判断,这在后面的流程中会提到。

蓝牙扫描(获取动态数据) 优点 缺点
手机扫描 1.有成熟的软件可以进行蓝牙扫描
2.不用外接电源,无需考虑续航问题
3.可以使用移动数据进行通信
1.贵
2.体积较大,易被发现
esp32C3扫描 1.轻便小巧,可以轻易藏起来
2.成本低,丢了也不心疼
1.没有外接电源无法正常工作
2.放置位置必须有网络,内网也行,但必须得有网络

静态蓝牙广播解决方案

  1. 手机下载 nRF connect
  2. 打开软件,打开蓝牙和位置,下拉或点击scan进行扫描
  3. 找到考勤机对应的数据

这里有几个建议和说明:

Arduino

下载: Arduino

  1. 拿出esp32C3开发板和数据线并连接电脑,打开电脑的设备管理器(右键我的电脑点击属性,在搜索框中输入设备管理器),查看开发板的串口
  2. 点击.exe文件打开Arduino,进行基础工具选项配置(如图3所示),开发板环境安装程序所需依赖的安装
  3. 注意esp32C3的开发环境安装需要从github拉取,国内连接不稳定可能需要科学上网,如果这对你有些困难可以向我寻求帮助。在科学上网后还需要在Arduino中设置使用代理,如图4和图5所示。注意,对于示例中的代码而言我下载的版本为2.0.7,如果使用最新版本程序将不能运行。
  4. 下载如图6所展示的所有依赖

粗糙编程

参考: 不爱笑的张杰-dingBle

接下来我们设置虚拟mac和广播数据,并进行广播!

详细的代码及注释如下,对于这部分代码有几个需要说明的点:

  1. 使用时需要更改代码中的设备的mac地址广播数据;如何获取考勤机的mac地址在前文中有提及;对于0x042233FFEE这个广播数据而言bleRaw变量值为{ 0x04, 0x22, 0x33, 0xFF, 0xEE}
  2. 蓝牙分为传统蓝牙和低功耗蓝牙,这里我们进行的是低功耗蓝牙广播,代码中进行了蓝牙服务的创建,但是创建服务这一步是无关紧要的,对于钉钉打卡而言只需要改动代码中的mac地址和广播数据就行,关于低功耗蓝牙服务的详情可以点击此处
  3. 在输入界面中输入程序后点击编译再上传或直接上传,esp32C3就会运行这段程序了,这时打开串口监视器就可以看到打印的信息了,如果没有信息的话请检查波特率是否为115200,工具中的配置是否正确。建议使用电脑usb电源口运行开发板,如果需要其它电源建议电流小于1000mA

动态蓝牙广播解决方案

mqtt服务

  如果你的考勤机是静态广播类型的那么你应该已经可以实现远程蓝牙打卡了,但是多数资本家会愿意花更多钱使用更难作弊的动态广播打卡机,这种打卡机的广播数据是在实时变化的,所以之前我们在代码中写死广播数据的做法不再通用。那么很自然地我们想到,能不能实时地获取打卡机的广播数据呢?由于只有在打卡机的蓝牙范围内才能获取广播数据,所以我们必须要有额外的一个设备放在它的蓝牙范围内,通过该设备获取广播数据后,将数据写入实现打卡。

建立服务器

可以使用公共的服务器进行测试和使用,但是建立自己的服务器能保证信息的时效性,公共服务响应时间为一分钟左右,即esp32发布消息后,客户端需要过一分钟才能看到更新的消息,我使用 EMQX Platform 建立服务器,这是完全免费的!

  1. 进入官网后点击新建部署,设置部署的名称,然后点击右下角的立即部署,如图1所示
  2. 记录连接地址和端口号备用,如图2所示
  3. 添加用户,如图3所示

客户端

下载:mqtt explore

设置

  1. 可点击此处查看设置详情或阅读下方文字提示
  2. 可以直接使用默认的这个设置(见图1),这样将会使用公共的服务器,信息更新速度将大大降低
  3. 点击左上角connection按钮新建连接,设置好地址端口号tls加密用户名和密码,如图2所示
  4. 点击ADVANCED按钮订阅主题,对于本文中的代码,我们需要添加如图所示的三个主题,设置完成后返回;可以点击SAVE保存设置,否则每次都需重新输入
  5. 点击CONNECT按钮进行连接,进入后的界面介绍可以参考第一点的链接

粗糙编程

参考:esp32连接MQTT服务器

  1. 在这部分的代码中,我们用到了ArduinoBle这个库,所以先进行这个库的安装,如图1
  2. 按照注释更改内容:Wifi名称与密码考勤机mac地址
  3. 如果使用自己的服务器,请按照注释进行设置:设置根证书设置用户名和密码并在函数中传入使用WiFiClientSecure类型而不是WiFiClient
  4. 同静态广播解决方案的粗糙编程环节,上传运行代码
  5. 运行时的工作电流大于1000mA时可能无法正常工作

说明

  1. 使用WiFiClientSecure类型而不是WiFiClient
  2. 设置根证书
  1. 如果返回状态码-2,直接在连接中写入字符串
  2. 如果返回状态码2,设置用于支持连接的源文件 ,鼠标悬浮在引入的头文件上即可查看文件路径
  3. 参考官方文档解决

❤️将蓝牙扫描代码烧录入esp32后接通电源并放在蓝牙考勤机旁边,然后打开mqtt客户端查看上传的广播数据,将广播数据进行处理后替换蓝牙广播代码的广播数据,然后烧录程序打开钉钉即可实现打卡。❤️

源代码