go fmt
This commit is contained in:
parent
b10aace99b
commit
1bcc46f458
|
@ -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
38
main.go
|
@ -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 {}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
17
tcpserver.go
17
tcpserver.go
|
@ -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
801
worker.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue