From 45307d6a0661afa165f07f47b351cba4e7a6f39d Mon Sep 17 00:00:00 2001
From: fish <gcslyp@gmail.com>
Date: Thu, 25 Apr 2019 21:55:22 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84tcp=E4=B8=8B=E8=A7=A3?=
 =?UTF-8?q?=E6=9E=90lora=E4=BC=A0=E8=BE=93=E6=9D=A5=E7=9A=84=E6=95=B0?=
 =?UTF-8?q?=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 router.go    | 384 ++++++++++++++++++++++++++++++++++++++++++++++-----
 tcpserver.go | 155 +++++++++++++++++----
 2 files changed, 473 insertions(+), 66 deletions(-)

diff --git a/router.go b/router.go
index 3cf3720..cfe6e3e 100644
--- a/router.go
+++ b/router.go
@@ -13,6 +13,7 @@ import (
 	"strings"
 	"sync"
 	"time"
+	"bytes"
 )
 
 var router = gin.Default()
@@ -33,10 +34,14 @@ func gw_router() {
 		v1.GET("/satisfaction", pj_api)
 		v1.GET("/seat/:id", seat_api)
 		v1.POST("/push", push)
+		v1.POST("/pushv2", pushv2)
 
 		v1.GET("/getConf")
 
 	}
+
+
+
 	router.Run(":10086")
 }
 
@@ -68,6 +73,10 @@ func getConf() {
 		log.Println("yunhorndebug.getConf.success:", dparkConf)
 	}
 
+	if err!=nil{
+		return
+	}
+
 	if dparkConf.ExtensionInTime == 0 && dparkConf.ExtensionOutTime == 0 {
 		return
 	}
@@ -83,7 +92,7 @@ func getConf() {
 	extensionInTime = dparkConf.ExtensionInTime
 	extensionOutTime = dparkConf.ExtensionOutTime
 
-	check(err)
+	// check(err)
 
 }
 
@@ -107,56 +116,70 @@ var dataMap sync.Map
 //接收传感器push来的数据,解析并上传到云端
 func push(c *gin.Context) {
 
-	nowtime := time.Now()
+		data := c.PostForm("d")
 
-	data := c.PostForm("d")
+ 		go dealData(data)
+
+		log.Println("data:", data)
+		c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": data})
+
+}
+
+func dealData(data string) string{
+
+	nowtime := time.Now()
 
 	log.Println("yunhorndeug.push.data|", data)
 
-	go pushCODE1007(data)
+//	go pushCODE1007(data)
 
 	alldata := strings.Split(data, "#")
 
 	if len(alldata) != 2 {
-		c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
-		return
+		// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
+		return ""
 	} else {
 
 		valuedata := strings.Split(alldata[1], "*")
 
 		if len(valuedata) < 1 {
-			c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
-			return
+			// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
+			return ""
 		}
 
 		dtype, error := strconv.Atoi(valuedata[0])
 		if error != nil {
-			c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtype"})
-			return
+			// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtype"})
+			return ""
 		}
 
 		var nowTmpData = "1#0"
 
 		if dtype == 1 {
 			if len(valuedata) != 3 {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 3"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 3"})
+				return ""
 			}
 			addr, error := strconv.Atoi(alldata[0])
 			if error != nil {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
+				return ""
 			}
 			cs2001, error := strconv.Atoi(valuedata[1])
 			if error != nil {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
+				return ""
 			}
 
 			tof, error := strconv.Atoi(valuedata[2])
 			if error != nil {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtof"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtof"})
