Explorar o código

更新查询电压电流指令

liuxiulin %!s(int64=2) %!d(string=hai) anos
pai
achega
6e620eb742

+ 2 - 2
config/config.toml

@@ -2,12 +2,12 @@
     Addr = "0.0.0.0"
     Port = 8998
     RunMode = "debug"
+    PowerFrequency = 600
+    VIFrequency = 60
 [Sparrow]
     Server = "http://192.168.0.224:18100"
     ProductKey = "958daf8b3a533f0d9516ac8fd17ef0cb06b439e664787a2a89608a10eeee8eb3c35c82c505d19f8a4417e530de0678fd"
     DeviceCode = "Dtt645-4G"
     Debug = true
 
-[frequency]
-
 

+ 2 - 2
protocol/const.go

@@ -10,8 +10,8 @@ const (
 	// ReceiveByte 接收
 	ReceiveByte = byte(0x68)
 
-	// CRID IP位
-	CRID = byte(0x16)
+	// EndByte IP位
+	EndByte = byte(0x16)
 	// PrefixID 标志位
 	PrefixID = byte(0x7e)
 

+ 88 - 0
protocol/context.go

@@ -3,6 +3,11 @@ package protocol
 type PacketContext struct {
 	ReceiveAddress []byte
 	Id             string
+	ReportPower    bool
+	VICount        int
+	ReportVI       bool
+	IsReg          bool
+	VIData         VIData
 }
 
 // SetReceiveAddress 设置接收表地址
@@ -27,3 +32,86 @@ func (a *PacketContext) SetId(id string) {
 func (a *PacketContext) GetId() string {
 	return a.Id
 }
+
+// SetReportPower 是否上报
+func (a *PacketContext) SetReportPower(report bool) {
+	a.ReportPower = report
+}
+
+// GetReportPower 获取是否上报
+func (a *PacketContext) GetReportPower() bool {
+	return a.ReportPower
+}
+
+// SetReportPower 设置电压电流收集数量
+func (a *PacketContext) SetViCount() {
+	c := a.VICount
+	if c < 4 {
+		a.VICount += 1
+		return
+	}
+	if c == 4 {
+		a.VICount = 0
+		a.SetReportVI(true)
+	}
+}
+
+// GetViCount 获取电压电流收集数量
+func (a *PacketContext) GetViCount() int {
+	return a.VICount
+}
+
+// SetReportPower 是否上报电流电压数据
+func (a *PacketContext) SetReportVI(report bool) {
+	a.ReportVI = report
+}
+
+// GetReportPower 获取是否上报电流电压数据
+func (a *PacketContext) GetReportVI() bool {
+	return a.ReportVI
+}
+
+// SetIsReg 设置是否注册
+func (a *PacketContext) SetIsReg(isReg bool) {
+	a.IsReg = isReg
+}
+
+// GetIsReg 获取是否注册
+func (a *PacketContext) GetIsReg() bool {
+	return a.IsReg
+}
+
+// SetAV
+func (a *PacketContext) SetAV(value float64) {
+	a.VIData.AV = value
+}
+
+// SetAI
+func (a *PacketContext) SetAI(value float64) {
+	a.VIData.AI = value
+}
+
+// SetBV
+func (a *PacketContext) SetBV(value float64) {
+	a.VIData.BV = value
+}
+
+// SetBI
+func (a *PacketContext) SetBI(value float64) {
+	a.VIData.BI = value
+}
+
+// SetCV
+func (a *PacketContext) SetCV(value float64) {
+	a.VIData.CV = value
+}
+
+// SetIsReg
+func (a *PacketContext) SetCI(value float64) {
+	a.VIData.CI = value
+}
+
+// GetVIData
+func (a *PacketContext) GetVIData() VIData {
+	return a.VIData
+}

+ 1 - 1
protocol/dlt645_0x0001.go

@@ -12,6 +12,6 @@ func (entity *Dlt_0x0040) Encode(ctx *PacketContext) ([]byte, error) {
 	panic("emmm")
 }
 
-func (entity *Dlt_0x0040) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x0040) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	return result, err
 }

