From bc0b7e914a378b2c40f9d2ec2470b61a19c18288 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期五, 11 八月 2023 17:05:02 +0800
Subject: [PATCH] 修改上报的数据结构, 添加plc查询接口

---
 msg/send.go             |    3 
 config/config.go        |    2 
 go.sum                  |   77 ++++++++++++
 webserver/controller.go |   24 ++++
 msg/msg.go              |    2 
 collector/device.go     |   30 +++++
 webserver/router.go     |   12 ++
 go.mod                  |   25 ++++
 main.go                 |   11 +
 util/jwt.go             |    3 
 collector/collector.go  |  117 +++++++++++--------
 11 files changed, 247 insertions(+), 59 deletions(-)

diff --git a/collector/collector.go b/collector/collector.go
index 12e8f2e..3fa392b 100644
--- a/collector/collector.go
+++ b/collector/collector.go
@@ -14,10 +14,12 @@
 var tasksStore sync.Map
 
 type collectorProc struct {
-	device *msg.PLCDevice
-	cancel context.CancelFunc
+	device  *msg.PLCDevice
+	cancel  context.CancelFunc
+	plcConn *plc4go.PlcConnection
 }
 
+// 鍒濆鍖栭噰闆嗕换鍔�, 璇锋眰璁惧鍒楄〃, 鎸夎澶囨坊鍔犻噰闆嗕换鍔�
 func InitTask() {
 	logger.Debug("init task")
 	devices, err := getDeviceList()
@@ -53,78 +55,55 @@
 
 	tasksStore.Store(device.DeviceID, &proc)
 
-	go connectingDevice(ctx, device)
+	go connectingDevice(ctx, &proc)
 }
 
