mvtov 2 năm trước cách đây
mục cha
commit
f00a43ddf7

+ 1 - 0
config/config.toml

@@ -8,5 +8,6 @@
     DeviceCode = "Dtt645-4G"
     Debug = true
 
+[frequency]
 
 

+ 29 - 0
protocol/context.go

@@ -0,0 +1,29 @@
+package protocol
+
+type PacketContext struct {
+	ReceiveAddress []byte
+	Id             string
+}
+
+// SetReceiveAddress 设置接收表地址
+func (a *PacketContext) SetReceiveAddress(address []byte) {
+	a.ReceiveAddress = address
+}
+
+// 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
+}

+ 3 - 3
protocol/dlt645_0x0001.go

@@ -8,10 +8,10 @@ func (entity *Dlt_0x0040) MsgID() MsgID {
 	return Msgdlt_0x0040
 }
 
-func (entity *Dlt_0x0040) Encode() ([]byte, error) {
+func (entity *Dlt_0x0040) Encode(ctx *PacketContext) ([]byte, error) {
 	panic("emmm")
 }
 
-func (entity *Dlt_0x0040) Decode(data []byte) (int, error) {
-	return 0, nil
+func (entity *Dlt_0x0040) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+	return result, err
 }

+ 8 - 6
protocol/dlt645_0x33333433.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,12 +20,12 @@ func (entity *Dlt_0x33333433) MsgID() MsgID {
 	return Msgdlt_0x33333433
 }
 
-func (entity *Dlt_0x33333433) Encode() ([]byte, error) {
+func (entity *Dlt_0x33333433) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x34, 0x33})
 
 	//cs效验位
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33333433) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333433) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33333433) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,13 +50,14 @@ func (entity *Dlt_0x33333433) Decode(data []byte) (int, error) {
 	for i := 0; i < 4; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.WP, err = stringToWP(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return "", err
 	}
 	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f kWh", entity.DeviceID, entity.WP)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f kWh", "正向有功总电能", entity.WP)
+	return entity.DeviceID, nil
 }
 
 func stringToWP(s string) (float64, error) {

+ 8 - 5
protocol/dlt645_0x33333533.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,7 +20,7 @@ func (entity *Dlt_0x33333533) MsgID() MsgID {
 	return Msgdlt_0x33333533
 }
 
-func (entity *Dlt_0x33333533) Encode() ([]byte, error) {
+func (entity *Dlt_0x33333533) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33333533) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333533) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,13 +50,15 @@ func (entity *Dlt_0x33333533) Decode(data []byte) (int, error) {
 	for i := 0; i < 4; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.ReactiveEnergy, err = stringToReactiveEnergy(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return "", err
 	}
 	glog.Debugf("数据读取成功:表号:%s,反向有功总电能:%2f", entity.DeviceID, entity.ReactiveEnergy)
-	return len(data), nil
+
+	result = fmt.Sprintf("%s:%2f kWh", "反向有功总电能", entity.ReactiveEnergy)
+	return result, nil
 }
 
 func stringToReactiveEnergy(s string) (float64, error) {

+ 13 - 6
protocol/dlt645_0x33333635.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,12 +20,16 @@ func (entity *Dlt_0x33333635) MsgID() MsgID {
 	return Msgdlt_0x33333635
 }
 
-func (entity *Dlt_0x33333635) Encode() ([]byte, error) {
+func (entity *Dlt_0x33333635) GetData() (string, float64) {
+	return "当前总有功功率", entity.ActivePower
+}
+
+func (entity *Dlt_0x33333635) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
 	writer.Write([]byte{0x68})
-	writer.Write(entity.DeviceAddress)
+	writer.Write(ctx.GetReceiveAddress())
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x36, 0x35})
 
 	//cs效验位
