『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: XCray

[修仙教程] 【ESPHome】ESP32 DIY通用蓝牙网关,接入米家系门锁等各种设备

  [复制链接]

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-7-26 08:22:54 | 显示全部楼层
本帖最后由 XCray 于 2021-7-29 23:22 编辑
ghostist 发表于 2021-7-25 21:38
常用的应该就这些了,我解读看看  对照着改一下~
先谢谢啦  弄好了交作业~ ...

xiaomi_ble.zip (3.14 KB, 下载次数: 22) 这是我改过的代码,应该可以适应至少两种门锁,你试试。

直接解压到 mine\xiaomi_ble目录下替换原文件。

~~~~~~~~~~~~~~~
这个文件有一行忘记改了,第104行,应改为:
  if (!service_data.uuid.contains(0x8F, 0x03) and !service_data.uuid.contains(0x95, 0xFE)) {
以兼容米家门锁
回复

使用道具 举报

40

主题

2176

帖子

8286

积分

元老级技术达人

积分
8286
金钱
6095
HASS币
110
发表于 2021-7-26 08:51:09 | 显示全部楼层
XCray 发表于 2021-7-26 08:22
这是我改过的代码,应该可以适应至少两种门锁,你试试。

直接解压到 mine\xiaomi_ble目录下替换原文件。 ...

学霸把学渣头按在桌上:给我抄!

我健康码绿了 复工了  晚上回去测测看,今天很多同事还是黄码没来  估计可以摸鱼
摸鱼看看两份代码区别咯
回复

使用道具 举报

40

主题

2176

帖子

8286

积分

元老级技术达人

积分
8286
金钱
6095
HASS币
110
发表于 2021-7-27 16:52:27 | 显示全部楼层
XCray 发表于 2021-7-26 08:22
这是我改过的代码,应该可以适应至少两种门锁,你试试。

直接解压到 mine\xiaomi_ble目录下替换原文件。 ...

预交作业:
0b00 09 a4 ffffffff dc59fd60                        2021-07-25 20:32:28  【锁事件】人工 门内开锁
0700 05 00 dd59fd60                                2021-07-25 20:32:29  【门事件】开门
0700 05 01 e259fd60                                2021-07-25 20:32:34  【门事件】关门


0b00 09 a2 ffffffff 5b63fd60                        2021-07-25 21:12:59  【锁事件】人工 门内反锁
0b00 09 a3 ffffffff 5e63fd60                        2021-07-25 21:13:02  【锁事件】人工 解除反锁
0700 05 02 c963fd60                                2021-07-25 21:14:49  【门事件】超时未关
0b00 09 a4 ffffffff f363fd60                        2021-07-25 21:15:31  【锁事件】人工 门内开锁
0b00 09 a1 ffffffff f963fd60                        2021-07-25 21:15:37  【锁事件】人工 门外上锁
0700 05 00 fd63fd60                                2021-07-25 21:15:41  【门事件】开门
0700 05 01 0264fd60                                2021-07-25 21:15:46  【门事件】关门
0b00 09 a1 ffffffff 0364fd60                        2021-07-25 21:15:47  【锁事件】人工 门外上锁

这是前面你帮转的报文解析
几个问题:
1、我外部指纹开锁 不知道为啥keyid还是ffffffff
2、电量和锁舌状态的报文从来没有(mqttl我也没见过)

然后我一点点改下来发现和你一样  唯一的问题是你改的那个const int32_t keyid = encode_uint32(data[3], data[3], data[2], data[1]); 应该是const int32_t keyid = encode_uint32(data[4], data[3], data[2], data[1]);
编译是编译好了,晚上回去抽空测测,没问题了正式交作业

PS:昨天去玩那个蓝牙定位设备的项目了
回复

使用道具 举报

40

主题

2176

帖子

8286

积分

元老级技术达人

积分
8286
金钱
6095
HASS币
110
发表于 2021-7-27 20:45:11 | 显示全部楼层
ghostist 发表于 2021-7-27 16:52
预交作业:

这是前面你帮转的报文解析

作业用不起来....HA里创建了实体8个,但都是未知,串口输出如下后就不再输出了
Using 'COM7' as serial port.
Writing at 0x000ec000... (100 %)Wrote 1529872 bytes (915773 compressed) at 0x00010000 in 21.2 seconds (effective 577.5 kbit/s)...
Hash of data verified.

Leaving...
Hard Resetting...
Done! Flashing is complete!

Showing logs:
[20:41:07]ets Jun  8 2016 00:22:57
[20:41:07]
[20:41:07]rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
[20:41:07]configsip: 0, SPIWP:0xee
[20:41:07]clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
[20:41:07]modeIO, clock div:2
[20:41:07]load:0x3fff0018,len:4
[20:41:07]load:0x3fff001c,len:1044
[20:41:07]load:0x40078000,len:8896
[20:41:07]load:0x40080400,len:5828
[20:41:07]entry 0x400806ac
[20:41:08][I][logger:170]: Log initialized
[20:41:08][C][ota:378]: There have been 0 suspected unsuccessful boot attempts.
[20:41:08][I][app:029]: Running through setup()...
[20:41:08][D][esp32_ble_tracker:180]: Starting scan...
[20:41:08][C][wifi:037]: Setting up WiFi...
[20:41:09][D][wifi:380]: Starting scan...
[20:41:09][D][esp32_ble_tracker:620]: Found device 77:65:029:5E:49 RSSI=-53
[20:41:09][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:09][D][esp32_ble_tracker:645]:   TX Power: 2
[20:41:09][D][esp32_ble_tracker:620]: Found device E9:4E:6A6:FE:7A RSSI=-75
[20:41:09][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:09][D][esp32_ble_tracker:620]: Found device 75:74:0C:06:33:98 RSSI=-57
[20:41:09][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:09][D][esp32_ble_tracker:645]:   TX Power: 2
[20:41:10][D][esp32_ble_tracker:620]: Found device 68:3E:34:CC:E25 RSSI=-86
[20:41:10][D][esp32_ble_tracker:641]:   Address Type: PUBLIC
[20:41:10][D][esp32_ble_tracker:643]:   Name: '魅族遥控器'
[20:41:12][D][wifi:395]: Found networks:
[20:41:12][I][wifi:441]: - 'Vaneber_2.4G' (76:7D:24:EB0:16) ▂▄▆█
[20:41:12][D][wifi:442]:     Channel: 8
[20:41:12][D][wifi:443]:     RSSI: -61 dB
[20:41:12][D][wifi:445]: - 'ChinaNet-jJtM' (D4:5F:25:24:74:44) ▂▄▆█
[20:41:12][D][wifi:445]: - 'iTV-jJtM' (D6:5F:25:34:74:44) ▂▄▆█
[20:41:12][D][wifi:445]: - 'ChinaNet-mu3346' (DC:9C:9F:5A:AC:17) ▂▄▆█
[20:41:12][D][wifi:445]: - 'iTV-9fJM' (DE:9C:9F:5A:AC:17) ▂▄▆█
[20:41:12][D][wifi:445]: - 'mu3346' (8C:AB:8E:B2:0D8) ▂▄▆█
[20:41:12][D][wifi:445]: - 'TP-LINK_803' (F4:83:CD:66:F9:4B) ▂▄▆█
[20:41:12][D][wifi:445]: - 'CMCC-N57Q' (A0:8C:F8:E7:B5:C4) ▂▄▆█
[20:41:12][D][wifi:445]: - '15-503' (F0:E4:A2:2F:70:AC) ▂▄▆█
[20:41:12][D][wifi:445]: - 'lixiang' (C4:2B:44:25:4F:40) ▂▄▆█
[20:41:12][I][wifi:250]: WiFi Connecting to 'Vaneber_2.4G'...
[20:41:13][D][esp32_ble_tracker:620]: Found device E9:79:5E2:A9:6A RSSI=-93
[20:41:13][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:13][D][esp32_ble_tracker:643]:   Name: 'Mi Band 3'
[20:41:13][I][wifi:513]: WiFi Connected!
[20:41:13][C][wifi:359]:   SSID: 'Vaneber_2.4G'
[20:41:13][C][wifi:360]:   IP Address: 192.168.50.12
[20:41:13][C][wifi:362]:   BSSID: 76:7D:24:EB0:16
[20:41:13][C][wifi:363]:   Hostname: 'lock'
[20:41:13][C][wifi:367]:   Signal strength: -60 dB ▂▄▆█
[20:41:13][C][wifi:371]:   Channel: 8
[20:41:13][C][wifi:372]:   Subnet: 255.255.255.0
[20:41:13][C][wifi:373]:   Gateway: 192.168.50.1
[20:41:13][C][wifi:374]:   DNS1: 114.114.114.114
[20:41:13][C][wifi:375]:   DNS2: 8.8.8.8
[20:41:13][D][wifi:522]: Disabling AP...
[20:41:13][C][ota:029]: Over-The-Air Updates:
[20:41:13][C][ota:030]:   Address: lock.local:3232
[20:41:13][C][ota:032]:   Using Password.
[20:41:13][C][api:022]: Setting up Home Assistant API server...
[20:41:13][I][app:059]: setup() finished successfully!
[20:41:13][I][app:105]: ESPHome version 1.21.0-dev compiled on Jul 24 2021, 03:23:58
[20:41:13][C][wifi:499]: WiFi:
[20:41:13][C][wifi:359]:   SSID: 'Vaneber_2.4G'
[20:41:13][C][wifi:360]:   IP Address: 192.168.50.12
[20:41:13][C][wifi:362]:   BSSID: 76:7D:24:EB0:16
[20:41:13][C][wifi:363]:   Hostname: 'lock'
[20:41:13][C][wifi:367]:   Signal strength: -61 dB ▂▄▆█
[20:41:13][C][wifi:371]:   Channel: 8
[20:41:13][C][wifi:372]:   Subnet: 255.255.255.0
[20:41:13][C][wifi:373]:   Gateway: 192.168.50.1
[20:41:13][C][wifi:374]:   DNS1: 114.114.114.114
[20:41:13][C][wifi:375]:   DNS2: 8.8.8.8
[20:41:13][C][logger:189]: Logger:
[20:41:13][C][logger:190]:   Level: DEBUG
[20:41:13][C][logger:191]:   Log Baud Rate: 115200
[20:41:13][C][logger:192]:   Hardware UART: UART0
[20:41:13][C][esp32_ble_tracker:606]: BLE Tracker:
[20:41:13][C][esp32_ble_tracker:607]:   Scan Duration: 300 s
[20:41:13][C][esp32_ble_tracker:608]:   Scan Interval: 320.0 ms
[20:41:13][C][esp32_ble_tracker:609]:   Scan Window: 180.0 ms
[20:41:13][C][esp32_ble_tracker:610]:   Scan Type: ACTIVE
[20:41:13][C][xiaomi_zelkova:012]: Xiaomi ZELKOVA
[20:41:13][C][xiaomi_zelkova:013]:   Bindkey: D8.9E.5B.CE.BB.E8.11.5A.E1.42.BB.03.D8.09.95.6E (16)
[20:41:13][C][xiaomi_zelkova:014]:   OpMethod 'OpMethod'
[20:41:13][C][xiaomi_zelkova:014]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:014]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:014]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:015]:   OpKeyID 'KeyID'
[20:41:13][C][xiaomi_zelkova:015]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:015]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:015]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:016]:   OpTS 'OpTS'
[20:41:13][C][xiaomi_zelkova:016]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:016]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:016]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:017]:   LockAttr 'LockAttr'
[20:41:13][C][xiaomi_zelkova:017]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:017]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:017]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:018]:   BattLvl 'BattLvl'
[20:41:13][C][xiaomi_zelkova:018]:     Device Class: 'battery'
[20:41:13][C][xiaomi_zelkova:018]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:018]:     Unit of Measurement: '%'
[20:41:13][C][xiaomi_zelkova:018]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:019]:   BattLvlTS 'BattLvlTS'
[20:41:13][C][xiaomi_zelkova:019]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:019]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:019]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:020]:   DoorEvt 'DoorEvt'
[20:41:13][C][xiaomi_zelkova:020]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:020]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:020]:     Accuracy Decimals: 0
[20:41:13][C][xiaomi_zelkova:021]:   DoorEvtTS 'DoorEvtTS'
[20:41:13][C][xiaomi_zelkova:021]:     State Class: ''
[20:41:13][C][xiaomi_zelkova:021]:     Unit of Measurement: ''
[20:41:13][C][xiaomi_zelkova:021]:     Accuracy Decimals: 0
[20:41:13][C][captive_portal:148]: Captive Portal:
[20:41:13][C][ota:029]: Over-The-Air Updates:
[20:41:13][C][ota:030]:   Address: lock.local:3232
[20:41:13][C][ota:032]:   Using Password.
[20:41:13][C][api:095]: API Server:
[20:41:13][C][api:096]:   Address: lock.local:6053
[20:41:14][D][esp32_ble_tracker:620]: Found device 77:59:8C:75:07:C3 RSSI=-92
[20:41:14][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:17][D][esp32_ble_tracker:620]: Found device 51:C6:C86:2B:2D RSSI=-96
[20:41:17][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:18][D][esp32_ble_tracker:620]: Found device 50:EB:60:97:B4:9A RSSI=-96
[20:41:18][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:20][D][esp32_ble_tracker:620]: Found device 74:61:5A:74:66:83 RSSI=-49
[20:41:20][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:20][D][esp32_ble_tracker:645]:   TX Power: 2
[20:41:21][D][esp32_ble_tracker:620]: Found device 48:02:87:87:BF:77 RSSI=-93
[20:41:21][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:38][D][api:067]: Disconnecting aioesphomeapi (192.168.50.221)
[20:41:38][D][api.connection:670]: Client 'Home Assistant 2021.4.3 (192.168.50.221)' connected successfully!
[20:41:43][D][esp32_ble_tracker:620]: Found device 63:10:7D:59:F6:97 RSSI=-73
[20:41:43][D][esp32_ble_tracker:641]:   Address Type: RANDOM
[20:41:59][D][esp32_ble_tracker:620]: Found device 68:3E:34:CC:E0:88 RSSI=-95
[20:41:59][D][esp32_ble_tracker:641]:   Address Type: PUBLIC
[20:41:59][D][esp32_ble_tracker:643]:   Name: '魅族遥控器'
[20:44:23][D][esp32_ble_tracker:620]: Found device 78:DA:07:EA:E9:80 RSSI=-97
[20:44:23][D][esp32_ble_tracker:641]:   Address Type: PUBLIC
回复

