# macless-haystack **Repository Path**: ynzheng/macless-haystack ## Basic Information - **Project Name**: macless-haystack - **Description**: 制作自己的AirTag - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 59 - **Created**: 2025-04-24 - **Last Updated**: 2025-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Macless-Haystack 中文版 该项目的目标是 - 1、DIY 兼容 FindMy 网络的定位标签/设备 - 2、运行 FindMy 网络,而无需拥有 Mac 电脑或虚拟机,也不需要拥有 iPhone 与其上面的查找 app 即可查看您 DIY 的定位标签/设备的位置(注册 Apple-ID 时需要借用一下别人的 iPhone)。 ## 目录 - [Macless-Haystack 中文版](#macless-haystack-中文版) - [目录](#目录) - [安装](#安装) - [先决条件](#先决条件) - [硬件设置](#硬件设置) - [服务器设置](#服务器设置) - [前端应用程序](#前端应用程序) - [Home Assistant 集成](#home-assistant-集成) - [问题 / 争议 / 疑问](#问题--争议--疑问) - [包含的项目和变更](#包含的项目和变更) - [截图](#截图) - [Android](#android) - [网页](#网页) - [贡献](#贡献) - [免责声明](#免责声明) ## 安装 在本节中,您将找到有关如何设置自己的 Macless-Haystack 网络的分步指南。 硬件DIY有点门槛,如果你不想自己动手,可以咸鱼搜索 “自制定位标签”(用户名 lovelyelfpop),我会不定时上架一些成品,但仍然需要你自己搭建服务。 如果你已经有了成品定位标签,可以参考此简要使用说明 [成品使用教程](./read/ProductUsage.md)。 否则,请往下一步步跟着我从零开始吧。
1. 先决条件 ### 先决条件 - 会**魔法上网**。本教程很多东西需要去 github 等地方下载文件。 - 有 **Linux 服务器**(任意Linux均可)。 用来运行 Docker 服务和 Python 脚本。 - 已启用 2FA (双重认证)的 **Apple-ID**。 强烈建议不要使用个人常用的 Apple ID,而是注册一个新的 Apple ID 用于实验目的。 没有 Apple ID 的 可以找朋友借用一下苹果设备(iPad、Macbook、iPhone),注册一个。 - 仅支持短信方式作为双重认证! - 如果有苹果设备登录着该 Apple ID,最好退出,否则有可能收不到短信验证码。 - 您需要在苹果设备上登录过该帐户才可以(获得了 iCloud 的 5G 免费空间或登录过 Apple Music 才是有效的 Apple ID)。仅在 iCloud 网页上注册的 Apple ID 权限不足。 - ST17H66 系列芯片的廉价蓝牙防丢 iTag 或 nRF51/nRF52系列芯片的 iBeacon - 蓝牙防丢 iTag ![iTag](images/iTags.jpg) 拼夕夕9块钱左右,但是现在很少有 ST17H66 的芯片了。不建议大家购买。 - nRF5x 蓝牙信标 ![nRF5x蓝牙信标](images/nRF5x蓝牙信标.jpg) 价格比较贵,推荐阿里巴巴采购,最便宜的也要20左右(加邮费)。需要从商品页面详情获取或向商家询问蓝牙信标电路板上 SWCLK/SWDIO 引脚的位置 - nRF5x 蓝牙模块 ![nRF5x蓝牙模块](images/nRF5x蓝牙模块.jpg) 这个比蓝牙信标便宜,特别是闲鱼上两三块钱一个。模块体积小可以做出的定位标签也小。但是模块引脚太小要考验焊工,另外还需要网上找相应模块资料或询问卖家,找出 VCC/GND/SWCLK/SWDIO 四个引脚。最后成品如何接电池需要自己处理。 - nRF52810 PCB打样 有同学在嘉立创分享了 [nRF52810 信标 PCB 设计图](https://oshwhub.com/bitshen/lan-ya-xin-biao-findmy_copy_copy),可以自己打样、焊接元件,成本非常低,但是自己焊元件难度很大。 - 电烙铁、焊锡丝;ST-LINK V2编程器(用来给 nRF5x 刷固件) 或 USB转TTL刷机线/转接器(比如CH340,用来给 ST17H66 刷固件);杜邦线若干 - 给 ST17H66 刷机需要另外准备一个 3.3V 电源(各种3.3V电源方案均可,比如 AMS1117 稳压板,要能支持超过500mA电流),因为USB转TTL提供的电流不够,不接外部电源大概率刷不成功 - Windows 电脑,用来刷机等操作 - Linux 已安装 [Docker](https://www.docker.com/)。 - 如果你有 Home Assistant 集成的需求(不知道是啥的就不用看这段了),还要满足以下条件 - Home Assistant 安装有 mqtt 和 mqtt broker(比如 Mosquitto broker)。 - Linux 已安装 [Python3](https://www.python.org/) 和 [pip3](https://pypi.org/project/pip/) - 下载或克隆本仓库到 Linux 的 `~/macless-haystack/` (`~` 代表 home 目录),并执行 `pip3 install -r requirements.txt` 命令用于安装依赖包。 - 创建 `keys/` 目录 ```bash mkdir ~/macless-haystack/keys/ ``` 然后把 `XXXXXX.keys` 文件放到此目录下 ---
2. 硬件设置 ### 硬件设置 1. 下载刷机固件和刷机脚本 - ST17H66 芯片前往 [Lenze_ST17H66](https://github.com/biemster/FindMy/tree/main/Lenze_ST17H66) 下载所需固件(FindMy.hex)和刷机脚本(flash_st17h66.py) - nRF5x 前往 [openhaystack-firmware](https://github.com/acalatrava/openhaystack-firmware/releases) 下载所需固件(nrf51_firmware.bin或nrf52_firmware.bin) - [TLSR825X 芯片](https://github.com/biemster/FindMy/blob/main/Telink_TLSR825X/README.md),比如米家温湿度计2(型号 LYWSD03MMC)也可以刷机成定位标签,但我没有尝试 2. 执行本仓库的 `python3 generate_keys.py` 来生成密钥对(在 `keys/` 目录下)。(注意: 必须安装依赖 `cryptography`. 用 `pip3 install cryptography` 命令安装) Windows 或 Linux 下都可以执行。 3. 将固件刷入设备 这里说一下,`generate_keys.py` 可以指定参数 `python3 generate_keys.py -n 50` 来生成包含多个密钥的 keyfile,其中 50 就是个数,可以自己改。不指定则默认单个密钥,也就是定位标签运行过程中只有一个蓝牙 Mac 地址(密钥其实就是加密了的 Mac 地址),而多密钥就是定位标签可以定时更换 Mac 地址(称为滚动密钥,苹果 AirTag 就是这样)。 经过我的测试,如果单密钥的定位标签和某台 iPhone 每天都会在同一个地方相遇,第一天 iPhone 会报告标签的位置,后面一两天可能这台 iPhone 就不会报告标签的位置了,即使 iPhone 和定位标签这一两天内并不在一个地方。我猜这与密钥轮换有关,带密钥轮换机制的标签,其位置会被更频繁的上报,即位置更新更频繁,更能被精确定位。推荐使用多密钥的 keyfile。但是,密钥轮换会增加一定功耗。 刷机方法: - [ST17H66](read/ST17H66.md) ST17H66 目前为止能找到的固件都只支持单密钥。 - [nRF5x](read/nRF5x.md) 支持多密钥轮换。 ---
3. 服务器设置 ### 服务器设置 1. 在终端中执行以下命令,创建一个新的docker网络 ```bash docker network create mh-network ``` 2. 安装 [Anisette Server](https://github.com/Dadoum/anisette-v3-server): ```bash docker run -d --restart always --name anisette -p 6969:6969 --volume anisette-v3_data:/home/Alcoholic/.config/anisette-v3/ --network mh-network dadoum/anisette-v3-server ``` 注意:首次执行该命令会自动从 docker 官方仓库拉取镜像,因国内网络环境的原因,需要设置镜像仓库。如下修改 docker 的配置文件`/etc/docker/daemon.json`(不存在就新建),增加 `registry-mirrors`: ```json { "registry-mirrors": [ "https://docker.hpcloud.cloud", "https://docker.m.daocloud.io", "https://docker.unsee.tech", "https://docker.1panel.live", "http://mirrors.ustc.edu.cn", "https://docker.chenby.cn", "http://mirror.azure.cn", "https://dockerpull.org", "https://dockerhub.icu", "https://hub.rat.dev" ] } ``` 之后运行如下命令重启 docker 服务: ```bash systemctl restart docker # 或者 service docker restart ``` 此时,镜像源应该生效了。可以用 `docker info` 命令验证,如果输出末尾有如下`Registry Mirrors`,说明镜像源配置成功了: ``` Registry Mirrors: https://docker.hpcloud.cloud/ https://docker.m.daocloud.io/ https://docker.unsee.tech/ ...... ``` *如果配置未生效,拉取docker镜像还是出错,可能的原因: 1、Ubuntu 可能是因为你的docker是snap安装的,解决方法请移步 https://blog.csdn.net/lovelyelfpop/article/details/146802408 2、群晖 配置方法请移步 https://post.smzdm.com/p/ag82opxd/ 或 https://blog.csdn.net/Falleaves_Yu/article/details/120316411 或 https://wiki.slarker.me/basic/docker_mirrors.html* 镜像源配置生效后,继续执行上面安装 Anisette Server 的命令。 *要检测 Anisette 是否正常运行,可以浏览器打开 `http://服务器ip:6969`,如果能访问就说明正常;或者执行命令 `curl http://服务器ip:6969`,如果有输出`{"X-Apple-I-Client-Time":"202......`则正常。* **如果你没有在安卓手机或网页端查看 Tag 标签定位的需求,就不用看下面的3、4步骤了。** 3. 启动 Macless Haystack 服务 运行下面命令启动 macless-haystack 服务: ```bash docker run -it --restart unless-stopped --name macless-haystack-gitee -p 6176:6176 --volume mh_data:/app/endpoint/data --network mh-network lovelyelfpop/macless-haystack-gitee ``` 启动服务时,系统会要求您输入 Apple ID、密码和两步验证短信验证码(注意如果 AppleID 是大陆手机号,前面要加上 +86)。 如果您看到命令行显示 `serving at port 6176 over HTTP` 则所有设置均正确。 *要检测 Macless Haystack 服务是否正常运行,可以浏览器打开 `http://服务器ip:6176`,如果页面显示`Nothing to see here`就说明正常;或者执行命令 `curl http://服务器ip:6176`,如果有输出`Nothing to see here`则正常。* 4. 立即开启另一个终端,执行下面命令重新启动服务器 ```bash docker restart macless-haystack-gitee ``` ---
4. 前端应用程序 ### 前端应用程序 **如果你没有在安卓手机或网页上查看 Tag 标签定位的需求,就不用看本节内容了。** 您可以使用 Atomgit 提供的前端 web 网站,也可以自己托管网站服务器;也可以使用 Android app。 另外,请自己去[高德开放平台](https://console.amap.com/dev/key/app)申请 web 服务 key(key 类型一定要是 ***Web服务***,申请是免费的),在 app/web 网站的设置中需要填入。不填也可以用,但是只会显示位置坐标,不会显示中文地址描述。 - 安装/打开前端应用 - 安卓设备请安装 [apk](https://gitee.com/lovelyelfpop/macless-haystack/releases) - 非安卓的设备(iOS/鸿蒙/PC)可使用浏览器打开网站(任选其一) - [Atomgit Page(http)](http://lovelyelfpop.atomgit.net/macless_haystack_pages/) - [Atomgit Page(https)](https://lovelyelfpop.atomgit.net/macless_haystack_pages/) 注意: 1、因浏览器限制,https 的网站只能访问 https 的后台服务。所以如果你选择使用 [Atomgit Page(https)](https://lovelyelfpop.atomgit.net/macless_haystack_pages/),那么必须将 macless_haystack 服务部署为 https(需要 SSL 证书)。可以使用 nginx 等工具进行反代,也可以使用服务内置支持的 [SSL 使用方法](read/FAQ.md#%E5%A6%82%E6%9E%9C%E6%9C%8D%E5%8A%A1%E5%92%8C-ui-%E4%B8%8D%E5%9C%A8%E4%B8%80%E5%8F%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E8%BF%90%E8%A1%8C%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-ssl) 2、访问 http 的地址,浏览器可能会自作主张转向 https 的地址,可以地址栏改成 http 再回车 - *可选: 如果需要iOS、Linux 或 Windows 客户端,可以自己打包(本项目前端基于 Flutter)* - 点击前端应用程序(app 或 网站)右上角齿轮图标进入设置,填写 **高德web 服务 key** 和 **macless haystack 服务 url 地址**。其它设置项默认或按需设置。 - 回主界面,点"+"图标,选择"导入 json 文件",将 `XXXXXX_devices.json` 文件导入前端应用程序内。 - 注意: - 1、"高德web 服务 key" 如果不填,位置只会显示成经纬度,而不显示中文地址描述。 - 2、"macless haystack 服务 url 地址" 形如 `http://服务器ip:6176`。若要在公网使用,需将 macless haystack 服务公开到公网,可以用 路由器端口映射 或 内网穿透 的方式实现。具体操作不属于本文范畴,请自行搜索。 - 3、如果 app 获取位置报告时报错`未获取到位置。AppleID登录失效,请移除 auth.json 并重启 macless-haystack 服务`,请移步 [FAQ#重新注册/更改账户](read/FAQ.md#%E9%87%8D%E6%96%B0%E6%B3%A8%E5%86%8C%E6%9B%B4%E6%94%B9%E8%B4%A6%E6%88%B7) - 4、部分国产安卓机因系统魔改,点"导入 json 文件"可能弹不出文件选择。可以安装 "File Manager Plus" 这个文件管理器([[GooglePlay]](https://play.google.com/store/apps/details?id=com.alphainventor.filemanager) [[Apkpure]](https://apkpure.com/file-manager/com.alphainventor.filemanager) [[百度]](https://www.baidu.com/s?wd=com.alphainventor.filemanager)),即可支持文件选择。 ---
5. Home Assistant集成 ### Home Assistant 集成 **如果你没有 Home Assistant 集成的需求(或者不知道是啥的),就不用看本节内容了。** 此处利用了 OwnTracks 这个官方集成。 本服务的 `request_reports.py` 脚本运行之后,会通过 HA 的 mqtt 向 OwnTracks 发布消息。OwnTracks 收到消息之后会自动生成 device_tracker。 - Home Assistant 中添加集成 [OwnTracks](https://www.home-assistant.io/integrations/owntracks) 集成安装后,要在 `/homeassistant/configuration.yaml` 增加如下配置: ```yaml # Example configuration.yaml entry owntracks: max_gps_accuracy: 200 waypoints: true mqtt_topic: "owntracks/#" events_only: false ``` - 把 `XXXXXX.keys` 文件放到 `~/macless-haystack/keys/` 目录下 - 编辑本仓库的 `settings.toml` 文件,填入你自己的 mqtt地址、用户名、密码 和 Tag 标签等信息(文件内有说明) - 执行 `request_reports.py` 脚本。会要求你输入 Apple-ID、密码和两步验证短信验证码。 ```bash python3 ./request_reports.py # 或者 仅获取过去12小时位置报告 python3 ./request_reports.py --hours 12 ``` 去 Home Assistant "设备与服务-实体"(或 OwnTracks 集成)中,应该可以看到 `tag` 开头的 device_tracker 了。 ![OwnTags](images/ha/ha1.jpg) 可以在墨澜地图中查看 ![墨澜地图](images/ha/ha2.jpg) - 最后,需要设置定时任务(比如Linux的cron),比如每隔15分钟(建议不要太频繁)执行一次上面的 `python3 ./request_reports.py --hours 2`,这样位置才会定时更新。 - 注意 - 1:如果获取不到位置报告,建议拿着定位标签去人多的地方逛逛。 - 2:执行 `request_reports.py` 时如果报错 `401`,说明 `keys/auth.json` 登录失效,请删除该文件后重新执行,重新输入 AppleID 和密码即可 - 3: 以定时任务执行时,如果 `auth.json` 失效,希望能第一时间知晓,可以配置 `settings.toml` 文件内的"通知功能"部分,支持钉钉、企业微信等通知方式 ---
## 问题 / 争议 / 疑问 如果您有任何问题、问题或疑问,请先查看[FAQ](read/FAQ.md)。如果这对您没有帮助,请创建新问题。 ## 包含的项目和变更 包含的项目有(感谢他们的辛勤工作): - [Anisette Server](https://github.com/Dadoum/anisette-v3-server) - Anisette 类似于设备指纹。一旦获得信任,它就会存储在 Apple 设备上。此“设备”使用此指纹和同一 Apple 帐户发出的后续请求不会再次触发两步验证 2FA。 - 最初的 [Openhaystack](https://github.com/seemoo-lab/openhaystack) - 精简为移动应用程序(Android)和 ESP32 固件。ESP32 固件与 FindYou 项目相结合,并优化了功耗。 - Android 应用程序 - ESP32 固件 - [Biemster 的 FindMy](https://github.com/biemster/FindMy) - 在密钥对生成器中进行定制,以输出用于 ESP32 固件的数组和用于在 Android 应用程序中导入的 json。 - 用于获取 FindMy 报告的独立 Python 网络服务器 - [Positive security 的 Find you](https://github.com/positive-security/find-you) - ESP32 固件定制以实现电池优化 - [acalatrava 的 OpenHaystack-Fimware 替代固件](https://github.com/acalatrava/openhaystack-firmware) - nRF5x 固件定制用于电池优化 - [dchristl 的 macless-haystack](https://github.com/dchristl/macless-haystack) ## 截图
Android 应用程序 ### Android ![首页](images/dashboard_mobile.jpg) ![跳转地图app导航](images/dashboard_navi_mobile.jpg) ![历史轨迹](images/history_mobile.jpg) ![定位标签列表](images/accessories_mobile.jpg) ![设置](images/settings_mobile.jpg)
网站 ### 网页 ![首页(手机浏览器)](images/dashboard_web_phone.jpg) ![首页(桌面浏览器)](images/dashboard_web.jpg) ![历史轨迹](images/history_web.png) ![定位标签列表](images/accessories_web.jpg)
## 贡献 欢迎提交 Pull 请求。对于重大更改,请先在 Issues 讨论您想要更改的内容。 [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) ## 免责声明 此存储库仅用于研究目的,此代码的使用由您负责。 对于您选择如何使用此处提供的任何源代码,我概不负责。使用此存储库中提供的任何文件,即表示您同意自行承担使用风险。再次重申,此处提供的所有文件仅用于教育和/或研究目的。