基本逻辑完成
This commit is contained in:
72
internal/common/device.go
Normal file
72
internal/common/device.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/eclipse/paho.golang/autopaho"
|
||||
"github.com/eclipse/paho.golang/paho"
|
||||
"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)
|
||||
}
|
||||
|
||||
func (d *Device) Unlock() {
|
||||
defer d.OnChange()
|
||||
d.status.Store(0)
|
||||
d.mu.Unlock()
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user