Parcourir la source

更新解码包,添加发送

mvtov il y a 2 ans
Parent
commit
e1f1e71527

+ 2 - 2
config/config.toml

@@ -4,8 +4,8 @@
     RunMode = "debug"
 [Sparrow]
     Server = "http://192.168.0.224:18100"
-    ProductKey = "57c8ba507fedce9b729844e4e4bf45bd09076ac272057b128b40fc7f9d9b662d9a0dd8b8288cdf61e9af0238499e27b0"
-    DeviceCode = "4G-LET-DTU"
+    ProductKey = "958daf8b3a533f0d9516ac8fd17ef0cb06b439e664787a2a89608a10eeee8eb3c35c82c505d19f8a4417e530de0678fd"
+    DeviceCode = "Dtt645-4G"
     Debug = true
 
 

+ 5 - 5
protocol/dlt645_0x33333433.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33333433 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//正向有功总电能
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33333433) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x34, 0x33})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)
@@ -54,7 +54,7 @@ func (entity *Dlt_0x33333433) Decode(data []byte) (int, error) {
 	if err != nil {
 		return 0, err
 	}
-	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f", entity.DeviceID, entity.WP)
+	glog.Debugf("数据读取成功:表号:%s,正向有功总电能:%2f kWh", entity.DeviceID, entity.WP)
 	return len(data), nil
 }
 

+ 4 - 4
protocol/dlt645_0x33333533.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33333533 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//反向有功总电能
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33333533) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x35, 0x33})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33333635.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33333635 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前总有功功率
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33333635) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x36, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33333735.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33333735 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前总无功功率
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33333735) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x37, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33333835.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33333835 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前视在功率
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33333835) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x38, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33333935.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33333935 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前总功率因数
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33333935) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x39, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33343435.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33343435 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前A相电压
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33343435) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x34, 0x34, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33343535.go

