diff --git a/apps/device/services/device.go b/apps/device/services/device.go index 85528c4..fe1ad44 100644 --- a/apps/device/services/device.go +++ b/apps/device/services/device.go @@ -12,6 +12,7 @@ import ( type ( DeviceModel interface { Insert(data entity.Device) *entity.Device + FindOneByToken(token string) (*entity.Device, error) FindOne(id string) *entity.DeviceRes FindListPage(page, pageSize int, data entity.Device) (*[]entity.DeviceRes, int64) FindList(data entity.Device) *[]entity.DeviceRes @@ -35,13 +36,14 @@ func (m *deviceModelImpl) Insert(data entity.Device) *entity.Device { list := m.FindList(entity.Device{Name: data.Name}) biz.IsTrue(list != nil && len(*list) == 0, "设备名称已经存在") //2 创建认证TOKEN IOTHUB使用 - etoken := getDeviceToken(&data) + etoken, err := GetDeviceToken(&data) + biz.ErrIsNil(err, "设备缓存失败") // 子网关不需要设置token if data.DeviceType != global.GATEWAYS { data.Token = etoken.Token } //3 添加设备 - err := tx.Table(m.table).Create(&data).Error + err = tx.Table(m.table).Create(&data).Error biz.ErrIsNil(err, "添加设备失败") // 创建超级表 失败就 err = createDeviceTable(data.Pid, data.Name) @@ -53,28 +55,6 @@ func (m *deviceModelImpl) Insert(data entity.Device) *entity.Device { return &data } -func getDeviceToken(data *entity.Device) *tool.DeviceAuth { - now := time.Now() - etoken := &tool.DeviceAuth{ - DeviceId: data.Id, - OrgId: data.OrgId, - Owner: data.Owner, - Name: data.Name, - DeviceType: data.DeviceType, - ProductId: data.Pid, - } - //设备有效期360天 - etoken.CreatedAt = now.Unix() - etoken.ExpiredAt = now.Add(time.Hour * 24 * 365).Unix() - if data.Token == "" { - etoken.Token = etoken.MD5ID() - } else { - etoken.Token = data.Token - } - biz.ErrIsNil(global.RedisDb.Set(data.Id, etoken.GetMarshal(), time.Hour*24*365), "Redis 存储失败") - return etoken -} - func (m *deviceModelImpl) FindOne(id string) *entity.DeviceRes { resData := new(entity.DeviceRes) db := global.Db.Table(m.table).Where("id = ?", id) @@ -83,6 +63,13 @@ func (m *deviceModelImpl) FindOne(id string) *entity.DeviceRes { return resData } +func (m *deviceModelImpl) FindOneByToken(token string) (*entity.Device, error) { + resData := new(entity.Device) + db := global.Db.Table(m.table).Where("token = ?", token) + err := db.First(resData).Error + return resData, err +} + func (m *deviceModelImpl) FindListPage(page, pageSize int, data entity.Device) (*[]entity.DeviceRes, int64) { list := make([]entity.DeviceRes, 0) var total int64 = 0 @@ -160,7 +147,8 @@ func (m *deviceModelImpl) FindList(data entity.Device) *[]entity.DeviceRes { } func (m *deviceModelImpl) Update(data entity.Device) *entity.Device { - getDeviceToken(&data) + _, err := GetDeviceToken(&data) + biz.ErrIsNil(err, "设备更改缓存失败") biz.ErrIsNil(global.Db.Table(m.table).Updates(&data).Error, "修改设备失败") return &data } @@ -205,3 +193,25 @@ func deleteDeviceTable(device string) error { } return nil } + +func GetDeviceToken(data *entity.Device) (*tool.DeviceAuth, error) { + now := time.Now() + etoken := &tool.DeviceAuth{ + DeviceId: data.Id, + OrgId: data.OrgId, + Owner: data.Owner, + Name: data.Name, + DeviceType: data.DeviceType, + ProductId: data.Pid, + } + //设备有效期360天 + etoken.CreatedAt = now.Unix() + etoken.ExpiredAt = now.Add(time.Hour * 24 * 365).Unix() + if data.Token == "" { + etoken.Token = etoken.MD5ID() + } else { + etoken.Token = data.Token + } + err := etoken.CreateDeviceToken(data.Id) + return etoken, err +} diff --git a/iothub/hook_base.go b/iothub/hook_base.go index 0a6cf3d..93bfadc 100644 --- a/iothub/hook_base.go +++ b/iothub/hook_base.go @@ -2,6 +2,7 @@ package iothub import ( "encoding/json" + "pandax/apps/device/services" exhook "pandax/iothub/protobuf" "pandax/pkg/global" "pandax/pkg/tool" @@ -16,7 +17,22 @@ func (s *HookService) auth(username, password string) bool { return true } etoken := &tool.DeviceAuth{} - err := global.RedisDb.Get(username, etoken) + // redis 中有就查询,没有就添加 + exists, err := global.RedisDb.Exists(global.RedisDb.Context(), username).Result() + if exists == 1 { + err = global.RedisDb.Get(username, etoken) + } else { + device, err := services.DeviceModelDao.FindOneByToken(password) + if err != nil { + global.Log.Infof("设备 %s 不存在", username) + return false + } + etoken, err = services.GetDeviceToken(device) + if err != nil { + global.Log.Infof("设备%s添加缓存失败", username) + return false + } + } if err != nil { global.Log.Infof("invalid username %s", username) return false diff --git a/pkg/tool/device.go b/pkg/tool/device.go index bb40487..c924e47 100644 --- a/pkg/tool/device.go +++ b/pkg/tool/device.go @@ -12,6 +12,7 @@ import ( "pandax/pkg/global" "strconv" "strings" + "time" ) type DeviceAuth struct { @@ -27,9 +28,8 @@ type DeviceAuth struct { ExpiredAt int64 `json:"expired_at"` } -func (entity *DeviceAuth) CreateDeviceToken() (err error) { - - return nil +func (entity *DeviceAuth) CreateDeviceToken(key string) (err error) { + return global.RedisDb.Set(key, entity.GetMarshal(), time.Hour*24*365) } func (entity *DeviceAuth) GetDeviceToken(key string) error {