+ 9 - 8
protocol/dlt645_0x33333433.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -13,7 +12,7 @@ type Dlt_0x33333433 struct {
 	//表号
 	DeviceID string
 	//正向有功总电能
-	WP float64
+	WH float64
 }
 
 func (entity *Dlt_0x33333433) MsgID() MsgID {
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33333433) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333433) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33333433) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -51,13 +50,15 @@ func (entity *Dlt_0x33333433) Decode(ctx *PacketContext, data []byte) (result st
 		byteb[i] = data[14+i] - 0x33
 	}
 
-	entity.WP, err = stringToWP(hex.EncodeToString(byteb))
+	entity.WH, err = stringToWP(hex.EncodeToString(byteb))
 	if err != nil {
-		return "", err
+		return result, err
 	}
-	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f kWh", entity.DeviceID, entity.WP)
-	result = fmt.Sprintf("%s:%2f kWh", "正向有功总电能", entity.WP)
-	return entity.DeviceID, nil
+
+	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f kWh", entity.DeviceID, entity.WH)
+	result.ActivePower = entity.WH
+	ctx.SetReportPower(true)
+	return result, err
 }
 
 func stringToWP(s string) (float64, error) {

+ 2 - 4
protocol/dlt645_0x33333533.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33333533) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -53,11 +52,10 @@ func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, data []byte) (result st
 
 	entity.ReactiveEnergy, err = stringToReactiveEnergy(hex.EncodeToString(byteb))
 	if err != nil {
-		return "", err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,反向有功总电能:%2f", entity.DeviceID, entity.ReactiveEnergy)
 
-	result = fmt.Sprintf("%s:%2f kWh", "反向有功总电能", entity.ReactiveEnergy)
 	return result, nil
 }
 

+ 2 - 4
protocol/dlt645_0x33333635.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -43,7 +42,7 @@ func (entity *Dlt_0x33333635) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333635) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33333635) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -57,10 +56,9 @@ func (entity *Dlt_0x33333635) Decode(ctx *PacketContext, data []byte) (result st
 
 	entity.ActivePower, err = stringToActivePower(hex.EncodeToString(byteb))
 	if err != nil {
-		return "", err
+		return result, err
 	}
 
-	result = fmt.Sprintf("%s:%2f", "当前总有功功率", entity.ActivePower)
 	glog.Debugf("数据读取成功:表号:%s,当前总有功功率:%2f", entity.DeviceID, entity.ActivePower)
 
 	return result, nil

+ 2 - 3
protocol/dlt645_0x33333735.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33333735) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -56,7 +55,7 @@ func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前总无功功率:%2f", entity.DeviceID, entity.ReactivePower)
-	result = fmt.Sprintf("%s:%2f", "当前总无功功率", entity.ReactivePower)
+
 	return result, nil
 }
 

+ 3 - 4
protocol/dlt645_0x33333835.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33333835) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -53,10 +52,10 @@ func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, data []byte) (result st
 
 	entity.ApparentPower, err = stringToApparentPower(hex.EncodeToString(byteb))
 	if err != nil {
-		return "", err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前视在功率:%2f", entity.DeviceID, entity.ApparentPower)
-	result = fmt.Sprintf("%s:%2f", "当前视在功率", entity.ApparentPower)
+
 	return result, nil
 }
 

+ 1 - 3
protocol/dlt645_0x33333935.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33333935) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -56,7 +55,6 @@ func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前总功率因数:%2f", entity.DeviceID, entity.PowerFactor)
-	result = fmt.Sprintf("%s:%2f ", "当前总功率因数", entity.PowerFactor)
 
 	return result, nil
 }

+ 4 - 4
protocol/dlt645_0x33343435.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -25,7 +24,7 @@ func (entity *Dlt_0x33343435) Encode(ctx *PacketContext) ([]byte, error) {
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x34, 0x34, 0x35})
 
 	//cs效验位
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33343435) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33343435) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33343435) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -58,7 +57,8 @@ func (entity *Dlt_0x33343435) Decode(ctx *PacketContext, data []byte) (result st
 
 	glog.Debugf("数据读取成功:表号:%s,当前A相电压:%2f", entity.DeviceID, entity.VoltageA)
 
-	result = fmt.Sprintf("%s:%2f ", "当前A相电压", entity.VoltageA)
+	ctx.SetAV(entity.VoltageA)
+	ctx.SetViCount()
 
 	return result, nil
 }

