添加简单的服务错误状态监听处理

This commit is contained in:
walker 2023-12-20 18:08:11 +08:00
parent 120fb4c5fb
commit f64cccccfc
9 changed files with 87 additions and 59 deletions

View File

@ -24,20 +24,17 @@ type ServiceState int32
const ( const (
ServiceState_Normal ServiceState = 0 // 正常 ServiceState_Normal ServiceState = 0 // 正常
ServiceState_Offline ServiceState = 1 // 离线 ServiceState_Error ServiceState = 2 // 错误
ServiceState_Error ServiceState = 2 // 异常
) )
// Enum value maps for ServiceState. // Enum value maps for ServiceState.
var ( var (
ServiceState_name = map[int32]string{ ServiceState_name = map[int32]string{
0: "Normal", 0: "Normal",
1: "Offline",
2: "Error", 2: "Error",
} }
ServiceState_value = map[string]int32{ ServiceState_value = map[string]int32{
"Normal": 0, "Normal": 0,
"Offline": 1,
"Error": 2, "Error": 2,
} }
) )
@ -77,6 +74,7 @@ type IotServiceState struct {
// string cliId = 1; // IOT服务mqtt客户端id // string cliId = 1; // IOT服务mqtt客户端id
State ServiceState `protobuf:"varint,2,opt,name=state,proto3,enum=iot_dto.ServiceState" json:"state,omitempty"` // 服务状态 State ServiceState `protobuf:"varint,2,opt,name=state,proto3,enum=iot_dto.ServiceState" json:"state,omitempty"` // 服务状态
ErrMsg string `protobuf:"bytes,3,opt,name=errMsg,proto3" json:"errMsg,omitempty"` // 当state为error时错误描述
} }
func (x *IotServiceState) Reset() { func (x *IotServiceState) Reset() {
@ -118,6 +116,13 @@ func (x *IotServiceState) GetState() ServiceState {
return ServiceState_Normal return ServiceState_Normal
} }
func (x *IotServiceState) GetErrMsg() string {
if x != nil {
return x.ErrMsg
}
return ""
}
type IotQcServiceStartReq struct { type IotQcServiceStartReq struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -470,35 +475,36 @@ var file_proto_src_mqtt_proto_rawDesc = []byte{
0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x71, 0x74, 0x74, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x6d, 0x71, 0x74, 0x74,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x69, 0x6f, 0x74, 0x5f, 0x64, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x69, 0x6f, 0x74, 0x5f, 0x64, 0x74, 0x6f, 0x1a,
0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x64, 0x63, 0x2e, 0x70, 0x72, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x64, 0x63, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x22, 0x3e, 0x0a, 0x0f, 0x49, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x0f, 0x49, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x74, 0x5f, 0x64, 0x74, 0x6f, 0x2e, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x74, 0x5f, 0x64, 0x74, 0x6f, 0x2e,
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
0x61, 0x74, 0x65, 0x22, 0x5b, 0x0a, 0x14, 0x49, 0x6f, 0x74, 0x51, 0x63, 0x53, 0x65, 0x72, 0x76, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x18, 0x03, 0x20,
0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x06, 0x63, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x5b, 0x0a, 0x14, 0x49,
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x6f, 0x74, 0x51, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74,
0x74, 0x5f, 0x64, 0x74, 0x6f, 0x2e, 0x4d, 0x6f, 0x64, 0x62, 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20,
0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x74, 0x5f, 0x64, 0x74, 0x6f, 0x2e, 0x4d, 0x6f,
0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x62, 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66,
0x22, 0x15, 0x0a, 0x13, 0x49, 0x6f, 0x74, 0x51, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x69, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x22, 0x3e, 0x0a, 0x16, 0x49, 0x6f, 0x74, 0x51, 0x63, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6f, 0x74, 0x51,
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x22,
0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x3e, 0x0a, 0x16, 0x49, 0x6f, 0x74, 0x51, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43,
0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x28, 0x0a, 0x10, 0x49, 0x6f, 0x74, 0x53, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a,
0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22,
0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x28, 0x0a, 0x10, 0x49, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x67,
0x74, 0x22, 0x27, 0x0a, 0x11, 0x49, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01,
0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x27, 0x0a, 0x11, 0x49, 0x6f, 0x74,
0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x05, 0x49, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12,
0x74, 0x51, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f,
0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1b, 0x0a, 0x05, 0x49, 0x6f, 0x74, 0x43, 0x6a, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x05, 0x49, 0x6f, 0x74, 0x51, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64,
0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,
0x64, 0x61, 0x74, 0x61, 0x2a, 0x32, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x1b, 0x0a, 0x05, 0x49, 0x6f, 0x74, 0x43, 0x6a, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x10, 0x00, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x2a, 0x25, 0x0a, 0x0c,
0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06,
0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x02, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x64, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f,
0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x72, 0x10, 0x02, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x64, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x33,
} }
var ( var (

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"log/slog" "log/slog"
"time"
"github.com/eclipse/paho.golang/autopaho" "github.com/eclipse/paho.golang/autopaho"
"github.com/eclipse/paho.golang/paho" "github.com/eclipse/paho.golang/paho"
@ -42,6 +43,15 @@ func Start(cmc *IotMqttConfig) error {
return nil return nil
} }
// 断开MQTT客户端
func Stop() error {
slog.Info("停止MQTT客户端")
ctx, cancle := context.WithTimeout(context.Background(), 5*time.Second)
defer cancle()
err := iotcli.cm.Disconnect(ctx)
return err
}
func checkConfig(cmc *IotMqttConfig) error { func checkConfig(cmc *IotMqttConfig) error {
if cmc.AppId == "" { if cmc.AppId == "" {
return fmt.Errorf("应用编号不能为空") return fmt.Errorf("应用编号不能为空")

View File

@ -61,7 +61,7 @@ func TestRequest(t *testing.T) {
fmt.Printf("请求结果: %v\n", resp) fmt.Printf("请求结果: %v\n", resp)
lr := &dto.IotServiceLogResp{} lr := &dto.IotServiceLogResp{}
err = proto.Unmarshal(resp.Payload, lr) _ = proto.Unmarshal(resp.Payload, lr)
log.Printf("Received response: %s\n", lr) log.Printf("Received response: %s\n", lr)
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
@ -111,7 +111,7 @@ func listen() {
v.Wait() v.Wait()
} }
func getCmConfig(clientId, logReqTopic string) autopaho.ClientConfig { func getCmConfig(clientId, subTopic string) autopaho.ClientConfig {
addr, _ := url.Parse("tcp://192.168.3.233:1883") addr, _ := url.Parse("tcp://192.168.3.233:1883")
cc := autopaho.ClientConfig{ cc := autopaho.ClientConfig{
BrokerUrls: []*url.URL{addr}, BrokerUrls: []*url.URL{addr},
@ -122,7 +122,7 @@ func getCmConfig(clientId, logReqTopic string) autopaho.ClientConfig {
defer cancel() defer cancel()
if _, err := cm.Subscribe(ctx, &paho.Subscribe{ if _, err := cm.Subscribe(ctx, &paho.Subscribe{
Subscriptions: []paho.SubscribeOptions{ Subscriptions: []paho.SubscribeOptions{
{Topic: logReqTopic, QoS: 0}, {Topic: subTopic, QoS: 0},
}, },
}); err != nil { }); err != nil {
fmt.Printf("failed to subscribe (%s). This is likely to mean no messages will be received.", err) fmt.Printf("failed to subscribe (%s). This is likely to mean no messages will be received.", err)

View File

@ -1,7 +0,0 @@
package mqtt
import "testing"
func TestWillMessage(t *testing.T) {
t.Log("test will message")
}

View File

@ -59,6 +59,5 @@ func (c *IotMqttConfig) tryInto() (*autopaho.ClientConfig, error) {
}, },
} }
cc.SetUsernamePassword(c.Username, []byte(c.Password)) cc.SetUsernamePassword(c.Username, []byte(c.Password))
cc.SetWillMessage(GetIotServiceStateTopic(), []byte("离线"), 1, true)
return cc, nil return cc, nil
} }

View File

@ -7,14 +7,14 @@ import "proto/src/dc.proto";
enum ServiceState { enum ServiceState {
Normal = 0; // Normal = 0; //
Offline = 1; // 线 Error = 2; //
Error = 2; //
} }
// IOT服务状态 // IOT服务状态
message IotServiceState { message IotServiceState {
// string cliId = 1; // IOT服务mqtt客户端id // string cliId = 1; // IOT服务mqtt客户端id
ServiceState state = 2; // ServiceState state = 2; //
string errMsg = 3; // state为error时,/
} }
message IotQcServiceStartReq { message IotQcServiceStartReq {

View File

@ -16,6 +16,7 @@ var iqcs *IotQcServer
type IotQcServer struct { type IotQcServer struct {
qcMappingService service.IotQcMappingService qcMappingService service.IotQcMappingService
tasks []service.IScheduledTask tasks []service.IScheduledTask
state *dto.IotServiceState
} }
func (s *IotQcServer) start() error { func (s *IotQcServer) start() error {
@ -27,6 +28,21 @@ func (s *IotQcServer) start() error {
return nil return nil
} }
func (s *IotQcServer) stateMonitor() *dto.IotServiceState {
if s.qcMappingService != nil {
if err := s.qcMappingService.ReportError(); err != nil {
// slog.Error("Modbus驱采映射服务报错", "err", err)
return &dto.IotServiceState{
State: dto.ServiceState_Error,
ErrMsg: err.Error(),
}
}
}
return &dto.IotServiceState{
State: dto.ServiceState_Normal,
}
}
func (s *IotQcServer) registerReqHandlers() { func (s *IotQcServer) registerReqHandlers() {
mqtt.RegIotQcServiceStartReqHandler(s.startIotQcMappingService) mqtt.RegIotQcServiceStartReqHandler(s.startIotQcMappingService)
mqtt.RegIotQcServiceStopReqHandler(s.stopIotQcMappingService) mqtt.RegIotQcServiceStopReqHandler(s.stopIotQcMappingService)
@ -54,15 +70,16 @@ func (s *IotQcServer) stopIotQcMappingService(req *dto.IotQcServiceStopReq) *dto
func StartIotQcServer() { func StartIotQcServer() {
iqcs = &IotQcServer{ iqcs = &IotQcServer{
tasks: []service.IScheduledTask{}, tasks: []service.IScheduledTask{},
state: &dto.IotServiceState{
State: dto.ServiceState_Normal,
},
} }
iqcs.start() iqcs.start()
} }
func pubServerState() { func pubServerState() {
state := dto.ServiceState_Normal state := iqcs.stateMonitor()
mqtt.PubIotServiceState(&dto.IotServiceState{ mqtt.PubIotServiceState(state)
State: state,
})
} }
func startMqttClient() { func startMqttClient() {

View File

@ -22,6 +22,8 @@ type IotQcMappingService interface {
WriteQdBytes(bytes []byte) error WriteQdBytes(bytes []byte) error
// 写采集位列表 // 写采集位列表
WriteCjBytes(bytes []byte) error WriteCjBytes(bytes []byte) error
// 报错
ReportError() error
} }
// 定时任务 // 定时任务

View File

@ -19,8 +19,14 @@ type modbusQcService struct {
qc model.QC qc model.QC
tasks []IScheduledTask tasks []IScheduledTask
stopped bool stopped bool
// cancel context.CancelFunc }
// done chan struct{} // 服务协程退出信号
// ReportError implements IotQcMappingService.
func (s *modbusQcService) ReportError() error {
if !s.cli.IsConnected() {
return fmt.Errorf("modbus连接断开")
}
return nil
} }
// RegisterQcDataHandleScheduleTask implements IotQcMappingService. // RegisterQcDataHandleScheduleTask implements IotQcMappingService.
@ -119,13 +125,8 @@ func NewModbusQcService(config *dto.ModbusConfig) (IotQcMappingService, error) {
config: config, config: config,
cli: cli, cli: cli,
qc: model.NewDC(qd, cj), qc: model.NewDC(qd, cj),
// done: make(chan struct{}),
} }
s.RegisterQcDataHandleScheduleTask(s.readTaskExecute, time.Duration(config.Interval)*time.Millisecond) s.RegisterQcDataHandleScheduleTask(s.readTaskExecute, time.Duration(config.Interval)*time.Millisecond)
// s.initOnUpdateTask()
// ctx, cancel := context.WithCancel(context.Background())
// go s.run(ctx)
// s.cancel = cancel
return s, nil return s, nil
} }