模拟蓝牙打卡机

能够模拟,也能识别到,但是打卡时会显示蓝牙验证失败,不建议尝试了。

模拟蓝牙打卡,源码来自github项目dingBLE

只需要一个ESP32模块模拟蓝牙打卡机,即可通过蓝牙打卡 亲测有效arduino代码如下

打卡机的MAC和RAW数据可使用安卓app mRFconnect 扫描获取


#include "BLEDevice.h"
#include "BLEUtils.h"
#include "esp_sleep.h"
  
BLEAdvertising *pAdvertising;
//MAC地址
uint8_t bleMac[6] = {0xFA, 0xA8, 0x9A, 0x2E, 0x6B, 0x13};
// 0-30 前31组
uint8_t bleRaw[] = {0x02,0x01,0x06,0x17,0xFF,0x00,0x01,0xB5,0x00,0x02,0x25,0xEC,0xD7,0x44,0x00,0x00,0x01,0xAA,0x91,0x77,0x67,0xAF,0x01,0x10,0x00,0x00,0x00,0x03,0x03,0x3C,0xFE};
// 如果复制出来的raw超过31组 那么把它改为true并维护下面的数组
boolean rawMoreThan31 = true;//false
// 31-end
uint8_t bleRaw32[] = {0x02, 0x01, 0x16, 0x17, 0xFF, 0x00, 0x01, 0xB5, 0x00, 0x02, 0x7D, 0x00, 0x8B, 0x6A, 0x00, 0x00, 0x00, 0x90, 0x4B, 0xB6, 0xB1, 0x38, 0x01, 0x10, 0x00, 0x00, 0x00, 0x03, 0x03, 0x3C, 0xFE};


void setup() {
  Serial.begin(115200);

  // esp32没有提供设置蓝牙mac地址的api 通过查看esp32的源代码
  // 此操作将根据蓝牙mac算出base mac
  if (UNIVERSAL_MAC_ADDR_NUM == FOUR_UNIVERSAL_MAC_ADDR) {
    bleMac[5] -= 2;
  } else if (UNIVERSAL_MAC_ADDR_NUM == TWO_UNIVERSAL_MAC_ADDR) {
    bleMac[5] -= 1;
  }
  esp_base_mac_addr_set(bleMac);

  // 初始化
  BLEDevice::init("");

  // Create the BLE Server
  // BLEServer *pServer = BLEDevice::createServer(); // <-- no longer required to instantiate BLEServer, less flash and ram usage

  pAdvertising = BLEDevice::getAdvertising();

  // 设备信息设置成空白的
  BLEAdvertisementData oScanResponseData = BLEAdvertisementData();
  pAdvertising->setScanResponseData(oScanResponseData);

  // 里面有个 m_customScanResponseData = true; 和 m_customScanResponseData = true; 所以只能先随便设置一下
  BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
  pAdvertising->setAdvertisementData(oAdvertisementData);

  // 简单粗暴直接底层api重新设置一下抓到的raw
  esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw(bleRaw, 31);
  if (errRc != ESP_OK) {
    Serial.printf("esp_ble_gap_config_adv_data_raw: %d\n", errRc);
  }
  // 超过31
  if (rawMoreThan31) {
    errRc = ::esp_ble_gap_config_scan_rsp_data_raw(bleRaw32, sizeof(bleRaw32)/sizeof(bleRaw32[0]));
    if (errRc != ESP_OK) {
      Serial.printf("esp_ble_gap_config_scan_rsp_data_raw: %d\n", errRc);
    }
  }

  pAdvertising->start();
}

void loop() {
  // 闪灯灯 至于为什么是串口输出,因为并没有内置led,但拥有串口指示灯
  Serial.println("Sparkle");
  delay(1000);
  // 20分钟去待机避免忘了关
  if (millis() > 1200000) {
    esp_deep_sleep_start();
  }
}

如果有人感兴趣请留言点赞 我写一篇详细一点的教程

能够模拟,钉钉也能识别到,但是打卡时会显示蓝牙验证失败,不建议尝试了。

### 使用PHP实现钉钉蓝牙打卡集成 为了通过PHP实现与钉钉蓝牙打卡功能的集成,开发者需遵循钉钉开放平台提供的API接口指南[^1]。通常情况下,该过程涉及获取企业内部应用授权、调用特定API以及处理回调通知。 #### 获取必要的权限和配置 在开始之前,确保已经在钉钉管理后台创建了一个自定义应用并获得了相应的AppKey和AppSecret。这些凭证用于后续的身份验证请求[^2]。 #### 发起OAuth认证流程 要使外部系统能够代表员工发起操作(如记录考勤),必须先完成OAuth 2.0协议下的用户授权步骤: ```php <?php // 构建重定向URL以引导用户登录并同意授权范围 $redirect_uri = urlencode('https://yourdomain.com/callback'); echo "前往此链接进行授权:<a href='https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=YOUR_APP_KEY&response_type=code&scope=snsapi_login&state=STATE_STRING&redirect_uri={$redirect_uri}'>点击这里</a>"; ?> ``` 一旦获得用户的同意,将会跳转到指定`redirect_uri`参数中的地址,并附带一个临时授权码(code),这个code可以用来换取access_token[^3]。 #### 调用蓝牙设备绑定接口 当成功取得有效的access_token之后,就可以利用它来访问更敏感的功能区——比如关联蓝牙标签或查询附近已知信标的列表。下面是一个简单的例子展示如何发送HTTP POST请求给DingTalk API服务器从而执行上述动作之一: ```php <?php function bind_beacon($accessToken, $deviceMacAddress){ $url = 'https://oapi.dingtalk.com/topapi/checkin/record/add'; // 准备POST数据体 $postData = json_encode([ 'mac' => $deviceMacAddress, 'op_user_id'=>'manager_userid',// 操作者userid 'timestamp'=>time()*1000,// 时间戳(ms) 'source'=>'beacon',// 来源类型固定为"beacon" 'check_type'=>"On_Duty",// 打卡类型 On_Duty|Off_Duty 'latitude'=>null,// 如果不需要地理位置则设为空 'longitude'=>null ]); // 初始化cURL会话 $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST,true); curl_setopt($ch,CURLOPT_POSTFIELDS,$postData); curl_setopt($ch,CURLOPT_HTTPHEADER,array( "Content-Type: application/json", "Authorization: Bearer {$accessToken}" )); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); // 执行请求并将响应存储在一个变量中 $result=curl_exec($ch); curl_close($ch); return $result; } ?> 注意:以上代码片段仅作为概念证明用途,在实际部署前还需要考虑错误处理机制和其他安全措施。 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值