本章主要实现智能设备管理系统中的门锁管理功能,主要包括**门锁详情展示**,**密码下发**,**开门记录列表展示**等功能。
# 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实现智能门锁管理,当然还有其他的门锁管理接口可以使用。但使用方法也大同小异,为避免重复,在此不一一赘述。开发者也可以通过接口的组合,定制其他的功能。