YHGW/tcpserver.go

122 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"log"
"net"
//"os"
// "strconv"
// "log"
//"strings"
"time"
// "go-study/socket/config"
)
func handleConn(conn net.Conn) {
log.Println("begin handleConn,cliendAddr:", conn.RemoteAddr())
defer conn.Close()
readChan := make(chan []byte)
//writeChan := make(chan string)
stopChan := make(chan bool)
go readConn(conn, readChan, stopChan)
// go writeConn(conn, writeChan, stopChan)
var heartbeat []byte = []byte{0x01}
for {
select {
case readStr := <-readChan:
//log.Println("readStr:",readStr)
//upper := strings.ToUpper(readStr)
//writeChan <- upper
// go yunhorn_ys_l_v1(readStr)
go yunhorn_wireless(readStr)
case stop := <-stopChan:
if stop {
log.Println("stop channel")
break
}
case <-time.After(5000 * time.Millisecond):
_, err := conn.Write(heartbeat)
if err != nil {
log.Println("write msg error!", err)
stopChan <- true
} else {
log.Println("write msg success!", conn.RemoteAddr())
//暂时写死,演示用 lora心跳包给云端
var device Device
device.Lock()
device.ID = "6F3A8B2D-B0DF-404A-AA7E-4A4086BD0B56"
device.VERSION = "yunhorn_lora_l_v1"
device.ONLINE = true
device.DATA = make(map[string]interface{})
device.DATA["data"] = 1
go send_data(1005, device)
}
}
}
}
func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) {
data_buf := make(chan []byte)
Rdata := make([]byte, 0)
data := make([]byte, 256)
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)
}
}
}()
for {
// data := make([]byte, config.SERVER_RECV_LEN)
//data2 := make([]byte,256)
_, 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
}
stopChan <- true
}
func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) {
for {
strData := <-writeChan
_, err := conn.Write([]byte(strData))
if err != nil {
log.Println(err)
break
}
log.Println("Send:", strData)
}
stopChan <- true
}