76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
package common
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/eclipse/paho.golang/autopaho"
|
|
"github.com/eclipse/paho.golang/paho"
|
|
"go.uber.org/zap"
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
type DeviceMan interface {
|
|
sync.Locker
|
|
Status() int
|
|
PublishStatus()
|
|
}
|
|
|
|
type Device struct {
|
|
mu sync.Mutex
|
|
C context.Context
|
|
cm *autopaho.ConnectionManager
|
|
|
|
topic string
|
|
status atomic.Int32
|
|
OnChange func()
|
|
}
|
|
|
|
func (d *Device) Lock() {
|
|
defer d.OnChange()
|
|
d.mu.Lock()
|
|
d.status.Store(1)
|
|
zap.S().Infoln("设备上锁")
|
|
}
|
|
|
|
func (d *Device) Unlock() {
|
|
defer d.OnChange()
|
|
d.status.Store(0)
|
|
d.mu.Unlock()
|
|
zap.S().Infoln("设备解锁")
|
|
}
|
|
|
|
func (d *Device) Status() int {
|
|
return int(d.status.Load())
|
|
}
|
|
|
|
// PublishStatus 推送设备状态
|
|
func (d *Device) PublishStatus() {
|
|
err := d.cm.AwaitConnection(d.C)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, _ = d.cm.Publish(d.C, &paho.Publish{
|
|
Topic: d.topic,
|
|
Payload: []byte(fmt.Sprint(d.Status())),
|
|
QoS: 1,
|
|
})
|
|
}
|
|
|
|
func DefaultDevice(ctx context.Context, cm *autopaho.ConnectionManager, topic string) *Device {
|
|
return &Device{
|
|
C: ctx,
|
|
cm: cm,
|
|
topic: topic,
|
|
}
|
|
}
|
|
|
|
func NewDevice(ctx context.Context, cm *autopaho.ConnectionManager, topic string, onChange func()) *Device {
|
|
return &Device{
|
|
C: ctx,
|
|
cm: cm,
|
|
topic: topic,
|
|
OnChange: onChange,
|
|
}
|
|
}
|