ソースを参照

更新查询逻辑

liuxiulin 2 年 前
コミット
50dae20f28

+ 5 - 0
main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"context"
+	"dlt645-server/protocol"
 	"dlt645-server/server"
 	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/os/glog"
@@ -13,6 +14,8 @@ import (
 
 func main() {
 	ctx := context.Background()
+	packetContext := new(protocol.PacketContext)
+	data := new(protocol.Data)
 	err := glog.SetLevelStr(g.Cfg().GetString("Server.RunMode"))
 	if err != nil {
 		panic(err)
@@ -42,6 +45,8 @@ func main() {
 		g.Cfg().GetString("Server.Addr"),
 		g.Cfg().GetInt("Server.Port"),
 		gw,
+		packetContext,
+		data,
 	)
 	go func() {
 		if err := srv.Start(); err != nil {

+ 1 - 103
protocol/context.go

@@ -2,12 +2,6 @@ package protocol
 
 type PacketContext struct {
 	ReceiveAddress []byte
-	Id             string
-	ReportPower    bool
-	VICount        int
-	ReportVI       bool
-	IsReg          bool
-	VIData         VIData
 }
 
 // SetReceiveAddress 设置接收表地址
@@ -17,101 +11,5 @@ func (a *PacketContext) SetReceiveAddress(address []byte) {
 
 // GetReceiveAddress 获取接收表地址
 func (a *PacketContext) GetReceiveAddress() []byte {
-	if a.ReceiveAddress != nil {
-		return a.ReceiveAddress
-	}
-	return nil
-}
-
-// SetId 设置表号
-func (a *PacketContext) SetId(id string) {
-	a.Id = id
-}
-
-// GetId 获取表号
-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
+	return a.ReceiveAddress
 }

+ 78 - 0
protocol/dlt645_0x33323435.go

@@ -0,0 +1,78 @@
+package protocol
+
+import (
+	"encoding/hex"
+	"github.com/gogf/gf/os/glog"
+	"strconv"
+)
+
+type Dlt_0x33323435 struct {
+	//接收表号
+	DeviceAddress []byte
+	//表号
+	DeviceID string
+	//当前A相电压
+	VoltageA float64
+	//当前B相电压
+	VoltageB float64
+	//当前C相电压
+	VoltageC float64
+}
+
+func (e *Dlt_0x33323435) MsgID() MsgID {
+	return Msgdlt_0x33323435
+}
+
+func (e *Dlt_0x33323435) Encode(ctx *PacketContext) ([]byte, error) {
+	writer := NewWriter()
+
+	// 接收符号
+	writer.Write([]byte{0x68})
+	writer.Write(ctx.GetReceiveAddress())
+	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x32, 0x34, 0x35})
+
+	//cs效验位
+	var one byte
+	for _, v := range writer.Bytes() {
+		one += v
+	}
+	writer.WriteByte(one)
+	// 功能码
+	writer.WriteByte(0x16)
+	return writer.Bytes(), nil
+}
+
+func (e *Dlt_0x33323435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+	bytea := dataByte[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]
+	}
+	e.DeviceID = hex.EncodeToString(bytea)
+	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
+	byteb := make([]byte, 6)
+	for i := 0; i < 2; i++ {
+		byteb[i] = dataByte[14+i] - 0x33
+	}
+
+	_ = e.stringToVoltageBlock(hex.EncodeToString(byteb))
+
+	glog.Debugf("数据读取成功:表号:%s,当前A相电压:%2fV,B相电压:%2fV,C相电压:%2fV", e.DeviceID, e.VoltageA, e.VoltageB, e.VoltageC)
+	data.AV = e.VoltageA
+	data.BV = e.VoltageB
+	data.CV = e.VoltageC
+	data.DataType = IsVData
+	return nil
+}
+
+func (e *Dlt_0x33323435) stringToVoltageBlock(s string) error {
+	a0, _ := strconv.ParseFloat(s[0:2], 64)
+	a1, _ := strconv.ParseFloat(s[2:4], 64)
+	b0, _ := strconv.ParseFloat(s[4:6], 64)
+	b1, _ := strconv.ParseFloat(s[6:8], 64)
+	c0, _ := strconv.ParseFloat(s[8:10], 64)
+	c1, _ := strconv.ParseFloat(s[10:12], 64)
+	e.VoltageA = a0*0.1 + a1*10
+	e.VoltageB = b0*0.1 + b1*10
+	e.VoltageC = c0*0.1 + c1*10
+	return nil
+}

+ 80 - 0
protocol/dlt645_0x33323535.go

@@ -0,0 +1,80 @@
+package protocol
+
+import (
+	"encoding/hex"
+	"github.com/gogf/gf/os/glog"
+	"strconv"
+)
+
+type Dlt_0x33323535 struct {
+	//接收表号
+	DeviceAddress []byte
+	//表号
+	DeviceID string
+	// 当前A相电流
+	CurrentA float64
+	// 当前B相电流
+	CurrentB float64
+	// 当前C相电流
+	CurrentC float64
+}
+
+func (e *Dlt_0x33323535) MsgID() MsgID {
+	return Msgdlt_0x33323535
+}
+
+func (e *Dlt_0x33323535) Encode(ctx *PacketContext) ([]byte, error) {
+	writer := NewWriter()
+	// 接收符号
+	writer.Write([]byte{0x68})
+	writer.Write(ctx.GetReceiveAddress())
+	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x32, 0x35, 0x35})
+
+	//cs效验位
+	var one byte
+	for _, v := range writer.Bytes() {
+		one += v
+	}
+	writer.WriteByte(one)
+	// 功能码
+	writer.WriteByte(0x16)
+	return writer.Bytes(), nil
+}
+
+func (e *Dlt_0x33323535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+	bytea := dataByte[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]
+	}
+	e.DeviceID = hex.EncodeToString(bytea)
+	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
+	byteb := make([]byte, 9)
+	for i := 0; i < 2; i++ {
+		byteb[i] = dataByte[14+i] - 0x33
+	}
+
+	_ = e.stringToCurrentBlock(hex.EncodeToString(byteb))
+
+	glog.Debugf("数据读取成功:表号:%s,当前A相电流:%2fA,B相电流:%2fA,C相电流:%2fA", e.DeviceID, e.CurrentA, e.CurrentB, e.CurrentC)
+	data.AI = e.CurrentA
+	data.BI = e.CurrentB
+	data.CI = e.CurrentC
+	data.DataType = IsIData
+	return nil
+}
+
+func (e *Dlt_0x33323535) stringToCurrentBlock(s string) error {
+	a0, _ := strconv.ParseFloat(s[0:2], 64)
+	a1, _ := strconv.ParseFloat(s[2:4], 64)
+	a2, _ := strconv.ParseFloat(s[4:6], 64)
+	b0, _ := strconv.ParseFloat(s[6:8], 64)
+	b1, _ := strconv.ParseFloat(s[8:10], 64)
+	b2, _ := strconv.ParseFloat(s[10:12], 64)
+	c0, _ := strconv.ParseFloat(s[12:14], 64)
+	c1, _ := strconv.ParseFloat(s[14:16], 64)
+	c2, _ := strconv.ParseFloat(s[16:18], 64)
+	e.CurrentA = a0*0.001 + a1*0.1 + a2*10
+	e.CurrentB = b0*0.001 + b1*0.1 + b2*10
+	e.CurrentC = c0*0.001 + c1*0.1 + c2*10
+	return nil
+}

