merge dpark
This commit is contained in:
commit
2d10cea853
|
@ -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": {
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
BIN
db/gateway.db
BIN
db/gateway.db
Binary file not shown.
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送数据
|
// 发送数据
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
7
main.go
7
main.go
|
@ -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
630
router.go
|
@ -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])
|
||||||
|
|
179
tcpserver.go
179
tcpserver.go
|
@ -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
|
||||||
|
|
25
worker.go
25
worker.go
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue