merge dpark

This commit is contained in:
fish 2019-05-05 11:35:36 +08:00
commit 2d10cea853
11 changed files with 1319 additions and 181 deletions

View File

@ -6,86 +6,21 @@
"单位": "深圳市云兴科技", "单位": "深圳市云兴科技",
"config": [ "config": [
{ {
"id": "deb03e28-ddcb-4e5d-aa31-d870a1f0f09b", "id": "7BB22E6A-ED0D-4161-8370-6B722D3683B7",
"version": "yunhorn_kgl_c8_v1", "version": "yunhorn_kgl_c16_v1",
"data": [ "data": [
["男厕位", 1],
["男厕位", 2],
["女厕位", 1], ["女厕位", 1],
["女厕位", 2], ["女厕位", 2],
["女厕位", 3],
["女厕位", 4],
["女厕位", 5],
["女厕位", 6],
["男厕位", 1],
["男厕位", 2]
]
},
{
"id": "EC13C2D9-6A93-4894-BB5B-89BDAA786D8A",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 7],
["男厕位", 8],
["男厕位", 3], ["男厕位", 3],
["男厕位", 4], ["男厕位", 4],
["男厕位", 5], ["男厕位", 5],
["男厕位", 6], ["男厕位", 6],
["纸巾卷", 7], ["男厕位", 7],
["纸巾抽", 8] ["男厕位", 8],
]
}, {
"id": "82BF7B5E-EC0D-4DB6-807F-B097C3C84073",
"version": "yunhorn_kgl_c8_v1",
"data": [
["母婴", 1],
["残卫", 1],
["残卫", 2],
["男便池", 4],
["男便池", 5],
["男便池", 6],
["男便池", 7],
["男便池", 8]
]
}, {
"id": "F5B7FDCC-79A8-499E-A925-F2FF357BE30D",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 9],
["男厕位", 10],
["女厕位", 14],
["女厕位", 15],
["女厕位", 16],
["女厕位", 17],
["女厕位", 18],
[null, null]
]
},
{
"id": "00DD66A6-378E-450D-98AA-44AC02741980",
"version": "yunhorn_kgl_c16_v1",
"data": [
["女厕位", 1],
["女厕位", 2],
["女厕位", 3], ["女厕位", 3],
["女厕位", 4], ["女厕位", 4]
["女厕位", 5],
["女厕位", 6],
["女厕位", 7],
["女厕位", 8],
["女厕位", 9],
["女厕位", 10],
["女厕位", 11],
["女厕位", 12],
["女厕位", 13],
["男便池", 1],
["男便池", 2],
["男便池", 3]
]
},
{
"id": "4E5D52DD-EB81-43C0-A2B6-04E432412EBA",
"version": "yunhorn_kgl_l_v1",
"data": [
["纸巾卷", 1]
] ]
} }
] ]
@ -109,17 +44,116 @@
}, },
{ {
"adrh":0, "adrh":0,
"adrl":0, "adrl":1,
"type":0, "type":0,
"version":"yunhorn_ys_l_v1", "version":"yunhorn_ys_l_v1",
"flip":false, "flip":true,
"id":"018B5704-55BE-40CA-9D3E-90EF157C2489" "id":"018B5704-55BE-40CA-9D3E-90EF157C2489"
} }
], ],
"lora_nodes":[
{
"adr":"0c521618",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data6",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c473018",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data7",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c451d14",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data3",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c471714",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data4",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c093e17",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data5",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c3e3c14",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data2",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c3c1214",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data8",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c3d3c14",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data10",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c3b4f14",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data9",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c360514",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data1",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"123",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data11",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
},
{
"adr":"0c0a2017",
"location_type":"changing_desk",
"location_code":"spao",
"location_data":"data12",
"current_data":0,
"device":"yunhorn_kgl_c16_v1_1"
}
],
"devices_list": [ "devices_list": [
["4E5D52DD-EB81-43C0-A2B6-04E432412EBA", "loraport", "yunhorn_kgl_l_v1", "1"], ["4E5D52DD-EB81-43C0-A2B6-04E432412EBA", "loraport", "yunhorn_kgl_l_v1", "1"],
["EB5B0798-9B7F-474E-AAB8-467FD5FE1293", "loraport", "yunhorn_kgl_l_v1", "2"], ["deb03e28-ddcb-4e5d-aa31-d870a1f0f09b", "loraport", "yunhorn_kgl_c8_v1", "1"],
["deb03e28-ddcb-4e5d-aa31-d870a1f0f09b", "loraport", "yunhorn_kgl_c8_v1", "1"] ["7BB22E6A-ED0D-4161-8370-6B722D3683B7", "loraport", "yunhorn_kgl_c16_v1", "1"],
["8E146028-E1B1-4AC9-8F47-01376A22CB35", "loraport", "yunhorn_kgl_c8_v1", "2"]
], ],
"serialports_list": { "serialports_list": {
"loraport": { "loraport": {
@ -160,41 +194,6 @@
"command": [ "command": [
[3, 2, 0, 0, 0, 16, 120, 36] [3, 2, 0, 0, 0, 16, 120, 36]
] ]
},
"52A79B3D-D9D9-48AF-AEB4-7D456BA22B31": {
"version": "yunhorn_db_c_v1",
"num": "1",
"command": [
[104, 65, 4, 0, 120, 16, 68, 104, 17, 4, 51, 51, 52, 51, 195, 22]
]
},
"607E11C4-8986-4F8E-807E-FFA655A6F677": {
"version": "yunhorn_sb_c_v1",
"num": "1",
"command": [
[104, 16, 103, 19, 146, 128, 1, 0, 0, 1, 3, 31, 144, 2, 186, 22]
]
},
"066BB944-AFA2-4E5D-86FA-61D9080A97BB": {
"version": "yunhorn_kq_c_v1",
"num": "1",
"command": [
[2, 3, 0, 0, 0, 7, 4, 59]
]
},
"22E175B2-8DD5-4740-B428-0297F409AA47": {
"version": "yunhorn_lhq_c_v1",
"num": "1",
"command": [
[4, 3, 0, 6, 0, 1, 100, 94]
]
},
"20F44B9C-E4A1-478E-B28F-0B7B14A2AF64": {
"version": "yunhorn_aq_c_v1",
"num": "1",
"command": [
[3, 3, 0, 0, 0, 1, 133, 232]
]
} }
}, },
"loradevices_list": { "loradevices_list": {

114
conf/gateway.conf.0314 Normal file
View File

@ -0,0 +1,114 @@
{
"gateway_info": {
"id": "F23FACD2-7D85-4FCC-88E3-C5B78931A26D",
"version": "yunhorn_gw_c_v1",
"location": [113.960347, 22.54143],
"单位": "深圳市云兴科技",
"config": [{
"id": "EC13C2D9-6A93-4894-BB5B-89BDAA786D8A",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 1],
["男厕位", 2],
["男厕位", 3],
["男厕位", 4],
["男厕位", 5],
["男厕位", 6],
["男厕位", 7],
["男厕位", 8]
]
}, {
"id": "82BF7B5E-EC0D-4DB6-807F-B097C3C84073",
"version": "yunhorn_kgl_c8_v1",
"data": [
["母婴", 1],
["残卫", 1],
["残卫", 2],
["男便池", 4],
["男便池", 5],
["男便池", 6],
["男便池", 7],
["男便池", 8]
]
}, {
"id": "F5B7FDCC-79A8-499E-A925-F2FF357BE30D",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 9],
["男厕位", 10],
["女厕位", 14],
["女厕位", 15],
["女厕位", 16],
["女厕位", 17],
["女厕位", 18],
[null, null]
]
},
{
"id": "00DD66A6-378E-450D-98AA-44AC02741980",
"version": "yunhorn_kgl_c16_v1",
"data": [
["女厕位", 1],
["女厕位", 2],
["女厕位", 3],
["女厕位", 4],
["女厕位", 5],
["女厕位", 6],
["女厕位", 7],
["女厕位", 8],
["女厕位", 9],
["女厕位", 10],
["女厕位", 11],
["女厕位", 12],
["女厕位", 13],
["男便池", 1],
["男便池", 2],
["男便池", 3]
]
},
{
"id": "4E5D52DD-EB81-43C0-A2B6-04E432412EBA",
"version": "yunhorn_kgl_l_v1",
"data": [
["纸巾卷", 1]
]
}
]
},
"devices_list": [
["15394892-E8B0-4FF2-BC35-1BF380BD1B68", "port1", "yunhorn_xsy_l_v1", "1"]
],
"serialports_list": {
"port1": {
"com": "/dev/ttyUSB0",
"bauds": 9600,
"size": 8,
"parity": "N",
"stopbits": 1,
"readtimeout": 1000,
"note": "液位"
}
},
"rs485devices": {
"15394892-E8B0-4FF2-BC35-1BF380BD1B68": {
"version": "yunhorn_xsy_l_v1",
"num": "1",
"command": [
[8, 3, 0, 1, 0, 2, 149, 82]
]
}
},
"loradevices_list": {
"4E5D52DD-EB81-43C0-A2B6-04E432412EBA": {
"version": "yunhorn_zjj_l_v1",
"num": "1",
"command": [
[85, 2, 242, 170]
]
}
},
"iconurl": "http://192.168.3.188/icons/",
"websocketurl": ["192.168.3.216:8080", "/echo"],
"post_to_server": "https://smartoilets.cn/socketServer/statis/push",
"debug": true
}