+ 5 - 4
protocol/dlt645_0x33343535.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -25,7 +24,7 @@ func (entity *Dlt_0x33343535) Encode(ctx *PacketContext) ([]byte, error) {
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x34, 0x35, 0x35})
 
 	//cs效验位
@@ -39,7 +38,7 @@ func (entity *Dlt_0x33343535) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33343535) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33343535) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -56,7 +55,9 @@ func (entity *Dlt_0x33343535) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前A相电流:%2f", entity.DeviceID, entity.CurrentA)
-	result = fmt.Sprintf("%s:%2f ", "当前A相电流", entity.CurrentA)
+
+	ctx.SetAI(entity.CurrentA)
+	ctx.SetViCount()
 	return result, nil
 }
 

+ 5 - 4
protocol/dlt645_0x33353435.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -24,7 +23,7 @@ func (entity *Dlt_0x33353435) Encode(ctx *PacketContext) ([]byte, error) {
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x35, 0x34, 0x35})
 
 	//cs效验位
@@ -38,7 +37,7 @@ func (entity *Dlt_0x33353435) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33353435) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33353435) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -54,6 +53,8 @@ func (entity *Dlt_0x33353435) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前B相电压:%2f", entity.DeviceID, entity.VoltageB)
-	result = fmt.Sprintf("%s:%2f ", "当前B相电压", entity.VoltageB)
+
+	ctx.SetBV(entity.VoltageB)
+	ctx.SetViCount()
 	return result, err
 }

+ 5 - 4
protocol/dlt645_0x33353535.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -24,7 +23,7 @@ func (entity *Dlt_0x33353535) Encode(ctx *PacketContext) ([]byte, error) {
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x35, 0x35, 0x35})
 
 	//cs效验位
@@ -38,7 +37,7 @@ func (entity *Dlt_0x33353535) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33353535) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33353535) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -55,6 +54,8 @@ func (entity *Dlt_0x33353535) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前B相电流:%2f", entity.DeviceID, entity.CurrentB)
-	result = fmt.Sprintf("%s:%2f ", "当前B相电流", entity.CurrentB)
+
+	ctx.SetBI(entity.CurrentB)
+	ctx.SetViCount()
 	return result, err
 }

+ 5 - 4
protocol/dlt645_0x33363435.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -24,7 +23,7 @@ func (entity *Dlt_0x33363435) Encode(ctx *PacketContext) ([]byte, error) {
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x36, 0x34, 0x35})
 
 	//cs效验位
@@ -38,7 +37,7 @@ func (entity *Dlt_0x33363435) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33363435) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33363435) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -55,6 +54,8 @@ func (entity *Dlt_0x33363435) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前C相电压:%2f", entity.DeviceID, entity.VoltageC)
-	result = fmt.Sprintf("%s:%2f ", "当前C相电压", entity.VoltageC)
+
+	ctx.SetCV(entity.VoltageC)
+	ctx.SetViCount()
 	return result, nil
 }

+ 5 - 4
protocol/dlt645_0x33363535.go

@@ -2,7 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -24,7 +23,7 @@ func (entity *Dlt_0x33363535) Encode(ctx *PacketContext) ([]byte, error) {
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x36, 0x35, 0x35})
 
 	//cs效验位
@@ -38,7 +37,7 @@ func (entity *Dlt_0x33363535) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33363535) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x33363535) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	bytea := data[1:7]
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
@@ -55,6 +54,8 @@ func (entity *Dlt_0x33363535) Decode(ctx *PacketContext, data []byte) (result st
 		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前C相电流:%2f", entity.DeviceID, entity.CurrentC)
-	result = fmt.Sprintf("%s:%2f ", "当前C相电流", entity.CurrentC)
+
+	ctx.SetCI(entity.CurrentC)
+	ctx.SetViCount()
 	return result, nil
 }

+ 3 - 13
protocol/dlt645_0x93.go

@@ -2,8 +2,6 @@ package protocol
 
 import (
 	"encoding/hex"
-	"fmt"
-	"github.com/gogf/gf/os/glog"
 )
 
 type Dlt_0x93 struct {
@@ -30,25 +28,17 @@ func (entity *Dlt_0x93) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x93) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (entity *Dlt_0x93) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 
 	entity.DeviceAddress = data[1:7]
 	ctx.SetReceiveAddress(data[1:7])
 
