ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
本章主要实现智能设备管理系统中的门锁管理功能,主要包括**门锁详情展示**,**密码下发**,**开门记录列表展示**等功能。 # 3.1 门锁详情展示 门锁详情展示根据系统为我们提供的get_lock_info接口便可以获取该门锁的相关信息。在apis文件夹新建lock.py。vim lock.py ``` import requests def get_lock_info(access_token, home_id, uuid): ''' 获取门锁详情 :param access_token: 调用接口凭证 :param home_id: 门锁所在房源id :param uuid: 门锁的uuid,唯一 ''' url = 'https://saas-openapi.dding.net/v2/get_lock_info' headers = { 'Content-type' : 'Application/json', 'User-Agent' : 'PostmanRuntime/7.13.0', } query_string = { 'access_token' : access_token, 'home_id' : home_id, 'uuid' : uuid } response = requests.request('GET', url, headers=headers, params=query_string) return response.json() ``` 接着我们使用该方法获取公区门锁的设备详情,vim main.py ``` from apis.lock import get_lock_info def main(): uuid = '157c4b2bfc87abe316378b42cde86141' home_id = 'testhomeid123' access_token = '6afc3f360e04f806244af07c6c5eca1cee6065e83565e107fc4896b55ce8f735df5bd9a7d3c5e1e2f96f1fdd1c2ea52483ec2e10e5cc38517a17b1d4aff2ceff' res = get_lock_info(access_token, home_id, uuid) print(res) if __name__ == '__main__': main() ``` 其返回结果为: ``` { "ReqID": "1SCfOhyh1o9", "ErrNo": 0, "ErrMsg": "成功", "mac": "8D0003672D35", "sn": "lkjl0026190002800173", "uuid": "157c4b2bfc87abe316378b42cde86141", "device_id": 1632908514, "bind_time": 1567166975, "onoff_line": 1, "onoff_time": 1567167226, "power": 92, "power_refreshtime": 1567166980, "brand": "dding", "model": "DSL-B06", "name": "D3门锁", "lqi": 89, "lqi_refreshtime": 1567166980327, "lqi_refreshtime_s": 1567166980, "center_description": "网关", "center_uuid": "ccec6095685126a25213657764f7eb2f", "center_sn": "cnjl0003180100385967", "parent": "ccec6095685126a25213657764f7eb2f", "versions": { "hardware_version": "1.0.0.0", "app_version": "1.1.3.2", "protocol_version": "0.0.0.6", "zigbee_version": "1.0.0.0", "stm8_version": "1.0.0.0" }, "model_name": "D3" } ``` 我们可以得到门锁的信号值,在离线,版本号等等一系列的设备信息,可以将其发送给前端进行展示。 门锁详情展示的效果如下: ![](https://img.kancloud.cn/1a/9f/1a9fb477a40ffb226121b66c2589d167_2318x1352.png) # 3.2 门锁下发密码 门锁密码下发主要分为在线密码下发,离线密码下发和动态密码获取。不同的密码获取使用不同的接口,但都大同小异,这里使用在线普通密码下发作为示例。vim lock.py ``` def add_password(access_token, home_id, uuid, phonenumber, is_default, begin, end): ''' 添加在线密码 :param access_token: 调用接口凭证 :param home_id: 门锁所在的房源id :param uuid: 门锁的uuid,唯一 :param phonenumber: 租客接收密码的手机号 :param is_default: 是否超级管理员密码 0:否 1:是 :param begin: 密码有效期开始时间戳 :param end: 密码有效期结束时间戳 ''' url = 'https://saas-openapi.dding.net/v2/add_password' headers = { 'Content-type' : 'Application/json', 'User-Agent' : 'PostmanRuntime/7.13.0', } payload = { "access_token" : access_token, "home_id" : home_id, "uuid" : uuid, "phonenumber" : phonenumber, "is_default" : is_default, "permission_begin" : begin, "permission_end" : end } response = requests.request('POST', url, headers=headers, json=payload) return response.json() ``` 需要说明的是,参数is_default表明下发的密码是管理员密码,0为普通在线密码,1为超管密码。vim main.py ``` from apis.lock import add_password def main(): uuid = '157c4b2bfc87abe316378b42cde86141' home_id = 'testhomeid123' access_token = '6afc3f360e04f806244af07c6c5eca1cee6065e83565e107fc4896b55ce8f735df5bd9a7d3c5e1e2f96f1fdd1c2ea52483ec2e10e5cc38517a17b1d4aff2ceff' is_default = 0 phonenumber = 'xxxxxxxxxxx' begin = 1567094400 end = 1569772800 res = add_password(access_token, home_id, uuid, phonenumber, is_default, begin, end) print(res) if __name__ == '__main__': main() ``` 成功下发返回值:1011为该密码的id值。需要知道的是超级管理密码的id为999,普通在线密码id值为1001- 1050。 ``` { "ReqID": "1SCkbhiwcq3", "ErrNo": 0, "ErrMsg": "ADD_PASSWORD_SUCCESS", "id": 1011, "serviceid": "605642224" } ``` 值得注意的是,添加密码是耗时网络IO,建议使用异步的方式。返回值的serviceid是本次下发密码操作的服务id,当门锁下发成功后,会产生回调,并且携带serviceid字段。因此可以根据回调确定下发密码操作是否成功。 # 3.3 开门记录列表展示 根据get_lock_events可以获取门锁的开门记录,根据返回结果可以在展示成开门记录列表。vim lock.py ``` def get_lock_events(access_token, home_id, uuid, begin, end): ''' 获取开门记录列表 :param access_token: 调用接口凭证 :param home_id: 门锁所在房源id :param uuid: 门锁的uuid :param begin: 记录的开始时间戳 :param end: 记录的结束时间戳 ''' url = 'https://saas-openapi.dding.net/v2/get_lock_events' headers = { 'Content-type': 'Application/json', 'User-Agent': 'PostmanRuntime/7.13.0', } query_string = { 'access_token': access_token, 'home_id': home_id, 'uuid': uuid, 'start_time': begin, 'end_time': end } response = requests.request('GET', url, headers=headers, params=query_string) return response.json() ``` vim main.py ``` from apis.lock import get_lock_events def main(): access_token = '6afc3f360e04f806244af07c6c5eca1cee6065e83565e107fc4896b55ce8f735df5bd9a7d3c5e1e2f96f1fdd1c2ea52483ec2e10e5cc38517a17b1d4aff2ceff' home_id = 'testhomeid123' uuid = '157c4b2bfc87abe316378b42cde86141' begin = 1565798400 #7月15号时间戳 end = 1567094400 #8月30号时间戳 result = get_lock_events(access_token, home_id, uuid, begin, end) print(result) #解析获取结果,展示开门记录 for lock_event in result['lock_events']: print(lock_event) if __name__ == '__main__': main() ``` 返回的结果如下: ``` {'ReqID': '1SCL0f8y4xx', 'ErrNo': 0, 'ErrMsg': '', 'lock_events': [{'time': 1566895241000, 'eventid': 1, 'sourceid': 999, 'source_name': '管理密码', 'source': 2}, {'time': 1566895219000, 'eventid': 1, 'sourceid': 999, 'source_name': '管理密码', 'source': 2}, {'time': 1566895205000, 'eventid': 1, 'sourceid': 999, 'source_name': '管理密码', 'source': 2}, {'time': 1566306744177, 'eventid': 1, 'sourceid': 1010, 'source_name': '密码 1010', 'source': 2}]} {'time': 1566895241000, 'eventid': 1, 'sourceid': 999, 'source_name': '管理密码', 'source': 2} {'time': 1566895219000, 'eventid': 1, 'sourceid': 999, 'source_name': '管理密码', 'source': 2} {'time': 1566895205000, 'eventid': 1, 'sourceid': 999, 'source_name': '管理密码', 'source': 2} {'time': 1566306744177, 'eventid': 1, 'sourceid': 1010, 'source_name': '密码 1010', 'source': 2} ``` lock_events字段是个列表,里面每个元素是一条开门的记录。 开门记录列表展示效果如下: ![](https://img.kancloud.cn/db/55/db551b3c0ca14ffb1ba5aa530f8fc395_2274x1306.png) # 3.4 小结 本章通过门锁管理的几个示例展示了如何通过openAP实现智能门锁管理,当然还有其他的门锁管理接口可以使用。但使用方法也大同小异,为避免重复,在此不一一赘述。开发者也可以通过接口的组合,定制其他的功能。