我正在使用树莓派和 Firebase 开发设备/产品...
系统流程如下:用户在我的网站上购买设备,她可以使用相同的凭据登录移动应用程序。
目前,我依靠我放入设备中的一些生成的 uniuqe id 来与设备和设备与 Firebase 实时数据库的数据库进行交互...
现在我需要知道设备是在线还是离线。答案应该是两种可能的解决方案。因为我想通知用户:“您的设备已离线”...
1-基于当前代码(依赖于唯一ID):如果可能,我怎样才能实现这一点。
2-将系统更改为基于用户的系统:如果我实现这个系统,我必须如何思考。设备将没有显示输入或键盘。例如,当用户更改密码时会发生什么?
谢谢你..
最佳答案
你想要的是onDisconnect
当您的设备启动时,您可以设置 onDisconnect
来更改其状态甚至触发时间:
var lastOnlineRef = firebase.database().ref("devices/1234/lastOnline");
lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);
var isOnlineRef = firebase.database().ref("devices/1234/isOnline");
isOnlineRef.onDisconnect().set(false);
至于用户的事情我不完全确定我理解。如果您将设备与您的 UID 隔离在以下路径中:/devices/UID
,则它们独立于用户而存在。
对于您的用户,您只需创建他们所有设备的列表:/users/UID/devices
{
1234: 1234,
5678: 5678
}
然后在您的应用中,您只需首先获取其设备列表,然后创建对它们的引用。
在 Angular 中,它看起来像:
// in the ts
public userDevices = this.db.list('/users/UID/devices').valueChanges();
public getDeviceObservable(deviceId: string) {
return this.db.object('/devices/' + deviceId).valueChanges();
}
//in the template
<div *ngFor="let deviceId of userDevices | async">
<ng-container *ngIf="getDeviceObservable(deviceId) | async as device">
{{ device | json }}
</ng-container>
</div>
将 getObservable 放入模板中并不完全是最佳实践,您也可以在组件中执行此操作,但这与 switchMap 等完全是另一回事。
关于Firebase如何知道特定客户端离线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48303327/