-	glog.Debugf("11111111----------DeviceAddress:%2X", ctx.GetReceiveAddress())
-
-	bytea := data[1:7]
+	var bytea []byte
+	bytea = append(bytea, data[1:7]...)
 	for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
 		bytea[i], bytea[j] = bytea[j], bytea[i]
 	}
 	entity.DeviceID = hex.EncodeToString(bytea)
 	ctx.SetId(entity.DeviceID)
-
-	glog.Debugf("2222222----------DeviceAddress:%2X", ctx.GetReceiveAddress())
-
-	glog.Debugf("表地址接收成功:表号:%s", entity.DeviceID)
-	result = fmt.Sprintf("%s:%s", "表号", entity.DeviceID)
-
-	glog.Debugf("DeviceAddress:%2X,Id:%s,", ctx.GetReceiveAddress(), ctx.GetId())
 	return result, nil
 }

+ 1 - 1
protocol/entity.go

@@ -5,5 +5,5 @@ type Entity interface {
 	//GetDeviceAddress() DeviceAddress
 	MsgID() MsgID
 	Encode(ctx *PacketContext) ([]byte, error)
-	Decode(ctx *PacketContext, data []byte) (result string, err error)
+	Decode(ctx *PacketContext, data []byte) (result Data, err error)
 }

+ 24 - 3
protocol/message.go

@@ -20,6 +20,24 @@ type DHeader struct {
 	MsgID MsgID
 }
 