@@ -8,7 +8,7 @@ import (
 
 type Dlt_0x33343535 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前A相电流
@@ -23,13 +23,13 @@ func (entity *Dlt_0x33343535) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x34, 0x35, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33353435.go

@@ -7,7 +7,7 @@ import (
 
 type Dlt_0x33353435 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前B相电压
@@ -22,13 +22,13 @@ func (entity *Dlt_0x33353435) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x35, 0x34, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33353535.go

@@ -7,7 +7,7 @@ import (
 
 type Dlt_0x33353535 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前B相电流
@@ -22,13 +22,13 @@ func (entity *Dlt_0x33353535) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x35, 0x35, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33363435.go

@@ -7,7 +7,7 @@ import (
 
 type Dlt_0x33363435 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前C相电压
@@ -22,13 +22,13 @@ func (entity *Dlt_0x33363435) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x36, 0x34, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 4 - 4
protocol/dlt645_0x33363535.go

@@ -7,7 +7,7 @@ import (
 
 type Dlt_0x33363535 struct {
 	//接收表号
-	DeviceName []byte
+	DeviceAddress []byte
 	//表号
 	DeviceID string
 	//当前C相电流
@@ -22,13 +22,13 @@ func (entity *Dlt_0x33363535) Encode() ([]byte, error) {
 	writer := NewWriter()
 
 	// 接收符号
-	writer.Write([]byte{0xFE, 0xFE, 0x68})
-	writer.Write(entity.DeviceName)
+	writer.Write([]byte{0x68})
+	writer.Write(entity.DeviceAddress)
 	writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x36, 0x35, 0x35})
 
 	//cs效验位
 	var one byte
-	for _, v := range writer.Bytes()[2:] {
+	for _, v := range writer.Bytes() {
 		one += v
 	}
 	writer.WriteByte(one)

+ 41 - 0
protocol/dlt645_0x93.go

@@ -0,0 +1,41 @@
+package protocol
+
+import (
+	"encoding/hex"
+	"github.com/gogf/gf/os/glog"
+)
+
+type Dlt_0x93 struct {
+	//接收表号
+	DeviceAddress []byte
+	//表号
+	DeviceID string
+	//当前视在功率
+	ApparentPower float64
+}
+
+func (entity *Dlt_0x93) MsgID() MsgID {
+	return ReadAddress
+}
+
+//func (entity *Dlt_0x93) GetDeviceAddress() DeviceAddress {
+//	return entity.DeviceAddress
+//}
+
+func (entity *Dlt_0x93) Encode() ([]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) {
+	entity.DeviceAddress = data[1:7]
+	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)
+	glog.Debugf("表地址接收成功:表号:%s", entity.DeviceID)
+	return len(data), nil
+}

+ 1 - 1
protocol/entity.go

@@ -2,8 +2,8 @@ package protocol
 
 // 消息实体
 type Entity interface {
+	//GetDeviceAddress() DeviceAddress
 	MsgID() MsgID
 	Encode() ([]byte, error)
 	Decode([]byte) (int, error)
 }
-

+ 10 - 9
protocol/header.go

@@ -14,15 +14,16 @@ type Packet struct {
 
 // 消息头
 type Header struct {
-	MsgID       MsgID
-	Property    Property
-	Ver         string `json:"ver"`
-	Csp         uint64 `json:"csp"`
-	Imei        string `json:"imei"`
-	ICID        string `json:"iccid"`
-	IccID       uint64
-	MsgSerialNo uint16
-	Packet      *Packet
+	ControlNumber byte
+	MsgID         MsgID
+	Property      Property
+	Ver           string `json:"ver"`
+	Csp           uint64 `json:"csp"`
+	Imei          string `json:"imei"`
+	ICID          string `json:"iccid"`
+	IccID         uint64
+	MsgSerialNo   uint16
+	Packet        *Packet
 }
 
 // 协议编码

+ 29 - 29
protocol/message.go

@@ -5,8 +5,7 @@ import (
 	"dlt645-server/errors"
 	"encoding/binary"
 	"encoding/json"
-	"fmt"
-	log "github.com/sirupsen/logrus"
+	"github.com/gogf/gf/os/glog"
 	"reflect"
 	"strconv"
 )
@@ -51,7 +50,7 @@ func (message *Message) Decode(data []byte) error {
 	if data[0] != ReceiveByte && data[0] != RegisterByte {
 		return errors.ErrInvalidMessage
 	}
-	if  !message.checkSum(data){
+	if !message.checkSum(data) {
 		return errors.ErrInvalidCheckSum
 	}
 	var header Header
@@ -60,39 +59,40 @@ func (message *Message) Decode(data []byte) error {
 	if data[0] == RegisterByte {
 
 		header := Header{}
-		 _ = json.Unmarshal(data, &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 {
-			message.Body = nil
-		} else {
-			log.WithFields(log.Fields{
-				"id":     fmt.Sprintf("0x%x", header.MsgID),
-				"reason": err,
-			}).Warn("failed to decode message")
+		if err != nil {
+			if err != nil {
+				glog.Errorf("解析报文失败:%s", err.Error())
+			}
 		}
+		message.Body = nil
 		message.Header = header
 		return nil
-	} else if len(data) < 8 {
-		log.WithFields(log.Fields{
-			"data":   fmt.Sprintf("V:%v", data),
-			"reason": "error datalen",
-		}).Warn("failed to decode message")
+	}
+	if len(data) < 8 {
+		if err != nil {
+			glog.Errorf("解析报文失败:%s", errors.ErrInvalidBody)
+		}
+	}
+	if data[7] == 0x93 {
+		entity, _, err := message.decode(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 : 为消息标识
-		if err == nil {
-			message.Body = entity
-		} else {
-			log.WithFields(log.Fields{
-				"id":     fmt.Sprintf("0x%x", header.MsgID),
-				"reason": err,
-			}).Warn("failed to decode message")
+		if err != nil {
+			glog.Errorf("解析报文失败:%s", err.Error())
 		}
+		message.Body = entity
 	}
 
 	message.Header = header
@@ -108,11 +108,11 @@ func (message *Message) decode(dataType uint32, data []byte) (Entity, int, error
 
 	entity := creator()
 
-		count, err := entity.Decode(data) //解析data数据
-		if err != nil {
-			return nil, 0, err
-		}
-		return entity, count, nil
+	count, err := entity.Decode(data) //解析data数据
+	if err != nil {
+		return nil, 0, err
+	}
+	return entity, count, nil
 }
 
 // 写入二进制数据
@@ -135,7 +135,7 @@ func (message *Message) write(buffer *bytes.Buffer, data []byte) *Message {
 func (message *Message) checkSum(data []byte) bool {
 	var checkSum byte
 	for _, b := range data[:len(data)-2] {
-		checkSum +=b
+		checkSum += b
 	}
 	checkSum = checkSum & 0xFF
 

+ 6 - 0
protocol/register.go

@@ -3,7 +3,10 @@ package protocol
 // 消息ID枚举
 type MsgID uint32
 
+//type DeviceAddress []byte
+
 const (
+	ReadAddress MsgID = 0x93
 	//  注册心跳
 	Msgdlt_0x0040 MsgID = 0x0040
 	//上传正向有功总电能
@@ -74,6 +77,9 @@ var entityMapper = map[uint32]func() Entity{
 	uint32(Msgdlt_0x33333835): func() Entity {
 		return new(Dlt_0x33333835)
 	},
+	uint32(ReadAddress): func() Entity {
+		return new(Dlt_0x93)
+	},
 }
 
 // Register 类型注册

+ 48 - 17
server/client.go

@@ -1,6 +1,8 @@
 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"
@@ -11,29 +13,34 @@ import (
 )
 
 type Client struct {
-	Id           string
-	srv          *Server
-	conn         *gtcp.Conn
-	sendChan     chan []byte
-	closeChan    chan struct{}
-	closeHandler func(id string, c *Client)
-	nc            *gtcp.Conn
+	Id            string
+	srv           *Server
+	conn          *gtcp.Conn
+	sendChan      chan []byte
+	closeChan     chan struct{}
+	closeHandler  func(id string, c *Client)
 	lastHeartBeat time.Time
 	done          chan struct{}
 	gatewayId     uint16
-
+	isReg         bool
 }
 
-
 func (c *Client) ReadLoop() {
-	defer c.srv.grWG.Done()
+	//defer c.srv.grWG.Done()
 	for {
-		buf, err := c.nc.RecvTil([]byte{0x16})
+		buf, err := c.conn.Recv(-1)
 		if err != nil {
 			c.readError(err)
 			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)
 			if err != nil {
 				glog.Errorf("解析报文失败:%s", err.Error())
@@ -42,12 +49,10 @@ func (c *Client) ReadLoop() {
 	}
 }
 
-
 func (c *Client) SetId(id string) {
 	c.Id = id
 }
 
-
 func (c *Client) readError(err error) {
 	defer c.closeConnection()
 	if err == io.EOF || isErrConnReset(err) {
@@ -57,9 +62,11 @@ func (c *Client) readError(err error) {
 }
 
 func (c *Client) closeConnection() {
-	c.nc.Close()
-	c.nc = nil
+	_ = c.conn.Close()
+	c.conn = nil
 	close(c.done)
+	c.SetId("")
+	c.isReg = false
 	if c.closeHandler != nil {
 		c.closeHandler(c.Id, c)
 	}
@@ -74,15 +81,39 @@ func isErrConnReset(err error) bool {
 }
 
 func (c *Client) send(buf []byte) error {
-	if c.nc == nil {
+	if c.conn == nil {
 		return nil
 	}
-	err := c.nc.Send(buf)
+	err := c.conn.Send(buf)
 	if err != nil {
 		glog.Error(err)
 		c.closeConnection()
 		return err
 	}
+	glog.Debugf("指令发送成功:%2X", buf)
 	return nil
 }
 
+func (c *Client) Send0X3433() {
+	//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())
+		}
+		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)
+	}
+}

+ 6 - 2
server/server.go

@@ -69,12 +69,16 @@ func (s *Server) createClient(conn *gtcp.Conn) *Client {
 	c := &Client{
 		srv:  s,
 		done: make(chan struct{}),
-		nc:   conn,
+		conn: conn,
 		closeHandler: func(id string, c *Client) {
 			glog.Debugf("客户端断开:%s", id)
 		},
 	}
-	glog.Info("client connect created")
+
+	s.startGoRoutine(func() {
+		c.Send0X3433()
+	})
+
 	s.startGoRoutine(func() {
 		c.ReadLoop()
 	})

+ 10 - 5
test/main.go

@@ -2,16 +2,21 @@ package main
 
 import (
 	"github.com/gogf/gf/net/gtcp"
-	"time"
 )
 
 func main() {
-	conn, err := gtcp.NewConn("127.0.0.1:8999")
+	conn, err := gtcp.NewConn("127.0.0.1:8998")
 	if err != nil {
 		panic(err)
 	}
+
 	for {
-		conn.Write([]byte{0x68, 0x76, 0x02, 0x02, 0x47, 0x02, 0x02, 0x68, 0x91, 0x08, 0x33, 0x33, 0x34, 0x33, 0x35, 0x33, 0x33, 0x33, 0xC9, 0x16})
-		time.Sleep(5 * time.Second)
+		buf, err := conn.RecvTil([]byte{0x16})
+		if err != nil {
+			return
+		}
+		if len(buf) > 0 {
+			conn.Write([]byte{0x68, 0x76, 0x02, 0x02, 0x47, 0x02, 0x02, 0x68, 0x91, 0x08, 0x33, 0x33, 0x34, 0x33, 0x35, 0x33, 0x33, 0x33, 0xC9, 0x16})
+		}
 	}
-}
+}