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

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

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

  [复制链接]

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-7-25 21:04:33 | 显示全部楼层
ghostist 发表于 2021-7-25 20:34
打印格式参考你的,一行长度(不管接收到几个字节,1个也打印),一行内容(11,20,24三种)
进行一次室 ...

和之前的分析一样,长度11的消息只有mac地址,不用处理;长度20的两条解密后分别为07000500dd59fd60和07000501e259fd60,分别代表开门和关门,时间戳差5秒;长度24的解密后为0b0009a4ffffffffdc59fd60,操作码a4,代表人工门内开锁。

接下来尽量收集更多不同类型的消息,用我之前发过的python测试代码解密,弄清楚门锁发出的object都有哪些类型,然后根据这些数据修改xiaomi_ble.cpp。

目前可以确定的是:
122行0x97和0x01分别改为0x1A和0x03,即你用的门锁pid;
17行,0x05 改为 0x0b、长度 10 改为 9;opmethod的下标改为0,keyid 和 opts 的下标也都减1;即17-20行改为:
  if ((value_type == 0x0b) && (value_length == 9)) {
    const int8_t opmethod = data[0];
    const int32_t keyid = encode_uint32(data[3], data[3], data[2], data[1]);
    const int32_t opts = encode_uint32(data[8], data[7], data[6], data[5]);

门事件37行不用改,两种锁在这一条上没区别。

其他消息等你收集到相应的消息再分析修改。
回复

使用道具 举报

40

主题

2178

帖子

8340

积分

元老级技术达人

积分
8340
金钱
6147
HASS币
110
发表于 2021-7-25 21:26:24 | 显示全部楼层
XCray 发表于 2021-7-25 21:04
和之前的分析一样,长度11的消息只有mac地址,不用处理;长度20的两条解密后分别为07000500dd59fd60和070 ...
门内上儿童锁
48441A0363CC4BEC1F2E519D4A4BE379CB12E63D5DF11D5C
门内解儿童锁
48441A0364FD3D40504B05F47F96F6895FF998E1297D6717

超时未关
48441A0369E7A270843DA17B3394FD24FCFB9A7C


-----------室内开锁-门外上锁-门外指纹开锁-门内上提把手锁门-----------------
门内开锁?
48441A036EA14010BFB45E6E7BE14758D8646AB91845023E
门外上锁?
48441A03712C659FD4D68406C33A4BA675F15C68F3C182D2
门开?
48441A037306A29E0BC73ED05978182D0D4BF37A
门关?
48441A037419EE006C2024D97A8C6665A7C3ACE7
室内上锁?
48441A03759A245C2F5E11251F113CF8E3356D5257194C58


我这电脑没有python环境....疫情居家隔离了  在家玩玩
https://bbs.hassbian.com/thread-8444-1-1.html这个帖子可否参考?mqttl项目我就是参考这个的...
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-7-25 21:35:46 | 显示全部楼层
ghostist 发表于 2021-7-25 21:26
我这电脑没有python环境....疫情居家隔离了  在家玩玩
https://bbs.hassbian.com/thread-8444-1-1.html ...

jstormx大神的那个帖子意在思路,要说参考的话,看官方文档更好!地址:https://iot.mi.com/new/doc/embed ... e/object-definition

这几条消息我帮你解密一下:
0b0009a2ffffffff5b63fd60
0b0009a3ffffffff5e63fd60
07000502c963fd60
0b0009a4fffffffff363fd60
0b0009a1fffffffff963fd60
07000500fd63fd60
070005010264fd60
0b0009a1ffffffff0364fd60
回复

使用道具 举报

40

主题

2178

帖子

8340

积分

元老级技术达人

积分
8340
金钱
6147
HASS币
110
发表于 2021-7-25 21:38:06 | 显示全部楼层
XCray 发表于 2021-7-25 21:35
jstormx大神的那个帖子意在思路,要说参考的话,看官方文档更好!地址:https://iot.mi.com/new/doc/embe ...

常用的应该就这些了,我解读看看  对照着改一下~
先谢谢啦  弄好了交作业~
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12119
金钱
9100
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

主题

2178

帖子

8340

积分

元老级技术达人

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

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

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

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

使用道具 举报

40

主题

2178

帖子

8340

积分

元老级技术达人

积分
8340
金钱
6147
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

主题

2178

帖子

8340

积分

元老级技术达人

积分
8340
金钱
6147
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

主题

2178

帖子

8340

积分

元老级技术达人

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

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

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-29 06:58 , Processed in 0.124332 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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