+ 7 - 7
protocol/dlt645_0x33333433.go

@@ -15,11 +15,11 @@ type Dlt_0x33333433 struct {
 	WH float64
 }
 
-func (entity *Dlt_0x33333433) MsgID() MsgID {
+func (e *Dlt_0x33333433) MsgID() MsgID {
 	return Msgdlt_0x33333433
 }
 
-func (entity *Dlt_0x33333433) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33333433) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,25 +38,25 @@ func (entity *Dlt_0x33333433) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333433) Decode(ctx *PacketContext, dataByte []byte, data *Data) error {
+func (e *Dlt_0x33333433) Decode(ctx *PacketContext, dataByte []byte, data *Data) error {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 4)
 	for i := 0; i < 4; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 	var err error
-	entity.WH, err = stringToWP(hex.EncodeToString(byteb))
+	e.WH, err = stringToWP(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
 
-	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f kWh", entity.DeviceID, entity.WH)
-	data.ActivePower = entity.WH
+	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f kWh", e.DeviceID, e.WH)
+	data.ActivePower = e.WH
 	data.DataType = IsPower
 	return err
 }

+ 7 - 7
protocol/dlt645_0x33333533.go

@@ -15,16 +15,16 @@ type Dlt_0x33333533 struct {
 	ReactiveEnergy float64
 }
 
-func (entity *Dlt_0x33333533) MsgID() MsgID {
+func (e *Dlt_0x33333533) MsgID() MsgID {
 	return Msgdlt_0x33333533
 }
 
-func (entity *Dlt_0x33333533) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33333533) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(e.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x35, 0x33})
 
 	//cs效验位
