mvtov 2 年之前
父節點
當前提交
c9e8b34c65

+ 2 - 2
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 Data, err error) {
-	return result, err
+func (entity *Dlt_0x0040) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
+	return err
 }

+ 7 - 7
protocol/dlt645_0x33333433.go

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

+ 5 - 5
protocol/dlt645_0x33333533.go

@@ -38,8 +38,8 @@ func (entity *Dlt_0x33333533) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
-	bytea := data[1:7]
+func (entity *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]
 	}
@@ -47,16 +47,16 @@ func (entity *Dlt_0x33333533) Decode(ctx *PacketContext, data []byte) (result Da
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 4)
 	for i := 0; i < 4; i++ {
-		byteb[i] = data[14+i] - 0x33
+		byteb[i] = dataByte[14+i] - 0x33
 	}
 
 	entity.ReactiveEnergy, err = stringToReactiveEnergy(hex.EncodeToString(byteb))
 	if err != nil {
-		return result, err
+		return err
 	}
 	glog.Debugf("数据读取成功:表号:%s,反向有功总电能:%2f", entity.DeviceID, entity.ReactiveEnergy)
 
-	return result, nil
+	return nil
 }
 
 func stringToReactiveEnergy(s string) (float64, error) {

+ 5 - 5
protocol/dlt645_0x33333635.go

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

+ 5 - 5
protocol/dlt645_0x33333735.go

@@ -38,8 +38,8 @@ func (entity *Dlt_0x33333735) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
-	bytea := data[1:7]
+func (entity *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]
 	}
@@ -47,16 +47,16 @@ func (entity *Dlt_0x33333735) Decode(ctx *PacketContext, data []byte) (result Da
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
-		byteb[i] = data[14+i] - 0x33
+		byteb[i] = dataByte[14+i] - 0x33
 	}
 
 	entity.ReactivePower, err = stringToReactivePower(hex.EncodeToString(byteb))
 	if err != nil {
-		return result, err
+		return err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前总无功功率:%2f", entity.DeviceID, entity.ReactivePower)
 
-	return result, nil
+	return nil
 }
 
 func stringToReactivePower(s string) (float64, error) {

+ 5 - 5
protocol/dlt645_0x33333835.go

@@ -38,8 +38,8 @@ func (entity *Dlt_0x33333835) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
-	bytea := data[1:7]
+func (entity *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]
 	}
@@ -47,16 +47,16 @@ func (entity *Dlt_0x33333835) Decode(ctx *PacketContext, data []byte) (result Da
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 3)
 	for i := 0; i < 3; i++ {
-		byteb[i] = data[14+i] - 0x33
+		byteb[i] = dataByte[14+i] - 0x33
 	}
 
 	entity.ApparentPower, err = stringToApparentPower(hex.EncodeToString(byteb))
 	if err != nil {
-		return result, err
+		return err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前视在功率:%2f", entity.DeviceID, entity.ApparentPower)
 
-	return result, nil
+	return nil
 }
 
 func stringToApparentPower(s string) (float64, error) {

+ 5 - 5
protocol/dlt645_0x33333935.go

@@ -38,8 +38,8 @@ func (entity *Dlt_0x33333935) Encode(ctx *PacketContext) ([]byte, error) {
 	return writer.Bytes(), nil
 }
 
-func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
-	bytea := data[1:7]
+func (entity *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]
 	}
@@ -47,16 +47,16 @@ func (entity *Dlt_0x33333935) Decode(ctx *PacketContext, data []byte) (result Da
 	//正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
 	byteb := make([]byte, 2)
 	for i := 0; i < 2; i++ {
-		byteb[i] = data[14+i] - 0x33
+		byteb[i] = dataByte[14+i] - 0x33
 	}
 
 	entity.PowerFactor, err = stringToPowerFactor(hex.EncodeToString(byteb))
 	if err != nil {
-		return result, err
+		return err
 	}
 	glog.Debugf("数据读取成功:表号:%s,当前总功率因数:%2f", entity.DeviceID, entity.PowerFactor)
 
-	return result, nil
+	return nil
 }
 
 func stringToPowerFactor(s string) (float64, error) {

+ 5 - 5
protocol/dlt645_0x33343435.go

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

+ 6 - 8
protocol/dlt645_0x33343535.go

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

+ 7 - 7
protocol/dlt645_0x33353435.go

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

+ 6 - 7
protocol/dlt645_0x33353535.go

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

+ 6 - 7
protocol/dlt645_0x33363435.go

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

+ 6 - 7
protocol/dlt645_0x33363535.go

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

+ 5 - 5
protocol/dlt645_0x93.go

@@ -28,17 +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 Data, err error) {
+func (entity *Dlt_0x93) Decode(ctx *PacketContext, dataByte []byte, data *Data) (err error) {
 
-	entity.DeviceAddress = data[1:7]
-	ctx.SetReceiveAddress(data[1:7])
+	entity.DeviceAddress = dataByte[1:7]
+	ctx.SetReceiveAddress(dataByte[1:7])
 
 	var bytea []byte
-	bytea = append(bytea, data[1:7]...)
+	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)
-	return result, nil
+	return 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 Data, err error)
+	Decode(ctx *PacketContext, dataByte []byte, data *Data) error
 }

