online.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package online
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gogf/gf/database/gredis"
  6. "github.com/gogf/gf/util/gconv"
  7. )
  8. const (
  9. KeyPrefix = "device:onlinestatus:"
  10. )
  11. type Status struct {
  12. ClientIP string
  13. AccessRPCHost string
  14. HeartbeatInterval uint32
  15. }
  16. type Manager struct {
  17. redisClient *gredis.Redis
  18. }
  19. func NewManager(host string, port, db int) *Manager {
  20. gredis.SetConfig(gredis.Config{
  21. Host: host,
  22. Port: port,
  23. Db: db,
  24. MaxActive: 100,
  25. })
  26. mgr := &Manager{
  27. redisClient: gredis.Instance(),
  28. }
  29. return mgr
  30. }
  31. func (mgr *Manager) GetStatus(id string) (*Status, error) {
  32. key := KeyPrefix + id
  33. var status *Status
  34. // get status from redis
  35. result, err := mgr.redisClient.DoVar("GET", key)
  36. fmt.Println(fmt.Sprintf("GetStatus:%v", result.String()))
  37. if err != nil {
  38. return nil, err
  39. }
  40. err = result.Struct(&status)
  41. if err != nil {
  42. return nil, err
  43. }
  44. return status, nil
  45. }
  46. func (mgr *Manager) GetOnline(id string, status Status) error {
  47. key := KeyPrefix + id
  48. buffStr := gconv.String(&status)
  49. _, err := mgr.redisClient.Do("SET", key, buffStr)
  50. if err != nil {
  51. return err
  52. }
  53. _, err = mgr.redisClient.Do("EXPIRE", key, status.HeartbeatInterval+status.HeartbeatInterval/2)
  54. if err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func (mgr *Manager) SetHeartbeat(id string) error {
  60. status, err := mgr.GetStatus(id)
  61. if err != nil {
  62. return err
  63. }
  64. if status == nil {
  65. return errors.New("device offline")
  66. }
  67. key := KeyPrefix + id
  68. _, err = mgr.redisClient.Do("EXPIRE", key, status.HeartbeatInterval+status.HeartbeatInterval/2)
  69. if err != nil {
  70. return err
  71. }
  72. return nil
  73. }
  74. func (mgr *Manager) GetOffline(id string) error {
  75. key := KeyPrefix + id
  76. _, err := mgr.redisClient.Do("DEL", key)
  77. if err != nil {
  78. return err
  79. }
  80. return nil
  81. }