使用道具 举报

0

主题

22

帖子

144

积分

注册会员

Rank: 2

积分
144
金钱
122
HASS币
0
发表于 2021-7-28 10:07:45 | 显示全部楼层
ghostist 发表于 2021-7-24 21:43
ruan_yhang的作业貌似可以直接抄,不过这位好像近期心思不在此?
不知道这个方式的接入目前还有谁做到了   ...

幸好今天心血来潮看了下帖子,现在兴趣暂时在别处,而且密钥已经变了,不存在安全问题,就把数据公开吧。
from Cryptodome.Cipher import AES
import binascii

# test record:
# step 0: 通过网关串口接收到关于门锁beaconkey的数据:
# 15:27:46.440 [D] ots: {"id":1643315567,"result":{"operation":"query_dev","did":"1011175959","mac":"CC:8D:8F:D8:38:D2","pdid":794,"ttl":1800,"token":"0b424f31ad38035aa136b019","beaconkey":"671be45fc035476d30ed9f598f3d5054","spec_supported":0}}.
# step 1: 上拉门锁关门,门锁广播的关于自身事件的数据:
# Service Data: 48441a033c967e9fca5654edb6d67617d932a539262e30ac
# step 2: 通过网关串口接收到上一条动作的日志输出数据:
# 15:53:06.290 [D] ots: {"id":846925184,"method":"_async.ble_event","params":{"dev":{"did":"1011175959","mac":"CC:8D:8F:D8:38:D2","pdid":794},"evt":[{"eid":11,"edata":"a1ffffffffe1f2b160"}],"frmCnt":60,"gwts":2077}}
# step 3: 手机远程接收到“上提把手锁门”日志。

