YHGW/loadconfig.go

271 lines
7.1 KiB
Go
Raw Permalink 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 (
"database/sql"
// "encoding/json"
"os"
// _ "github.com/mattn/go-sqlite3"
// "strconv"
"math/rand"
"sync"
"time"
"k8s.io/apimachinery/pkg/util/yaml"
"bytes"
"io/ioutil"
)
type Traffic struct {
TRAFFIC uint16 `json:"traffic"`
}
type Satisfaction struct {
SATISFACTION float64 `json:"satisfaction"`
}
type Conf struct {
GATEWAY_INFO Gateway_info `json:"gateway_info"`
DEVICES_LIST [][]string `json:"devices_list`
SERIALPORTS_LIST map[string]Serialconf `json:"serialports_list"`
RS485DEVICES map[string]Rs485devices `json:"rs485devices"`
ICONURL string `json:"iconurl`
WEBSOCKETURL []string `json:"websocketurl"`
POST_TO_SERVER string `json:"post_to_server"`
DEBUG bool `json:"debug"`
//是否初始化时打开串口
OPENSERIAL bool `json:"openserial"`
//无线 设备
WIRELESSSLAVEDEVICES []WirelessSlaveDevice `json:"wireless_slave_devices"`
//是否启动tcpserver
OPENTCPSETVER bool `json:"open_tcp_server"`
CHECKSERIAL bool `json:"check_serial"`
LORANODES []LoraNode `json:"lora_nodes"`
DPARKLOCATION string `json:"dpark_location"`
TCPPORT int `json:"tcp_port"`
APIPORT int `json:"api_port"`
PROCATEGORY int `json:"pro_category"`
SYNDATA bool `json:"syn_data"`
SYNEXTENSIONTIME bool `json:"syn_extension_Time"`
RECORD_LOG_PATH string `json:"record_log_path"`
RECORD_LOG_RETENTION_TIME int `json:"record_log_retention_time"`
MQTT_OPEN bool `json:"mqtt_open"`
MQTT_BROKER string `json:"mqtt_broker"`
MQTT_USERNAME string `json:"mqtt_username"`
MQTT_PASSWORD string `json:"mqtt_password"`
MQTT_KEEPALIVE int `json:"mqtt_keepAlive"`
MQTT_TOPIC string `json:"mqtt_topic"`
MQTT_TIMEOUT int `json:"mqtt_timeout"`
}
//无线 下位机
type WirelessSlaveDevice struct {
ADRH int `json:"adrh"`
ADRL int `json:"adrl"`
TYPE int `json:"type"`
VERSION string `json:"version"`
FLIP bool `json:"flip"`
ID string `json:"id"`
}
type Gateway_info struct {
ID string `json:"id"`
VERSION string `json:"version"`
LOCATION []float64 `json:"location"`
UNITNAME string `json:"单位"`
CONFIG []Config `json:"config"`
}
type Config struct {
ID string `json:"id"`
VERAION string `json:"version"`
DATA [][]interface{} `json:"data"`
}
type Rs485devices struct {
VERSION string `json:"version"`
NUM string `json:"num"`
COMMAND [][]byte `json:"command"`
}
type Serialconf struct {
COM string `json:"com"`
BAUDS int `json:"bauds"`
SIZE uint16 `json:"size"`
PARITY string `json:"parity"`
STOPBITS int `json:"stopbits"`
READTIMEOUT int `json:"readtimeout"`
NOTE string `json:"note"`
}
type LoraNode struct {
ADR string `json:"adr"`
LOCATION_TYPE string `json:"location_type"`
LOCATION_CODE string `json:"location_code"`
LOCATION_DATA string `json:"location_data"`
TIME time.Time `json:"time"`
CURRENT_DATA int `json:"current_data"`
CHECK_TIME bool `json:"check_time"`
DEVICE string `json:"device"`
UPDATE_TIME time.Time `json:"update_time"`
LORA_GWS []string `json:"lora_gws"`
}
var conf Conf
var DEVICEDATAS Devicedatas
var demoDevice Device
var today string
var nodeUpdateMap sync.Map
//sensor data update map
var sensorUpdateMap sync.Map
//key:loragateway ip value:conn object
var loragwMap sync.Map
//key:字符串addr value:byte[] addr
var sensorMap sync.Map
//log channel
var logch = make(chan []byte)
var loraNodeMap sync.Map
var db, _ = sql.Open("sqlite3", "./db/gateway.db")
type pluginConfig struct {
PodNodeSelectorPluginConfig map[string]string
}
// 加载配置文件
func init() {
//以时间配置随机数种子
rand.Seed(time.Now().UnixNano())
t := time.Now()
today = t.Format("2006-01-02")
// configfile, err := os.Open("conf/gateway.conf")
// check(err)
// defer configfile.Close()
// err = json.NewDecoder(configfile).Decode(&conf)
// check(err)
configfile, err := os.Open("conf/gateway.yaml")
check(err)
defer configfile.Close()
configData, err := ioutil.ReadAll(configfile)
check(err)
reader := bytes.NewReader(configData)
// ext := runtime.RawExtension{}
d := yaml.NewYAMLOrJSONDecoder(reader, 4096)
// defaultConfig := &pluginConfig{}
// if err := d.Decode(&defaultConfig); err != nil {
// check(err)
// }
// log.Println("======================yaml.data:",defaultConfig)
// return;
if err = d.Decode(&conf); err != nil {
// log.Println("conf parse error")
check(err)
}
//post_to_server smartoilets.host
// conf
var SMARTOILETS_HOST string
SMARTOILETS_HOST = os.Getenv("SMARTOILETS_HOST")
if SMARTOILETS_HOST != "" {
conf.POST_TO_SERVER = SMARTOILETS_HOST
}
// log.Println("conf:{}", conf.POST_TO_SERVER)
var device Device
// log.Println("slaveDevices:", conf.WIRELESSSLAVEDEVICES)
for _, v := range conf.LORANODES {
v.CURRENT_DATA = -1
v.TIME = time.Now()
loraNodeMap.Store(v.ADR, v)
}
DEVICEDATAS.Lock()
DEVICEDATAS.DATA = make(map[string]Device)
//初始化设备目前conf.DEVICES_LIST
for _, i := range conf.DEVICES_LIST {
device.DATA = make(map[string]interface{})
device.ID = i[0]
device.VERSION = i[2]
//版本号+编号
DEVICEDATAS.DATA[i[2]+"_"+i[3]] = device
}
DEVICEDATAS.Unlock()
// go dbdata_init()
}
var good, bad float64
var traffic_data Traffic
var satisfaction_data Satisfaction
// 初始化评价数据和人流量数据
// func dbdata_init() {
// rows, err := db.Query("SELECT good, bad FROM satisfaction order by id DESC limit 1")
// if err != nil {
// good = 1
// bad = 0
// } else {
// rows.Next()
// rows.Scan(&good, &bad)
// rows.Close()
// }
// //在原本没有db文件的情况下调用 会报错
// // 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
// } else {
// rows.Next()
// rows.Scan(&traffic_data.TRAFFIC)
// rows.Close()
// }
// }
// 定时更新评价数据和人流数据
// func savedata_cron() {
// T := time.Now().Format("2006-01-02")
// stmt, err := db.Prepare("UPDATE satisfaction set good=?, bad=? ,create_time=? where id=(SELECT max(id) FROM satisfaction)")
// check(err)
// stmt.Exec(&good, &bad, &T)
// stmt, err = db.Prepare("UPDATE traffic set traffic=?, create_time=? where id=(SELECT max(id) FROM traffic)")
// check(err)
// stmt.Exec(&traffic_data.TRAFFIC, &T)
// }
// 每天0点插入一条数据
//TODO 刚好有人流量数据
// func insertdata() {
// T := time.Now().Format("2006-01-02")
// stmt, _ := db.Prepare(`INSERT INTO traffic (traffic, create_time) values (?, ?)`)
// stmt.Exec(&traffic_data.TRAFFIC, &T)
// traffic_data.TRAFFIC = 0
// }