@@ -38,23 +38,23 @@ func (entity *Dlt_0x33333533) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33333533) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 4)
 	for i := 0; i < 4; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.ReactiveEnergy, err = stringToReactiveEnergy(hex.EncodeToString(byteb))
+	e.ReactiveEnergy, err = stringToReactiveEnergy(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,反向有功总电能:%2f", entity.DeviceID, entity.ReactiveEnergy)
+	glog.Debugf("数据读取成功:表号:%s,反向有功总电能:%2f", e.DeviceID, e.ReactiveEnergy)
 
 	return nil
 }

+ 8 - 8
protocol/dlt645_0x33333635.go

@@ -15,15 +15,15 @@ type Dlt_0x33333635 struct {
 	ActivePower float64
 }
 
-func (entity *Dlt_0x33333635) MsgID() MsgID {
+func (e *Dlt_0x33333635) MsgID() MsgID {
 	return Msgdlt_0x33333635
 }
 
-func (entity *Dlt_0x33333635) GetData() (string, float64) {
-	return "当前总有功功率", entity.ActivePower
+func (e *Dlt_0x33333635) GetData() (string, float64) {
+	return "当前总有功功率", e.ActivePower
 }
 
-func (entity *Dlt_0x33333635) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33333635) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -42,24 +42,24 @@ func (entity *Dlt_0x33333635) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333635) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33333635) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.ActivePower, err = stringToActivePower(hex.EncodeToString(byteb))
+	e.ActivePower, err = stringToActivePower(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
 
-	glog.Debugf("数据读取成功:表号:%s,当前总有功功率:%2f", entity.DeviceID, entity.ActivePower)
+	glog.Debugf("数据读取成功:表号:%s,当前总有功功率:%2f", e.DeviceID, e.ActivePower)
 
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x33333735.go

@@ -15,16 +15,16 @@ type Dlt_0x33333735 struct {
 	ReactivePower float64
 }
 
-func (entity *Dlt_0x33333735) MsgID() MsgID {
+func (e *Dlt_0x33333735) MsgID() MsgID {
 	return Msgdlt_0x33333735
 }
 
-func (entity *Dlt_0x33333735) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33333735) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(e.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x37, 0x35})
 
 	//cs效验位
@@ -38,23 +38,23 @@ func (entity *Dlt_0x33333735) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33333735) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.ReactivePower, err = stringToReactivePower(hex.EncodeToString(byteb))
+	e.ReactivePower, err = stringToReactivePower(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前总无功功率:%2f", entity.DeviceID, entity.ReactivePower)
+	glog.Debugf("数据读取成功:表号:%s,当前总无功功率:%2f", e.DeviceID, e.ReactivePower)
 
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x33333835.go

@@ -15,16 +15,16 @@ type Dlt_0x33333835 struct {
 	ApparentPower float64
 }
 
-func (entity *Dlt_0x33333835) MsgID() MsgID {
+func (e *Dlt_0x33333835) MsgID() MsgID {
 	return Msgdlt_0x33333835
 }
 
-func (entity *Dlt_0x33333835) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33333835) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(e.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x38, 0x35})
 
 	//cs效验位
