From 5e8a7ce21e35b2c4d7faeede04e60b3537db2f3c Mon Sep 17 00:00:00 2001
From: 648540858 <18010473990@163.com>
Date: 星期一, 13 九月 2021 16:08:40 +0800
Subject: [PATCH] 添加utf-8解析设备信息

---
 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java                              |    3 
 web_src/src/components/DeviceList.vue                                                           |   21 +++
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java                                    |   28 +++++
 src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java                      |   14 ++
 web_src/src/components/dialog/deviceEdit.vue                                                    |  117 +++++++++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java |    2 
 sql/mysql.sql                                                                                   |    3 
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java                    |   28 +++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java   |   11 +
 src/main/resources/wvp.sqlite                                                                   |    0 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java  |   33 +++++-
 11 files changed, 244 insertions(+), 16 deletions(-)

diff --git a/sql/mysql.sql b/sql/mysql.sql
index 5524e32..90393e6 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -23,7 +23,8 @@
     updateTime    varchar(50)  not null,
     port          int          not null,
     expires       int          not null,
-    hostAddress   varchar(50)  not null
+    hostAddress   varchar(50)  not null,
+    charset       varchar(50)  not null
 );
 
 create table device_channel
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java
index 6fe63cc..01b0a12 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java
@@ -1,5 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.auth;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -14,13 +16,17 @@
 @Component
 public class RegisterLogicHandler {
 
+	private Logger logger = LoggerFactory.getLogger(RegisterLogicHandler.class);
+
 	@Autowired
 	private SIPCommander cmder;
 	
 	public void onRegister(Device device) {
-		// TODO 鍚庣画澶勭悊锛屽彧鏈夌涓�娆℃敞鍐屾椂璋冪敤鏌ヨ璁惧淇℃伅锛屽闇�鏇存柊璋冪敤鏇存柊API鎺ュ彛
-		cmder.deviceInfoQuery(device);
-		
-		cmder.catalogQuery(device, null);
+		// 鍙湁绗竴娆℃敞鍐屾椂璋冪敤鏌ヨ璁惧淇℃伅锛屽闇�鏇存柊璋冪敤鏇存柊API鎺ュ彛
+		if (device.isFirsRegister()) {
+			logger.info("[{}] 棣栨娉ㄥ唽锛屾煡璇㈣澶囦俊鎭互鍙婇�氶亾淇℃伅", device.getDeviceId());
+			cmder.deviceInfoQuery(device);
+			cmder.catalogQuery(device, null);
+		}
 	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
index cf939cf..bfbf547 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -99,6 +99,18 @@
 	 */
 	private String mediaServerId;
 
+	/**
+	 * 棣栨娉ㄥ唽
+	 */
+	private boolean firsRegister;
+
+	/**
+	 * 瀛楃闆�, 鏀寔 utf-8 涓� gb2312
+	 */
+	private String charset ;
+
+
+
 	public String getDeviceId() {
 		return deviceId;
 	}
@@ -242,4 +254,20 @@
 	public void setMediaServerId(String mediaServerId) {
 		this.mediaServerId = mediaServerId;
 	}
+
+	public boolean isFirsRegister() {
+		return firsRegister;
+	}
+
+	public void setFirsRegister(boolean firsRegister) {
+		this.firsRegister = firsRegister;
+	}
+
+	public String getCharset() {
+		return charset;
+	}
+
+	public void setCharset(String charset) {
+		this.charset = charset;
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index db5f05b..6f38e56 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -172,6 +172,7 @@
 			String deviceId = deviceIdElement.getTextTrim().toString();
 			Device device = storager.queryVideoDevice(deviceId);
 			if (device != null) {
+				rootElement = getRootElement(evt, device.getCharset());
 				if (!StringUtils.isEmpty(device.getName())) {
 					mobilePosition.setDeviceName(device.getName());
 				}
@@ -449,8 +450,11 @@
 			Element rootElement = getRootElement(evt);
 			String requestName = rootElement.getName();
 			Element deviceIdElement = rootElement.element("DeviceID");
-			String deviceId = deviceIdElement.getTextTrim().toString();
+			String deviceId = deviceIdElement.getTextTrim();
 			Device device = storager.queryVideoDevice(deviceId);
+			if (device != null ) {
+				rootElement = getRootElement(evt, device.getCharset());
+			}
 			if (requestName.equals("Query")) {
 				logger.info("鎺ユ敹鍒癉eviceInfo鏌ヨ娑堟伅");
 				FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
@@ -470,7 +474,9 @@
 				if (device == null) {
 					return;
 				}
+
 				device.setName(XmlUtil.getText(rootElement, "DeviceName"));
+
 				device.setManufacturer(XmlUtil.getText(rootElement, "Manufacturer"));
 				device.setModel(XmlUtil.getText(rootElement, "Model"));
 				device.setFirmware(XmlUtil.getText(rootElement, "Firmware"));
@@ -569,12 +575,14 @@
 
 
 			} else {
+				Device device = storager.queryVideoDevice(deviceId);
+				if (device == null) {
+					return;
+				}
+				deviceListElement = getRootElement(evt, device.getCharset()).element("DeviceList");
 				Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
 				if (deviceListIterator != null) {
-					Device device = storager.queryVideoDevice(deviceId);
-					if (device == null) {
-						return;
-					}
+
 					// 閬嶅巻DeviceList
 					while (deviceListIterator.hasNext()) {
 						Element itemDevice = deviceListIterator.next();
@@ -692,6 +700,9 @@
 			Device device = storager.queryVideoDevice(deviceId);
 			if (device == null) {
 				return;
+			}
+			if (device.getCharset() != null) {
+				rootElement = getRootElement(evt, device.getCharset());
 			}
 
 			if (rootElement.getName().equals("Notify")) {	// 澶勭悊鎶ヨ閫氱煡
@@ -816,6 +827,10 @@
 			Element rootElement = getRootElement(evt);
 			Element deviceIdElement = rootElement.element("DeviceID");
 			String deviceId = deviceIdElement.getText().toString();
+			Device device = storager.queryVideoDevice(deviceId);
+			if (device != null ) {
+				rootElement = getRootElement(evt, device.getCharset());
+			}
 			recordInfo.setDeviceId(deviceId);
 			recordInfo.setName(XmlUtil.getText(rootElement, "Name"));
 			if (XmlUtil.getText(rootElement, "SumNum")== null || XmlUtil.getText(rootElement, "SumNum") =="") {
@@ -1009,9 +1024,15 @@
 	}
 
 	private Element getRootElement(RequestEvent evt) throws DocumentException {
+
+		return getRootElement(evt, "gb2312");
+	}
+
+	private Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
+		if (charset == null) charset = "gb2312";
 		Request request = evt.getRequest();
 		SAXReader reader = new SAXReader();
-		reader.setEncoding("gbk");
+		reader.setEncoding(charset);
 		Document xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
 		return xml.getRootElement();
 	}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java
index b1c4922..4c17769 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/NotifyRequestProcessor.java
@@ -156,6 +156,7 @@
 			if (device == null) {
 				return;
 			}
+			rootElement = getRootElement(evt, device.getCharset());
 			DeviceAlarm deviceAlarm = new DeviceAlarm();
 			deviceAlarm.setDeviceId(deviceId);
 			deviceAlarm.setAlarmPriority(XmlUtil.getText(rootElement, "AlarmPriority"));
@@ -218,6 +219,9 @@
 			Element deviceIdElement = rootElement.element("DeviceID");
 			String deviceId = deviceIdElement.getText();
 			Device device = storager.queryVideoDevice(deviceId);
+			if (device != null ) {
+				rootElement = getRootElement(evt, device.getCharset());
+			}
 			Element deviceListElement = rootElement.element("DeviceList");
 			if (deviceListElement == null) {
 				return;
@@ -347,11 +351,14 @@
 		serverTransaction.sendResponse(response);
 		if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
 	}
-
 	private Element getRootElement(RequestEvent evt) throws DocumentException {
+		return getRootElement(evt, "gb2312");
+	}
+	private Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
+		if (charset == null) charset = "gb2312";
 		Request request = evt.getRequest();
 		SAXReader reader = new SAXReader();
-		reader.setEncoding("gbk");
+		reader.setEncoding(charset);
 		Document xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
 		return xml.getRootElement();
 	}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
index 4034d57..68299f2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
@@ -134,7 +134,9 @@
 					if (device == null) {
 						device = new Device();
 						device.setStreamMode("UDP");
+						device.setCharset("gb2312");
 						device.setDeviceId(deviceId);
+						device.setFirsRegister(true);
 					}
 					device.setIp(received);
 					device.setPort(rPort);
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
index c70eda3..68ad28d 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -32,6 +32,7 @@
                 "keepaliveTime," +
                 "createTime," +
                 "updateTime," +
+                "charset," +
                 "online" +
             ") VALUES (" +
                 "#{deviceId}," +
@@ -49,6 +50,7 @@
                 "#{keepaliveTime}," +
                 "#{createTime}," +
                 "#{updateTime}," +
+                "#{charset}," +
                 "#{online}" +
             ")")
     int add(Device device);
@@ -69,6 +71,7 @@
                 "<if test=\"registerTime != null\">, registerTime='${registerTime}'</if>" +
                 "<if test=\"keepaliveTime != null\">, keepaliveTime='${keepaliveTime}'</if>" +
                 "<if test=\"expires != null\">, expires=${expires}</if>" +
+                "<if test=\"charset != null\">, charset='${charset}'</if>" +
                 "WHERE deviceId='${deviceId}'"+
             " </script>"})
     int update(Device device);
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
index 02894cc..cb08ba3 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -3,6 +3,7 @@
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
@@ -22,6 +23,7 @@
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 
 import javax.sip.message.Response;
+import java.io.UnsupportedEncodingException;
 
 @Api(tags = "鍥芥爣璁惧鏌ヨ", value = "鍥芥爣璁惧鏌ヨ")
 @SuppressWarnings("rawtypes")
@@ -274,6 +276,32 @@
 	}
 
 	/**
+	 * 鏇存柊璁惧淇℃伅
+	 * @param device 璁惧淇℃伅
+	 * @return
+	 */
+	@ApiOperation("鏇存柊璁惧淇℃伅")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "device", value = "璁惧淇℃伅", required = true, dataTypeClass = Device.class)
+	})
+	@PostMapping("/device/update/")
+	public ResponseEntity<WVPResult<String>> updateDevice(Device device){
+
+		if (device != null && device.getDeviceId() != null) {
+			Device deviceInStore = storager.queryVideoDevice(device.getDeviceId());
+			if (!StringUtils.isEmpty(device.getName())) deviceInStore.setName(device.getName());
+			if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset());
+			if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId());
+			storager.updateDevice(deviceInStore);
+			cmder.deviceInfoQuery(deviceInStore);
+		}
+		WVPResult<String> result = new WVPResult<>();
+		result.setCode(0);
+		result.setMsg("success");
+		return new ResponseEntity<>(result,HttpStatus.OK);
+	}
+
+	/**
 	 * 璁惧鐘舵�佹煡璇㈣姹侫PI鎺ュ彛
 	 * 
 	 * @param deviceId 璁惧id
diff --git a/src/main/resources/wvp.sqlite b/src/main/resources/wvp.sqlite
index 228a96a..b95368d 100644
--- a/src/main/resources/wvp.sqlite
+++ b/src/main/resources/wvp.sqlite
Binary files differ
diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue
index 8a21211..7644a96 100644
--- a/web_src/src/components/DeviceList.vue
+++ b/web_src/src/components/DeviceList.vue
@@ -60,7 +60,7 @@
 							<el-button-group>
                 <el-button size="mini" icon="el-icon-video-camera-solid" v-bind:disabled="scope.row.online==0"  type="primary" @click="showChannelList(scope.row)">閫氶亾</el-button>
                 <el-button size="mini" icon="el-icon-location" v-bind:disabled="scope.row.online==0"  type="primary" @click="showDevicePosition(scope.row)">瀹氫綅</el-button>
-                <el-button size="mini" icon="el-icon-s-tools" v-bind:disabled="scope.row.online==0"  type="primary">鎺у埗</el-button>
+                <el-button size="mini" icon="el-icon-delete" type="primary" @click="edit(scope.row)">缂栬緫</el-button>
                 <el-button size="mini" icon="el-icon-delete" type="danger" v-if="scope.row.online==0"  @click="deleteDevice(scope.row)">鍒犻櫎</el-button>
 							</el-button-group>
 							</template>
@@ -76,7 +76,7 @@
 					layout="total, sizes, prev, pager, next"
 					:total="total">
 				</el-pagination>
-
+        <deviceEdit ref="deviceEdit" ></deviceEdit>
 			</el-main>
 		</el-container>
 	</div>
@@ -84,10 +84,12 @@
 
 <script>
 	import uiHeader from './UiHeader.vue'
+	import deviceEdit from './dialog/deviceEdit.vue'
 	export default {
 		name: 'app',
 		components: {
-			uiHeader
+			uiHeader,
+      deviceEdit
 		},
 		data() {
 			return {
@@ -239,6 +241,19 @@
 
         }).catch(function(e) {
         });
+      },
+      edit: function (row) {
+        console.log(row);
+        this.$refs.deviceEdit.openDialog(row, ()=>{
+          this.$refs.deviceEdit.close();
+          this.$message({
+            showClose: true,
+            message: "璁惧淇敼鎴愬姛锛岄�氶亾瀛楃闆嗗皢鍦ㄤ笅娆℃洿鏂扮敓鏁�",
+            type: "success",
+          });
+          setTimeout(this.getDeviceList, 200)
+
+        })
       }
 
 		}
diff --git a/web_src/src/components/dialog/deviceEdit.vue b/web_src/src/components/dialog/deviceEdit.vue
new file mode 100644
index 0000000..464de02
--- /dev/null
+++ b/web_src/src/components/dialog/deviceEdit.vue
@@ -0,0 +1,117 @@
+<template>
+  <div id="deviceEdit" v-loading="isLoging">
+    <el-dialog
+      title="璁惧缂栬緫"
+      width="40%"
+      top="2rem"
+      :close-on-click-modal="false"
+      :visible.sync="showDialog"
+      :destroy-on-close="true"
+      @close="close()"
+    >
+      <div id="shared" style="margin-top: 1rem;margin-right: 100px;">
+        <el-form ref="form" :rules="rules" :model="form" label-width="140px" >
+          <el-form-item label="璁惧缂栧彿" >
+            <el-input v-model="form.deviceId" disabled></el-input>
+          </el-form-item>
+
+          <el-form-item label="璁惧鍚嶇О" prop="name">
+            <el-input v-model="form.name" clearable></el-input>
+          </el-form-item>
+<!--          <el-form-item label="娴佸獟浣揑D" prop="mediaServerId">-->
+<!--            <el-select v-model="form.mediaServerId" style="float: left; width: 100%" >-->
+<!--              <el-option key="auto" label="鑷姩璐熻浇鏈�灏�" value="null"></el-option>-->
+<!--              <el-option-->
+<!--                v-for="item in mediaServerList"-->
+<!--                :key="item.id"-->
+<!--                :label="item.id"-->
+<!--                :value="item.id">-->
+<!--              </el-option>-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+
+          <el-form-item label="瀛楃闆�" prop="charset" >
+            <el-select v-model="form.charset" style="float: left; width: 100%" >
+                <el-option key="GB2312" label="GB2312" value="gb2312"></el-option>
+              <el-option key="UTF-8" label="UTF-8" value="utf-8"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <div style="float: right;">
+              <el-button type="primary" @click="onSubmit" >纭</el-button>
+              <el-button @click="close">鍙栨秷</el-button>
+            </div>
+
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import MediaServer from '../service/MediaServer'
+export default {
+  name: "deviceEdit",
+  props: {},
+  computed: {},
+  created() {},
+  data() {
+    return {
+      listChangeCallback: null,
+      showDialog: false,
+      isLoging: false,
+      hostNames:[],
+      mediaServerList: [], // 婊呬綋鑺傜偣鍒楄〃
+      mediaServerObj : new MediaServer(),
+      form: {},
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ悕绉�", trigger: "blur" }]
+      },
+    };
+  },
+  methods: {
+    openDialog: function (row, callback) {
+      console.log(row)
+      this.showDialog = true;
+      this.listChangeCallback = callback;
+      if (row != null) {
+        this.form = row;
+      }
+      this.getMediaServerList();
+    },
+    getMediaServerList: function (){
+      let that = this;
+      that.mediaServerObj.getMediaServerList((data)=>{
+        that.mediaServerList = data.data;
+      })
+    },
+    onSubmit: function () {
+      console.log("onSubmit");
+      console.log(this.form);
+      this.$axios({
+        method: 'post',
+        url:`/api/device/query/device/update/`,
+        params: this.form
+      }).then((res) => {
+        console.log(res.data)
+        if (res.data.code == 0) {
+          this.listChangeCallback()
+        }else {
+          this.$message({
+            showClose: true,
+            message: res.data.msg,
+            type: "error",
+          });
+        }
+      }).catch(function (error) {
+        console.log(error);
+      });
+    },
+    close: function () {
+      this.showDialog = false;
+      this.$refs.form.resetFields();
+    },
+  },
+};
+</script>

--
Gitblit v1.8.0