-func connectingDevice(ctx context.Context, dev *msg.PLCDevice) {
-	plcResponse := msg.PLCResponse{
-		DeviceID:   dev.DeviceID,
-		DeviceName: dev.DeviceName,
-		DeviceIP:   dev.DeviceIP,
-		Online:     false,
-	}
-
+// 杩涘叆閲囬泦浠诲姟, 寮�濮嬪皾璇曡繛鎺ヨ澶�, 澶辫触鍚�30绉掗噸璇�, 鎴愬姛鍚庤繘鍏ュ惊鐜噰闆�
+func connectingDevice(ctx context.Context, proc *collectorProc) {
 	for {
 		select {
 		case <-ctx.Done():
-			logger.Warn("plc device %s, ip: %s, end of connecting.", dev.DeviceName, dev.DeviceIP)
+			logger.Warn("plc device %s, ip: %s, end of connecting.", proc.device.DeviceName, proc.device.DeviceIP)
 			return
 		default:
-			plcConnection, err := NewModbusConnection(dev.DeviceIP)
+			plcConnection, err := NewModbusConnection(proc.device.DeviceIP)
 			if err != nil {
-				logger.Warn("error connecting to PLC: %s, ip: %s", dev.DeviceName, dev.DeviceIP)
-				plcResponse.Online = false
-				msg.SendDeviceLiveData(&plcResponse)
+				logger.Warn("error connecting to PLC: %s, ip: %s", proc.device.DeviceName, proc.device.DeviceIP)
+
+				// 涓婃姤璁惧绂荤嚎
+				msg.SendDeviceLiveData(&msg.PLCResponse{
+					DeviceID:   proc.device.DeviceID,
+					DeviceName: proc.device.DeviceName,
+					DeviceIP:   proc.device.DeviceIP,
+					Online:     false,
+				})
+
 				time.Sleep(30 * time.Second)
 			} else {
 				// 杩炴帴鎴愬姛鍚�, 寮�濮嬮噰闆嗘暟鎹�, 浼氬垽鏂繛鎺ユ槸鍚︽湁鏁�, 鏂紑鍚庝細閲囬泦浠诲姟浼氶��鍑�, 缁х画閲嶆柊灏濊瘯杩炴帴璁惧
-				runCollectionTask(ctx, dev, plcConnection)
+				proc.plcConn = &plcConnection
+				runCollectionTask(ctx, proc)
 			}
 		}
 	}
 }
 
-func runCollectionTask(ctx context.Context, dev *msg.PLCDevice, conn plc4go.PlcConnection) {
-	// 鍒涘缓modbusTCP杩炴帴, 寰幆鏌ヨ鏁版嵁骞朵笂鎶�
-	plcResponse := msg.PLCResponse{
-		DeviceID:   dev.DeviceID,
-		DeviceName: dev.DeviceName,
-		DeviceIP:   dev.DeviceIP,
-		Online:     true,
-	}
+func runCollectionTask(ctx context.Context, proc *collectorProc) {
+	dev := proc.device
 
 	for {
 		select {
 		case <-ctx.Done():
 			logger.Warn("plc device %s, ip: %s, end of collection.", dev.DeviceName, dev.DeviceIP)
-			conn.Close()
+			(*proc.plcConn).Close()
 			return
 		default:
-			if !conn.IsConnected() {
-				logger.Warn("plc device %s, ip: %s, disconnected.", dev.DeviceName, dev.DeviceIP)
-				return
-			}
+			plcResponse := plc4xRequest(proc)
 
-			// 鏍规嵁璁剧疆鐨勫湴鍧�鏌ヨ鏁版嵁锛屼笂鎶�
-			plcResponse.Message = ""
-			for _, addr := range dev.Details {
-				result, err := ReadHoldingRegister(conn, addr.StartAddress, addr.Length)
-				if err != nil {
-					logger.Warn("plc device Read Holding Register error, %s", err.Error())
-					plcResponse.Message = err.Error()
-				} else {
-					plcResponse.PLCData = append(plcResponse.PLCData, msg.PLCData{
-						StartAddress: addr.StartAddress,
-						Length:       addr.Length,
-						Type:         addr.Type,
-						FieldName:    addr.FieldName,
-						RawData:      result,
-					})
-				}
-			}
+			msg.SendDeviceLiveData(plcResponse)
 
-			msg.SendDeviceLiveData(&plcResponse)
-			if plcResponse.Message != "" {
+			// 鏃犳硶杩炴帴浜�, 閫�鍑洪噰闆�, 閲嶆柊杩炴帴
+			if !plcResponse.Online {
 				return
 			}
 
@@ -133,3 +112,43 @@
 		}
 	}
 }
+
+func plc4xRequest(proc *collectorProc) *msg.PLCResponse {
+	conn := *proc.plcConn
+	dev := proc.device
+
+	plcResponse := msg.PLCResponse{
+		DeviceID:   dev.DeviceID,
+		DeviceName: dev.DeviceName,
+		DeviceIP:   dev.DeviceIP,
+		Online:     true,
+	}
+
+	if !conn.IsConnected() {
+		logger.Warn("plc device %s, ip: %s, disconnected.", dev.DeviceName, dev.DeviceIP)
+		plcResponse.Online = false
+
+		return &plcResponse
+	}
+
+	// 鏍规嵁璁剧疆鐨勫湴鍧�鏌ヨ鏁版嵁锛屼笂鎶�
+	for _, addr := range dev.Details {
+		result, err := ReadHoldingRegister(conn, addr.StartAddress, addr.Length)
+		readRequest := msg.PLCData{
+			StartAddress: addr.StartAddress,
+			Length:       addr.Length,
+			Type:         addr.Type,
+			FieldName:    addr.FieldName,
+			RawData:      result,
+		}
+
+		if err != nil {
+			logger.Warn("plc device Read Holding Register error, %s", err.Error())
+			readRequest.Message = err.Error()
+		}
+
+		plcResponse.PLCData = append(plcResponse.PLCData, readRequest)
+	}
+
+	return &plcResponse
+}
diff --git a/collector/device.go b/collector/device.go
index a9fc19e..9de3d33 100644
--- a/collector/device.go
+++ b/collector/device.go
@@ -51,3 +51,33 @@
 
 	return nil
 }
+
+func HandleDeviceReadRequest(device *msg.PLCDevice) *msg.PLCResponse {
+	procCache, ok := tasksStore.Load(device.DeviceID)
+	if ok {
+		if procCache.(*collectorProc).device.DeviceIP == device.DeviceIP {
+			return plc4xRequest(procCache.(*collectorProc))
+		}
+	}
+
+	plcConnection, err := NewModbusConnection(device.DeviceIP)
+	if err != nil {
+		logger.Warn("error connecting to PLC: %s, ip: %s", device.DeviceName, device.DeviceIP)
+
+		// 涓婃姤璁惧绂荤嚎
+		return &msg.PLCResponse{
+			DeviceID:   device.DeviceID,
+			DeviceName: device.DeviceName,
+			DeviceIP:   device.DeviceIP,
+			Online:     false,
+		}
+	}
+
+	proc := collectorProc{
+		device:  device,
+		cancel:  nil,
+		plcConn: &plcConnection,
+	}
+
+	return plc4xRequest(&proc)
+}
diff --git a/config/config.go b/config/config.go
index 9200865..143c96a 100644
--- a/config/config.go
+++ b/config/config.go
@@ -9,6 +9,7 @@
 )
 
 type Config struct {
+	ServePort         string `json:"serve_port"`           // 涓昏处鍙穒d, 鐢ㄤ簬璇锋眰web鎺ュ彛
 	ParentId          string `json:"parent_id"`            // 涓昏处鍙穒d, 鐢ㄤ簬璇锋眰web鎺ュ彛
 	JWTKey            string `json:"jwt_key"`              // 鐢熸垚jwt鐨刱ey
 	NsqServer         string `json:"nsq_server"`           // nsq TCP鏈嶅姟绔湴鍧�
@@ -24,6 +25,7 @@
 var Options Config
 
 func DefaultConfig() {
+	Options.ServePort = "16860"
 	Options.ParentId = "guangsheng"
 	Options.JWTKey = "abcdefghijklmn"
 	Options.NsqServer = "fai365.com:4150"
diff --git a/go.mod b/go.mod
index 242207f..23eb7ce 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@
 require (
 	github.com/apache/plc4x/plc4go v0.0.0-20230731062314-d0b9a9d01b04
 	github.com/fatedier/beego v1.7.2
+	github.com/gin-gonic/gin v1.9.1
 	github.com/golang-jwt/jwt/v4 v4.5.0
 	github.com/nsqio/go-nsq v1.1.0
 	github.com/rs/zerolog v1.30.0
@@ -12,15 +13,37 @@
 
 require (
 	github.com/IBM/netaddr v1.5.0 // indirect
+	github.com/bytedance/sonic v1.9.1 // indirect
+	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/go-playground/locales v0.14.1 // indirect
+	github.com/go-playground/universal-translator v0.18.1 // indirect
+	github.com/go-playground/validator/v10 v10.14.0 // indirect
+	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/golang/snappy v0.0.1 // indirect
 	github.com/google/uuid v1.3.0 // indirect
 	github.com/gopacket/gopacket v1.1.1 // indirect
 	github.com/icza/bitio v1.1.0 // indirect
 	github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+	github.com/leodido/go-urn v1.2.4 // indirect
 	github.com/libp2p/go-reuseport v0.3.0 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
-	github.com/mattn/go-isatty v0.0.17 // indirect
+	github.com/mattn/go-isatty v0.0.19 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+	github.com/ugorji/go/codec v1.2.11 // indirect
+	golang.org/x/arch v0.3.0 // indirect
+	golang.org/x/crypto v0.11.0 // indirect
 	golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect
+	golang.org/x/net v0.12.0 // indirect
 	golang.org/x/sys v0.10.0 // indirect
+	golang.org/x/text v0.11.0 // indirect
+	google.golang.org/protobuf v1.30.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index c5a5e14..cb21de8 100644
--- a/go.sum
+++ b/go.sum
@@ -4,16 +4,42 @@
 github.com/antchfx/xpath v0.0.0-20170515025933-1f3266e77307 h1:C735MoY/X+UOx6SECmHk5pVOj51h839Ph13pEoY8UmU=
 github.com/apache/plc4x/plc4go v0.0.0-20230731062314-d0b9a9d01b04 h1:0HYYkjoJotw8vjGCwFK7Y0CEpCbP3jSvOuDsmgjqHTs=
 github.com/apache/plc4x/plc4go v0.0.0-20230731062314-d0b9a9d01b04/go.mod h1:xz9DW4Goo2domdcwckV8/yViuANq12sV/3VDC2wJZls=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
+github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
 github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/fatedier/beego v1.7.2 h1:kVw3oKiXccInqG+Z/7l8zyRQXrsCQEfcUxgzfGK+R8g=
 github.com/fatedier/beego v1.7.2/go.mod h1:wx3gB6dbIfBRcucp94PI9Bt3I0F2c/MyNEWuhzpWiwk=
+github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
+github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
 github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopacket/gopacket v1.1.1 h1:zbx9F9d6A7sWNkFKrvMBZTfGgxFoY4NgUudFVVHMfcw=
@@ -24,6 +50,13 @@
 github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
 github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 h1:G2ztCwXov8mRvP0ZfjE6nAlaCX2XbykaeHdbT6KwDz0=
 github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4/go.mod h1:2RvX5ZjVtsznNZPEt4xwJXNJrM3VTZoQf7V6gk0ysvs=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
+github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
 github.com/libp2p/go-reuseport v0.3.0 h1:iiZslO5byUYZEg9iCwJGf5h+sf1Agmqx2V2FDjPyvUw=
 github.com/libp2p/go-reuseport v0.3.0/go.mod h1:laea40AimhtfEqysZ71UpYj4S+R9VpH8PgqLo7L+SwI=
 github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
@@ -31,10 +64,17 @@
 github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
 github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
+github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -42,16 +82,49 @@
 github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
 github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 github.com/subchen/go-xmldom v1.1.2 h1:7evI2YqfYYOnuj+PBwyaOZZYjl3iWq35P6KfBUw9jeU=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
+golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
+golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
 golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w=
 golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
 golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
+golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
+golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/main.go b/main.go
index a828d4b..c479135 100644
--- a/main.go
+++ b/main.go
@@ -1,13 +1,15 @@
 package main
 
 import (
-	"plc-recorder/msg"
+	"os"
 	"runtime"
 
 	"plc-recorder/collector"
 	"plc-recorder/config"
 	"plc-recorder/logger"
+	"plc-recorder/msg"
 	"plc-recorder/nsqclient"
+	"plc-recorder/webserver"
 
 	"github.com/rs/zerolog"
 )
@@ -35,10 +37,13 @@
 	// 璁㈤槄璁惧鍙樻洿
 	go nsqclient.InitNsqConsumer(config.Options.SubDeviceTopic, "plc-recorder", collector.HandleDeviceUpdate)
 
+	// 鍚姩閲囬泦浠诲姟
 	collector.InitTask()
 
 	// 娴嬭瘯鏁版嵁
-	go msg.TestSendDeviceLiveData()
+	if len(os.Args) > 1 && os.Args[1] == "-d" {
+		go msg.TestSendDeviceLiveData()
+	}
 
-	select {}
+	webserver.Serve(config.Options.ServePort)
 }
diff --git a/msg/msg.go b/msg/msg.go
index 09d2504..e4000ff 100644
--- a/msg/msg.go
+++ b/msg/msg.go
@@ -24,7 +24,6 @@
 	DeviceName string    `json:"deviceName"`
 	DeviceIP   string    `json:"deviceIp"`
 	Online     bool      `json:"online"`
-	Message    string    `json:"message"`
 	PLCData    []PLCData `json:"plcData"`
 }
 
@@ -34,6 +33,7 @@
 	Type         string `json:"type"`         // 鏁版嵁绫诲瀷
 	FieldName    string `json:"fieldName"`    // 瀵瑰簲绯荤粺瀛楁
 	RawData      []byte `json:"rawData"`      // 浠巔lc璇诲彇鐨勫師濮嬫暟鎹�
+	Message      string `json:"message"`
 }
 
 type ApsDeviceApiResponse struct {
diff --git a/msg/send.go b/msg/send.go
index ba068d5..8290dda 100644
--- a/msg/send.go
+++ b/msg/send.go
@@ -2,12 +2,12 @@
 
 import (
 	"encoding/json"
-	"plc-recorder/util"
 	"time"
 
 	"plc-recorder/config"
 	"plc-recorder/logger"
 	"plc-recorder/nsqclient"
+	"plc-recorder/util"
 )
 
 func SendDeviceLiveData(response *PLCResponse) {
@@ -37,7 +37,6 @@
 			DeviceName: "test",
 			DeviceIP:   "0.0.0.0",
 			Online:     true,
-			Message:    "",
 			PLCData: []PLCData{{
 				StartAddress: 100,
 				Length:       1,
diff --git a/util/jwt.go b/util/jwt.go
index 431dac4..72bf305 100644
--- a/util/jwt.go
+++ b/util/jwt.go
@@ -1,9 +1,10 @@
 package util
 
 import (
-	"plc-recorder/config"
 	"time"
 
+	"plc-recorder/config"
+
 	"github.com/golang-jwt/jwt/v4"
 )
 
diff --git a/webserver/controller.go b/webserver/controller.go
new file mode 100644
index 0000000..530fd26
--- /dev/null
+++ b/webserver/controller.go
@@ -0,0 +1,24 @@
+package webserver
+
+import (
+	"plc-recorder/collector"
+	"plc-recorder/msg"
+
+	"github.com/gin-gonic/gin"
+)
+
+func plcReadRequest(c *gin.Context) {
+	var req msg.PLCDevice
+	if err := c.ShouldBind(&req); err != nil {
+		c.JSON(401, gin.H{"msg": err.Error()})
+		return
+	}
+
+	rsp := collector.HandleDeviceReadRequest(&req)
+
+	c.JSON(200, gin.H{
+		"success": true,
+		"message": "",
+		"data":    rsp,
+	})
+}
diff --git a/webserver/router.go b/webserver/router.go
new file mode 100644
index 0000000..6f99da5
--- /dev/null
+++ b/webserver/router.go
@@ -0,0 +1,12 @@
+package webserver
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func Serve(port string) {
+	r := gin.Default()
+	r.POST("/device/liveData", plcReadRequest)
+
+	r.Run(":" + port)
+}

--
Gitblit v1.8.0