121
conf/gateway.conf.0318 Normal file
View File

@ -0,0 +1,121 @@
{
"gateway_info": {
"id": "F23FACD2-7D85-4FCC-88E3-C5B78931A26D",
"version": "yunhorn_gw_c_v1",
"location": [113.960347, 22.54143],
"单位": "深圳市云兴科技",
"config": [{
"id": "EC13C2D9-6A93-4894-BB5B-89BDAA786D8A",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 1],
["男厕位", 2],
["男厕位", 3],
["男厕位", 4],
["男厕位", 5],
["男厕位", 6],
["男厕位", 7],
["男厕位", 8]
]
}, {
"id": "82BF7B5E-EC0D-4DB6-807F-B097C3C84073",
"version": "yunhorn_kgl_c8_v1",
"data": [
["母婴", 1],
["残卫", 1],
["残卫", 2],
["男便池", 4],
["男便池", 5],
["男便池", 6],
["男便池", 7],
["男便池", 8]
]
}, {
"id": "F5B7FDCC-79A8-499E-A925-F2FF357BE30D",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 9],
["男厕位", 10],
["女厕位", 14],
["女厕位", 15],
["女厕位", 16],
["女厕位", 17],
["女厕位", 18],
[null, null]
]
},
{
"id": "00DD66A6-378E-450D-98AA-44AC02741980",
"version": "yunhorn_kgl_c16_v1",
"data": [
["女厕位", 1],
["女厕位", 2],
["女厕位", 3],
["女厕位", 4],
["女厕位", 5],
["女厕位", 6],
["女厕位", 7],
["女厕位", 8],
["女厕位", 9],
["女厕位", 10],
["女厕位", 11],
["女厕位", 12],
["女厕位", 13],
["男便池", 1],
["男便池", 2],
["男便池", 3]
]
},
{
"id": "4E5D52DD-EB81-43C0-A2B6-04E432412EBA",
"version": "yunhorn_kgl_l_v1",
"data": [
["纸巾卷", 1]
]
}
]
},
"devices_list": [
["00DD66A6-378E-450D-98AA-44AC02741980", "port2", "yunhorn_kgl_c16_v1", "1"]
],
"serialports_list": {
"port2": {
"com": "/dev/ttyUSB1",
"bauds": 9600,
"size": 8,
"parity": "N",
"stopbits": 1,
"readtimeout": 1000,
"note": "液位"
}
},
"rs485devices": {
"15394892-E8B0-4FF2-BC35-1BF380BD1B68": {
"version": "yunhorn_xsy_l_v1",
"num": "1",
"command": [
[8, 3, 0, 1, 0, 2, 149, 82]
]
},
"00DD66A6-378E-450D-98AA-44AC02741980": {
"version": "yunhorn_kgl_c16_v1",
"num": "1",
"command": [
[3, 2, 0, 0, 0, 16, 120, 36]
]
}
},
"loradevices_list": {
"4E5D52DD-EB81-43C0-A2B6-04E432412EBA": {
"version": "yunhorn_zjj_l_v1",
"num": "1",
"command": [
[85, 2, 242, 170]
]
}
},
"iconurl": "http://192.168.3.188/icons/",
"websocketurl": ["192.168.3.216:8080", "/echo"],
"post_to_server": "https://smartoilets.cn/socketServer/statis/push",
"debug": true
}