+ 21 - 21
protocol/message.go

@@ -59,36 +59,36 @@ func (message *Message) Encode() ([]byte, error) {
 }
 
 // 协议解码
-func (message *Message) Decode(ctx *PacketContext, data []byte) (result Data, err error) {
+func (message *Message) Decode(ctx *PacketContext, buf []byte, data *Data) (result *Data, err error) {
 	// 检验标志位
-	length := len(data)
+	length := len(buf)
 	if length == 0 {
 		return result, errors.ErrInvalidMessage
 	}
 	for i := 0; i <= length; i++ {
-		if data[i] == SendByte {
+		if buf[i] == SendByte {
 			continue
 		} else {
-			data = data[i:length]
-			glog.Debugf("收到数据:%2X", data)
+			buf = buf[i:length]
+			glog.Debugf("收到数据:%2X", buf)
 			break
 		}
 	}
-	if data[0] != ReceiveByte {
+	if buf[0] != ReceiveByte {
 		return result, nil
 	}
-	if data[len(data)-1] != EndByte {
-		data = append(data, 0x16)
+	if buf[len(buf)-1] != EndByte {
+		buf = append(buf, 0x16)
 	}
-	if !message.checkSum(data) {
+	if !message.checkSum(buf) {
 		return result, errors.ErrInvalidCheckSum
 	}
 
 	//处理注册包
-	if data[0] == RegisterByte {
+	if buf[0] == RegisterByte {
 
 		header := Header{}
-		_ = json.Unmarshal(data, &header)
+		_ = json.Unmarshal(buf, &header)
 
 		header.IccID, err = strconv.ParseUint(header.Imei, 10, 64)
 		header.MsgID = 0x0040 //消息ID
@@ -101,20 +101,20 @@ func (message *Message) Decode(ctx *PacketContext, data []byte) (result Data, er
 		message.Header = header
 		return result, nil
 	}
-	if len(data) < 8 {
+	if len(buf) < 8 {
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", errors.ErrInvalidBody)
 		}
 	}
-	if data[8] == 0x93 {
-		result, err = message.decode(ctx, uint32(0x93), data[:])
+	if buf[8] == 0x93 {
+		err = message.decode(ctx, uint32(0x93), buf[:], data)
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", err.Error())
 		}
 
 	} else {
-		msgID := MsgID(binary.BigEndian.Uint32(data[10:15]))      //消息ID
-		result, err = message.decode(ctx, uint32(msgID), data[:]) //解析实体对象 entity     buffer : 为消息标识
+		msgID := MsgID(binary.BigEndian.Uint32(buf[10:15]))    //消息ID
+		err = message.decode(ctx, uint32(msgID), buf[:], data) //解析实体对象 entity     buffer : 为消息标识
 		if err != nil {
 			glog.Errorf("解析报文失败:%s", err.Error())
 		}
@@ -123,19 +123,19 @@ func (message *Message) Decode(ctx *PacketContext, data []byte) (result Data, er
 }
 
 //--->
-func (message *Message) decode(ctx *PacketContext, dataType uint32, data []byte) (result Data, err error) {
+func (message *Message) decode(ctx *PacketContext, dataType uint32, buf []byte, data *Data) error {
 	creator, ok := entityMapper[dataType]
 	if !ok {
-		return result, errors.ErrTypeNotRegistered
+		return errors.ErrTypeNotRegistered
 	}
 
 	entity := creator()
 
-	result, err = entity.Decode(ctx, data) //解析data数据
+	err := entity.Decode(ctx, buf, data) //解析data数据
 	if err != nil {
-		return result, err
+		return err
 	}
-	return result, err
+	return err
 }
 
 // 写入二进制数据

+ 47 - 32
server/client.go

@@ -21,12 +21,20 @@ type Client struct {
 	closeChan     chan struct{}
 	closeHandler  func(id string, c *Client)
 	lastHeartBeat time.Time
-	done          chan struct{}
 	gatewayId     uint16
 	isReg         bool
 }
 
-func (c *Client) ReadLoop(ctx *protocol.PacketContext) {
+func NewClient(s *Server, conn *gtcp.Conn) *Client {
+	return &Client{
+		srv:       s,
+		conn:      conn,
+		sendChan:  make(chan []byte),
+		closeChan: make(chan struct{}),
+	}
+}
+
+func (c *Client) ReadLoop(ctx *protocol.PacketContext, data *protocol.Data) {
 	defer c.srv.grWG.Done()
 	for {
 		buf, err := c.conn.Recv(-1)
@@ -35,7 +43,7 @@ func (c *Client) ReadLoop(ctx *protocol.PacketContext) {
 			return
 		}
 		if len(buf) > 0 {
-			result, err := c.srv.message.Decode(ctx, buf)
+			_, err := c.srv.message.Decode(ctx, buf, data)
 			if err != nil {
 				glog.Errorf("解析报文失败:%s", err.Error())
 			}
@@ -43,33 +51,40 @@ func (c *Client) ReadLoop(ctx *protocol.PacketContext) {
 				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)
-			}
+func (c *Client) ReportPower(data *protocol.Data) {
+	defer c.srv.grWG.Done()
+	for {
+		reportData := new(protocol.PowerData)
+		reportData.ActivePower = data.ActivePower
+		if err := c.srv.ReportStatus(c.Id, reportData); err != nil {
+			c.readError(err)
+			return
+		}
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.PowerFrequency")) * time.Second)
+	}
+}
 
-			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)
-			}
+func (c *Client) ReportVIData(data *protocol.Data) {
+	defer c.srv.grWG.Done()
+	for {
+		reportData := new(protocol.VIData)
+		reportData.AV = data.AV
+		reportData.BV = data.BV
+		reportData.CV = data.CV
+		reportData.AI = data.AI
+		reportData.BI = data.BI
+		reportData.CI = data.CI
+		if err := c.srv.ReportStatus(c.Id, reportData); err != nil {
+			c.readError(err)
+			return
 		}
+		time.Sleep(time.Duration(g.Cfg().GetInt("Server.VIFrequency")) * time.Second)
 	}
+
 }
 
 func (c *Client) SetId(id string) {
@@ -91,7 +106,7 @@ func (c *Client) readError(err error) {
 func (c *Client) closeConnection() {
 	_ = c.conn.Close()
 	c.conn = nil
-	close(c.done)
+	close(c.closeChan)
 	c.SetId("")
 	c.isReg = false
 	if c.closeHandler != nil {
@@ -149,7 +164,7 @@ func (c *Client) GetAV(ctx *protocol.PacketContext, avChan, aiChan chan struct{}
 				glog.Debugf("指令发送失败:%s", err.Error())
 			}
 		}
-		time.Sleep(1 * time.Second)
+		time.Sleep(2 * time.Second)
 		aiChan <- struct{}{}
 	}
 }
@@ -166,7 +181,7 @@ func (c *Client) GetAI(ctx *protocol.PacketContext, aiChan, bvChan chan struct{}
 				glog.Debugf("指令发送失败:%s", err.Error())
 			}
 		}
-		time.Sleep(1 * time.Second)
+		time.Sleep(2 * time.Second)
 		bvChan <- struct{}{}
 	}
 }
@@ -183,7 +198,7 @@ func (c *Client) GetBV(ctx *protocol.PacketContext, bvChan, biChan chan struct{}
 				glog.Debugf("指令发送失败:%s", err.Error())
 			}
 		}
-		time.Sleep(1 * time.Second)
+		time.Sleep(2 * time.Second)
 		biChan <- struct{}{}
 	}
 }
@@ -199,7 +214,7 @@ func (c *Client) GetBI(ctx *protocol.PacketContext, biChan, cvChan chan struct{}
 				glog.Debugf("指令发送失败:%s", err.Error())
 			}
 		}
-		time.Sleep(1 * time.Second)
+		time.Sleep(2 * time.Second)
 		cvChan <- struct{}{}
 	}
 }
@@ -215,7 +230,7 @@ func (c *Client) GetCV(ctx *protocol.PacketContext, cvChan, ciChan chan struct{}
 				glog.Debugf("指令发送失败:%s", err.Error())
 			}
 		}
-		time.Sleep(1 * time.Second)
+		time.Sleep(2 * time.Second)
 		ciChan <- struct{}{}
 	}
 }

