jl-iot/main.go
walker 70c8f9a41d 添加驱采任务定义和实现
修改modbus驱采映射服务任务使用驱采任务对象实现
2023-12-18 17:52:23 +08:00

107 lines
2.3 KiB
Go

package main
import (
"fmt"
"log/slog"
"os"
"time"
"joylink.club/iot/config"
"joylink.club/iot/mqtt"
mproto "joylink.club/iot/mqtt/proto"
"joylink.club/iot/service"
"joylink.club/iot/service/proto"
)
func main() {
// slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
// Level: slog.LevelDebug,
// AddSource: false,
// })))
config.LoadConfig()
mqttcfg := config.Cfg.Mqtt
cmc := &mqtt.IotMqttConfig{
AppId: mqttcfg.Topic.App,
BrokerUrl: mqttcfg.Address,
ClientId: mqttcfg.ClientId,
Username: mqttcfg.Username,
Password: mqttcfg.Password,
KeepAlive: mqttcfg.KeepAlive,
ConnectRetryDelay: mqttcfg.ConnectRetryDelay,
ConnectTimeout: mqttcfg.ConnectTimeout,
}
err := mqtt.Start(cmc)
if err != nil {
slog.Error("启动MQTT客户端失败", "error", err)
os.Exit(1)
}
go func() {
for {
time.Sleep(time.Second)
mqtt.PubIotServiceState(&mproto.IotServiceState{
Code: config.Cfg.Mqtt.ClientId,
State: mproto.ServiceState_Normal,
})
}
}()
mds, err := service.NewModbusQcService(&proto.ModbusConfig{
Url: "tcp://127.0.0.1:502",
UnitId: 2,
Timeout: 500,
Interval: 1000,
Mapping: []*proto.ModbusDcMapping{
{
// Function: proto.Modbus_ReadHoldingRegister,
Function: proto.Modbus_ReadCoil,
Addr: 0,
Quantity: 16,
Type: proto.DataType_CollectTable,
Start: 0,
},
{
Function: proto.Modbus_WriteCoils,
Addr: 16,
Quantity: 16,
Type: proto.DataType_DriveTable,
WriteStrategy: proto.Modbus_OnUpdate,
Start: 0,
},
},
}, make([]byte, 2), make([]byte, 2))
if err != nil {
panic(err)
}
mds.RegisterQcDataHandleScheduleTask(func() {
i := 0
for {
c := mds.GetCjBytes()
fmt.Printf("发布采集数据: %v\n", c)
mqtt.PubIotCjData(&mproto.IotCj{
Code: config.Cfg.Mqtt.ClientId,
Data: c,
})
i++
if i%3 == 0 {
idx := i % 8
err := mds.WriteQdBytes([]byte{byte(1 << idx), byte(3 << idx)})
if err != nil {
slog.Error("设置驱动数据失败", "error", err)
} else {
fmt.Printf("设置驱动数据成功: %v\n", mds.GetQdBytes())
}
}
if i%10 == 0 {
mds.Stop()
}
time.Sleep(time.Second)
}
}, time.Second)
time.Sleep(time.Minute)
mds.Stop()
}