diff --git a/conf/gateway.conf b/conf/gateway.conf index 0a4f249..fd0d3db 100644 --- a/conf/gateway.conf +++ b/conf/gateway.conf @@ -6,86 +6,21 @@ "单位": "深圳市云兴科技", "config": [ { - "id": "deb03e28-ddcb-4e5d-aa31-d870a1f0f09b", - "version": "yunhorn_kgl_c8_v1", + "id": "7BB22E6A-ED0D-4161-8370-6B722D3683B7", + "version": "yunhorn_kgl_c16_v1", "data": [ + ["男厕位", 1], + ["男厕位", 2], ["女厕位", 1], ["女厕位", 2], - ["女厕位", 3], - ["女厕位", 4], - ["女厕位", 5], - ["女厕位", 6], - ["男厕位", 1], - ["男厕位", 2] - ] - }, - { - "id": "EC13C2D9-6A93-4894-BB5B-89BDAA786D8A", - "version": "yunhorn_kgl_c8_v1", - "data": [ - ["男厕位", 7], - ["男厕位", 8], ["男厕位", 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], + ["男厕位", 7], + ["男厕位", 8], ["女厕位", 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] + ["女厕位", 4] ] } ] @@ -109,17 +44,116 @@ }, { "adrh":0, - "adrl":0, + "adrl":1, "type":0, "version":"yunhorn_ys_l_v1", - "flip":false, + "flip":true, "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": [ ["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": { "loraport": { @@ -160,41 +194,6 @@ "command": [ [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": { diff --git a/conf/gateway.conf.0314 b/conf/gateway.conf.0314 new file mode 100644 index 0000000..750223d --- /dev/null +++ b/conf/gateway.conf.0314 @@ -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 +} diff --git a/conf/gateway.conf.0318 b/conf/gateway.conf.0318 new file mode 100644 index 0000000..b5712da --- /dev/null +++ b/conf/gateway.conf.0318 @@ -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 +} diff --git a/conf/gateway.conf.bak0319 b/conf/gateway.conf.bak0319 new file mode 100644 index 0000000..2394e26 --- /dev/null +++ b/conf/gateway.conf.bak0319 @@ -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 +} diff --git a/db/gateway.db b/db/gateway.db index 215fc0a..d620166 100644 Binary files a/db/gateway.db and b/db/gateway.db differ diff --git a/do_send_data.go b/do_send_data.go index 7d1e641..37d84de 100644 --- a/do_send_data.go +++ b/do_send_data.go @@ -20,6 +20,7 @@ type P1004_6 struct { VERSION string `json:"version"` ONLINE bool `json:"online"` DATA map[string]interface{} `json:"data"` + TIMESTAMP int64 `json:"timestamp"` } // 发送数据 diff --git a/loadconfig.go b/loadconfig.go index 1eed320..0e3a927 100644 --- a/loadconfig.go +++ b/loadconfig.go @@ -8,6 +8,7 @@ import ( "os" "strconv" "time" + "sync" ) type Traffic struct { @@ -34,6 +35,7 @@ type Conf struct { //是否启动tcpserver OPENTCPSETVER bool `json:"open_tcp_server"` CHECKSERIAL bool `json:"check_serial"` + LORANODES []LoraNode `json:"lora_nodes"` } //无线 下位机 @@ -76,16 +78,37 @@ type Serialconf struct { 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 DEVICEDATAS Devicedatas var demoDevice Device + var airDevice Device +var femaledemoDevice Device +var maledemoDevice Device + + var db, _ = sql.Open("sqlite3", "./db/gateway.db") +var loraNodeMap sync.Map + // 加载配置文件 func init() { + + time.Now() + configfile, err := os.Open("conf/gateway.conf") check(err) defer configfile.Close() @@ -118,6 +141,13 @@ func init() { // 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.DATA = make(map[string]Device) @@ -156,6 +186,39 @@ func init() { airDevice.DATA = make(map[string]interface{}) 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() } diff --git a/main.go b/main.go index 895b362..5788afe 100644 --- a/main.go +++ b/main.go @@ -14,8 +14,11 @@ func main() { go gw_router() go serial_run() c := cron.New() - send_data(CODE1001) + send_data(CODE1001) + //获取数据防抖处理时间 + go getConf() + c.AddFunc("0, *, *, *, *, *", func() { send_data(CODE1001) }) @@ -25,6 +28,10 @@ func main() { // log.Println(string(build_data(1001,devices))) }) + c.AddFunc("*/30, *, *, *, *, *", func() { + getConf() + }) + c.AddFunc("0, */10, *, *, *, *", savedata_cron) c.AddFunc("0, 0, 0, *, *, *", insertdata) c.AddFunc("0, 0, *, *, *, *", get_weather) diff --git a/router.go b/router.go index 76ed9d9..c9ce9f6 100644 --- a/router.go +++ b/router.go @@ -1,13 +1,19 @@ package main import ( + "encoding/json" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" _ "github.com/mattn/go-sqlite3" + "io/ioutil" "log" "math" "net/http" "strconv" + "strings" + "sync" + "time" + "bytes" ) var router = gin.Default() @@ -27,47 +33,598 @@ func gw_router() { v1.GET("/stink", aq_api) v1.GET("/satisfaction", pj_api) v1.GET("/seat/:id", seat_api) - v1.GET("/test/:id", test_api) - v1.GET("/test2/:id", test_api2) + v1.POST("/push", push) + v1.POST("/pushv2", pushv2) + + v1.GET("/getConf") } + + + router.Run(":10086") } -// 厕位占用api -func test_api(c *gin.Context) { - DEVICEDATAS.RLock() - //type_id := c.Param("id") - - 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"}) +type DparkConf struct { + ExtensionInTime int `json:"in"` + ExtensionOutTime int `json:"out"` + ExtensionInTime2 int `json:"in2"` + ExtensionOutTime2 int `json:"out2"` } -// 厕位占用api -func test_api2(c *gin.Context) { +var dparkConf DparkConf + +//获取数据防抖配置时间 +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() - //type_id := c.Param("id") - - 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"] = 0 - device.Unlock() - DEVICEDATAS.DATA[demoDevice.VERSION+"_1"] = device - - c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "ok"}) + DEVICEDATAS.DATA[loraNode.DEVICE].DATA[loraNode.LOCATION_DATA] = loraNode.CURRENT_DATA + DEVICEDATAS.RUnlock() + log.Println("yunhorndeug.push.data.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@22222:",DEVICEDATAS.DATA[loraNode.DEVICE]) + // log.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") } type EventNotificationAlert struct { @@ -263,7 +820,9 @@ func seat_api(c *gin.Context) { // 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 { + // 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)]) } } @@ -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 { 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 { var data Seat_data + //实例化空集合 + data.POSITIONLIST = make([]interface{}, 0) + data.HASPERSONLIST = make([]interface{}, 0) for _, i := range conf_data { if i[0] == T { data.POSITIONLIST = append(data.POSITIONLIST, i[1]) diff --git a/tcpserver.go b/tcpserver.go index ac14a29..b794b32 100644 --- a/tcpserver.go +++ b/tcpserver.go @@ -9,11 +9,14 @@ import ( //"strings" "time" // "go-study/socket/config" + "bytes" + "strconv" + ) 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() @@ -46,7 +49,7 @@ func handleConn(conn net.Conn) { log.Println("write msg error!", err) stopChan <- true } else { - log.Println("write msg success!", conn.RemoteAddr()) + //log.Println("write msg success!", conn.RemoteAddr()) //暂时写死,演示用 lora心跳包给云端 var device Device @@ -56,55 +59,175 @@ func handleConn(conn net.Conn) { device.ONLINE = true device.DATA = make(map[string]interface{}) 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) { - data_buf := make(chan []byte) - Rdata := make([]byte, 0) + + // data_buf := make(chan []byte) + + // Rdata := make([]byte, 0) data := make([]byte, 256) + Rdata2 := make([]byte, 0) - go func() { - for { - select { - case kkdata := <-data_buf: //如果有数据,下面打印。但是有可能ch一直没数据 - Rdata = append(Rdata, kkdata...) - //log.Println("kkdata:",kkdata) - case <-time.After(50 * time.Millisecond): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时 - // log.Println("超时") - if len(Rdata) > 4 { - readChan <- Rdata - Rdata = make([]byte, 0) - } - //strData := string(Rdata) - //Rdata = make([]byte,0) - //log.Println("Received:", strData) - - //readChan <- Rdata - //Rdata = make([]byte,0) - } - } - }() + // go func() { + // for { + // select { + // case kkdata := <-data_buf: //如果有数据,下面打印。但是有可能ch一直没数据 + // // log.Println("yunhorndeug.push.data.tcp|",kkdata) + // + // log.Println("###########################yunhorndeug.push.data.tcp.kkdata:",kkdata) + // Rdata = append(Rdata, kkdata...) + // Rdata2 = append(Rdata2,Rdata...) + // count := 0 + // for _,v := range Rdata{ + // if v==0{ + // break; + // } + // 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 + // Rdata = make([]byte, 0) + // } + // //strData := string(Rdata) + // //Rdata = make([]byte,0) + // //log.Println("Received:", strData) + // + // //readChan <- Rdata + // //Rdata = make([]byte,0) + // } + // } + // }() for { // data := make([]byte, config.SERVER_RECV_LEN) //data2 := make([]byte,256) - _, err := conn.Read(data) + reqLen, err := conn.Read(data) if err != nil { log.Println(err) 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 } +//BytesCombine 多个[]byte数组合并成一个[]byte +func BytesCombine(pBytes ...[]byte) []byte { + return bytes.Join(pBytes, []byte("")) +} + func writeConn(conn net.Conn, writeChan <-chan string, stopChan chan<- bool) { for { strData := <-writeChan diff --git a/worker.go b/worker.go index 88a20b5..f98c79c 100644 --- a/worker.go +++ b/worker.go @@ -23,6 +23,7 @@ type Device struct { } //处理通过tcp发送过来的数据 + func yunhorn_wireless(data_buf []byte) { //至少5个字节数据 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) { @@ -140,6 +138,7 @@ func yunhorn_ys_l_v1(data_buf []byte) { demoDevice.DATA["data"+strconv.Itoa(2)] = 0 demoDevice.DATA["data"+strconv.Itoa(3)] = 0 + if data_int0[0] == 0 && data_int1[0] == 0 && data_type[0] == 0 { demoDevice.DATA["data"+strconv.Itoa(8)] = data_int[0] var device Device @@ -152,16 +151,32 @@ func yunhorn_ys_l_v1(data_buf []byte) { device.Unlock() DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data8"] = data_int[0] } 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 device.Lock() device.ID = demoDevice.ID device.VERSION = demoDevice.VERSION device.ONLINE = demoDevice.ONLINE 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() + DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data7"] = data_int[0] + +// DEVICEDATAS.DATA[demoDevice.VERSION+"_1"].DATA["data7"] = device.DATA["data7"] + } device.DATA = demoDevice.DATA