业务接口
## 业务接口
面向前端业务接口
#### 1. 用户管理接口
|接口功能|请求方式|API|
|-|-|-|
|监听用户认证/登录状态|Firebase Auth||
|用户注册/创建|Firebase Auth|```FirebaseAuth.instance.createUserWithEmailAndPassword(email, password)```|
|用户邮箱是否已验证|Firebase Auth|```FirebaseAuth.instance.currentUser.emailVerified 属性```|
|发送邮件验证码|Firebase Auth|```FirebaseAuth.instance.currentUser.sendEmailVerification()```|
|检查并校验验证码|Firebase Auth|```FirebaseAuth.instance.currentUser.checkActionCode(code)```<br>```FirebaseAuth.instance.currentUser.applyActionCode(code)```<br>```FirebaseAuth.instance.currentUser.reload()```|
|用户登录|Firebase Auth|先监听用户认证状态<br>```FirebaseAuth.instance.signInWithEmailAndPassword(email, password)```|
|用户登出|Firebase Auth|```FirebaseAuth.instance.currentUser.signOut()```|
|更新用户信息|Firebase Auth|```mAuth.getCurrentUser().updateProfile(profileUpdates)```|
|更新用户邮箱|Firebase Auth|```mAuth.getCurrentUser().updateEmail("user@example.com")```|
|更新用户密码|Firebase Auth|```mAuth.getCurrentUser().updatePassword(newPassword)```|
|用户注销|Firebase Auth|```FirebaseAuth.instance.currentUser.delete()```|
|用户登录状态|Firebase Auth|```user = FirebaseAuth.instance.currentUser```<br>```user is null表示没有登录```<br>|
|对用户重新进行身份验证|Firebase Auth|```EmailAuthCredential credential = EmailAuthProvider.credential(email, password)```<br>```FirebaseAuth.instance.currentUser.reauthenticateWithCredential(credential)```|
<b>Google 授权登录</b>
|接口功能|请求方式|API|
|-|-|-|
|获取 经过Google授权登录 的 UserCredential|Firebase Auth||
<b>用户注册成功事件 云函数</b>
- 生成物联子账号Id,随机生成
- 生成涂鸦子账号Id,随机生成,并调用三方创建子账号接口
schema/country_code/username/password/username_type=3
- 生成萤石子账号Id,并调用三方创建子账号接口
<b>APP侧SDK初始化接口</b>
|接口功能|请求方式|API|
|-|-|-|
|萤石SDK-获取appkey和用户账号access_token|Firebase CF|萤石SDK初始化的时候,需要appkey和子用户access_token|
|涂鸦SDK-获取appkey和appsecret|Firebase CF|涂鸦SDK初始化过程,需要appkey/appsecret,子用户的uid/passwword/country_code用于登录账号|
>d 涂鸦和萤石的配网过程,均完全由SDK与三方云直接对接完成,SPS_Core只把控认证部分,SDK确认设备配网激活成功后,同步给SPS_Core。
#### 2. 设备管理接口
设备添加步骤,会根据不同的厂商,流程有所不同。
其他设备管理接口,都统一。
<b>(1)设备添加 相关接口</b>
|接口功能|请求方式|API|
|-|-|-|
|添加物联网关设备|HTTP POST|/device/add|
|监听物联网关下传感器设备状态变化|Firebase Firestore|- 传感器设备添加属于硬件对接,APP端显示添加向导</br>- APP侧使用 where().onSnapshot()监听网关下设备的添加|
|同步物联网关下传感器设备列表|HTTP POST|- 触发让SPS_Core去同步指定物联网关下的设备列表</br>- [后台] 任务方式实现|
|同步萤石摄像头设备|HTTP POST|- 触发让SPS_Core去同步指定萤石摄像头设备</br>- 用在APP端成功添加完萤石摄像头后</br>- [后台] 任务方式实现|
|同步涂鸦设备|HTTP POST|- 触发让SPS_Core去同步指定涂鸦设备</br>- [后台] 任务方式实现|
>d 备注:涂鸦在添加设备过程中,涉及的获取配网access_token和轮询配网结果,由SDK接口直接完成,不需要对接到SPS_Core,只需要在设备添加成功后,调用同步涂鸦设备接口,告诉SPS_Core去同步指定的涂鸦设备
<b>(2)获取设备信息</b>
|接口功能|请求方式|API|
|-|-|-|
|根据设备ID获取设备信息|Firebase Firestore|```db.collection('user').doc('<user_id>').collection('devices').doc('<device_id>').get()```|
|根据user_id获取设备列表信息|Firebase Firestore|```db.collection('user').doc('<user_id>').collection('devices').get()```|
|监听具体某个设备的状态信息|Firebase Firestore||
|监听网关下所有传感器设备状态信息|Firebase Firestore||
|获取环境检测类设备历史状态数据|Firebase FireStore|```db.collection('user').doc('<user_id>').collection('device_data').where('device_id', ==: <device_id>).get().limit(20).then()```|
<b>(3)更新设备状态信息</b>
|接口功能|请求方式|API|
|-|-|-|
|安防检测设备 设防/撤防 状态切换|Firebase Cloud Function||
|电器开关设备 开关打开/关闭 操作|Firebase Cloud Function||
|电器开关设备 开关延迟打开/关闭 操作|Firebase Cloud Function||
|摄像头设备 设防/撤防 状态切换|Firebase Cloud Function|即动作检测功能的开启与关闭|
>d 摄像头拍照/直播/对讲 均不通过SPS Core
<b>对接三方的云函数</b>
监听由APP侧发起的对设备状态的更新,执行相应的动作到三方设备
基于物联传感器设备状态变化监控(Firestore collection where xx=物联)云函数
- 更新状态变化 到 相应的物联传感器设备
基于涂鸦车库门控制器设备状态变化监控(Firestore collection where xx=涂鸦)云函数
- 更新状态变化 到 相应的车库门控制器设备
基于萤石摄像头设备状态变化监控(Firestore collection where xx=萤石)云函数
- 更新状态变化 到 相应的萤石设备
事件总线 云函数 —— 同步设备列表事件 —— OnSync
- 同步物联设备列表云函数,同步后转换成SPS的设备格式
- 同步涂鸦设备列表云函数,同步后转换成SPS的设备格式
- 同步萤石设备列表云函数,同步后转换成SPS的设备格式
#### 3. 场景管理接口
#### 4. 家庭管理接口
#### 5. 消息管理接口
#### 6. 问题管理接口
#### 7. 系统模块接口
#### 8. 后端任务函数
(1)同步指定设备信息
参数:
- user_id: SPS 用户ID
- device_id: SPS 设备ID
- vendor: 设备厂商
过程:
- 根据device_id,到相应的厂商云 获取设备信息,并绑定到SPS用户
(2)同步用户设备列表信息
参数:
- user_id: SPS 用户ID
- vendor: 设备厂商
(3)执行设备控制指令,并将执行结果反馈到firestore数据库
参数:
- user_id: SPS 用户ID
- device_id: 设备ID
- vendor: 设备厂商
- execution_para: 执行指令参数
过程:
- 根据设备厂商、设备执行参数,发起执行指令到相应的厂商云
- 更新
(4)添加设备操作日志到数据库
(5)物联MQTT客户端服务(python),涂鸦消息订阅客户端服务(java),萤石消息订阅客户端服务
(6)基于时间的任务函数,用于基于时间的自动化场景
(7)基于事件的任务函数
基于位置:
- APP端上报位置,每个5秒,假设,触发云端更新用户位置数据,同时触发位置更新事件。
- 位置更新事件,订阅函数,计算位置是否满足场景条件,如果否,do nothing, 如果是执行操作
基于天气
- 每隔1分钟,获取天气数据,判断是否满足场景条件,如果否,do nothing, 如果是则执行操作
基于设备数据
- 设备状态数据被更新,触发函数review场景