@@ -38,7 +43,7 @@ func (entity *Dlt_0x33333635) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333635) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33333635) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,14 +54,16 @@ func (entity *Dlt_0x33333635) Decode(data []byte) (int, error) {
 	for i := 0; i < 3; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.ActivePower, err = stringToActivePower(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return "", err
 	}
 
+	result = fmt.Sprintf("%s:%2f", "当前总有功功率", entity.ActivePower)
 	glog.Debugf("数据读取成功:表号:%s,当前总有功功率:%2f", entity.DeviceID, entity.ActivePower)
-	return len(data), nil
+
+	return result, nil
 }
 
 func stringToActivePower(s string) (float64, error) {

+ 7 - 5
protocol/dlt645_0x33333735.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,7 +20,7 @@ func (entity *Dlt_0x33333735) MsgID() MsgID {
 	return Msgdlt_0x33333735
 }
 
-func (entity *Dlt_0x33333735) Encode() ([]byte, error) {
+func (entity *Dlt_0x33333735) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33333735) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333735) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,13 +50,14 @@ func (entity *Dlt_0x33333735) Decode(data []byte) (int, error) {
 	for i := 0; i < 3; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.ReactivePower, err = stringToReactivePower(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前总无功功率:%2f", entity.DeviceID, entity.ReactivePower)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f", "当前总无功功率", entity.ReactivePower)
+	return result, nil
 }
 
 func stringToReactivePower(s string) (float64, error) {

+ 7 - 5
protocol/dlt645_0x33333835.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,7 +20,7 @@ func (entity *Dlt_0x33333835) MsgID() MsgID {
 	return Msgdlt_0x33333835
 }
 
-func (entity *Dlt_0x33333835) Encode() ([]byte, error) {
+func (entity *Dlt_0x33333835) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33333835) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333835) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,13 +50,14 @@ func (entity *Dlt_0x33333835) Decode(data []byte) (int, error) {
 	for i := 0; i < 3; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.ApparentPower, err = stringToApparentPower(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return "", err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前视在功率:%2f", entity.DeviceID, entity.ApparentPower)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f", "当前视在功率", entity.ApparentPower)
+	return result, nil
 }
 
 func stringToApparentPower(s string) (float64, error) {

+ 8 - 5
protocol/dlt645_0x33333935.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,7 +20,7 @@ func (entity *Dlt_0x33333935) MsgID() MsgID {
 	return Msgdlt_0x33333935
 }
 
-func (entity *Dlt_0x33333935) Encode() ([]byte, error) {
+func (entity *Dlt_0x33333935) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33333935) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333935) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,13 +50,15 @@ func (entity *Dlt_0x33333935) Decode(data []byte) (int, error) {
 	for i := 0; i < 2; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.PowerFactor, err = stringToPowerFactor(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前总功率因数:%2f", entity.DeviceID, entity.PowerFactor)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f ", "当前总功率因数", entity.PowerFactor)
+
+	return result, nil
 }
 
 func stringToPowerFactor(s string) (float64, error) {

+ 9 - 5
protocol/dlt645_0x33343435.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,7 +20,7 @@ func (entity *Dlt_0x33343435) MsgID() MsgID {
 	return Msgdlt_0x33343435
 }
 
-func (entity *Dlt_0x33343435) Encode() ([]byte, error) {
+func (entity *Dlt_0x33343435) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33343435) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33343435) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33343435) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,14 +50,17 @@ func (entity *Dlt_0x33343435) Decode(data []byte) (int, error) {
 	for i := 0; i < 2; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.VoltageA, err = stringToVoltage(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 
 	glog.Debugf("数据读取成功:表号:%s,当前A相电压:%2f", entity.DeviceID, entity.VoltageA)
-	return len(data), nil
+
+	result = fmt.Sprintf("%s:%2f ", "当前A相电压", entity.VoltageA)
+
+	return result, nil
 }
 
 func stringToVoltage(s string) (float64, error) {

+ 7 - 5
protocol/dlt645_0x33343535.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"strconv"
 )
@@ -19,7 +20,7 @@ func (entity *Dlt_0x33343535) MsgID() MsgID {
 	return Msgdlt_0x33343535
 }
 
-func (entity *Dlt_0x33343535) Encode() ([]byte, error) {
+func (entity *Dlt_0x33343535) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -38,7 +39,7 @@ func (entity *Dlt_0x33343535) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33343535) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33343535) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -49,13 +50,14 @@ func (entity *Dlt_0x33343535) Decode(data []byte) (int, error) {
 	for i := 0; i < 3; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.CurrentA, err = stringToCurrent(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前A相电流:%2f", entity.DeviceID, entity.CurrentA)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f ", "当前A相电流", entity.CurrentA)
+	return result, nil
 }
 
 func stringToCurrent(s string) (float64, error) {

+ 6 - 5
protocol/dlt645_0x33353435.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -18,7 +19,7 @@ func (entity *Dlt_0x33353435) MsgID() MsgID {
 	return Msgdlt_0x33353435
 }
 
-func (entity *Dlt_0x33353435) Encode() ([]byte, error) {
+func (entity *Dlt_0x33353435) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,7 +38,7 @@ func (entity *Dlt_0x33353435) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33353435) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33353435) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -48,11 +49,11 @@ func (entity *Dlt_0x33353435) Decode(data []byte) (int, error) {
 	for i := 0; i < 2; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
 	entity.VoltageB, err = stringToVoltage(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前B相电压:%2f", entity.DeviceID, entity.VoltageB)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f ", "当前B相电压", entity.VoltageB)
+	return result, err
 }