+type Data struct {
+	PowerData
+	VIData
+}
+
+type PowerData struct {
+	ActivePower float64 `json:"active_power"`
+}
+
+type VIData struct {
+	AV float64 `json:"av"` // A相电压
+	AI float64 `json:"ai"` // A相电流
+	BV float64 `json:"bv"` // B相电压
+	BI float64 `json:"bi"` // B相电流
+	CV float64 `json:"cv"` // C相电压
+	CI float64 `json:"ci"` // C相电流
+}
+
 // 协议编码
 func (message *Message) Encode() ([]byte, error) {
 	// 编码消息体
@@ -41,7 +59,7 @@ func (message *Message) Encode() ([]byte, error) {
 }
 
 // 协议解码
-func (message *Message) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+func (message *Message) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
 	// 检验标志位
 	length := len(data)
 	if length == 0 {
@@ -59,6 +77,9 @@ func (message *Message) Decode(ctx *PacketContext, data []byte) (result string,
 	if data[0] != ReceiveByte {
 		return result, nil
 	}
+	if data[len(data)-1] != EndByte {
+		data = append(data, 0x16)
+	}
 	if !message.checkSum(data) {
 		return result, errors.ErrInvalidCheckSum
 	}
@@ -86,7 +107,7 @@ func (message *Message) Decode(ctx *PacketContext, data []byte) (result string,
 		}
 	}
 	if data[8] == 0x93 {
-		_, err := message.decode(ctx, uint32(0x93), data[:])
+		result, err = message.decode(ctx, uint32(0x93), data[:])
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", err.Error())
 		}
@@ -102,7 +123,7 @@ func (message *Message) Decode(ctx *PacketContext, data []byte) (result string,
 }
 
 //--->
-func (message *Message) decode(ctx *PacketContext, dataType uint32, data []byte) (result string, err error) {
+func (message *Message) decode(ctx *PacketContext, dataType uint32, data []byte) (result Data, err error) {
 	creator, ok := entityMapper[dataType]
 	if !ok {
 		return result, errors.ErrTypeNotRegistered

+ 138 - 13
server/client.go

@@ -2,6 +2,7 @@ package server
 
 import (
 	"dlt645-server/protocol"
+	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/net/gtcp"
 	"github.com/gogf/gf/os/glog"
 	"io"
@@ -26,7 +27,7 @@ type Client struct {
 }
 
 func (c *Client) ReadLoop(ctx *protocol.PacketContext) {
-	//defer c.srv.grWG.Done()
+	defer c.srv.grWG.Done()
 	for {
 		buf, err := c.conn.Recv(-1)
 		if err != nil {
@@ -34,19 +35,38 @@ func (c *Client) ReadLoop(ctx *protocol.PacketContext) {
 			return
 		}
 		if len(buf) > 0 {
-
 			result, err := c.srv.message.Decode(ctx, buf)
 			if err != nil {
 				glog.Errorf("解析报文失败:%s", err.Error())
 			}
-			//if c.Id == "" && ctx.GetId() != "" {
-			c.SetId("220714031227")
-			//}
-			if c.Id != "" {
-				if err := c.srv.ReportStatus(c.Id, result); err != nil {
+			if !c.isReg {
+				c.SetId(ctx.GetId())
+				c.isReg = true
+			}
+
+			if ctx.ReportPower {
+				data := new(protocol.PowerData)
+				data.ActivePower = result.ActivePower
+				if err := c.srv.ReportStatus(c.Id, data); err != nil {
+					c.readError(err)
+					return
+				}
+				ctx.SetReportPower(false)
+			}
+
+			if ctx.ReportVI {
+				data := new(protocol.VIData)
+				data.AV = ctx.GetVIData().AV
+				data.BV = ctx.GetVIData().BV
+				data.CV = ctx.GetVIData().CV
+				data.AI = ctx.GetVIData().AI
+				data.BI = ctx.GetVIData().BI
+				data.CI = ctx.GetVIData().CI
+				if err := c.srv.ReportStatus(c.Id, data); err != nil {
 					c.readError(err)
 					return
 				}
+				ctx.SetReportVI(false)
 			}
 		}
 	}
@@ -101,23 +121,128 @@ func (c *Client) send(buf []byte) error {
 	return nil
 }
 
-func (c *Client) Send0X3433(ctx *protocol.PacketContext) {
-	//defer c.srv.grWG.Done()
-	entity := protocol.Dlt_0x33333433{}
+func (c *Client) GetActivePower(ctx *protocol.PacketContext, powerChan chan struct{}) {
+	defer c.srv.grWG.Done()
 	for {
+		<-powerChan
+		entity := protocol.Dlt_0x33333433{}
 		if ctx.GetReceiveAddress() != nil {
 			sendByte, _ := entity.Encode(ctx)
 			err := c.send(sendByte)
 			if err != nil {
 				glog.Debugf("指令发送失败:%s", err.Error())
 			}
-			time.Sleep(10 * time.Second)
 		}
 	}
 
 }
 
-func (c *Client) SendGetAddress() {
+func (c *Client) GetAV(ctx *protocol.PacketContext, avChan, aiChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	for {
+		<-avChan
+		entity := protocol.Dlt_0x33343435{}
+		if ctx.GetReceiveAddress() != nil {
+			sendByte, _ := entity.Encode(ctx)
+			err := c.send(sendByte)
+			if err != nil {
+				glog.Debugf("指令发送失败:%s", err.Error())
+			}
+		}
+		time.Sleep(1 * time.Second)
+		aiChan <- struct{}{}
+	}
+}
+
+func (c *Client) GetAI(ctx *protocol.PacketContext, aiChan, bvChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	for {
+		<-aiChan
+		entity := protocol.Dlt_0x33343535{}
+		if ctx.GetReceiveAddress() != nil {
+			sendByte, _ := entity.Encode(ctx)
+			err := c.send(sendByte)
+			if err != nil {
+				glog.Debugf("指令发送失败:%s", err.Error())
+			}
+		}
+		time.Sleep(1 * time.Second)
+		bvChan <- struct{}{}
+	}
+}
+
+func (c *Client) GetBV(ctx *protocol.PacketContext, bvChan, biChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	for {
+		<-bvChan
+		entity := protocol.Dlt_0x33353435{}
+		if ctx.GetReceiveAddress() != nil {
+			sendByte, _ := entity.Encode(ctx)
+			err := c.send(sendByte)
+			if err != nil {
+				glog.Debugf("指令发送失败:%s", err.Error())
+			}
+		}
+		time.Sleep(1 * time.Second)
+		biChan <- struct{}{}
+	}
+}
+func (c *Client) GetBI(ctx *protocol.PacketContext, biChan, cvChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	for {
+		<-biChan
+		entity := protocol.Dlt_0x33353535{}
+		if ctx.GetReceiveAddress() != nil {
+			sendByte, _ := entity.Encode(ctx)
+			err := c.send(sendByte)
+			if err != nil {
+				glog.Debugf("指令发送失败:%s", err.Error())
+			}
+		}
+		time.Sleep(1 * time.Second)
+		cvChan <- struct{}{}
+	}
+}
+func (c *Client) GetCV(ctx *protocol.PacketContext, cvChan, ciChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	for {
+		<-cvChan
+		entity := protocol.Dlt_0x33363435{}
+		if ctx.GetReceiveAddress() != nil {
+			sendByte, _ := entity.Encode(ctx)
+			err := c.send(sendByte)
+			if err != nil {
+				glog.Debugf("指令发送失败:%s", err.Error())
+			}
+		}
+		time.Sleep(1 * time.Second)
+		ciChan <- struct{}{}
+	}
+}
+func (c *Client) GetCI(ctx *protocol.PacketContext, ciChan, powerChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	for {
+		<-ciChan
+		entity := protocol.Dlt_0x33363535{}
+		if ctx.GetReceiveAddress() != nil {
+			sendByte, _ := entity.Encode(ctx)
+			err := c.send(sendByte)
+			if err != nil {
+				glog.Debugf("指令发送失败:%s", err.Error())
+			}
+		}
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.PowerFrequency")-5) * time.Second)
+		powerChan <- struct{}{}
+	}
+}
+
+func (c *Client) SendGetAddress(ctx *protocol.PacketContext, addressChan, avChan chan struct{}) {
+	defer c.srv.grWG.Done()
+	<-addressChan
 	bytea := []byte{0x68, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x68, 0x13, 0x00, 0xDF, 0x16}
-	c.send(bytea)
+	_ = c.send(bytea)
+	for {
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.VIFrequency")) * time.Second)
+		avChan <- struct{}{}
+	}
 }

+ 43 - 2
server/server.go

@@ -9,6 +9,7 @@ import (
 	"github.com/gogf/gf/os/glog"
 	gatewayV2 "sparrow-sdk/v2"
 	"sync"
+	"time"
 )
 
 type Server struct {
@@ -77,16 +78,56 @@ func (s *Server) createClient(conn *gtcp.Conn) *Client {
 
 	ctx := new(protocol.PacketContext)
 
-	go c.SendGetAddress()
+	addressChan := make(chan struct{}, 1)
+	avChan := make(chan struct{}, 1)
+	aiChan := make(chan struct{}, 1)
+	bvChan := make(chan struct{}, 1)
+	biChan := make(chan struct{}, 1)
+	cvChan := make(chan struct{}, 1)
+	ciChan := make(chan struct{}, 1)
+	powerChan := make(chan struct{}, 1)
+
+	addressChan <- struct{}{}
+	s.startGoRoutine(func() {
+		go c.SendGetAddress(ctx, addressChan, avChan)
+	})
+
+	s.startGoRoutine(func() {
+		c.GetActivePower(ctx, powerChan)
+	})
 
 	s.startGoRoutine(func() {
 		c.ReadLoop(ctx)
 	})
 
+	time.Sleep(1 * time.Second)
 	s.startGoRoutine(func() {
-		c.Send0X3433(ctx)
+		c.GetAV(ctx, avChan, aiChan)
 	})
 
+	time.Sleep(1 * time.Second)
+	s.startGoRoutine(func() {
+		c.GetAI(ctx, aiChan, bvChan)
+	})
+
+	time.Sleep(1 * time.Second)
+	s.startGoRoutine(func() {
+		c.GetBV(ctx, bvChan, biChan)
+	})
+
+	time.Sleep(1 * time.Second)
+	s.startGoRoutine(func() {
+		c.GetBI(ctx, biChan, cvChan)
+	})
+	time.Sleep(1 * time.Second)
+	s.startGoRoutine(func() {
+		c.GetCV(ctx, cvChan, ciChan)
+	})
+
+	time.Sleep(1 * time.Second)
+	s.startGoRoutine(func() {
+		c.GetCI(ctx, ciChan, powerChan)
+	})
 	return c
 }
 

+ 1 - 1
test/dlt645_0x33333433_test.go

@@ -16,5 +16,5 @@ package main
 //		assert.Error(t, err, "decode error")
 //	}
 //	assert.True(t, reflect.DeepEqual("020247020276", message.Id))
-//	assert.True(t, reflect.DeepEqual(0.02, message.WP))
+//	assert.True(t, reflect.DeepEqual(0.02, message.WH))
 //}