@@ -38,23 +38,23 @@ func (entity *Dlt_0x33333835) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33333835) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.ApparentPower, err = stringToApparentPower(hex.EncodeToString(byteb))
+	e.ApparentPower, err = stringToApparentPower(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前视在功率:%2f", entity.DeviceID, entity.ApparentPower)
+	glog.Debugf("数据读取成功:表号:%s,当前视在功率:%2f", e.DeviceID, e.ApparentPower)
 
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x33333935.go

@@ -15,16 +15,16 @@ type Dlt_0x33333935 struct {
 	PowerFactor float64
 }
 
-func (entity *Dlt_0x33333935) MsgID() MsgID {
+func (e *Dlt_0x33333935) MsgID() MsgID {
 	return Msgdlt_0x33333935
 }
 
-func (entity *Dlt_0x33333935) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33333935) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(e.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x39, 0x35})
 
 	//cs效验位
@@ -38,23 +38,23 @@ func (entity *Dlt_0x33333935) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33333935) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 2)
 	for i := 0; i < 2; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.PowerFactor, err = stringToPowerFactor(hex.EncodeToString(byteb))
+	e.PowerFactor, err = stringToPowerFactor(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前总功率因数:%2f", entity.DeviceID, entity.PowerFactor)
+	glog.Debugf("数据读取成功:表号:%s,当前总功率因数:%2f", e.DeviceID, e.PowerFactor)
 
 	return nil
 }

+ 6 - 6
protocol/dlt645_0x33343435.go

@@ -15,11 +15,11 @@ type Dlt_0x33343435 struct {
 	VoltageA float64
 }
 
-func (entity *Dlt_0x33343435) MsgID() MsgID {
+func (e *Dlt_0x33343435) MsgID() MsgID {
 	return Msgdlt_0x33343435
 }
 
-func (entity *Dlt_0x33343435) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33343435) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,24 +38,24 @@ func (entity *Dlt_0x33343435) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33343435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33343435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 2)
 	for i := 0; i < 2; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.VoltageA, err = stringToVoltage(hex.EncodeToString(byteb))
+	e.VoltageA, err = stringToVoltage(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
 
-	glog.Debugf("数据读取成功:表号:%s,当前A相电压:%2f", entity.DeviceID, entity.VoltageA)
+	glog.Debugf("数据读取成功:表号:%s,当前A相电压:%2f", e.DeviceID, e.VoltageA)
 	data.DataType = IsVData
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x33343535.go

@@ -15,11 +15,11 @@ type Dlt_0x33343535 struct {
 	CurrentA float64
 }
 
-func (entity *Dlt_0x33343535) MsgID() MsgID {
+func (e *Dlt_0x33343535) MsgID() MsgID {
 	return Msgdlt_0x33343535
 }
 
-func (entity *Dlt_0x33343535) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33343535) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,24 +38,24 @@ func (entity *Dlt_0x33343535) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33343535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33343535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.CurrentA, err = stringToCurrent(hex.EncodeToString(byteb))
+	e.CurrentA, err = stringToCurrent(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前A相电流:%2f", entity.DeviceID, entity.CurrentA)
-	data.AI = entity.CurrentA
+	glog.Debugf("数据读取成功:表号:%s,当前A相电流:%2f", e.DeviceID, e.CurrentA)
+	data.AI = e.CurrentA
 	data.DataType = IsIData
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x33353435.go

@@ -14,11 +14,11 @@ type Dlt_0x33353435 struct {
 	VoltageB float64
 }
 
-func (entity *Dlt_0x33353435) MsgID() MsgID {
+func (e *Dlt_0x33353435) MsgID() MsgID {
 	return Msgdlt_0x33353435
 }
 
-func (entity *Dlt_0x33353435) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33353435) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,24 +37,24 @@ func (entity *Dlt_0x33353435) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33353435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33353435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 2)
 	for i := 0; i < 2; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
-	entity.VoltageB, err = stringToVoltage(hex.EncodeToString(byteb))
+	e.VoltageB, err = stringToVoltage(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前B相电压:%2f", entity.DeviceID, entity.VoltageB)
+	glog.Debugf("数据读取成功:表号:%s,当前B相电压:%2f", e.DeviceID, e.VoltageB)
 
-	data.BV = entity.VoltageB
+	data.BV = e.VoltageB
 
 	return err
 }

+ 7 - 7
protocol/dlt645_0x33353535.go

@@ -14,11 +14,11 @@ type Dlt_0x33353535 struct {
 	CurrentB float64
 }
 
-func (entity *Dlt_0x33353535) MsgID() MsgID {
+func (e *Dlt_0x33353535) MsgID() MsgID {
 	return Msgdlt_0x33353535
 }
 
-func (entity *Dlt_0x33353535) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33353535) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,24 +37,24 @@ func (entity *Dlt_0x33353535) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33353535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33353535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.CurrentB, err = stringToCurrent(hex.EncodeToString(byteb))
+	e.CurrentB, err = stringToCurrent(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前B相电流:%2f", entity.DeviceID, entity.CurrentB)
+	glog.Debugf("数据读取成功:表号:%s,当前B相电流:%2f", e.DeviceID, e.CurrentB)
 
-	data.BI = entity.CurrentB
+	data.BI = e.CurrentB
 	return err
 }

+ 7 - 7
protocol/dlt645_0x33363435.go

@@ -14,11 +14,11 @@ type Dlt_0x33363435 struct {
 	VoltageC float64
 }
 
-func (entity *Dlt_0x33363435) MsgID() MsgID {
+func (e *Dlt_0x33363435) MsgID() MsgID {
 	return Msgdlt_0x33363435
 }
 
-func (entity *Dlt_0x33363435) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33363435) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,24 +37,24 @@ func (entity *Dlt_0x33363435) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33363435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33363435) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 2)
 	for i := 0; i < 2; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.VoltageC, err = stringToVoltage(hex.EncodeToString(byteb))