+ 7 - 6
protocol/dlt645_0x33353535.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -18,7 +19,7 @@ func (entity *Dlt_0x33353535) MsgID() MsgID {
 	return Msgdlt_0x33353535
 }
 
-func (entity *Dlt_0x33353535) Encode() ([]byte, error) {
+func (entity *Dlt_0x33353535) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,7 +38,7 @@ func (entity *Dlt_0x33353535) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33353535) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33353535) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -48,12 +49,12 @@ func (entity *Dlt_0x33353535) Decode(data []byte) (int, error) {
 	for i := 0; i < 3; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.CurrentB, err = stringToCurrent(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前B相电流:%2f", entity.DeviceID, entity.CurrentB)
-
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f ", "当前B相电流", entity.CurrentB)
+	return result, err
 }

+ 7 - 5
protocol/dlt645_0x33363435.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -18,7 +19,7 @@ func (entity *Dlt_0x33363435) MsgID() MsgID {
 	return Msgdlt_0x33363435
 }
 
-func (entity *Dlt_0x33363435) Encode() ([]byte, error) {
+func (entity *Dlt_0x33363435) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,7 +38,7 @@ func (entity *Dlt_0x33363435) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33363435) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33363435) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -48,11 +49,12 @@ func (entity *Dlt_0x33363435) Decode(data []byte) (int, error) {
 	for i := 0; i < 2; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.VoltageC, err = stringToVoltage(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前C相电压:%2f", entity.DeviceID, entity.VoltageC)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f ", "当前C相电压", entity.VoltageC)
+	return result, nil
 }

+ 7 - 5
protocol/dlt645_0x33363535.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -18,7 +19,7 @@ func (entity *Dlt_0x33363535) MsgID() MsgID {
 	return Msgdlt_0x33363535
 }
 
-func (entity *Dlt_0x33363535) Encode() ([]byte, error) {
+func (entity *Dlt_0x33363535) Encode(ctx *PacketContext) ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
@@ -37,7 +38,7 @@ func (entity *Dlt_0x33363535) Encode() ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33363535) Decode(data []byte) (int, error) {
+func (entity *Dlt_0x33363535) Decode(ctx *PacketContext, data []byte) (result string, 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]
@@ -48,11 +49,12 @@ func (entity *Dlt_0x33363535) Decode(data []byte) (int, error) {
 	for i := 0; i < 3; i++ {
 		byteb[i] = data[14+i] - 0x33
 	}
-	var err error
+
 	entity.CurrentC, err = stringToCurrent(hex.EncodeToString(byteb))
 	if err != nil {
-		return 0, err
+		return result, err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前C相电流:%2f", entity.DeviceID, entity.CurrentC)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%2f ", "当前C相电流", entity.CurrentC)
+	return result, nil
 }

+ 16 - 3
protocol/dlt645_0x93.go

@@ -2,6 +2,7 @@ package protocol
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/gogf/gf/os/glog"
 )
 