133
conf/gateway.conf.bak0319 Normal file
View File

@ -0,0 +1,133 @@
{
"gateway_info": {
"id": "F23FACD2-7D85-4FCC-88E3-C5B78931A26D",
"version": "yunhorn_gw_c_v1",
"location": [113.960347, 22.54143],
"单位": "深圳市云兴科技",
"config": [{
"id": "EC13C2D9-6A93-4894-BB5B-89BDAA786D8A",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 1],
["男厕位", 2],
["男厕位", 3],
["男厕位", 4],
["男厕位", 5],
["男厕位", 6],
["男厕位", 7],
["男厕位", 8]
]
}, {
"id": "82BF7B5E-EC0D-4DB6-807F-B097C3C84073",
"version": "yunhorn_kgl_c8_v1",
"data": [
["母婴", 1],
["残卫", 1],
["残卫", 2],
["男便池", 4],
["男便池", 5],
["男便池", 6],
["男便池", 7],
["男便池", 8]
]
}, {
"id": "F5B7FDCC-79A8-499E-A925-F2FF357BE30D",
"version": "yunhorn_kgl_c8_v1",
"data": [
["男厕位", 9],
["男厕位", 10],
["女厕位", 14],
["女厕位", 15],
["女厕位", 16],
["女厕位", 17],
["女厕位", 18],
[null, null]
]
},
{
"id": "00DD66A6-378E-450D-98AA-44AC02741980",
"version": "yunhorn_kgl_c16_v1",
"data": [
["女厕位", 1],
["女厕位", 2],
["女厕位", 3],
["女厕位", 4],
["女厕位", 5],
["女厕位", 6],
["女厕位", 7],
["女厕位", 8],
["女厕位", 9],
["女厕位", 10],
["女厕位", 11],
["女厕位", 12],
["女厕位", 13],
["男便池", 1],
["纸巾卷", 2],
["男便池", 3]
]
},
{
"id": "4E5D52DD-EB81-43C0-A2B6-04E432412EBA",
"version": "yunhorn_kgl_l_v1",
"data": [
["纸巾卷", 1]
]
}
]
},
"devices_list": [
["00DD66A6-378E-450D-98AA-44AC02741980", "port2", "yunhorn_kgl_c16_v1", "1"],
["15394892-E8B0-4FF2-BC35-1BF380BD1B68", "port1", "yunhorn_xsy_l_v1", "1"]
],
"serialports_list": {
"port1": {
"com": "/dev/ttyUSB0",
"bauds": 9600,
"size": 8,
"parity": "N",
"stopbits": 1,
"readtimeout": 1000,
"note": "液位"
},
"port2": {
"com": "/dev/ttyUSB1",
"bauds": 9600,
"size": 8,
"parity": "N",
"stopbits": 1,
"readtimeout": 1000,
"note": "液位"
}
},
"rs485devices": {
"15394892-E8B0-4FF2-BC35-1BF380BD1B68": {
"version": "yunhorn_xsy_l_v1",
"num": "1",
"command": [
[8, 3, 0, 1, 0, 2, 149, 82]
]
},
"00DD66A6-378E-450D-98AA-44AC02741980": {
"version": "yunhorn_kgl_c16_v1",
"num": "1",
"command": [
[3, 2, 0, 0, 0, 16, 120, 36]
]
}
},
"loradevices_list": {
"4E5D52DD-EB81-43C0-A2B6-04E432412EBA": {
"version": "yunhorn_zjj_l_v1",
"num": "1",
"command": [
[85, 2, 242, 170]
]
}
},
"iconurl": "http://192.168.3.167/icons/",
"websocketurl": ["192.168.3.216:8080", "/echo"],
"post_to_server": "https://smartoilets.cn/socketServer/statis/push",
"debug": true,
"openserial":false
}

Binary file not shown.

View File

@ -20,6 +20,7 @@ type P1004_6 struct {
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"`
TIMESTAMP int64 `json:"timestamp"`
} }
// 发送数据 // 发送数据

View File

