# linyu
**Repository Path**: yehu-imei/linyu
## Basic Information
- **Project Name**: linyu
- **Description**: 趣智校园热水器第三方客户端
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-09-16
- **Last Updated**: 2026-10-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🚿 淋浴 (LinYu)
[](https://developer.android.com)
[](https://kotlinlang.org)
[](https://developer.android.com/jetpack/compose)
[](https://github.com/yehu-imei/linyu/releases/latest)
[](LICENSE)
**⬇️ [下载最新 APK (v3.1.0)](https://github.com/yehu-imei/linyu/releases/latest)**
> 安装包 12.6 MB,仅支持 64 位(arm64-v8a)设备。
>
> **国内下载慢?用 Gitee 镜像** → https://gitee.com/yehu-imei/linyu/releases
> App 内的更新下载默认也走镜像。
趣智校园第三方 Android 客户端,用于控制校园热水器。相比官方 App,提供更简洁的界面和更流畅的操作体验。
## 📱 预览
### 背景装扮
把喜欢的图片设成界面背景,App 会自动从图里提取主题色作为强调色;主页与使用页各存一套,互不影响。
| 背景设置 | 主页 | 使用页 |
|---|---|---|
|
|
|
|
> 使用页套用自定义背景后不再显示设备 emoji——背景图本身就是画面主体。
### 桌面小组件
在桌面直接启停热水,不用打开 App。
| 2x2 · 空闲 | 2x2 · 使用中 | 2x4 · 设备控制 |
|---|---|---|
|
|
|
|
| 2x4 · 附近设备 | 2x4 · 账单 |
|---|---|
|
|
|
## ✨ 功能
### 🚿 设备控制
- 🔐 **手机号登录** — 默认**短信验证码登录**(未注册的手机号会自动创建账号),也可切换密码登录;支持系统自动填充保存账号密码,登录状态持久化与自动恢复
- 📡 **蓝牙扫描** — BLE 扫描附近设备,按信号强度排序;权限按需申请,Android 12+ 不需要定位权限
- 🔌 **蓝牙水表直连** — 部分学校的表不联网,手机**通过蓝牙直连**即可开阀 / 关阀 / 结算:关阀即结清、遗留订单自动补结算、App 被杀重开能恢复用水;通知栏「结束使用」和桌面小组件都能走蓝牙关阀,App 被杀也能关
- 🎨 **统一的设备图标** — 热水器 / 洗手台用单色图标,不再受各厂商 emoji 字形影响
- 📷 **扫码绑定** — 扫描设备二维码,直接弹出设备详情,无需蓝牙;也可以**从相册选图识别**,光线不足时有**手电筒**
- 🏠 **绑定寝室** — 在「选择附近」里选一间寝室,首页**和桌面小组件**的设备列表都只显示该寝室的设备
- 🚿 **一键洗澡** — 选择设备即可开始,支持停止和恢复;开阀确认,失败有提示
- ⏳ **自动关停倒计时** — 显示闲置自动关闭倒计时,关闭时弹出确认框
- 🔔 **后台用水监控** — 监控跑在前台服务里,**退出 App、划掉最近任务都不影响**:超时自动关停照常生效
- 🔕 **系统通知** — 用水期间通知栏常驻状态条并带「结束用水」按钮;结束、超时自动关停、**开阀失败**都有提醒
- 开阀失败 / 设备被占用 / 超时关停会弹**横幅**,「横幅提醒」可单独关掉
- 💰 **消费结算** — 关阀后直接向服务端查这一单结算了多少钱,结束通知里给出**本次消费金额和用水时长**
- 🚰 **饮水机支持(待测试)** — 自动识别直饮水机,绿色主题区分,设备名智能精简
- 🧩 **桌面小组件** — 1x1 / 2x2 / 2x4 三种尺寸,桌面直接启停热水;深色液态玻璃卡片,布局随尺寸自适应
- **1x1 是一个按钮**:一格大小,点一下开/关;顶部小字标「空闲 / 使用中 / 占用中」,操作中显示转圈
- 2x4 带侧边导航,可切换「设备控制 / 附近设备 / 账单」三页
- 操作状态在桌面上**全局同步**:点任一个组件,所有淋浴组件同时显示「正在开启…」并转圈
- 点「上次消费」卡片进 App 账单页;使用中点计时卡片直接关阀
- 附近设备「选用」直接在桌面切换控制设备,不用打开 App
### 💰 钱包与账单
- 💳 **一卡通真实余额** — 直接读取校园卡账户余额,不再是估算;未签约免密支付时自动回退到本地估算并注明
- 🧾 **残留账单补扣** — 12 点后结束用水或余额不足导致没扣成的账单,可以在账单上手动「请求代扣」
- 📋 **账单查询** — 查看当月消费记录和详情,按设备类型着色;支持近 7 天 / 本月消费趋势统计
### 👤 账号
- 🪪 **个人信息卡片** — 姓名、学号、学校自动获取,不用手填
- 📱 **更换手机号** — 验证码发到新号码,改完即时生效
- 🔑 **修改密码** — 支持密码方式和**短信验证码方式**(没设过密码、或忘了密码都能用)
- 🎫 **使用码** — 领取 / 重新领取前可先预览,「换一个」每天 20 次,确定领取才真正替换;取消不会影响正在用的码
### 🎨 个性化
- 🖼 **背景装扮** — 主页与使用页各一套独立背景,自动提取主题色,支持透明度 / 模糊 / 亮度调节
- 🌓 **深浅主题** — 圆形揭示切换动画,设置自动保存
- 🧩 **卡片自定义** — 「我的」页面卡片可上下排序、隐藏显示
- 📶 **断网提示** — 网络异常时友好提示
- 👥 **挤号检测** — 多设备登录自动提醒,25 秒心跳轮询,被挤下线能及时弹出提示
### 🔧 其他
- 📜 **内置运行日志** — 内存 + 文件双缓冲,敏感信息自动打码,崩溃自动捕获,可一键分享导出
- 🔄 **应用内更新** — 自动读取 GitHub Release 比对版本、展开查看更新日志,并可直接在应用内下载安装
- **下载默认走 Gitee 镜像**,更新卡片里可切回 GitHub
- 更新日志默认只列最近 3 个版本,点「展开全部」看其余
- 🔐 **加密存储** — 登录凭证加密存储(EncryptedSharedPreferences)
## 📖 文档
| 文档 | 说明 |
|---|---|
| [PROJECT.md](PROJECT.md) | 完整项目文档:技术架构、项目结构、构建方法、功能清单 |
| [CHANGELOG.md](CHANGELOG.md) | 版本更新日志 |
| [SECURITY.md](SECURITY.md) | 安全说明:如何验证正版、我们的安全设计、已知暴露面 |
| [API-qzxy.md](API-qzxy.md) | 趣智校园 API 逆向工程完整参考 |
| [开发者指南.md](开发者指南.md) | 面向第三方开发者的开发指南 |
## 🔧 适配你的学校
趣智校园在各地的部署不一样,按需要的改动量可以分三类。**先直接下载发行版试,能用就不用管下面的内容。**
### ✅ 多数学校:直接装就能用
**projectId 不需要手动填,也不需要抓包。** 它由服务器在登录时下发,客户端自动获取并沿用到后续所有请求——项目里没有硬编码任何学校的 projectId。
短信验证码登录的 `secret` 同理,是按手机号在本地算出来的(见 `utils/SignUtils.kt`),任何学校、任何手机号都能用:
```
secret = MD5( 手机号前3位 + 手机号后4位 + "klcx" )
```
### ⚠️ 部分学校:可用设备类型不同
各校接入的设备不一样,已适配的有三类,App 会自动识别并区分显示:
| 设备 | 识别方式 | 界面表现 |
|---|---|---|
| 热水器 | 蓝牙广播名 `KLCXKJ-Water` | 🚿 蓝色,正在沐浴中 |
| 洗手台 | 设备名以「洗手台」开头 | 🪥 橙色,正在洗漱中 |
| 直饮水机 | `bigTypeId == 5` | ❄️ / ♨️ 绿色,正在接凉水 / 热水 |
如果设备名格式特殊,设备名简化和类型识别可能不准,可以在 `model/DeviceModels.kt` 里补规则。
### 🔧 少数学校:需要自行改代码重新编译
只有部署方式与常见情况不同时才需要动,一共两处:
| 位置 | 当前值 | 不改会怎样 |
|---|---|---|
| BLE 设备名过滤 | `KLCXKJ-Water` | 扫不到附近设备(扫码绑定不受影响,仍可用) |
| MQTT 服务器 | `tcp://47.107.37.60:1883` | 收不到实时消费推送(不影响开关阀,HTTP 轮询仍正常) |
改完自行编译即可,构建方法见 [PROJECT.md](PROJECT.md#构建说明)。
---
## ⚠️ 已知问题与限制
下面这些多数受服务器或系统限制,当前无法解决。已修复的历史问题见 [CHANGELOG](CHANGELOG.md)。
| 问题 | 说明 |
|---|---|
| **挤号检测有延迟** | 靠心跳轮询实现,被挤下线最多 25 秒后才提示 |
| **无实时扣费** | MQTT 仅在订单结束时推送消费金额,洗澡中看不到实时扣费。官方 App 也是如此 |
| **一卡通余额需已签约** | 未签约免密支付的学生拿不到真实余额,会自动回退到本地估算并在界面上注明 |
### 🏫 兼容性
| 问题 | 说明 |
|---|---|
| **仅支持 64 位设备** | v2.2.2 起安装包只包含 arm64-v8a,纯 32 位的老机型装不上 |
| **各校部署有差异** | 已在多所学校被实际使用,但各校网络请求接口信息可能不同 |
| **饮水机功能未实机验证** | 饮水机识别与 UI 已实现,但作者所在学校无直饮水机,实际控制流程未验证 |
| **Android 12 以下仍需定位权限** | 系统对蓝牙发现的硬性规定,无法绕过;引导卡片里说明了原因 |
| **自动填充依赖手机密码管理器** | 不同厂商 ROM 行为差异较大,未在多数机型上验证 |
### 🔒 安全
| 问题 | 说明 |
|---|---|
| **MQTT 明文** | 趣智校园 MQTT 服务器不支持 TLS,通信内容未加密 |
| **密码 MD5** | 趣智校园使用 MD5 取后 10 位,安全性低(官方协议限制) |
### 🎨 体验
| 问题 | 说明 |
|---|---|
| **深色模式不全** | 登录页和洗澡页为硬编码颜色切换,非完全跟随系统;扫码页固定深色 |
| **仅中文界面** | 无多语言支持 |
> 欢迎提 Issue 或 PR 帮助改进!
## 🙏 感谢
感谢每一位为本项目做出贡献的朋友,是你们让「淋浴」从想法一步步变成今天的样子:
| 贡献者 | 贡献内容 |
|---|---|
| [@Cainite07](https://github.com/Cainite07) | 短信登录的实现 |
| [@SubmergeDQ](https://github.com/SubmergeDQ) | 蓝牙阀控制的实现 |
| [@XiaoLoad](https://github.com/XiaoLoad) | 项目优化的宝贵建议 |
| 各位同学们 | 软件的测试与体验反馈 |
> 每一段代码、每一条建议、每一次测试,都在让「淋浴」变得更好。谢谢你们 🙌
## 📄 许可证
[MIT License](LICENSE)
## ⚖️ 免责声明
本项目仅供学习和研究用途。使用者应自行遵守趣智校园及相关服务的使用条款。开发者不对因使用本项目产生的任何后果承担责任。