@@ -22,20 +23,32 @@ func (entity *Dlt_0x93) MsgID() MsgID {
 //	return entity.DeviceAddress
 //}
 
-func (entity *Dlt_0x93) Encode() ([]byte, error) {
+func (entity *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(data []byte) (int, error) {
+func (entity *Dlt_0x93) Decode(ctx *PacketContext, data []byte) (result string, err error) {
+
 	entity.DeviceAddress = data[1:7]
+	ctx.SetReceiveAddress(data[1:7])
+
+	glog.Debugf("11111111----------DeviceAddress:%2X", ctx.GetReceiveAddress())
+
 	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)
-	return len(data), nil
+	result = fmt.Sprintf("%s:%s", "表号", entity.DeviceID)
+
+	glog.Debugf("DeviceAddress:%2X,Id:%s,", ctx.GetReceiveAddress(), ctx.GetId())
+	return result, nil
 }

+ 2 - 2
protocol/entity.go

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

+ 30 - 28
protocol/message.go

@@ -24,9 +24,9 @@ type DHeader struct {
 func (message *Message) Encode() ([]byte, error) {
 	// 编码消息体
 	var err error
-	var body []byte
+	var data []byte
 	if message.Body != nil && !reflect.ValueOf(message.Body).IsNil() {
-		body, err = message.Body.Encode()
+		data, err = message.Body.Encode(nil)
 		if err != nil {
 			return nil, err
 		}
@@ -36,34 +36,39 @@ func (message *Message) Encode() ([]byte, error) {
 	// 二进制转义
 	buffer := bytes.NewBuffer(nil)
 
-	message.write(buffer, body)
+	message.write(buffer, data)
 	return buffer.Bytes(), nil
 }
 
 // 协议解码
-func (message *Message) Decode(data []byte) error {
+func (message *Message) Decode(ctx *PacketContext, data []byte) (result string, err error) {
 	// 检验标志位
 	length := len(data)
 	if length == 0 {
-		return errors.ErrInvalidMessage
+		return result, errors.ErrInvalidMessage
 	}
-	if data[0] != ReceiveByte && data[0] != RegisterByte {
-		return errors.ErrInvalidMessage
+	for i := 0; i <= length; i++ {
+		if data[i] == SendByte {
+			continue
+		} else {
+			data = data[i:length]
+			glog.Debugf("收到数据:%2X", data)
+			break
+		}
+	}
+	if data[0] != ReceiveByte {
+		return result, nil
 	}
 	if !message.checkSum(data) {
-		return errors.ErrInvalidCheckSum
+		return result, errors.ErrInvalidCheckSum
 	}
-	var header Header
-	var err error
+
 	//处理注册包
 	if data[0] == RegisterByte {
 
 		header := Header{}
 		_ = json.Unmarshal(data, &header)
 
-		//fmt.Println(header.Imei)
-		//fmt.Println()
-
 		header.IccID, err = strconv.ParseUint(header.Imei, 10, 64)
 		header.MsgID = 0x0040 //消息ID
 		if err != nil {
@@ -73,46 +78,43 @@ func (message *Message) Decode(data []byte) error {
 		}
 		message.Body = nil
 		message.Header = header
-		return nil
+		return result, nil
 	}
 	if len(data) < 8 {
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", errors.ErrInvalidBody)
 		}
 	}
-	if data[7] == 0x93 {
-		entity, _, err := message.decode(uint32(0x93), data[:])
+	if data[8] == 0x93 {
+		_, err := message.decode(ctx, uint32(0x93), data[:])
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", err.Error())
 		}
-		message.Body = entity
+
 	} else {
-		header.MsgID = MsgID(binary.BigEndian.Uint32(data[10:15]))      //消息ID
-		entity, _, err := message.decode(uint32(header.MsgID), data[:]) //解析实体对象 entity     buffer : 为消息标识
+		msgID := MsgID(binary.BigEndian.Uint32(data[10:15]))      //消息ID
+		result, err = message.decode(ctx, uint32(msgID), data[:]) //解析实体对象 entity     buffer : 为消息标识
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", err.Error())
 		}
-		message.Body = entity
 	}
-
-	message.Header = header
-	return nil
+	return result, nil
 }
 
 //--->
-func (message *Message) decode(dataType uint32, data []byte) (Entity, int, error) {
+func (message *Message) decode(ctx *PacketContext, dataType uint32, data []byte) (result string, err error) {
 	creator, ok := entityMapper[dataType]
 	if !ok {
-		return nil, 0, errors.ErrTypeNotRegistered
+		return result, errors.ErrTypeNotRegistered
 	}
 
 	entity := creator()
 
-	count, err := entity.Decode(data) //解析data数据
+	result, err = entity.Decode(ctx, data) //解析data数据
 	if err != nil {
-		return nil, 0, err
+		return result, err
 	}
-	return entity, count, nil
+	return result, err
 }
 
 // 写入二进制数据

+ 28 - 24
server/client.go

@@ -2,7 +2,6 @@ package server
 
 import (
 	"dlt645-server/protocol"
-	"github.com/gogf/gf/encoding/gbinary"
 	"github.com/gogf/gf/net/gtcp"
 	"github.com/gogf/gf/os/glog"
 	"io"
@@ -14,6 +13,7 @@ import (
 
 type Client struct {
 	Id            string
+	Address       []byte
 	srv           *Server
 	conn          *gtcp.Conn
 	sendChan      chan []byte
@@ -25,7 +25,7 @@ type Client struct {
 	isReg         bool
 }
 
-func (c *Client) ReadLoop() {
+func (c *Client) ReadLoop(ctx *protocol.PacketContext) {
 	//defer c.srv.grWG.Done()
 	for {
 		buf, err := c.conn.Recv(-1)
@@ -34,17 +34,20 @@ func (c *Client) ReadLoop() {
 			return
 		}
 		if len(buf) > 0 {
-			if !c.isReg {
-				id := gbinary.DecodeToString(buf)
-				glog.Debugf("收到注册包!id:%s", id)
-				c.SetId(id)
-				c.isReg = true
-				continue
-			}
-			err = c.srv.message.Decode(buf)
+
+			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 {
+					c.readError(err)
+					return
+				}
+			}
 		}
 	}
 }
@@ -53,6 +56,10 @@ func (c *Client) SetId(id string) {
 	c.Id = id
 }
 
+func (c *Client) SetAddress(address []byte) {
+	c.Address = address
+}
+
 func (c *Client) readError(err error) {
 	defer c.closeConnection()
 	if err == io.EOF || isErrConnReset(err) {
@@ -94,26 +101,23 @@ func (c *Client) send(buf []byte) error {
 	return nil
 }
 
-func (c *Client) Send0X3433() {
+func (c *Client) Send0X3433(ctx *protocol.PacketContext) {
 	//defer c.srv.grWG.Done()
 	entity := protocol.Dlt_0x33333433{}
-	entity.DeviceAddress = []byte{0x27, 0x12, 0x03, 0x14, 0x07, 0x22}
 	for {
-		sendByte, _ := entity.Encode()
-		err := c.send(sendByte)
-		if err != nil {
-			glog.Debugf("指令发送失败:%s", err.Error())
+		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)
 		}
-		time.Sleep(10 * time.Second)
 	}
 
 }
 
-func (c *Client) SendAddress() {
-	defer c.srv.grWG.Done()
-	for {
-		bytea := []byte{0x68, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x68, 0x13, 0x00, 0xDF, 0x16}
-		c.send(bytea)
-		time.Sleep(5 * time.Second)
-	}
+func (c *Client) SendGetAddress() {
+	bytea := []byte{0x68, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x68, 0x13, 0x00, 0xDF, 0x16}
+	c.send(bytea)
 }

+ 7 - 2
server/server.go

@@ -75,13 +75,18 @@ func (s *Server) createClient(conn *gtcp.Conn) *Client {
 		},
 	}
 
+	ctx := new(protocol.PacketContext)
+
+	go c.SendGetAddress()
+
 	s.startGoRoutine(func() {
-		c.Send0X3433()
+		c.ReadLoop(ctx)
 	})
 
 	s.startGoRoutine(func() {
-		c.ReadLoop()
+		c.Send0X3433(ctx)
 	})
+
 	return c
 }
 

+ 2 - 1
test/dlt645_0x33333433_test.go

@@ -1,4 +1,5 @@
 package main
+
 //
 //import (
 //	"dlt645-server/protocol"
@@ -14,6 +15,6 @@ package main
 //	if err != nil {
 //		assert.Error(t, err, "decode error")
 //	}
-//	assert.True(t, reflect.DeepEqual("020247020276", message.DeviceID))
+//	assert.True(t, reflect.DeepEqual("020247020276", message.Id))
 //	assert.True(t, reflect.DeepEqual(0.02, message.WP))
 //}