diff --git a/loadconfig.go b/loadconfig.go index 21af667..d8a6d10 100644 --- a/loadconfig.go +++ b/loadconfig.go @@ -4,10 +4,10 @@ import ( "database/sql" "encoding/json" _ "github.com/mattn/go-sqlite3" - "os" - "time" - "strconv" "log" + "os" + "strconv" + "time" ) type Traffic struct { @@ -27,7 +27,7 @@ type Conf struct { WEBSOCKETURL []string `json:"websocketurl"` POST_TO_SERVER string `json:"post_to_server"` DEBUG bool `json:"debug"` - OPENSERIAL bool `json:"openserial"` + OPENSERIAL bool `json:"openserial"` } type Gateway_info struct { @@ -64,7 +64,6 @@ var conf Conf var DEVICEDATAS Devicedatas var demoDevice Device - var db, _ = sql.Open("sqlite3", "./db/gateway.db") // 加载配置文件 @@ -87,16 +86,14 @@ func init() { } DEVICEDATAS.Unlock() - - demoDevice.ID="deb03e28-ddcb-4e5d-aa31-d870a1f0f09b" - demoDevice.VERSION="yunhorn_kgl_c8_v1" + demoDevice.ID = "deb03e28-ddcb-4e5d-aa31-d870a1f0f09b" + demoDevice.VERSION = "yunhorn_kgl_c8_v1" demoDevice.DATA = make(map[string]interface{}) - for a:=0;a<8;a++ { - demoDevice.DATA["data"+strconv.Itoa(a+1)]=0 - } - demoDevice.ONLINE=true - log.Println("init demoDevice success:",demoDevice) - + for a := 0; a < 8; a++ { + demoDevice.DATA["data"+strconv.Itoa(a+1)] = 0 + } + demoDevice.ONLINE = true + log.Println("init demoDevice success:", demoDevice) dbdata_init() @@ -119,7 +116,7 @@ func dbdata_init() { rows.Close() } //在原本没有db文件的情况下调用 会报错 -// rows.Close() + // rows.Close() rows, err = db.Query("SELECT traffic FROM traffic t where datetime(t.create_time) > datetime('now','start of day','-1 day') order by id DESC limit 1 ") if err != nil { traffic_data.TRAFFIC = 0 diff --git a/main.go b/main.go index e972dd5..9d863c9 100644 --- a/main.go +++ b/main.go @@ -3,8 +3,8 @@ package main import ( "github.com/robfig/cron" "log" - "os" "net" + "os" ) var err error @@ -13,13 +13,13 @@ func main() { go gw_router() go serial_run() c := cron.New() - send_data(1001) + send_data(1001) c.AddFunc("0, *, *, *, *, *", func() { - send_data(1001) + send_data(1001) }) // devices := []Device{} - c.AddFunc("*/10, *, *, *, *, *", func(){ - // log.Println(string(build_data(1001,devices))) + c.AddFunc("*/10, *, *, *, *, *", func() { + // log.Println(string(build_data(1001,devices))) }) c.AddFunc("0, */10, *, *, *, *", savedata_cron) @@ -28,22 +28,22 @@ func main() { c.Start() listener, err := net.Listen("tcp", "0.0.0.0:10090") - if err != nil { - log.Printf("listen fail, err: %v\n", err) - return - } + if err != nil { + log.Printf("listen fail, err: %v\n", err) + return + } - for { - conn, err := listener.Accept() - if err != nil { - log.Printf("accept fail, err: %v\n", err) - continue - } - // go process(conn) - go handleConn(conn) - } + for { + conn, err := listener.Accept() + if err != nil { + log.Printf("accept fail, err: %v\n", err) + continue + } + // go process(conn) + go handleConn(conn) + } -// select {} + // select {} } diff --git a/router.go b/router.go index 1a81af3..235257c 100644 --- a/router.go +++ b/router.go @@ -205,7 +205,7 @@ func seat_api(c *gin.Context) { for _, i := range conf.GATEWAY_INFO.CONFIG { arr := get_seat_device_data(i.ID) version, num := arr[0], arr[1] - log.Println("conf.data:",i.DATA) + log.Println("conf.data:", i.DATA) for k, j := range i.DATA { if DEVICEDATAS.DATA[version+"_"+num].DATA != nil { if DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)] != nil { diff --git a/serial_init.go b/serial_init.go index 3180bb6..ba887b8 100644 --- a/serial_init.go +++ b/serial_init.go @@ -21,7 +21,7 @@ func serial_run() { port_arr = append(port_arr, ports_arr[i]) } // 解析串口配置 - if conf.OPENSERIAL{ + if conf.OPENSERIAL { for _, i := range port_arr { var PARITY serial.Parity switch conf.SERIALPORTS_LIST[i].PARITY { diff --git a/tcpserver.go b/tcpserver.go index f45b0c2..aa68cde 100644 --- a/tcpserver.go +++ b/tcpserver.go @@ -11,7 +11,6 @@ import ( // "go-study/socket/config" ) - func handleConn(conn net.Conn) { defer conn.Close() @@ -37,12 +36,12 @@ func handleConn(conn net.Conn) { break } case <-time.After(5000 * time.Millisecond): - n,err := conn.Write(heartbeat) - if err != nil{ - log.Println("write msg error!",err) + n, err := conn.Write(heartbeat) + if err != nil { + log.Println("write msg error!", err) stopChan <- true - }else{ - log.Println("write msg success!",n) + } else { + log.Println("write msg success!", n) } } } @@ -60,9 +59,9 @@ func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) { //log.Println("kkdata:",kkdata) case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时 // log.Println("超时") - if len(Rdata) >3{ + if len(Rdata) > 3 { readChan <- Rdata - Rdata = make([]byte,0) + Rdata = make([]byte, 0) } //strData := string(Rdata) //Rdata = make([]byte,0) @@ -84,7 +83,7 @@ func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) { } log.Println(DEVICEDATAS) - log.Println("read.data:",Bytes2Bits(data[3:4])) + log.Println("read.data:", Bytes2Bits(data[3:4])) data_buf <- data } diff --git a/worker.go b/worker.go index 512683e..7b7eed1 100644 --- a/worker.go +++ b/worker.go @@ -1,481 +1,484 @@ package main import ( - "encoding/binary" - "github.com/tarm/serial" - "log" - "strconv" - "sync" - "math/rand" + "encoding/binary" + "github.com/tarm/serial" + "log" + "math/rand" + "strconv" + "sync" ) type Devicedatas struct { - sync.RWMutex - DATA map[string]Device + sync.RWMutex + DATA map[string]Device } - type Device struct { - sync.RWMutex - ID string `json:"id"` - VERSION string `json:"version"` - ONLINE bool `json:"online"` - DATA map[string]interface{} `json:"data"` + sync.RWMutex + ID string `json:"id"` + VERSION string `json:"version"` + ONLINE bool `json:"online"` + DATA map[string]interface{} `json:"data"` } -func yunhorn_ys_l_v1(data_buf []byte){ +func yunhorn_ys_l_v1(data_buf []byte) { - // for _, i := range conf.RS485DEVICES { - // log.Println("################################",i) - // } + // for _, i := range conf.RS485DEVICES { + // log.Println("################################",i) + // } //log.Println(data_buf) - // for i, k := range b_buf { - // log.Println(binary.BigEndian.Uint16(append([]byte{0x00}, k)) - // } + // for i, k := range b_buf { + // log.Println(binary.BigEndian.Uint16(append([]byte{0x00}, k)) + // } - log.Println("ys_l_v1_data:",data_buf) - data_int := Bytes2Bits(data_buf[3:4]) + // log.Println("ys_l_v1_data:",data_buf) + data_int := Bytes2Bits(data_buf[3:4]) + data_int0 := Bytes2Bits(data_buf[0:1]) + data_int1 := Bytes2Bits(data_buf[1:2]) + data_int2 := Bytes2Bits(data_buf[2:3]) - log.Println("data_int:",data_int[0]) + log.Println("data_int:", data_int[0]) + log.Printf("ADRH:%d,ADRL:%d,dataType:%d,", data_int0[0], data_int1[0], data_int2[0]) var device Device - device.ID=demoDevice.ID - device.VERSION=demoDevice.VERSION - device.ONLINE=demoDevice.ONLINE + device.ID = demoDevice.ID + device.VERSION = demoDevice.VERSION + device.ONLINE = demoDevice.ONLINE - demoDevice.DATA["data"+strconv.Itoa(1)]=rand.Intn(2) - demoDevice.DATA["data"+strconv.Itoa(2)]=rand.Intn(2) - demoDevice.DATA["data"+strconv.Itoa(3)]=rand.Intn(2) + demoDevice.DATA["data"+strconv.Itoa(1)] = rand.Intn(2) + demoDevice.DATA["data"+strconv.Itoa(2)] = rand.Intn(2) + demoDevice.DATA["data"+strconv.Itoa(3)] = rand.Intn(2) - demoDevice.DATA["data"+strconv.Itoa(7)]=data_int[0] - demoDevice.DATA["data"+strconv.Itoa(8)]=rand.Intn(2) - device.DATA=demoDevice.DATA + demoDevice.DATA["data"+strconv.Itoa(7)] = data_int[0] + demoDevice.DATA["data"+strconv.Itoa(8)] = rand.Intn(2) + device.DATA = demoDevice.DATA if conf.DEBUG { - log.Println(device) - } - send_data(1005, device) + log.Println(device) + } + send_data(1005, device) } func yunhorn_lorawan_l_v1(s *serial.Port) { - for { - buf := make([]byte, 128) - b_buf := make([]byte, 0) - nn := 0 - for { - n, err := s.Read(buf) - nn = n + nn - b_buf = append(b_buf, buf[:n]...) - if err != nil { - break - } - } - switch nn { - case 4: - go yunhorn_kgl_l_v1(b_buf[:nn]) - } - } + for { + buf := make([]byte, 128) + b_buf := make([]byte, 0) + nn := 0 + for { + n, err := s.Read(buf) + nn = n + nn + b_buf = append(b_buf, buf[:n]...) + if err != nil { + break + } + } + switch nn { + case 4: + go yunhorn_kgl_l_v1(b_buf[:nn]) + } + } } func yunhorn_kgl_l_v1(data_buf []byte) { - log.Println(data_buf) - var device Device - device.Lock() - device.ID = "4E5D52DD-EB81-43C0-A2B6-04E432412EBA" - device.VERSION = "yunhorn_kgl_l_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["data1"] = 0 - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_kgl_l_v1_1"] = device - DEVICEDATAS.Unlock() + log.Println(data_buf) + var device Device + device.Lock() + device.ID = "4E5D52DD-EB81-43C0-A2B6-04E432412EBA" + device.VERSION = "yunhorn_kgl_l_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["data1"] = 0 + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_kgl_l_v1_1"] = device + DEVICEDATAS.Unlock() - if conf.DEBUG { - log.Println(device) - } + if conf.DEBUG { + log.Println(device) + } - send_data(1005, device) + send_data(1005, device) } // 采集并解析水表数据 func yunhorn_sb_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - buf := make([]byte, 128) - b_buf := make([]byte, 0) - var nn int - for { - n, err := s.Read(buf) - nn = n + nn - b_buf = append(b_buf, buf[:n]...) - if err != nil { - break - } - } - if nn != 39 { - return - } - data_buf := b_buf[17 : nn-20] + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + buf := make([]byte, 128) + b_buf := make([]byte, 0) + var nn int + for { + n, err := s.Read(buf) + nn = n + nn + b_buf = append(b_buf, buf[:n]...) + if err != nil { + break + } + } + if nn != 39 { + return + } + data_buf := b_buf[17 : nn-20] - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_sb_c_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["totalWater"] = binary.BigEndian.Uint16(data_buf) - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_sb_c_v1_"+num] = device - DEVICEDATAS.Unlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_sb_c_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["totalWater"] = binary.BigEndian.Uint16(data_buf) + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_sb_c_v1_"+num] = device + DEVICEDATAS.Unlock() - if conf.DEBUG { - log.Println(device) - } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析洗手液数据 func yunhorn_xsy_l_v1(s *serial.Port, device_id string, command [][]byte, num string) { - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - buf := make([]byte, 128) - b_buf := make([]byte, 0) - var nn int - for { - n, err := s.Read(buf) - nn = n + nn - b_buf = append(b_buf, buf[:n]...) - if err != nil { - break - } - } - if nn != 9 { - return - } - data_buf := b_buf[3 : nn-4] + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + buf := make([]byte, 128) + b_buf := make([]byte, 0) + var nn int + for { + n, err := s.Read(buf) + nn = n + nn + b_buf = append(b_buf, buf[:n]...) + if err != nil { + break + } + } + if nn != 9 { + return + } + data_buf := b_buf[3 : nn-4] - DEVICEDATAS.RLock() - var olddata = DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] - DEVICEDATAS.RUnlock() + DEVICEDATAS.RLock() + var olddata = DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] + DEVICEDATAS.RUnlock() - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_xsy_l_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["data"] = binary.BigEndian.Uint16(data_buf) - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] = device - DEVICEDATAS.Unlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_xsy_l_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["data"] = binary.BigEndian.Uint16(data_buf) + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] = device + DEVICEDATAS.Unlock() - if device.DATA["data"] != olddata.DATA["data"] { - send_data(1005, device) - } - if conf.DEBUG { - log.Println(device) - } + if device.DATA["data"] != olddata.DATA["data"] { + send_data(1005, device) + } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析电表数据 func yunhorn_db_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - buf := make([]byte, 128) - bb_buf := make([]byte, 0) - var nn int - for { - n, err := s.Read(buf) - nn = n + nn - bb_buf = append(bb_buf, buf[:n]...) - if err != nil { - break - } - } - if nn != 20 { - return - } - data_buf := bb_buf[nn-6 : nn-2] - for i, x := range data_buf { - data_buf[i] = x - 0x33 + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + buf := make([]byte, 128) + bb_buf := make([]byte, 0) + var nn int + for { + n, err := s.Read(buf) + nn = n + nn + bb_buf = append(bb_buf, buf[:n]...) + if err != nil { + break + } + } + if nn != 20 { + return + } + data_buf := bb_buf[nn-6 : nn-2] + for i, x := range data_buf { + data_buf[i] = x - 0x33 - } - Len := len(data_buf) - 1 - for i, k := 0, Len; i < k; i++ { - data_buf[i], data_buf[k] = data_buf[k], data_buf[i] - k-- - } - U8 := make([]byte, 0) - for i := 0; i < 4; i++ { - U8 = append(U8, data_buf[i]>>4) - U8 = append(U8, data_buf[i]<<4>>4) - } - b_buf := make([]byte, 0) - var db_data uint32 - b_buf = append([]byte{0, 0, 0}, U8[0]) - db_data = binary.BigEndian.Uint32(b_buf) * 10000000 - b_buf = append([]byte{0, 0, 0}, U8[1]) - db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000000 - b_buf = append([]byte{0, 0, 0}, U8[2]) - db_data = db_data + binary.BigEndian.Uint32(b_buf)*100000 - b_buf = append([]byte{0, 0, 0}, U8[3]) - db_data = db_data + binary.BigEndian.Uint32(b_buf)*10000 - b_buf = append([]byte{0, 0, 0}, U8[4]) - db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000 - b_buf = append([]byte{0, 0, 0}, U8[5]) - db_data = db_data + binary.BigEndian.Uint32(b_buf)*100 - b_buf = append([]byte{0, 0, 0}, U8[6]) - db_data = db_data + binary.BigEndian.Uint32(b_buf)*10 - b_buf = append([]byte{0, 0, 0}, U8[7]) - db_data = db_data + binary.BigEndian.Uint32(b_buf) + } + Len := len(data_buf) - 1 + for i, k := 0, Len; i < k; i++ { + data_buf[i], data_buf[k] = data_buf[k], data_buf[i] + k-- + } + U8 := make([]byte, 0) + for i := 0; i < 4; i++ { + U8 = append(U8, data_buf[i]>>4) + U8 = append(U8, data_buf[i]<<4>>4) + } + b_buf := make([]byte, 0) + var db_data uint32 + b_buf = append([]byte{0, 0, 0}, U8[0]) + db_data = binary.BigEndian.Uint32(b_buf) * 10000000 + b_buf = append([]byte{0, 0, 0}, U8[1]) + db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000000 + b_buf = append([]byte{0, 0, 0}, U8[2]) + db_data = db_data + binary.BigEndian.Uint32(b_buf)*100000 + b_buf = append([]byte{0, 0, 0}, U8[3]) + db_data = db_data + binary.BigEndian.Uint32(b_buf)*10000 + b_buf = append([]byte{0, 0, 0}, U8[4]) + db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000 + b_buf = append([]byte{0, 0, 0}, U8[5]) + db_data = db_data + binary.BigEndian.Uint32(b_buf)*100 + b_buf = append([]byte{0, 0, 0}, U8[6]) + db_data = db_data + binary.BigEndian.Uint32(b_buf)*10 + b_buf = append([]byte{0, 0, 0}, U8[7]) + db_data = db_data + binary.BigEndian.Uint32(b_buf) - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_db_c_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["totalElectric"] = float32(db_data) / 100 - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_db_c_v1_"+num] = device - DEVICEDATAS.Unlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_db_c_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["totalElectric"] = float32(db_data) / 100 + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_db_c_v1_"+num] = device + DEVICEDATAS.Unlock() - if conf.DEBUG { - log.Println(device) - } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析空气数据 func yunhorn_kq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - buf := make([]byte, 128) - b_buf := make([]byte, 0) - var nn int - for { - n, err := s.Read(buf) - nn = n + nn - b_buf = append(b_buf, buf[:n]...) - if err != nil { - break - } - } - if nn != 19 { - return - } - data_buf := b_buf[3 : nn-2] + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + buf := make([]byte, 128) + b_buf := make([]byte, 0) + var nn int + for { + n, err := s.Read(buf) + nn = n + nn + b_buf = append(b_buf, buf[:n]...) + if err != nil { + break + } + } + if nn != 19 { + return + } + data_buf := b_buf[3 : nn-2] - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_kq_c_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["二氧化碳"] = float32(binary.BigEndian.Uint16(data_buf[0:2])) - device.DATA["TVOC"] = float32(binary.BigEndian.Uint16(data_buf[2:4])) / 10 - device.DATA["甲醛"] = float32(binary.BigEndian.Uint16(data_buf[4:6])) / 10 - device.DATA["pm2.5"] = float32(binary.BigEndian.Uint16(data_buf[6:8])) - device.DATA["湿度"] = float32(binary.BigEndian.Uint16(data_buf[8:10])) / 10 - device.DATA["温度"] = float32(binary.BigEndian.Uint16(data_buf[10:13])) / 10 - device.DATA["PM10"] = float32(binary.BigEndian.Uint16(data_buf[12:14])) - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_kq_c_v1_"+num] = device - DEVICEDATAS.Unlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_kq_c_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["二氧化碳"] = float32(binary.BigEndian.Uint16(data_buf[0:2])) + device.DATA["TVOC"] = float32(binary.BigEndian.Uint16(data_buf[2:4])) / 10 + device.DATA["甲醛"] = float32(binary.BigEndian.Uint16(data_buf[4:6])) / 10 + device.DATA["pm2.5"] = float32(binary.BigEndian.Uint16(data_buf[6:8])) + device.DATA["湿度"] = float32(binary.BigEndian.Uint16(data_buf[8:10])) / 10 + device.DATA["温度"] = float32(binary.BigEndian.Uint16(data_buf[10:13])) / 10 + device.DATA["PM10"] = float32(binary.BigEndian.Uint16(data_buf[12:14])) + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_kq_c_v1_"+num] = device + DEVICEDATAS.Unlock() - if conf.DEBUG { - log.Println(device) - } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析氨气数据 func yunhorn_aq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - buf := make([]byte, 128) - b_buf := make([]byte, 0) - var nn int - for { - n, err := s.Read(buf) - nn = n + nn - b_buf = append(b_buf, buf[:n]...) - if err != nil { - break - } - } - if nn != 7 { - return - } - data_buf := b_buf[3 : nn-2] + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + buf := make([]byte, 128) + b_buf := make([]byte, 0) + var nn int + for { + n, err := s.Read(buf) + nn = n + nn + b_buf = append(b_buf, buf[:n]...) + if err != nil { + break + } + } + if nn != 7 { + return + } + data_buf := b_buf[3 : nn-2] - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_aq_c_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["氨气"] = binary.BigEndian.Uint16(data_buf) - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_aq_c_v1_"+num] = device - DEVICEDATAS.Unlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_aq_c_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["氨气"] = binary.BigEndian.Uint16(data_buf) + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_aq_c_v1_"+num] = device + DEVICEDATAS.Unlock() - if conf.DEBUG { - log.Println(device) - } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析硫化氢数据 func yunhorn_lhq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - buf := make([]byte, 128) - b_buf := make([]byte, 0) - var nn int - for { - n, err := s.Read(buf) - nn = n + nn - b_buf = append(b_buf, buf[:n]...) - if err != nil { - break - } - } - if nn != 7 { - return - } - data_buf := b_buf[3 : nn-2] + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + buf := make([]byte, 128) + b_buf := make([]byte, 0) + var nn int + for { + n, err := s.Read(buf) + nn = n + nn + b_buf = append(b_buf, buf[:n]...) + if err != nil { + break + } + } + if nn != 7 { + return + } + data_buf := b_buf[3 : nn-2] - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_lhq_c_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - device.DATA["硫化氢"] = binary.BigEndian.Uint16(data_buf) - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_lhq_c_v1_"+num] = device - DEVICEDATAS.Unlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_lhq_c_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + device.DATA["硫化氢"] = binary.BigEndian.Uint16(data_buf) + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_lhq_c_v1_"+num] = device + DEVICEDATAS.Unlock() - if conf.DEBUG { - log.Println(device) - } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析开关量数据 func yunhorn_kgl_c8_v1(s *serial.Port, device_id string, command [][]byte, num string) { - buf := make([]byte, 128) - b_buf := make([]byte, 0) - for _, i := range command { - _, err = s.Write([]byte(i)) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(i)) - } - _, err = s.Read(buf) - if err != nil { - return - } - b_buf = append(b_buf, buf[3]) - } - DEVICEDATAS.RLock() - var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] - DEVICEDATAS.RUnlock() - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_kgl_c8_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - for i, k := range b_buf { - device.DATA["data"+strconv.Itoa(i+1)] = binary.BigEndian.Uint16(append([]byte{0x00}, k)) - } - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] = device - DEVICEDATAS.Unlock() - for i, k := range device.DATA { - if k != olddata.DATA[i] { - send_data(1005, device) - break - } - } - if conf.DEBUG { - log.Println(device) - } + buf := make([]byte, 128) + b_buf := make([]byte, 0) + for _, i := range command { + _, err = s.Write([]byte(i)) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(i)) + } + _, err = s.Read(buf) + if err != nil { + return + } + b_buf = append(b_buf, buf[3]) + } + DEVICEDATAS.RLock() + var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] + DEVICEDATAS.RUnlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_kgl_c8_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + for i, k := range b_buf { + device.DATA["data"+strconv.Itoa(i+1)] = binary.BigEndian.Uint16(append([]byte{0x00}, k)) + } + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] = device + DEVICEDATAS.Unlock() + for i, k := range device.DATA { + if k != olddata.DATA[i] { + send_data(1005, device) + break + } + } + if conf.DEBUG { + log.Println(device) + } } // 采集并解析开关量数据 func yunhorn_kgl_c16_v1(s *serial.Port, device_id string, command [][]byte, num string) { - buf := make([]byte, 128) - _, err = s.Write([]byte(command[0])) - check(err) - if conf.DEBUG { - log.Printf("命令:\t%x", []byte(command[0])) - } - _, err = s.Read(buf) - if err != nil { - return - } - b_buf := Bytes2Bits(buf[3:5]) + buf := make([]byte, 128) + _, err = s.Write([]byte(command[0])) + check(err) + if conf.DEBUG { + log.Printf("命令:\t%x", []byte(command[0])) + } + _, err = s.Read(buf) + if err != nil { + return + } + b_buf := Bytes2Bits(buf[3:5]) - DEVICEDATAS.RLock() - var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] - DEVICEDATAS.RUnlock() - var device Device - device.Lock() - device.ID = device_id - device.VERSION = "yunhorn_kgl_c16_v1" - device.ONLINE = true - device.DATA = make(map[string]interface{}) - for i, k := range b_buf { - device.DATA["data"+strconv.Itoa(i+1)] = k - } - device.Unlock() - DEVICEDATAS.Lock() - DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] = device - DEVICEDATAS.Unlock() - for i, k := range device.DATA { - if k != olddata.DATA[i] { - send_data(1005, device) - break - } - } - if conf.DEBUG { - log.Println(device) - } + DEVICEDATAS.RLock() + var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] + DEVICEDATAS.RUnlock() + var device Device + device.Lock() + device.ID = device_id + device.VERSION = "yunhorn_kgl_c16_v1" + device.ONLINE = true + device.DATA = make(map[string]interface{}) + for i, k := range b_buf { + device.DATA["data"+strconv.Itoa(i+1)] = k + } + device.Unlock() + DEVICEDATAS.Lock() + DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] = device + DEVICEDATAS.Unlock() + for i, k := range device.DATA { + if k != olddata.DATA[i] { + send_data(1005, device) + break + } + } + if conf.DEBUG { + log.Println(device) + } } // byte数据转换成uint16 func Bytes2Bits(data []byte) []uint16 { - dst := make([]uint16, 0) - for _, v := range data { - for i := 0; i < 8; i++ { - move := uint(i) - dst = append(dst, uint16((v>>move)&1)) - } - } - return dst + dst := make([]uint16, 0) + for _, v := range data { + for i := 0; i < 8; i++ { + move := uint(i) + dst = append(dst, uint16((v>>move)&1)) + } + } + return dst }