+				return ""
+			}
+
+			if tof ==0{
+				log.Println("tof is zero")
+				return ""
 			}
 
 			if addr == 1 {
@@ -195,13 +218,13 @@ func push(c *gin.Context) {
 
 							if nowTmpData == "1#0" {
 								if durationAsInt64 < extensionOutTime {
-									c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
-									return
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
 								}
 							} else {
 								if durationAsInt64 < extensionInTime {
-									c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
-									return
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
 								}
 							}
 							maledemoDevice.DATA["data1"] = 0
@@ -250,13 +273,13 @@ func push(c *gin.Context) {
 
 							if nowTmpData == "1#0" {
 								if durationAsInt64 < extensionOutTime {
-									c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
-									return
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
 								}
 							} else {
 								if durationAsInt64 < extensionInTime {
-									c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
-									return
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
 								}
 							}
 							maledemoDevice.DATA["data2"] = 0
@@ -274,18 +297,18 @@ func push(c *gin.Context) {
 		} else if dtype == 2 {
 			//吸顶传感器  没有距离数据
 			if len(valuedata) != 2 {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 2,type2"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 2,type2"})
+				return ""
 			}
 			addr, error := strconv.Atoi(alldata[0])
 			if error != nil {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
+				return ""
 			}
 			cs2001, error := strconv.Atoi(valuedata[1])
 			if error != nil {
-				c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
-				return
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
+				return ""
 			}
 
 			if cs2001 == 1 {
@@ -324,13 +347,13 @@ func push(c *gin.Context) {
 
 						if nowTmpData == "1#0" {
 							if durationAsInt64 < extensionOutTime {
-								c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
-								return
+								// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+								return ""
 							}
 						} else {
 							if durationAsInt64 < extensionInTime {
-								c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
-								return
+								// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+								return ""
 							}
 						}
 
@@ -344,11 +367,296 @@ func push(c *gin.Context) {
 				}
 			}
 		}
-
 	}
+	return ""
+}
+
+func pushv2(c *gin.Context){
+	data := c.PostForm("d")
+
+	go dealDatav2(data)
 
 	log.Println("data:", data)
-	c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": data})
+	c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "code": 1})
+
+}z
+
+func dealDatav2(data string) string{
+
+	nowtime := time.Now()
+
+	log.Println("yunhorndeug.push.data|", data)
+
+	strs := []byte(data)
+
+	addr := string(strs[:3])
+
+	var readyData bytes.Buffer
+	//地址
+	readyData.WriteString(addr)
+	readyData.WriteString("#")
+	//类型
+	readyData.WriteString(string(strs[3:4]))
+	readyData.WriteString("*")
+	//红外人体感应
+	readyData.WriteString(string(strs[4:5]))
+
+  newdtype,err :=strconv.Atoi(string(strs[3:4]))
+	if err!=nil{
+		log.Println("type parse err",err)
+		return ""
+	}
+
+	if newdtype==1{
+		readyData.WriteString("*")
+		readyData.WriteString(string(strs[5:6]))
+	}
+
+
+	for i,v := range strs{
+		log.Println("strs,i,v",i,v-48)
+	}
+
+	log.Println("readyData:",readyData.String())
+
+//	go pushCODE1007(data)
+
+	alldata := strings.Split(readyData.String(), "#")
+
+	if len(alldata) != 2 {
+		// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
+		return ""
+	} else {
+
+		valuedata := strings.Split(alldata[1], "*")
+
+		if len(valuedata) < 1 {
+			// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
+			return ""
+		}
+
+		dtype, error := strconv.Atoi(valuedata[0])
+		if error != nil {
+			// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtype"})
+			return ""
+		}
+
+		var nowTmpData = "1#0"
+
+		if dtype == 1 {
+			if len(valuedata) != 3 {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 3"})
+				return ""
+			}
+			addr, error := strconv.Atoi(alldata[0])
+			if error != nil {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
+				return ""
+			}
+			cs2001, error := strconv.Atoi(valuedata[1])
+			if error != nil {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
+				return ""
+			}
+
+			tof, error := strconv.Atoi(valuedata[2])
+			if error != nil {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtof"})
+				return ""
+			}
+
+			if tof ==0{
+				log.Println("tof is zero")
+				return ""
+			}
+
+			if addr == 1 {
+
+				if cs2001 == 1 || tof ==1 {
+					nowTmpData = "1#1"
+				}
+
+				if oldData1 != nowTmpData {
+					dataMap.Store(addr, nowtime)
+					if oldData1 == "" {
+						//为空 直接改变状态
+						maledemoDevice.DATA["data1"] = 0
+						if nowTmpData == "1#1" {
+							maledemoDevice.DATA["data1"] = 1
+						}
+						changeData(2, maledemoDevice)
+					}
+					//存储状态
+					oldData1 = nowTmpData
+
+				} else {
+					oldDevDataTime, ok := dataMap.Load(addr)
+					if !ok {
+						log.Println("load time err", ok)
+					}
+
+					if ok {
+						if oldDevDataTime != nil {
+							//log.Println("t2.Sub(t1)", nowtime.Sub(oldDevDataTime.(time.Time)))
+
+							var duration = nowtime.Sub(oldDevDataTime.(time.Time)).Seconds()
+							var durationAsInt64 = int(duration)
+
+							log.Printf("yunhorndebug.origin.%s|%s|%d|%d|%d|%d|%d", oldData1, nowTmpData, addr, dtype, cs2001, tof, durationAsInt64)
+
+							if nowTmpData == "1#0" {
+								if durationAsInt64 < extensionOutTime {
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
+								}
+							} else {
+								if durationAsInt64 < extensionInTime {
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
+								}
+							}
+							maledemoDevice.DATA["data1"] = 0
+							if nowTmpData == "1#1" {
+								maledemoDevice.DATA["data1"] = 1
+							}
+
+							changeData(2, maledemoDevice)
+							dataMap.Delete(addr)
+						}
+					}
+				}
+
+			} else if addr == 2 {
+				if cs2001 == 1 || tof == 1 {
+					nowTmpData = "1#1"
+				}
+
+				if oldData2 != nowTmpData {
+					dataMap.Store(addr, nowtime)
+					if oldData2 == "" {
+						//为空 直接改变状态
+						maledemoDevice.DATA["data2"] = 0
+						if nowTmpData == "1#1" {
+							maledemoDevice.DATA["data2"] = 1
+						}
+						changeData(2, maledemoDevice)
+					}
+					//存储状态
+					oldData2 = nowTmpData
+
+				} else {
+					oldDevDataTime, ok := dataMap.Load(addr)
+					if !ok {
+						log.Println("load time err", ok)
+					}
+
+					if ok {
+						if oldDevDataTime != nil {
+							//log.Println("t2.Sub(t1)", nowtime.Sub(oldDevDataTime.(time.Time)))
+
+							var duration = nowtime.Sub(oldDevDataTime.(time.Time)).Seconds()
+							var durationAsInt64 = int(duration)
+
+							log.Printf("yunhorndebug.origin.%s|%s|%d|%d|%d|%d|%d", oldData2, nowTmpData, addr, dtype, cs2001, tof, durationAsInt64)
+
+							if nowTmpData == "1#0" {
+								if durationAsInt64 < extensionOutTime {
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
+								}
+							} else {
+								if durationAsInt64 < extensionInTime {
+									// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+									return ""
+								}
+							}
+							maledemoDevice.DATA["data2"] = 0
+							if nowTmpData == "1#1" {
+								maledemoDevice.DATA["data2"] = 1
+							}
+
+							changeData(2, maledemoDevice)
+							dataMap.Delete(addr)
+						}
+					}
+				}
+			}
+
+		} else if dtype == 2 {
+			//吸顶传感器  没有距离数据
+			if len(valuedata) != 2 {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 2,type2"})
+				return ""
+			}
+			addr, error := strconv.Atoi(alldata[0])
+			if error != nil {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
+				return ""
+			}
+			cs2001, error := strconv.Atoi(valuedata[1])
+			if error != nil {
+				// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
+				return ""
+			}
+
+			if cs2001 == 1 {
+				nowTmpData = "1#1"
+			}
+
+			if oldData3 != nowTmpData {
+				dataMap.Store(addr, nowtime)
+				if oldData3 == "" {
+					//为空 直接改变状态
+					femaledemoDevice.DATA["data1"] = 0
+					if nowTmpData == "1#1" {
+						femaledemoDevice.DATA["data1"] = 1
+					}
+					changeData(2, maledemoDevice)
+				}
+				//存储状态
+				oldData3 = nowTmpData
+
+			} else {
+				oldDevDataTime, ok := dataMap.Load(addr)
+				if !ok {
+					log.Println("load time err", ok)
+				}
+
+				if ok {
+					if oldDevDataTime != nil {
+						//log.Println("t2.Sub(t1)", nowtime.Sub(oldDevDataTime.(time.Time)))
+
+						var duration = nowtime.Sub(oldDevDataTime.(time.Time)).Seconds()
+						var durationAsInt64 = int(duration)
+
+						var tof = 0
+
+						log.Printf("yunhorndebug.origin.%s|%s|%d|%d|%d|%d|%d", oldData3, nowTmpData, addr, dtype, cs2001, tof, durationAsInt64)
+
+						if nowTmpData == "1#0" {
+							if durationAsInt64 < extensionOutTime {
+								// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+								return ""
+							}
+						} else {
+							if durationAsInt64 < extensionInTime {
+								// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
+								return ""
+							}
+						}
+
+						femaledemoDevice.DATA["data1"] = 0
+						if nowTmpData == "1#1" {
+							femaledemoDevice.DATA["data1"] = 1
+						}
+						changeData(3, femaledemoDevice)
+						dataMap.Delete(addr)
+					}
+				}
+			}
+		}
+	}
+	return ""
 }
 
 //发送code1007数据到云端