+	e.VoltageC, err = stringToVoltage(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前C相电压:%2f", entity.DeviceID, entity.VoltageC)
+	glog.Debugf("数据读取成功:表号:%s,当前C相电压:%2f", e.DeviceID, e.VoltageC)
 
-	data.CV = entity.VoltageC
+	data.CV = e.VoltageC
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x33363535.go

@@ -14,11 +14,11 @@ type Dlt_0x33363535 struct {
 	CurrentC float64
 }
 
-func (entity *Dlt_0x33363535) MsgID() MsgID {
+func (e *Dlt_0x33363535) MsgID() MsgID {
 	return Msgdlt_0x33363535
 }
 
-func (entity *Dlt_0x33363535) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x33363535) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,24 +37,24 @@ func (entity *Dlt_0x33363535) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33363535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x33363535) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 	bytea := dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
 		byteb[i] = dataByte[14+i] - 0x33
 	}
 
-	entity.CurrentC, err = stringToCurrent(hex.EncodeToString(byteb))
+	e.CurrentC, err = stringToCurrent(hex.EncodeToString(byteb))
 	if err != nil {
 		return err
 	}
-	glog.Debugf("数据读取成功:表号:%s,当前C相电流:%2f", entity.DeviceID, entity.CurrentC)
+	glog.Debugf("数据读取成功:表号:%s,当前C相电流:%2f", e.DeviceID, e.CurrentC)
 
-	data.CI = entity.CurrentC
+	data.CI = e.CurrentC
 	return nil
 }