# 密钥:
# 671be45fc035476d30ed9f598f3d5054

# 加密数据
# 967e9fca5654edb6d67617d9

# 解密数据
# 0b0009a1ffffffffe1f2b160

mibeacon = '48441a033c967e9fca5654edb6d67617d932a539262e30ac'

#MAC:CC:8D:8F:D8:38:D2
mac = 'd238d88f8dcc'
pdid = mibeacon[4:8]
fcnt = mibeacon[8:10]
ecnt = mibeacon[-14:-8]

nonce = binascii.unhexlify(mac+pdid+fcnt+ecnt)
key = binascii.unhexlify(b'671be45fc035476d30ed9f598f3d5054')
print(pdid)
print(fcnt)
print(ecnt)

aad = b"\x11"
ciphertext = binascii.unhexlify(mibeacon[10:-14])
print(mibeacon[10:-14])
print(ciphertext)
cipher = AES.new(key, AES.MODE_CCM, nonce=nonce, mac_len=4)
cipher.update(aad)

decrptdata = cipher.decrypt(ciphertext)

print("decrptdata:",binascii.hexlify(decrptdata))



回复

使用道具 举报

40

主题

2176

帖子

8286

积分

元老级技术达人

积分
8286
金钱
6095
HASS币
110
发表于 2021-7-28 10:25:21 | 显示全部楼层
ruan_yhang 发表于 2021-7-28 10:07
幸好今天心血来潮看了下帖子,现在兴趣暂时在别处,而且密钥已经变了,不存在安全问题,就把数据公开吧。 ...