@ -8,6 +8,7 @@ import (
"os" "os"
"strconv" "strconv"
"time" "time"
"sync"
) )
type Traffic struct { type Traffic struct {
@ -34,6 +35,7 @@ type Conf struct {
//是否启动tcpserver //是否启动tcpserver
OPENTCPSETVER bool `json:"open_tcp_server"` OPENTCPSETVER bool `json:"open_tcp_server"`
CHECKSERIAL bool `json:"check_serial"` CHECKSERIAL bool `json:"check_serial"`
LORANODES []LoraNode `json:"lora_nodes"`
} }
//无线 下位机 //无线 下位机
@ -76,16 +78,37 @@ type Serialconf struct {
NOTE string `json:"note"` 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"`
}
var conf Conf var conf Conf
var DEVICEDATAS Devicedatas var DEVICEDATAS Devicedatas
var demoDevice Device var demoDevice Device
var airDevice Device var airDevice Device
var femaledemoDevice Device
var maledemoDevice Device
var db, _ = sql.Open("sqlite3", "./db/gateway.db") var db, _ = sql.Open("sqlite3", "./db/gateway.db")
var loraNodeMap sync.Map
// 加载配置文件 // 加载配置文件
func init() { func init() {
time.Now()
configfile, err := os.Open("conf/gateway.conf") configfile, err := os.Open("conf/gateway.conf")
check(err) check(err)
defer configfile.Close() defer configfile.Close()
@ -118,6 +141,13 @@ func init() {
// log.Println(i.ID) // log.Println(i.ID)
// } // }
for _,v := range conf.LORANODES {
v.CURRENT_DATA = -1
// log.Println("&&&&&&&&&&&&&&&&&&&",v)
v.TIME = time.Now()
loraNodeMap.Store(v.ADR,v)
}
DEVICEDATAS.Lock() DEVICEDATAS.Lock()
DEVICEDATAS.DATA = make(map[string]Device) DEVICEDATAS.DATA = make(map[string]Device)
@ -156,6 +186,39 @@ func init() {
airDevice.DATA = make(map[string]interface{}) airDevice.DATA = make(map[string]interface{})
airDevice.DATA["data"] = 0 airDevice.DATA["data"] = 0
var device2 Device
device2.Lock()
device2.ID = demoDevice.ID
device2.VERSION = demoDevice.VERSION
device2.ONLINE = demoDevice.ONLINE
device2.DATA = make(map[string]interface{})
device2.DATA["data7"] = 0
device2.DATA["data8"] = 0
device2.Unlock()
//DEVICEDATAS.DATA[demoDevice.VERSION+"_1"] = device2
femaledemoDevice.ID = "8E146028-E1B1-4AC9-8F47-01376A22CB35"
femaledemoDevice.VERSION = "yunhorn_kgl_c8_v1"
femaledemoDevice.DATA = make(map[string]interface{})
femaledemoDevice.ONLINE = true
femaledemoDevice.DATA["data1"] = 0
//3是男厕
DEVICEDATAS.DATA[demoDevice.VERSION+"_3"] = femaledemoDevice
//2是女厕 配置演示使用
maledemoDevice.ID = "7BB22E6A-ED0D-4161-8370-6B722D3683B7"
maledemoDevice.VERSION = "yunhorn_kgl_c8_v1"
maledemoDevice.DATA = make(map[string]interface{})
maledemoDevice.ONLINE = true
maledemoDevice.DATA["data1"] = 0
maledemoDevice.DATA["data2"] = 0
//3是男厕
DEVICEDATAS.DATA[demoDevice.VERSION+"_2"] = maledemoDevice
dbdata_init() dbdata_init()
} }

View File

@ -14,7 +14,10 @@ func main() {
go gw_router() go gw_router()
go serial_run() go serial_run()
c := cron.New() c := cron.New()
send_data(CODE1001) send_data(CODE1001)
//获取数据防抖处理时间
go getConf()
c.AddFunc("0, *, *, *, *, *", func() { c.AddFunc("0, *, *, *, *, *", func() {
send_data(CODE1001) send_data(CODE1001)
@ -25,6 +28,10 @@ func main() {
// log.Println(string(build_data(1001,devices))) // log.Println(string(build_data(1001,devices)))
}) })
c.AddFunc("*/30, *, *, *, *, *", func() {
getConf()
})
c.AddFunc("0, */10, *, *, *, *", savedata_cron) c.AddFunc("0, */10, *, *, *, *", savedata_cron)
c.AddFunc("0, 0, 0, *, *, *", insertdata) c.AddFunc("0, 0, 0, *, *, *", insertdata)
c.AddFunc("0, 0, *, *, *, *", get_weather) c.AddFunc("0, 0, *, *, *, *", get_weather)

630
router.go
View File

@ -1,13 +1,19 @@
package main package main
import ( import (
"encoding/json"
"github.com/gin-contrib/cors" "github.com/gin-contrib/cors"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
"io/ioutil"
"log" "log"
"math" "math"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"sync"
"time"
"bytes"
) )
var router = gin.Default() var router = gin.Default()
@ -27,47 +33,598 @@ func gw_router() {
v1.GET("/stink", aq_api) v1.GET("/stink", aq_api)
v1.GET("/satisfaction", pj_api) v1.GET("/satisfaction", pj_api)
v1.GET("/seat/:id", seat_api) v1.GET("/seat/:id", seat_api)
v1.GET("/test/:id", test_api) v1.POST("/push", push)
v1.GET("/test2/:id", test_api2) v1.POST("/pushv2", pushv2)
v1.GET("/getConf")
} }
router.Run(":10086") router.Run(":10086")
} }
// 厕位占用api type DparkConf struct {
func test_api(c *gin.Context) { ExtensionInTime int `json:"in"`
DEVICEDATAS.RLock() ExtensionOutTime int `json:"out"`
//type_id := c.Param("id") ExtensionInTime2 int `json:"in2"`
ExtensionOutTime2 int `json:"out2"`
var device Device
device.Lock()
device.ID = demoDevice.ID
device.VERSION = demoDevice.VERSION
device.ONLINE = demoDevice.ONLINE
device.DATA = make(map[string]interface{})
device.DATA["data7"] = 1
device.Unlock()
DEVICEDATAS.DATA[demoDevice.VERSION+"_1"] = device
c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
} }
// 厕位占用api var dparkConf DparkConf
func test_api2(c *gin.Context) {
//获取数据防抖配置时间
func getConf() {
resp, err := http.Get("https://smartoilets.cn/socketServer/dpark/getConf")
if err != nil {
// handle error
log.Println("getConf.get.err", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
log.Println("getConf.readData.err", err)
return
}
if err := json.Unmarshal([]byte(body), &dparkConf); err == nil {
log.Println("yunhorndebug.getConf.success:", dparkConf)
}
if err!=nil{
return
}
if dparkConf.ExtensionInTime == 0 && dparkConf.ExtensionOutTime == 0 {
return
}
if dparkConf.ExtensionInTime < 0 {
dparkConf.ExtensionInTime = 0
}
if dparkConf.ExtensionOutTime < 0 {
dparkConf.ExtensionOutTime = 0
}
extensionInTime = dparkConf.ExtensionInTime
extensionOutTime = dparkConf.ExtensionOutTime
// check(err)
}
//距离有效判断
var reactTof = 1650
//数据防抖 进入时间
var extensionInTime = 6
//数据防抖 离开时间
var extensionOutTime = 15
var extensionInTime2 = 0
var extensionOutTime2 = 0
var oldData1 = ""
var oldData2 = ""
var oldData3 = ""
var dataMap sync.Map
//接收传感器push来的数据解析并上传到云端
func push(c *gin.Context) {
data := c.PostForm("d")
go dealData(data)
log.Println("data:", data)
c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": data})
}
func dealData(data string) string{
nowtime := time.Now()
log.Println("yunhorndeug.push.data|", data)
// go pushCODE1007(data)
alldata := strings.Split(data, "#")
if len(alldata) != 2 {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
return ""
} else {
valuedata := strings.Split(alldata[1], "*")
if len(valuedata) < 1 {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
return ""
}
dtype, error := strconv.Atoi(valuedata[0])
if error != nil {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtype"})
return ""
}
var nowTmpData = "1#0"
if dtype == 1 {
if len(valuedata) != 3 {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 3"})
return ""
}
addr, error := strconv.Atoi(alldata[0])
if error != nil {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
return ""
}
cs2001, error := strconv.Atoi(valuedata[1])
if error != nil {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
return ""
}
tof, error := strconv.Atoi(valuedata[2])
if error != nil {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errtof"})
return ""
}
if tof ==0{
log.Println("tof is zero")
return ""
}
if addr == 1 {
if cs2001 == 1 || tof < 1650 {
nowTmpData = "1#1"
}
if oldData1 != nowTmpData {
dataMap.Store(addr, nowtime)
if oldData1 == "" {
//为空 直接改变状态
maledemoDevice.DATA["data1"] = 0
if nowTmpData == "1#1" {
maledemoDevice.DATA["data1"] = 1
}
changeData(2, maledemoDevice)
}
//存储状态
oldData1 = nowTmpData
} else {
oldDevDataTime, ok := dataMap.Load(addr)
if !ok {
log.Println("load time err", ok)
}
if ok {
if oldDevDataTime != nil {
//log.Println("t2.Sub(t1)", nowtime.Sub(oldDevDataTime.(time.Time)))
var duration = nowtime.Sub(oldDevDataTime.(time.Time)).Seconds()
var durationAsInt64 = int(duration)
log.Printf("yunhorndebug.origin.%s|%s|%d|%d|%d|%d|%d", oldData1, nowTmpData, addr, dtype, cs2001, tof, durationAsInt64)
if nowTmpData == "1#0" {
if durationAsInt64 < extensionOutTime {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
return ""
}
} else {
if durationAsInt64 < extensionInTime {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
return ""
}
}
maledemoDevice.DATA["data1"] = 0
if nowTmpData == "1#1" {
maledemoDevice.DATA["data1"] = 1
}
changeData(2, maledemoDevice)
dataMap.Delete(addr)
}
}
}
} else if addr == 2 {
if cs2001 == 1 || tof < 1650 {
nowTmpData = "1#1"
}
if oldData2 != nowTmpData {
dataMap.Store(addr, nowtime)
if oldData2 == "" {
//为空 直接改变状态
maledemoDevice.DATA["data2"] = 0
if nowTmpData == "1#1" {
maledemoDevice.DATA["data2"] = 1
}
changeData(2, maledemoDevice)
}
//存储状态
oldData2 = nowTmpData
} else {
oldDevDataTime, ok := dataMap.Load(addr)
if !ok {
log.Println("load time err", ok)
}
if ok {
if oldDevDataTime != nil {
//log.Println("t2.Sub(t1)", nowtime.Sub(oldDevDataTime.(time.Time)))
var duration = nowtime.Sub(oldDevDataTime.(time.Time)).Seconds()
var durationAsInt64 = int(duration)
log.Printf("yunhorndebug.origin.%s|%s|%d|%d|%d|%d|%d", oldData2, nowTmpData, addr, dtype, cs2001, tof, durationAsInt64)
if nowTmpData == "1#0" {
if durationAsInt64 < extensionOutTime {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
return ""
}
} else {
if durationAsInt64 < extensionInTime {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
return ""
}
}
maledemoDevice.DATA["data2"] = 0
if nowTmpData == "1#1" {
maledemoDevice.DATA["data2"] = 1
}
changeData(2, maledemoDevice)
dataMap.Delete(addr)
}
}
}
}
} else if dtype == 2 {
//吸顶传感器 没有距离数据
if len(valuedata) != 2 {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "valuedata not 2,type2"})
return ""
}
addr, error := strconv.Atoi(alldata[0])
if error != nil {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "erraddr"})
return ""
}
cs2001, error := strconv.Atoi(valuedata[1])
if error != nil {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "errcs2001"})
return ""
}
if cs2001 == 1 {
nowTmpData = "1#1"
}
if oldData3 != nowTmpData {
dataMap.Store(addr, nowtime)
if oldData3 == "" {
//为空 直接改变状态
femaledemoDevice.DATA["data1"] = 0
if nowTmpData == "1#1" {
femaledemoDevice.DATA["data1"] = 1
}
changeData(2, maledemoDevice)
}
//存储状态
oldData3 = nowTmpData
} else {
oldDevDataTime, ok := dataMap.Load(addr)
if !ok {
log.Println("load time err", ok)
}
if ok {
if oldDevDataTime != nil {
//log.Println("t2.Sub(t1)", nowtime.Sub(oldDevDataTime.(time.Time)))
var duration = nowtime.Sub(oldDevDataTime.(time.Time)).Seconds()
var durationAsInt64 = int(duration)
var tof = 0
log.Printf("yunhorndebug.origin.%s|%s|%d|%d|%d|%d|%d", oldData3, nowTmpData, addr, dtype, cs2001, tof, durationAsInt64)
if nowTmpData == "1#0" {
if durationAsInt64 < extensionOutTime {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
return ""
}
} else {
if durationAsInt64 < extensionInTime {
// c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "not enough time"})
return ""
}
}
femaledemoDevice.DATA["data1"] = 0
if nowTmpData == "1#1" {
femaledemoDevice.DATA["data1"] = 1
}
changeData(3, femaledemoDevice)
dataMap.Delete(addr)
}
}
}
}
}
return ""
}
func pushv2(c *gin.Context){
data := c.PostForm("d")
// go dealDatav2(data)
log.Println("data:", data)
c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "code": 1})
}
func dealDatav3(data []byte) string{
nowtime := time.Now()
log.Println("yunhorndeug.push.data|", data)
strs := data
buffer := new(bytes.Buffer)
for _, b := range data[:4] {
s := strconv.FormatInt(int64(b&0xff), 16)
if len(s) == 1 {
buffer.WriteString("0")
}
buffer.WriteString(s)
}
adr := buffer.String()
var readyData bytes.Buffer
datatype := data[5]
cs2001 := data[6]
var R_data P1004_6
R_data.CODE = 1008
R_data.ID = adr
//尿布台
R_data.VERSION = "yunhorn_2_v1"
R_data.ONLINE = true
R_data.DATA = make(map[string]interface{})
R_data.DATA["cs2001"]=cs2001
datatypeStr := strconv.FormatInt(int64(data[5]&0xff), 16)
cs2001Str := strconv.FormatInt(int64(data[6]&0xff), 16)
//地址
readyData.WriteString(buffer.String())
readyData.WriteString("#")
//类型
readyData.WriteString(datatypeStr)
readyData.WriteString("*")
//红外人体感应
readyData.WriteString(cs2001Str)
newdtype := strs[5]
tmp := []byte{0, 0}
tof := tmp[0]
if newdtype==1{
tof = data[7]
R_data.VERSION = "yunhorn_1_v1"
R_data.DATA["tof"]=tof
tofTmp := strconv.FormatInt(int64(data[7]&0xff), 10)
readyData.WriteString("*")
readyData.WriteString(tofTmp)
}
R_data.TIMESTAMP=time.Now().Unix()
data_bufTmp, _ := json.Marshal(R_data)
data_buf := string(data_bufTmp)
go post_to_server(data_buf)
// log.Println("readyData:",readyData.String())
// go pushCODE1007(data)
//默认当前无人占用
current := 0
if datatype == 1 {
//尿布台类型
if cs2001==1 || tof<130{
//有人占用
current = 1
}
}else if datatype==2{
//吸顶类型
if cs2001 ==1 {
//有人占用
current = 1
}
}
// log.Println("loraNodeMap:",loraNodeMap)
loraNode, ok := loraNodeMap.Load(adr)
if !ok {
log.Println("load loraNode success ", ok)
return ""
}
// log.Println("load loraNode:",loraNode)
//log.Println("yunhorndeug.push.data.cuurent_data,current",loraNode.(LoraNode).CURRENT_DATA,current)
if loraNode.(LoraNode).CURRENT_DATA != current{
//不相同,直接改变状态,更新时间
// loraNode.(LoraNode).CURRENT_DATA = current
// loraNode.(LoraNode).TIME = time.Now()
// loraNode.(LoraNode).CHECK_TIME = true
newLoraNode := LoraNode{}
newLoraNode.CURRENT_DATA = current
newLoraNode.TIME = time.Now()
newLoraNode.CHECK_TIME=true
newLoraNode.LOCATION_TYPE = loraNode.(LoraNode).LOCATION_TYPE
newLoraNode.LOCATION_CODE = loraNode.(LoraNode).LOCATION_CODE
newLoraNode.LOCATION_DATA = loraNode.(LoraNode).LOCATION_DATA
newLoraNode.DEVICE = loraNode.(LoraNode).DEVICE
loraNodeMap.Store(adr,newLoraNode)
//初次启动
if loraNode.(LoraNode).CURRENT_DATA == -1{
changeDataV2(newLoraNode)
}
if (datatype==2 && (extensionInTime2<=0 || extensionOutTime2<=0)){
newLoraNode.CURRENT_DATA = current
changeDataV2(newLoraNode)
}
}else{
// 非首次
if loraNode.(LoraNode).CHECK_TIME {
var duration = nowtime.Sub(loraNode.(LoraNode).TIME).Seconds()
var durationAsInt64 = int(duration)
log.Println("yunhorndeug.push.data.durationAsInt64:",durationAsInt64)
if current == 0 {
//类型2 吸顶
if datatype==2{
if durationAsInt64 < extensionOutTime2 && extensionOutTime2>0 {
return ""
}
}else{
if durationAsInt64 < extensionOutTime && extensionOutTime>0 {
return ""
}
}
}else{
//类型2 吸顶
if datatype==2{
if durationAsInt64 < extensionInTime2 && extensionInTime2>0 {
return ""
}
}else{
if durationAsInt64 < extensionInTime && extensionInTime>0 {
return ""
}
}
}
//改变状态
// loraNode.(LoraNode).CHECK_TIME = false
newLoraNode := LoraNode{}
newLoraNode.CURRENT_DATA = current
newLoraNode.TIME = loraNode.(LoraNode).TIME
newLoraNode.CHECK_TIME= false
newLoraNode.LOCATION_TYPE = loraNode.(LoraNode).LOCATION_TYPE
newLoraNode.LOCATION_CODE = loraNode.(LoraNode).LOCATION_CODE
newLoraNode.LOCATION_DATA = loraNode.(LoraNode).LOCATION_DATA
newLoraNode.DEVICE = loraNode.(LoraNode).DEVICE
loraNodeMap.Store(adr,newLoraNode)
changeDataV2(newLoraNode)
}else{
// loraNode.(LoraNode).CHECK_TIME = true
newLoraNode := LoraNode{}
newLoraNode.CURRENT_DATA = loraNode.(LoraNode).CURRENT_DATA
newLoraNode.TIME = time.Now()
newLoraNode.CHECK_TIME= true
newLoraNode.LOCATION_TYPE = loraNode.(LoraNode).LOCATION_TYPE
newLoraNode.LOCATION_CODE = loraNode.(LoraNode).LOCATION_CODE
newLoraNode.LOCATION_DATA = loraNode.(LoraNode).LOCATION_DATA
newLoraNode.DEVICE = loraNode.(LoraNode).DEVICE
if (datatype==2 && (extensionInTime2<=0 || extensionOutTime2<=0)){
newLoraNode.CURRENT_DATA = current
changeDataV2(newLoraNode)
}
loraNodeMap.Store(adr,newLoraNode)
}
}
// log.Println("current:",current)
// log.Println("loraNode:",loraNode)
// log.Println("loraNode.time.is nil",(loraNode==nil))
return ""
}
//发送code1007数据到云端
func pushCODE1007(data string) {
//resp, err := http.PostForm("https://smartoilets.cn/socketServer/static/push",
// url.Values{"d": {data}})
resp, err := http.Post("https://smartoilets.cn/socketServer/statis/push",
"application/x-www-form-urlencoded",
strings.NewReader("d="+data))
if err != nil {
log.Print("yunhorndebug.pushCODE1007.err", err)
}
defer resp.Body.Close()
}
func changeData(num int, device Device) {
log.Println("device:", device)
DEVICEDATAS.DATA[demoDevice.VERSION+"_"+strconv.Itoa(num)] = device
}
func changeDataV2(loraNode LoraNode){
// log.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
// log.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@00000:",loraNode)
// log.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@11111:",DEVICEDATAS.DATA[loraNode.DEVICE])
DEVICEDATAS.RLock() DEVICEDATAS.RLock()
//type_id := c.Param("id") DEVICEDATAS.DATA[loraNode.DEVICE].DATA[loraNode.LOCATION_DATA] = loraNode.CURRENT_DATA
DEVICEDATAS.RUnlock()
var device Device log.Println("yunhorndeug.push.data.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@22222:",DEVICEDATAS.DATA[loraNode.DEVICE])
device.Lock() // log.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
device.ID = demoDevice.ID
device.VERSION = demoDevice.VERSION
device.ONLINE = demoDevice.ONLINE
device.DATA = make(map[string]interface{})
device.DATA["data7"] = 0
device.Unlock()
DEVICEDATAS.DATA[demoDevice.VERSION+"_1"] = device
c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"})
} }
type EventNotificationAlert struct { type EventNotificationAlert struct {
@ -263,7 +820,9 @@ func seat_api(c *gin.Context) {
// log.Println("data:", DEVICEDATAS.DATA[version+"_"+num].DATA) // log.Println("data:", DEVICEDATAS.DATA[version+"_"+num].DATA)
//} //}
// log.Println("============================devicedatas.data:", DEVICEDATAS.DATA[version+"_"+num].DATA)
if DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)] != nil { if DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)] != nil {
// log.Println("==========================do.data:", DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)])
j = append(j, DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)]) j = append(j, DEVICEDATAS.DATA[version+"_"+num].DATA["data"+strconv.Itoa(k+1)])
} }
} }
@ -271,7 +830,7 @@ func seat_api(c *gin.Context) {
} }
} }
//log.Println("end conf.data:", conf_data) log.Println("end conf.data:", conf_data)
switch type_id { switch type_id {
case "1": case "1":
@ -313,6 +872,9 @@ func get_seat_device_data(id string) []string {
// 从配置文件中匹配对应的数据 // 从配置文件中匹配对应的数据
func scan_seat_from_confdata(T string, conf_data [][]interface{}) Seat_data { func scan_seat_from_confdata(T string, conf_data [][]interface{}) Seat_data {
var data Seat_data var data Seat_data
//实例化空集合
data.POSITIONLIST = make([]interface{}, 0)
data.HASPERSONLIST = make([]interface{}, 0)
for _, i := range conf_data { for _, i := range conf_data {
if i[0] == T { if i[0] == T {
data.POSITIONLIST = append(data.POSITIONLIST, i[1]) data.POSITIONLIST = append(data.POSITIONLIST, i[1])

View File

@ -9,11 +9,14 @@ import (
//"strings" //"strings"
"time" "time"
// "go-study/socket/config" // "go-study/socket/config"
"bytes"
"strconv"
) )
func handleConn(conn net.Conn) { func handleConn(conn net.Conn) {
log.Println("begin handleConn,cliendAddr:", conn.RemoteAddr()) log.Println("yunhorndeug.push.data.tcp.begin handleConn,cliendAddr:", conn.RemoteAddr())
defer conn.Close() defer conn.Close()
@ -46,7 +49,7 @@ func handleConn(conn net.Conn) {
log.Println("write msg error!", err) log.Println("write msg error!", err)
stopChan <- true stopChan <- true
} else { } else {
log.Println("write msg success!", conn.RemoteAddr()) //log.Println("write msg success!", conn.RemoteAddr())
//暂时写死,演示用 lora心跳包给云端 //暂时写死,演示用 lora心跳包给云端
var device Device var device Device
@ -56,55 +59,175 @@ func handleConn(conn net.Conn) {
device.ONLINE = true device.ONLINE = true
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["data"] = 1 device.DATA["data"] = 1
go send_data(1005, device) //go send_data(1005, device)
} }
} }
} }
} }
func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) { func readConn(conn net.Conn, readChan chan<- []byte, stopChan chan<- bool) {
data_buf := make(chan []byte)
Rdata := make([]byte, 0) // data_buf := make(chan []byte)
// Rdata := make([]byte, 0)
data := make([]byte, 256) data := make([]byte, 256)
Rdata2 := make([]byte, 0)
go func() { // go func() {
for { // for {
select { // select {
case kkdata := <-data_buf: //如果有数据下面打印。但是有可能ch一直没数据 // case kkdata := <-data_buf: //如果有数据下面打印。但是有可能ch一直没数据
Rdata = append(Rdata, kkdata...) // // log.Println("yunhorndeug.push.data.tcp|",kkdata)
//log.Println("kkdata:",kkdata) //
case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞那么select也会检测其他case条件检测到后3秒超时 // log.Println("###########################yunhorndeug.push.data.tcp.kkdata:",kkdata)
// log.Println("超时") // Rdata = append(Rdata, kkdata...)
if len(Rdata) > 4 { // Rdata2 = append(Rdata2,Rdata...)
readChan <- Rdata // count := 0
Rdata = make([]byte, 0) // for _,v := range Rdata{
} // if v==0{
//strData := string(Rdata) // break;
//Rdata = make([]byte,0) // }
//log.Println("Received:", strData) // count++
// }
//
// Rdata2 = make([]byte, count)
// for i,v := range Rdata{
// if v==0{
// break;
// }
// Rdata2[i]=v
// }
//
//
// log.Println("---------------------------yunhorndeug.push.data.tcp.Rdata:",Rdata2)
// Rdata2 = make([]byte, 0)
// //log.Println("kkdata:",kkdata)
// case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞那么select也会检测其他case条件检测到后3秒超时
// // log.Println("超时")
// if len(Rdata) > 4 {
// readChan <- Rdata // readChan <- Rdata
// Rdata = make([]byte, 0) // Rdata = make([]byte, 0)
} // }
} // //strData := string(Rdata)
}() // //Rdata = make([]byte,0)
// //log.Println("Received:", strData)
//
// //readChan <- Rdata
// //Rdata = make([]byte,0)
// }
// }
// }()
for { for {
// data := make([]byte, config.SERVER_RECV_LEN) // data := make([]byte, config.SERVER_RECV_LEN)
//data2 := make([]byte,256) //data2 := make([]byte,256)
_, err := conn.Read(data) reqLen, err := conn.Read(data)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
break break
} }
// log.Println(DEVICEDATAS)
log.Println("read.data:%d,%s", Bytes2Bits(data[3:4])[0],conn.RemoteAddr())
data_buf <- data buffer := new(bytes.Buffer)
continueCount := 0
// log.Println("yunhorndeug.push.data.tcp.reqLen",reqLen)
// log.Println("$$$$$$$$$$$$$$$$$$$$$$$$$",data[:reqLen])
for i, b := range data[:reqLen] {
if reqLen<7{
break
}
if continueCount>0{
continueCount--
continue;
}
s := strconv.FormatInt(int64(b&0xff), 16)
if len(s) == 1 {
buffer.WriteString("0")
}
buffer.WriteString(s)
// log.Println(b)
//分隔符
// log.Println("$$$$$$$$$$$$$$$$$$$$$$$$$",i,reqLen)
// log.Println("$$$$$$$$$$$$$$$$$$$$$$$$$",data[reqLen])
end :=0
if b==254 && i>3{
addrs := data[i-4:i]
//尿布台数据地址1位 数据2位
dataType := data[i+1]
values := make([]byte,0)
if data[i+1] == 1 {
continueCount = 3
end = 4
if i+4>reqLen{
log.Println("yunhorndeug.push.data.tcp.fq",buffer.String(),addrs,dataType)
continue
}
//类型为1 数据量为2
values = data[i+2:i+4]
}else if dataType == 2{
//类型为2 数据量位1
continueCount = 2
end = 3
if i+3 >reqLen{
log.Println("yunhorndeug.push.data.tcp.fq",buffer.String(),addrs,dataType)
continue
}
values = data[i+2:i+3]
}
log.Println("yunhorndeug.push.data.tcp:",buffer.String(),addrs,dataType,values)
// log.Println("yunhorndeug.push.data.tcp.addr",addrs)
// log.Println("yunhorndeug.push.data.tcp.type",dataType)
// log.Println("yunhorndeug.push.data.tcp.values",values)
buffer = new(bytes.Buffer)
// var buffer bytes.Buffer
// buffer.Write(addrs)
// buffer.Write(dataType)
// buffer.Write(values)
go dealDatav3(data[i-4:i+end])
}
}
// 转化为字符串
// log.Println("yunhorndeug.push.data.tcp.16data:",buffer.String())
Rdata2 = make([]byte, reqLen)
for i,v := range data[:reqLen]{
Rdata2[i]=v
}
// log.Println("===========================yunhorndeug.push.data.tcp.origin.Rdata:",Rdata2)
// Rdata2 = make([]byte, count)
// log.Println("read.data:%d,%s", Bytes2Bits(data[3:4])[0],conn.RemoteAddr())
// data_buf <- data
data = make([]byte, 256)
} }
stopChan <- true stopChan <- true
} }
//BytesCombine 多个[]byte数组合并成一个[]byte
func BytesCombine(pBytes ...[]byte) []byte {
return bytes.Join(pBytes, []byte(""))
}
func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) { func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) {
for { for {
strData := <-writeChan strData := <-writeChan

View File

@ -23,6 +23,7 @@ type Device struct {
} }
//处理通过tcp发送过来的数据 //处理通过tcp发送过来的数据
func yunhorn_wireless(data_buf []byte) { func yunhorn_wireless(data_buf []byte) {
//至少5个字节数据 //至少5个字节数据
log.Println("wireless.tcp.data.len:", len(data_buf)) log.Println("wireless.tcp.data.len:", len(data_buf))
@ -67,9 +68,6 @@ func yunhorn_wireless(data_buf []byte) {
} }
} }
} }
// if(len(data_buf)>8){
// go yunhorn_wireless(data_buf[4:])
// }
} }
func yunhorn_xdy_l_v1(data_buf []byte) { func yunhorn_xdy_l_v1(data_buf []byte) {
@ -140,6 +138,7 @@ func yunhorn_ys_l_v1(data_buf []byte) {
demoDevice.DATA["data"+strconv.Itoa(2)] = 0 demoDevice.DATA["data"+strconv.Itoa(2)] = 0
demoDevice.DATA["data"+strconv.Itoa(3)] = 0 demoDevice.DATA["data"+strconv.Itoa(3)] = 0
if data_int0[0] == 0 && data_int1[0] == 0 && data_type[0] == 0 { if data_int0[0] == 0 && data_int1[0] == 0 && data_type[0] == 0 {
demoDevice.DATA["data"+strconv.Itoa(8)] = data_int[0] demoDevice.DATA["data"+strconv.Itoa(8)] = data_int[0]
var device Device var device Device
@ -152,16 +151,32 @@ func yunhorn_ys_l_v1(data_buf []byte) {
device.Unlock() device.Unlock()
DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data8"] = data_int[0] DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data8"] = data_int[0]
} else { } else {
demoDevice.DATA["data"+strconv.Itoa(7)] = data_int[0] if data_int[0] == 0{
demoDevice.DATA["data"+strconv.Itoa(7)] = 1
}else{
demoDevice.DATA["data"+strconv.Itoa(7)] = 0
}
var device Device var device Device
device.Lock() device.Lock()
device.ID = demoDevice.ID device.ID = demoDevice.ID
device.VERSION = demoDevice.VERSION device.VERSION = demoDevice.VERSION
device.ONLINE = demoDevice.ONLINE device.ONLINE = demoDevice.ONLINE
device.DATA = make(map[string]interface{}) device.DATA = make(map[string]interface{})
device.DATA["data7"] = data_int[0]
if data_int[0] == 0{
device.DATA["data7"] = 1
}else{
device.DATA["data7"] = 0
}
//device.DATA["data7"] = data_int[0]
device.Unlock() device.Unlock()
DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data7"] = data_int[0] DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data7"] = data_int[0]
// DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data7"] = device.DATA["data7"]
} }
device.DATA = demoDevice.DATA device.DATA = demoDevice.DATA