+ 7 - 7
protocol/dlt645_0x93.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"github.com/gogf/gf/os/glog"
 )
 
 type Dlt_0x93 struct {
@@ -13,7 +14,7 @@ type Dlt_0x93 struct {
 	ApparentPower float64
 }
 
-func (entity *Dlt_0x93) MsgID() MsgID {
+func (e *Dlt_0x93) MsgID() MsgID {
 	return ReadAddress
 }
 
@@ -21,24 +22,23 @@ func (entity *Dlt_0x93) MsgID() MsgID {
 //	return entity.DeviceAddress
 //}
 
-func (entity *Dlt_0x93) Encode(ctx *PacketContext) ([]byte, error) {
+func (e *Dlt_0x93) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 	// 接收符号
 	writer.Write([]byte{0x68, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x68, 0x13, 0x00, 0xDF, 0x16})
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x93) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+func (e *Dlt_0x93) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 
-	entity.DeviceAddress = dataByte[1:7]
+	e.DeviceAddress = dataByte[1:7]
 	ctx.SetReceiveAddress(dataByte[1:7])
-
 	var bytea []byte
 	bytea = append(bytea, dataByte[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)
+	e.DeviceID = hex.EncodeToString(bytea)
+	glog.Debugf("表号读取成功:%s", e.DeviceID)
 	return nil
 }

+ 9 - 13
protocol/message.go

@@ -33,17 +33,14 @@ type PowerData struct {
 
 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相电流
 }
 
 type IData struct {
-	AI2 float64 `json:"ai"` // A相电流
-	BI2 float64 `json:"bi"` // B相电流
-	CI2 float64 `json:"ci"` // C相电流
+	AI float64 `json:"ai"` // A相电流
+	BI float64 `json:"bi"` // B相电流
+	CI float64 `json:"ci"` // C相电流
 }
 
 // 协议编码
@@ -67,11 +64,11 @@ func (message *Message) Encode() ([]byte, error) {
 }
 
 // 协议解码
-func (message *Message) Decode(ctx *PacketContext, buf []byte, data *Data) (result *Data, err error) {
+func (message *Message) Decode(ctx *PacketContext, buf []byte, data *Data) (err error) {
 	// 检验标志位
 	length := len(buf)
 	if length == 0 {
-		return result, errors.ErrInvalidMessage
+		return errors.ErrInvalidMessage
 	}
 	for i := 0; i <= length; i++ {
 		if buf[i] == SendByte {
@@ -83,13 +80,13 @@ func (message *Message) Decode(ctx *PacketContext, buf []byte, data *Data) (resu
 		}
 	}
 	if buf[0] != ReceiveByte {
-		return result, nil
+		return nil
 	}
 	if buf[len(buf)-1] != EndByte {
 		buf = append(buf, 0x16)
 	}
 	if !message.checkSum(buf) {
-		return result, errors.ErrInvalidCheckSum
+		return errors.ErrInvalidCheckSum
 	}
 
 	//处理注册包
@@ -107,7 +104,7 @@ func (message *Message) Decode(ctx *PacketContext, buf []byte, data *Data) (resu
 		}
 		message.Body = nil
 		message.Header = header
-		return result, nil
+		return nil
 	}
 	if len(buf) < 8 {
 		if err != nil {
@@ -127,7 +124,7 @@ func (message *Message) Decode(ctx *PacketContext, buf []byte, data *Data) (resu
 			glog.Errorf("解析报文失败:%s", err.Error())
 		}
 	}
-	return result, nil
+	return nil
 }
 
 //--->
@@ -138,7 +135,6 @@ func (message *Message) decode(ctx *PacketContext, dataType uint32, buf []byte,
 	}
 
 	entity := creator()
-
 	err := entity.Decode(ctx, buf, data) //解析data数据
 	if err != nil {
 		return err

+ 10 - 0
protocol/register.go

@@ -33,6 +33,10 @@ const (
 	Msgdlt_0x33333935 MsgID = 0x33333935
 	//当前视在功率
 	Msgdlt_0x33333835 MsgID = 0x33333835
+	// 电压数据块
+	Msgdlt_0x33323435 MsgID = 0x33323435
+	// 电流数据块
+	Msgdlt_0x33323535 MsgID = 0x33323535
 )
 
 // 消息实体映射
@@ -80,6 +84,12 @@ var entityMapper = map[uint32]func() Entity{
 	uint32(ReadAddress): func() Entity {
 		return new(Dlt_0x93)
 	},
+	uint32(Msgdlt_0x33323435): func() Entity {
+		return new(Dlt_0x33323435)
+	},
+	uint32(Msgdlt_0x33323535): func() Entity {
+		return new(Dlt_0x33323535)
+	},
 }
 
 // Register 类型注册

+ 67 - 75
server/client.go

@@ -2,6 +2,8 @@ package server
 
 import (
 	"dlt645-server/protocol"
+	"github.com/gogf/gf/encoding/gbinary"
+	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/net/gtcp"
 	"github.com/gogf/gf/os/glog"
 	"io"
@@ -35,71 +37,67 @@ func NewClient(s *Server, conn *gtcp.Conn) *Client {
 
 func (c *Client) SendLoop(ctx *protocol.PacketContext, data *protocol.Data) {
 	defer c.srv.grWG.Done()
-
 	for {
+		glog.Info("Waiting..............")
 		select {
 		case buf := <-c.sendChan:
 			err := c.send(buf)
 			if err != nil {
-				if err != nil {
-					glog.Errorf("指令发送失败:%s", err.Error())
-				}
+				glog.Errorf("指令发送失败:%s", err.Error())
 				continue
 			}
 			timer := time.NewTimer(5 * time.Second)
 			for {
+				timer.Reset(5 * time.Second)
 				select {
 				case <-timer.C:
-					glog.Errorf("读取超时:%s", err.Error())
-					continue
+					glog.Errorf("接收指令超时")
+					break
 				default:
 					receiveBuf, err := c.conn.Recv(-1)
 					if err != nil {
 						c.readError(err)
-						continue
+						break
 					}
-					if len(buf) > 0 {
-						result, err := c.srv.message.Decode(ctx, receiveBuf, data)
+					if len(receiveBuf) > 0 {
+						err = c.srv.message.Decode(ctx, receiveBuf, data)
 						if err != nil {
 							glog.Errorf("解析报文失败:%s", err.Error())
-						}
-						if !c.isReg {
-							c.SetId(ctx.GetId())
-							c.isReg = true
-							continue
+							break
 						}
 						var reportData interface{}
-						switch result.DataType {
+						switch data.DataType {
 						case protocol.IsPower:
 							reportData = protocol.PowerData{
-								ActivePower: result.ActivePower,
+								ActivePower: data.ActivePower,
 							}
 						case protocol.IsVData:
 							reportData = protocol.VIData{
-								AV: result.AV,
-								BV: result.BV,
-								CV: result.CV,
+								AV: data.AV,
+								BV: data.BV,
+								CV: data.CV,
 							}
 						case protocol.IsIData:
 							reportData = protocol.IData{
-								AI2: result.AI,
-								BI2: result.BI,
-								CI2: result.CI,
+								AI: data.AI,
+								BI: data.BI,
+								CI: data.CI,
 							}
 						default:
-							continue
+							break
 						}
-						if err := c.srv.ReportStatus(c.Id, reportData); err != nil {
-							glog.Errorf("数据上报发送错误:%s", err.Error())
-							continue
+						if reportData != nil {
+							if err := c.srv.ReportStatus(c.Id, reportData); err != nil {
+								glog.Errorf("数据上报发送错误:%s", err.Error())
+							}
 						}
 					}
 				}
-
+				break
 			}
-
 		}
 	}
+
 }
 
 func (c *Client) SetId(id string) {
@@ -157,73 +155,67 @@ func (c *Client) GetActivePower(ctx *protocol.PacketContext) {
 		entity := protocol.Dlt_0x33333433{}
 		sendByte, _ := entity.Encode(ctx)
 		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.PowerFrequency")) * time.Second)
 	}
 
 }
 
-func (c *Client) GetAV(ctx *protocol.PacketContext) {
+func (c *Client) GetVBlock(ctx *protocol.PacketContext) {
 	defer c.srv.grWG.Done()
 	for {
-		entity := protocol.Dlt_0x33343435{}
+		entity := protocol.Dlt_0x33323435{}
 		sendByte, _ := entity.Encode(ctx)
 		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.VIFrequency")) * time.Second)
 	}
-}
 
-func (c *Client) GetAI(ctx *protocol.PacketContext) {
-	defer c.srv.grWG.Done()
-	for {
-		entity := protocol.Dlt_0x33343535{}
-		sendByte, _ := entity.Encode(ctx)
-		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
-	}
 }
 
-func (c *Client) GetBV(ctx *protocol.PacketContext, bvChan, biChan chan struct{}) {
+func (c *Client) GetIBlock(ctx *protocol.PacketContext) {
 	defer c.srv.grWG.Done()
 	for {
-		entity := protocol.Dlt_0x33353435{}
+		entity := protocol.Dlt_0x33323535{}
 		sendByte, _ := entity.Encode(ctx)
 		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.VIFrequency")) * time.Second)
 	}
-}
 
-func (c *Client) GetBI(ctx *protocol.PacketContext, biChan, cvChan chan struct{}) {
-	defer c.srv.grWG.Done()
-	for {
-		entity := protocol.Dlt_0x33353535{}
-		sendByte, _ := entity.Encode(ctx)
-		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
-	}
-}
-func (c *Client) GetCV(ctx *protocol.PacketContext, cvChan, ciChan chan struct{}) {
-	defer c.srv.grWG.Done()
-	for {
-		<-cvChan
-		entity := protocol.Dlt_0x33363435{}
-		sendByte, _ := entity.Encode(ctx)
-		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
-	}
-}
-func (c *Client) GetCI(ctx *protocol.PacketContext, ciChan, powerChan chan struct{}) {
-	defer c.srv.grWG.Done()
-	for {
-		<-ciChan
-		entity := protocol.Dlt_0x33363535{}
-		sendByte, _ := entity.Encode(ctx)
-		c.sendChan <- sendByte
-		time.Sleep(10 * time.Second)
-	}
 }
 
-func (c *Client) SendGetAddress(ctx *protocol.PacketContext) []byte {
+func (c *Client) SendGetAddress(ctx *protocol.PacketContext, data *protocol.Data) error {
 	entity := new(protocol.Dlt_0x93)
 	sendBuf, _ := entity.Encode(ctx)
-	return sendBuf
+	err := c.send(sendBuf)
+	if err != nil {
+		return err
+	}
+	timer := time.NewTimer(10 * time.Second)
+	for {
+		select {
+		case <-timer.C:
+			glog.Errorf("读取超时:%s", err.Error())
+			continue
+		default:
+
+			receiveBuf, err := c.conn.Recv(-1)
+			if err != nil {
+				c.readError(err)
+				continue
+			}
+			if !c.isReg {
+				c.SetId(gbinary.DecodeToString(receiveBuf))
+				c.isReg = true
+				break
+			}
+			if len(receiveBuf) > 0 {
+				err = c.srv.message.Decode(ctx, receiveBuf, data)
+				if err != nil {
+					glog.Errorf("解析报文失败:%s", err.Error())
+				}
+			}
+			if ctx.GetReceiveAddress() != nil {
+				return nil
+			}
+		}
+	}
 }

+ 11 - 8
server/server.go

@@ -20,15 +20,19 @@ type Server struct {
 	grWG      sync.WaitGroup
 	message   protocol.Message
 	gateWay   *gatewayV2.Gateway
+	packetCtx *protocol.PacketContext
+	data      *protocol.Data
 }
 
-func NewServer(ctx context.Context, addr string, port int, gw *gatewayV2.Gateway) *Server {
+func NewServer(ctx context.Context, addr string, port int, gw *gatewayV2.Gateway, packetCtx *protocol.PacketContext, data *protocol.Data) *Server {
 	return &Server{
 		closeChan: make(chan struct{}),
 		ctx:       ctx,
 		addr:      addr,
 		port:      port,
 		gateWay:   gw,
+		packetCtx: packetCtx,
+		data:      data,
 	}
 }
 
@@ -49,16 +53,15 @@ func (s *Server) onClientConnect(conn *gtcp.Conn) {
 	c.closeHandler = func(id string, c *Client) {
 		glog.Debugf("客户端断开:%s", id)
 	}
-	ctx := new(protocol.PacketContext)
-	c.sendChan <- c.SendGetAddress(ctx)
-	data := new(protocol.Data)
-	go c.SendLoop(ctx, data)
+	_ = c.SendGetAddress(s.packetCtx, s.data)
 
-	go c.GetActivePower(ctx)
+	go c.SendLoop(s.packetCtx, s.data)
 
-	go c.GetAV(ctx)
+	go c.GetActivePower(s.packetCtx)
 
-	go c.GetAI(ctx)
+	go c.GetVBlock(s.packetCtx)
+
+	go c.GetIBlock(s.packetCtx)
 
 }