谢啦,看来你作业没写完 哈哈
你发的这些基本就是总结了整个帖子(尤其是我这几天和@XCray讨论的部分)
我猜测现在我用不起来还是解析出问题了,XCray的榉树门锁 报文长度是16 25,咱的米家是20 24,应该是第一步列举object没选对?
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-7-28 17:07:52 | 显示全部楼层
ghostist 发表于 2021-7-27 16:52
预交作业:

这是前面你帮转的报文解析

1、外部指纹开锁keyid不可能是一串ff,肯定是你哪儿弄错了
2、电量报文我观察到的规律是每天0点发一次,当然不同设备会不一样。看看米家app在不直连门锁的情况下(比如在户外蓝牙通讯距离外)能看到电量吗?如果能的话就说明门锁是会广播电量的。
锁舌状态可能确实没有,我的锁也没有。有的锁有,取决于厂家的具体实现。

3、是的,你是对的,就是4321,我当时没注意敲错了键盘成了3321
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-7-28 17:14:07 | 显示全部楼层
ghostist 发表于 2021-7-27 20:45
作业用不起来....HA里创建了实体8个,但都是未知,串口输出如下后就不再输出了
...

实体状态未知是因为没收到相应的广播报文、或者识别解析错误。

你可以在代码的各处重要语句前加上 ESP_LOGD 语句,将相关变量打印出来,同时可以观察程序执行的过程是否正确——这是比较简单的程序调试方法。
回复