diff --git a/tcpserver.go b/tcpserver.go
index f99eca0..2593653 100644
--- a/tcpserver.go
+++ b/tcpserver.go
@@ -9,11 +9,14 @@ import (
 	//"strings"
 	"time"
 	// "go-study/socket/config"
+	"bytes"
+	"strconv"
+
 )
 
 func handleConn(conn net.Conn) {
 
-	log.Println("begin handleConn,cliendAddr:", conn.RemoteAddr())
+	log.Println("yunhorndeug.push.data.tcp.begin handleConn,cliendAddr:", conn.RemoteAddr())
 
 	defer conn.Close()
 
@@ -61,50 +64,146 @@ func handleConn(conn net.Conn) {
 		}
 	}
 }
+
 func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) {
-	data_buf := make(chan []byte)
-	Rdata := make([]byte, 0)
+
+	// data_buf := make(chan []byte)
+
+	// Rdata := make([]byte, 0)
 	data := make([]byte, 256)
+	Rdata2 := make([]byte, 0)
 
-	go func() {
-		for {
-			select {
-			case kkdata := <-data_buf: //如果有数据,下面打印。但是有可能ch一直没数据
-				Rdata = append(Rdata, kkdata...)
-				//log.Println("kkdata:",kkdata)
-			case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时
-				// log.Println("超时")
-				if len(Rdata) > 4 {
-					readChan <- Rdata
-					Rdata = make([]byte, 0)
-				}
-				//strData := string(Rdata)
-				//Rdata = make([]byte,0)
-				//log.Println("Received:", strData)
-
-				//readChan <- Rdata
-				//Rdata = make([]byte,0)
-			}
-		}
-	}()
+	// go func() {
+	// 	for {
+	// 		select {
+	// 		case kkdata := <-data_buf: //如果有数据,下面打印。但是有可能ch一直没数据
+	// 		 // log.Println("yunhorndeug.push.data.tcp|",kkdata)
+	//
+	// 		 log.Println("###########################yunhorndeug.push.data.tcp.kkdata:",kkdata)
+	// 			Rdata = append(Rdata, kkdata...)
+	// 			Rdata2 = append(Rdata2,Rdata...)
+	// 			count := 0
+	// 			for _,v := range  Rdata{
+	// 				if v==0{
+	// 					break;
+	// 				}
+	// 				count++
+	// 			}
+	//
+	// 			Rdata2 = make([]byte, count)
+	// 			for i,v := range  Rdata{
+	// 				if v==0{
+	// 					break;
+	// 				}
+	// 				Rdata2[i]=v
+	// 			}
+	//
+	//
+	// 			log.Println("---------------------------yunhorndeug.push.data.tcp.Rdata:",Rdata2)
+	// 			Rdata2 = make([]byte, 0)
+	// 			//log.Println("kkdata:",kkdata)
+	// 		case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时
+	// 			// log.Println("超时")
+	// 			if len(Rdata) > 4 {
+	// 				readChan <- Rdata
+	// 				Rdata = make([]byte, 0)
+	// 			}
+	// 			//strData := string(Rdata)
+	// 			//Rdata = make([]byte,0)
+	// 			//log.Println("Received:", strData)
+	//
+	// 			//readChan <- Rdata
+	// 			//Rdata = make([]byte,0)
+	// 		}
+	// 	}
+	// }()
 
 	for {
 		// data := make([]byte, config.SERVER_RECV_LEN)
 		//data2 := make([]byte,256)
-		_, err := conn.Read(data)
+		reqLen, err := conn.Read(data)
 		if err != nil {
 			log.Println(err)
 			break
 		}
-		// log.Println(DEVICEDATAS)
-		log.Println("read.data:%d,%s", Bytes2Bits(data[3:4])[0],conn.RemoteAddr())
 
-		data_buf <- data
+		buffer := new(bytes.Buffer)
+		continueCount := 0
+		log.Println("yunhorndeug.push.data.tcp.reqLen",reqLen)
+    for i, b := range data[:reqLen] {
+
+			  if continueCount>0{
+					continueCount--
+					continue;
+				}
+
+        s := strconv.FormatInt(int64(b&0xff), 16)
+        if len(s) == 1 {
+            buffer.WriteString("0")
+        }
+        buffer.WriteString(s)
+
+				// log.Println(b)
+				//分隔符
+				end :=0
+				if b==254 && i>3{
+					addrs := data[i-4:i]
+					//尿布台数据,地址1位 数据2位
+					dataType := data[i+1]
+					values := make([]byte,0)
+					if data[i+1] == 1 {
+						continueCount = 3
+						end = 4
+						//类型为1 数据量为2
+						values = data[i+2:i+4]
+					}else if dataType == 2{
+						//类型为2 数据量位1
+						values = data[i+2:i+3]
+						continueCount = 2
+						end = 3
+					}
+					log.Println("yunhorndeug.push.data.tcp.addr",addrs)
+					log.Println("yunhorndeug.push.data.tcp.type",dataType)
+					log.Println("yunhorndeug.push.data.tcp.values",values)
+					// var buffer bytes.Buffer
+					// buffer.Write(addrs)
+					// buffer.Write(dataType)
+					// buffer.Write(values)
+
+					// go dealDatav3(data[i-4:i+end])
+					
+				}
+    }
+
+
+
+    // 转化为字符串
+    log.Println("yunhorndeug.push.data.tcp.16data:",buffer.String())
+
+		Rdata2 = make([]byte, reqLen)
+		for i,v := range  data[:reqLen]{
+			Rdata2[i]=v
+		}
+
+		log.Println("===========================yunhorndeug.push.data.tcp.origin.Rdata:",Rdata2)
+
+		// Rdata2 = make([]byte, count)
+
+		// log.Println("read.data:%d,%s", Bytes2Bits(data[3:4])[0],conn.RemoteAddr())
+
+		// data_buf <- data
+
+		data = make([]byte, 256)
 	}
 
 	stopChan <- true
 }
 
+//BytesCombine 多个[]byte数组合并成一个[]byte
+func BytesCombine(pBytes ...[]byte) []byte {
+    return bytes.Join(pBytes, []byte(""))
+}
+
 func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) {
 	for {
 		strData := <-writeChan