This commit is contained in:
fish 2019-03-21 11:52:09 +08:00
parent b10aace99b
commit 1bcc46f458
6 changed files with 443 additions and 444 deletions

View File

@ -4,10 +4,10 @@ import (
"database/sql" "database/sql"
"encoding/json" "encoding/json"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
"os"
"time"
"strconv"
"log" "log"
"os"
"strconv"
"time"
) )
type Traffic struct { type Traffic struct {
@ -27,7 +27,7 @@ type Conf struct {
WEBSOCKETURL []string `json:"websocketurl"` WEBSOCKETURL []string `json:"websocketurl"`
POST_TO_SERVER string `json:"post_to_server"` POST_TO_SERVER string `json:"post_to_server"`
DEBUG bool `json:"debug"` DEBUG bool `json:"debug"`
OPENSERIAL bool `json:"openserial"` OPENSERIAL bool `json:"openserial"`
} }
type Gateway_info struct { type Gateway_info struct {
@ -64,7 +64,6 @@ var conf Conf
var DEVICEDATAS Devicedatas var DEVICEDATAS Devicedatas
var demoDevice Device var demoDevice Device
var db, _ = sql.Open("sqlite3", "./db/gateway.db") var db, _ = sql.Open("sqlite3", "./db/gateway.db")
// 加载配置文件 // 加载配置文件
@ -87,16 +86,14 @@ func init() {
} }
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
demoDevice.ID = "deb03e28-ddcb-4e5d-aa31-d870a1f0f09b"
demoDevice.ID="deb03e28-ddcb-4e5d-aa31-d870a1f0f09b" demoDevice.VERSION = "yunhorn_kgl_c8_v1"
demoDevice.VERSION="yunhorn_kgl_c8_v1"
demoDevice.DATA = make(map[string]interface{}) demoDevice.DATA = make(map[string]interface{})
for a:=0;a<8;a++ { for a := 0; a < 8; a++ {
demoDevice.DATA["data"+strconv.Itoa(a+1)]=0 demoDevice.DATA["data"+strconv.Itoa(a+1)] = 0
} }
demoDevice.ONLINE=true demoDevice.ONLINE = true
log.Println("init demoDevice success:",demoDevice) log.Println("init demoDevice success:", demoDevice)
dbdata_init() dbdata_init()
@ -119,7 +116,7 @@ func dbdata_init() {
rows.Close() rows.Close()
} }
//在原本没有db文件的情况下调用 会报错 //在原本没有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 ") 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 { if err != nil {
traffic_data.TRAFFIC = 0 traffic_data.TRAFFIC = 0

38
main.go
View File

@ -3,8 +3,8 @@ package main
import ( import (
"github.com/robfig/cron" "github.com/robfig/cron"
"log" "log"
"os"
"net" "net"
"os"
) )
var err error var err error
@ -13,13 +13,13 @@ func main() {
go gw_router() go gw_router()
go serial_run() go serial_run()
c := cron.New() c := cron.New()
send_data(1001) send_data(1001)
c.AddFunc("0, *, *, *, *, *", func() { c.AddFunc("0, *, *, *, *, *", func() {
send_data(1001) send_data(1001)
}) })
// devices := []Device{} // devices := []Device{}
c.AddFunc("*/10, *, *, *, *, *", func(){ c.AddFunc("*/10, *, *, *, *, *", func() {
// log.Println(string(build_data(1001,devices))) // log.Println(string(build_data(1001,devices)))
}) })
c.AddFunc("0, */10, *, *, *, *", savedata_cron) c.AddFunc("0, */10, *, *, *, *", savedata_cron)
@ -28,22 +28,22 @@ func main() {
c.Start() c.Start()
listener, err := net.Listen("tcp", "0.0.0.0:10090") listener, err := net.Listen("tcp", "0.0.0.0:10090")
if err != nil { if err != nil {
log.Printf("listen fail, err: %v\n", err) log.Printf("listen fail, err: %v\n", err)
return return
} }
for { for {
conn, err := listener.Accept() conn, err := listener.Accept()
if err != nil { if err != nil {
log.Printf("accept fail, err: %v\n", err) log.Printf("accept fail, err: %v\n", err)
continue continue
} }
// go process(conn) // go process(conn)
go handleConn(conn) go handleConn(conn)
} }
// select {} // select {}
} }

View File

@ -205,7 +205,7 @@ func seat_api(c *gin.Context) {
for _, i := range conf.GATEWAY_INFO.CONFIG { for _, i := range conf.GATEWAY_INFO.CONFIG {
arr := get_seat_device_data(i.ID) arr := get_seat_device_data(i.ID)
version, num := arr[0], arr[1] version, num := arr[0], arr[1]
log.Println("conf.data:",i.DATA) log.Println("conf.data:", i.DATA)
for k, j := range i.DATA { for k, j := range i.DATA {
if DEVICEDATAS.DATA[version+"_"+num].DATA != nil { if DEVICEDATAS.DATA[version+"_"+num].DATA != nil {
if DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)] != nil { if DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)] != nil {

View File

@ -21,7 +21,7 @@ func serial_run() {
port_arr = append(port_arr, ports_arr[i]) port_arr = append(port_arr, ports_arr[i])
} }
// 解析串口配置 // 解析串口配置
if conf.OPENSERIAL{ if conf.OPENSERIAL {
for _, i := range port_arr { for _, i := range port_arr {
var PARITY serial.Parity var PARITY serial.Parity
switch conf.SERIALPORTS_LIST[i].PARITY { switch conf.SERIALPORTS_LIST[i].PARITY {

View File

@ -11,7 +11,6 @@ import (
// "go-study/socket/config" // "go-study/socket/config"
) )
func handleConn(conn net.Conn) { func handleConn(conn net.Conn) {
defer conn.Close() defer conn.Close()
@ -37,12 +36,12 @@ func handleConn(conn net.Conn) {
break break
} }
case <-time.After(5000 * time.Millisecond): case <-time.After(5000 * time.Millisecond):
n,err := conn.Write(heartbeat) n, err := conn.Write(heartbeat)
if err != nil{ if err != nil {
log.Println("write msg error!",err) log.Println("write msg error!", err)
stopChan <- true stopChan <- true
}else{ } else {
log.Println("write msg success!",n) 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) //log.Println("kkdata:",kkdata)
case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞那么select也会检测其他case条件检测到后3秒超时 case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞那么select也会检测其他case条件检测到后3秒超时
// log.Println("超时") // log.Println("超时")
if len(Rdata) >3{ if len(Rdata) > 3 {
readChan <- Rdata readChan <- Rdata
Rdata = make([]byte,0) Rdata = make([]byte, 0)
} }
//strData := string(Rdata) //strData := string(Rdata)
//Rdata = make([]byte,0) //Rdata = make([]byte,0)
@ -84,7 +83,7 @@ func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) {
} }
log.Println(DEVICEDATAS) log.Println(DEVICEDATAS)
log.Println("read.data:",Bytes2Bits(data[3:4])) log.Println("read.data:", Bytes2Bits(data[3:4]))
data_buf <- data data_buf <- data
} }

801
worker.go
View File

@ -1,481 +1,484 @@
package main package main
import ( import (
"encoding/binary" "encoding/binary"
"github.com/tarm/serial" "github.com/tarm/serial"
"log" "log"
"strconv" "math/rand"
"sync" "strconv"
"math/rand" "sync"
) )
type Devicedatas struct { type Devicedatas struct {
sync.RWMutex sync.RWMutex
DATA map[string]Device DATA map[string]Device
} }
type Device struct { type Device struct {
sync.RWMutex sync.RWMutex
ID string `json:"id"` ID string `json:"id"`
VERSION string `json:"version"` VERSION string `json:"version"`
ONLINE bool `json:"online"` ONLINE bool `json:"online"`
DATA map[string]interface{} `json:"data"` 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 { // for _, i := range conf.RS485DEVICES {
// log.Println("################################",i) // log.Println("################################",i)
// } // }
//log.Println(data_buf) //log.Println(data_buf)
// for i, k := range b_buf { // for i, k := range b_buf {
// log.Println(binary.BigEndian.Uint16(append([]byte{0x00}, k)) // log.Println(binary.BigEndian.Uint16(append([]byte{0x00}, k))
// } // }
log.Println("ys_l_v1_data:",data_buf) // log.Println("ys_l_v1_data:",data_buf)
data_int := Bytes2Bits(data_buf[3:4]) 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 var device Device
device.ID=demoDevice.ID device.ID = demoDevice.ID
device.VERSION=demoDevice.VERSION device.VERSION = demoDevice.VERSION
device.ONLINE=demoDevice.ONLINE device.ONLINE = demoDevice.ONLINE
demoDevice.DATA["data"+strconv.Itoa(1)]=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(2)] = rand.Intn(2)
demoDevice.DATA["data"+strconv.Itoa(3)]=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(7)] = data_int[0]
demoDevice.DATA["data"+strconv.Itoa(8)]=rand.Intn(2) demoDevice.DATA["data"+strconv.Itoa(8)] = rand.Intn(2)
device.DATA=demoDevice.DATA device.DATA = demoDevice.DATA
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
send_data(1005, device) send_data(1005, device)
} }
func yunhorn_lorawan_l_v1(s *serial.Port) { func yunhorn_lorawan_l_v1(s *serial.Port) {
for { for {
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
nn := 0 nn := 0
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
b_buf = append(b_buf, buf[:n]...) b_buf = append(b_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
switch nn { switch nn {
case 4: case 4:
go yunhorn_kgl_l_v1(b_buf[:nn]) go yunhorn_kgl_l_v1(b_buf[:nn])
} }
} }
} }
func yunhorn_kgl_l_v1(data_buf []byte) { func yunhorn_kgl_l_v1(data_buf []byte) {
log.Println(data_buf) log.Println(data_buf)
var device Device var device Device
device.Lock() device.Lock()
device.ID = "4E5D52DD-EB81-43C0-A2B6-04E432412EBA" device.ID = "4E5D52DD-EB81-43C0-A2B6-04E432412EBA"
device.VERSION = "yunhorn_kgl_l_v1" device.VERSION = "yunhorn_kgl_l_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["data1"] = 0 device.DATA["data1"] = 0
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_kgl_l_v1_1"] = device DEVICEDATAS.DATA["yunhorn_kgl_l_v1_1"] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if conf.DEBUG { if conf.DEBUG {
log.Println(device) 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) { func yunhorn_sb_c_v1(s *serial.Port, device_id string, command [][]byte, num string) {
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
var nn int var nn int
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
b_buf = append(b_buf, buf[:n]...) b_buf = append(b_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
if nn != 39 { if nn != 39 {
return return
} }
data_buf := b_buf[17 : nn-20] data_buf := b_buf[17 : nn-20]
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_sb_c_v1" device.VERSION = "yunhorn_sb_c_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["totalWater"] = binary.BigEndian.Uint16(data_buf) device.DATA["totalWater"] = binary.BigEndian.Uint16(data_buf)
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_sb_c_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_sb_c_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析洗手液数据 // 采集并解析洗手液数据
func yunhorn_xsy_l_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_xsy_l_v1(s *serial.Port, device_id string, command [][]byte, num string) {
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
var nn int var nn int
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
b_buf = append(b_buf, buf[:n]...) b_buf = append(b_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
if nn != 9 { if nn != 9 {
return return
} }
data_buf := b_buf[3 : nn-4] data_buf := b_buf[3 : nn-4]
DEVICEDATAS.RLock() DEVICEDATAS.RLock()
var olddata = DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] var olddata = DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num]
DEVICEDATAS.RUnlock() DEVICEDATAS.RUnlock()
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_xsy_l_v1" device.VERSION = "yunhorn_xsy_l_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["data"] = binary.BigEndian.Uint16(data_buf) device.DATA["data"] = binary.BigEndian.Uint16(data_buf)
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_xsy_l_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if device.DATA["data"] != olddata.DATA["data"] { if device.DATA["data"] != olddata.DATA["data"] {
send_data(1005, device) send_data(1005, device)
} }
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析电表数据 // 采集并解析电表数据
func yunhorn_db_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_db_c_v1(s *serial.Port, device_id string, command [][]byte, num string) {
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
buf := make([]byte, 128) buf := make([]byte, 128)
bb_buf := make([]byte, 0) bb_buf := make([]byte, 0)
var nn int var nn int
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
bb_buf = append(bb_buf, buf[:n]...) bb_buf = append(bb_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
if nn != 20 { if nn != 20 {
return return
} }
data_buf := bb_buf[nn-6 : nn-2] data_buf := bb_buf[nn-6 : nn-2]
for i, x := range data_buf { for i, x := range data_buf {
data_buf[i] = x - 0x33 data_buf[i] = x - 0x33
} }
Len := len(data_buf) - 1 Len := len(data_buf) - 1
for i, k := 0, Len; i < k; i++ { for i, k := 0, Len; i < k; i++ {
data_buf[i], data_buf[k] = data_buf[k], data_buf[i] data_buf[i], data_buf[k] = data_buf[k], data_buf[i]
k-- k--
} }
U8 := make([]byte, 0) U8 := make([]byte, 0)
for i := 0; i < 4; i++ { for i := 0; i < 4; i++ {
U8 = append(U8, data_buf[i]>>4) U8 = append(U8, data_buf[i]>>4)
U8 = append(U8, data_buf[i]<<4>>4) U8 = append(U8, data_buf[i]<<4>>4)
} }
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
var db_data uint32 var db_data uint32
b_buf = append([]byte{0, 0, 0}, U8[0]) b_buf = append([]byte{0, 0, 0}, U8[0])
db_data = binary.BigEndian.Uint32(b_buf) * 10000000 db_data = binary.BigEndian.Uint32(b_buf) * 10000000
b_buf = append([]byte{0, 0, 0}, U8[1]) b_buf = append([]byte{0, 0, 0}, U8[1])
db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000000 db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000000
b_buf = append([]byte{0, 0, 0}, U8[2]) b_buf = append([]byte{0, 0, 0}, U8[2])
db_data = db_data + binary.BigEndian.Uint32(b_buf)*100000 db_data = db_data + binary.BigEndian.Uint32(b_buf)*100000
b_buf = append([]byte{0, 0, 0}, U8[3]) b_buf = append([]byte{0, 0, 0}, U8[3])
db_data = db_data + binary.BigEndian.Uint32(b_buf)*10000 db_data = db_data + binary.BigEndian.Uint32(b_buf)*10000
b_buf = append([]byte{0, 0, 0}, U8[4]) b_buf = append([]byte{0, 0, 0}, U8[4])
db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000 db_data = db_data + binary.BigEndian.Uint32(b_buf)*1000
b_buf = append([]byte{0, 0, 0}, U8[5]) b_buf = append([]byte{0, 0, 0}, U8[5])
db_data = db_data + binary.BigEndian.Uint32(b_buf)*100 db_data = db_data + binary.BigEndian.Uint32(b_buf)*100
b_buf = append([]byte{0, 0, 0}, U8[6]) b_buf = append([]byte{0, 0, 0}, U8[6])
db_data = db_data + binary.BigEndian.Uint32(b_buf)*10 db_data = db_data + binary.BigEndian.Uint32(b_buf)*10
b_buf = append([]byte{0, 0, 0}, U8[7]) b_buf = append([]byte{0, 0, 0}, U8[7])
db_data = db_data + binary.BigEndian.Uint32(b_buf) db_data = db_data + binary.BigEndian.Uint32(b_buf)
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_db_c_v1" device.VERSION = "yunhorn_db_c_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["totalElectric"] = float32(db_data) / 100 device.DATA["totalElectric"] = float32(db_data) / 100
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_db_c_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_db_c_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析空气数据 // 采集并解析空气数据
func yunhorn_kq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_kq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) {
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
var nn int var nn int
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
b_buf = append(b_buf, buf[:n]...) b_buf = append(b_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
if nn != 19 { if nn != 19 {
return return
} }
data_buf := b_buf[3 : nn-2] data_buf := b_buf[3 : nn-2]
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_kq_c_v1" device.VERSION = "yunhorn_kq_c_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["二氧化碳"] = float32(binary.BigEndian.Uint16(data_buf[0:2])) device.DATA["二氧化碳"] = float32(binary.BigEndian.Uint16(data_buf[0:2]))
device.DATA["TVOC"] = float32(binary.BigEndian.Uint16(data_buf[2:4])) / 10 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["甲醛"] = float32(binary.BigEndian.Uint16(data_buf[4:6])) / 10
device.DATA["pm2.5"] = float32(binary.BigEndian.Uint16(data_buf[6:8])) 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[8:10])) / 10
device.DATA["温度"] = float32(binary.BigEndian.Uint16(data_buf[10:13])) / 10 device.DATA["温度"] = float32(binary.BigEndian.Uint16(data_buf[10:13])) / 10
device.DATA["PM10"] = float32(binary.BigEndian.Uint16(data_buf[12:14])) device.DATA["PM10"] = float32(binary.BigEndian.Uint16(data_buf[12:14]))
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_kq_c_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_kq_c_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析氨气数据 // 采集并解析氨气数据
func yunhorn_aq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_aq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) {
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
var nn int var nn int
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
b_buf = append(b_buf, buf[:n]...) b_buf = append(b_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
if nn != 7 { if nn != 7 {
return return
} }
data_buf := b_buf[3 : nn-2] data_buf := b_buf[3 : nn-2]
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_aq_c_v1" device.VERSION = "yunhorn_aq_c_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["氨气"] = binary.BigEndian.Uint16(data_buf) device.DATA["氨气"] = binary.BigEndian.Uint16(data_buf)
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_aq_c_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_aq_c_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析硫化氢数据 // 采集并解析硫化氢数据
func yunhorn_lhq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_lhq_c_v1(s *serial.Port, device_id string, command [][]byte, num string) {
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
var nn int var nn int
for { for {
n, err := s.Read(buf) n, err := s.Read(buf)
nn = n + nn nn = n + nn
b_buf = append(b_buf, buf[:n]...) b_buf = append(b_buf, buf[:n]...)
if err != nil { if err != nil {
break break
} }
} }
if nn != 7 { if nn != 7 {
return return
} }
data_buf := b_buf[3 : nn-2] data_buf := b_buf[3 : nn-2]
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_lhq_c_v1" device.VERSION = "yunhorn_lhq_c_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["硫化氢"] = binary.BigEndian.Uint16(data_buf) device.DATA["硫化氢"] = binary.BigEndian.Uint16(data_buf)
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_lhq_c_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_lhq_c_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析开关量数据 // 采集并解析开关量数据
func yunhorn_kgl_c8_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_kgl_c8_v1(s *serial.Port, device_id string, command [][]byte, num string) {
buf := make([]byte, 128) buf := make([]byte, 128)
b_buf := make([]byte, 0) b_buf := make([]byte, 0)
for _, i := range command { for _, i := range command {
_, err = s.Write([]byte(i)) _, err = s.Write([]byte(i))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(i)) log.Printf("命令:\t%x", []byte(i))
} }
_, err = s.Read(buf) _, err = s.Read(buf)
if err != nil { if err != nil {
return return
} }
b_buf = append(b_buf, buf[3]) b_buf = append(b_buf, buf[3])
} }
DEVICEDATAS.RLock() DEVICEDATAS.RLock()
var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num]
DEVICEDATAS.RUnlock() DEVICEDATAS.RUnlock()
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_kgl_c8_v1" device.VERSION = "yunhorn_kgl_c8_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
for i, k := range b_buf { for i, k := range b_buf {
device.DATA["data"+strconv.Itoa(i+1)] = binary.BigEndian.Uint16(append([]byte{0x00}, k)) device.DATA["data"+strconv.Itoa(i+1)] = binary.BigEndian.Uint16(append([]byte{0x00}, k))
} }
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_kgl_c8_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
for i, k := range device.DATA { for i, k := range device.DATA {
if k != olddata.DATA[i] { if k != olddata.DATA[i] {
send_data(1005, device) send_data(1005, device)
break break
} }
} }
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// 采集并解析开关量数据 // 采集并解析开关量数据
func yunhorn_kgl_c16_v1(s *serial.Port, device_id string, command [][]byte, num string) { func yunhorn_kgl_c16_v1(s *serial.Port, device_id string, command [][]byte, num string) {
buf := make([]byte, 128) buf := make([]byte, 128)
_, err = s.Write([]byte(command[0])) _, err = s.Write([]byte(command[0]))
check(err) check(err)
if conf.DEBUG { if conf.DEBUG {
log.Printf("命令:\t%x", []byte(command[0])) log.Printf("命令:\t%x", []byte(command[0]))
} }
_, err = s.Read(buf) _, err = s.Read(buf)
if err != nil { if err != nil {
return return
} }
b_buf := Bytes2Bits(buf[3:5]) b_buf := Bytes2Bits(buf[3:5])
DEVICEDATAS.RLock() DEVICEDATAS.RLock()
var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] var olddata = DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num]
DEVICEDATAS.RUnlock() DEVICEDATAS.RUnlock()
var device Device var device Device
device.Lock() device.Lock()
device.ID = device_id device.ID = device_id
device.VERSION = "yunhorn_kgl_c16_v1" device.VERSION = "yunhorn_kgl_c16_v1"
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
for i, k := range b_buf { for i, k := range b_buf {
device.DATA["data"+strconv.Itoa(i+1)] = k device.DATA["data"+strconv.Itoa(i+1)] = k
} }
device.Unlock() device.Unlock()
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] = device DEVICEDATAS.DATA["yunhorn_kgl_c16_v1_"+num] = device
DEVICEDATAS.Unlock() DEVICEDATAS.Unlock()
for i, k := range device.DATA { for i, k := range device.DATA {
if k != olddata.DATA[i] { if k != olddata.DATA[i] {
send_data(1005, device) send_data(1005, device)
break break
} }
} }
if conf.DEBUG { if conf.DEBUG {
log.Println(device) log.Println(device)
} }
} }
// byte数据转换成uint16 // byte数据转换成uint16
func Bytes2Bits(data []byte) []uint16 { func Bytes2Bits(data []byte) []uint16 {
dst := make([]uint16, 0) dst := make([]uint16, 0)
for _, v := range data { for _, v := range data {
for i := 0; i < 8; i++ { for i := 0; i < 8; i++ {
move := uint(i) move := uint(i)
dst = append(dst, uint16((v>>move)&1)) dst = append(dst, uint16((v>>move)&1))
} }
} }
return dst return dst
} }