使用道具 举报

40

主题

2176

帖子

8286

积分

元老级技术达人

积分
8286
金钱
6095
HASS币
110
发表于 2021-7-28 17:42:32 | 显示全部楼层
XCray 发表于 2021-7-28 17:14
实体状态未知是因为没收到相应的广播报文、或者识别解析错误。

你可以在代码的各处重要语句前加上 ESP_L ...

1、我也怀疑,因为mqttl项目是正常的
2、不直连看不到电量,mqttl也没看到过电量,现在怀疑米家锁没这个功能?
------------------------
ESP_LOGD在原本的代码里就多处有,但实际没看到,准备在启动的时候加几句试试
今天研究了半天代码,除了96~105行 没太看明白(没找到对应协议),其他都对应起来了感觉没问题
看这个周末吧  晚上在家一会儿时间不够测的
回复

使用道具 举报

40

主题

2176

帖子

8286

积分

元老级技术达人

积分
8286
金钱
6095
HASS币
110
发表于 2021-7-29 21:08:33 | 显示全部楼层
XCray 发表于 2021-7-24 16:37
是的,很显然收到了门锁的广播消息,长度有20字节、24字节、11字节。

你是不是没有修改我发的代码?

反复测试了好多遍,总感觉这里有问题
你在1楼提到:
- 门锁会不断地发送两种广播报文:

a:“Service Data”(0x16)含有Mi Service(UUID:0xFE95),MAC地址就在这个报文里。这种报文未加密、长度固定12字节,内容中只有一个字节的序号约6分钟变一次,其余固定不变  这条报文根据官方文档里MiBeacon的说明可以完美解读,不过这个消息与本文应用没啥关系;

b:“Manufacturer Specific Data”(0xFF)含有小米公司识别码(ID:0x038F),这类消息是加密的,又分为两种(已可以解密,见下文):
   b.1:待机状态下,长度固定为16,这是锁属性/状态报告,大概十来秒发一次;
- 在开锁或发生其他事件时,门锁会发出长度不同的“Manufacturer Specific Data”广播报文:
   b.2:比如开锁时,长度为25,对应小米文档里的“锁事件”。显然,这个是很重要的;

#48里又提到:
1. 我的锁有用消息都是在scan response中的“Manufacturer Specific Data”当中,而你的锁都是在advertising中“Service Data”里。也就是说,你只需要被动接收即可,无需主动扫描,更省电

我感觉xiaomi_ble.cpp中96~105行也是需要修改的(然而我看不懂这段)


目前我卡在日志输出没有任何“xiaomi_ble”开头的,xiaomi_ble.cpp所有if里面有ESP_LOGD()的,我都在后面加了else然后ESP_LOGD(),理论上无论如何都能跑到某一句ESP_LOGD(),但是我并没有收到任何输出。
附上我修改的xiaomi_ble.cpp文件,方便帮看看  下一步我该怎么调试?
xiaomi_ble.zip (5.78 KB, 下载次数: 6)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-23 20:11 , Processed in 0.102654 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表