+ 24 - 77
server/server.go

@@ -4,12 +4,10 @@ import (
 	"context"
 	"dlt645-server/protocol"
 	"fmt"
-	"github.com/gogf/gf/container/gmap"
 	"github.com/gogf/gf/net/gtcp"
 	"github.com/gogf/gf/os/glog"
 	gatewayV2 "sparrow-sdk/v2"
 	"sync"
-	"time"
 )
 
 type Server struct {
@@ -18,10 +16,8 @@ type Server struct {
 	ctx       context.Context
 	addr      string
 	port      int
-	clients   *gmap.HashMap
 	grMu      sync.Mutex
 	grWG      sync.WaitGroup
-	grRunning bool
 	message   protocol.Message
 	gateWay   *gatewayV2.Gateway
 }
@@ -38,11 +34,8 @@ func NewServer(ctx context.Context, addr string, port int, gw *gatewayV2.Gateway
 
 func (s *Server) Start() error {
 	glog.Printf("服务端启动[%s:%d]", s.addr, s.port)
-	server := gtcp.NewServer(fmt.Sprintf("%s:%d", s.addr, s.port), s.handleConnect)
+	server := gtcp.NewServer(fmt.Sprintf("%s:%d", s.addr, s.port), s.onClientConnect)
 	s.server = server
-	s.grMu.Lock()
-	s.grRunning = true
-	s.grMu.Unlock()
 	return s.server.Run()
 }
 
@@ -50,33 +43,15 @@ func (s *Server) Stop() {
 	s.server.Close()
 }
 
-func (s *Server) handleConnect(conn *gtcp.Conn) {
-	s.startGoRoutine(func() {
-		s.createClient(conn)
-		s.grWG.Done()
-	})
-}
-
-func (s *Server) startGoRoutine(f func()) {
-	s.grMu.Lock()
-	if s.grRunning {
-		s.grWG.Add(1)
-		go f()
-	}
-	s.grMu.Unlock()
-}
-
-func (s *Server) createClient(conn *gtcp.Conn) *Client {
-	c := &Client{
-		srv:  s,
-		done: make(chan struct{}),
-		conn: conn,
-		closeHandler: func(id string, c *Client) {
-			glog.Debugf("客户端断开:%s", id)
-		},
+func (s *Server) onClientConnect(conn *gtcp.Conn) {
+	glog.Debugf("新的设备接入:%s", conn.RemoteAddr())
+	c := NewClient(s, conn)
+	c.closeHandler = func(id string, c *Client) {
+		glog.Debugf("客户端断开:%s", id)
 	}
-
 	ctx := new(protocol.PacketContext)
+	data := new(protocol.Data)
+	go c.ReadLoop(ctx, data)
 
 	addressChan := make(chan struct{}, 1)
 	avChan := make(chan struct{}, 1)
@@ -88,51 +63,23 @@ func (s *Server) createClient(conn *gtcp.Conn) *Client {
 	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.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
-}
 
-func (s *Server) removeClient(gatewayId uint16) {
-	s.clients.Remove(gatewayId)
+	go c.SendGetAddress(ctx, addressChan, avChan)
+
+	go c.GetActivePower(ctx, powerChan)
+
+	go c.GetAV(ctx, avChan, aiChan)
+
+	go c.GetAI(ctx, aiChan, bvChan)
+
+	go c.GetBV(ctx, bvChan, biChan)
+
+	go c.GetBI(ctx, biChan, cvChan)
+
+	go c.GetCV(ctx, cvChan, ciChan)
+
+	go c.GetCI(ctx, ciChan, powerChan)
+
 }
 
 func (s *Server) ReportStatus(subId string, data interface{}) error {