| admin/src/views/business/deviceDianbiao.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/business/screenBoard.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| screen/src/assets/images/default_nowarning.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| server/startsh/service_start.sh | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| server/visits/device_service/src/main/java/com/doumee/tcp/WaterElectricityUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/SensorStatusStatisticResponse.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsCarInParkDataResponse.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
admin/src/views/business/deviceDianbiao.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,186 @@ <template> <TableLayout :permissions="['business:device:query']"> <!-- æç´¢è¡¨å --> <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> <el-form-item title="åç§°" prop="name"> <el-input v-model="searchForm.name" placeholder="请è¾å ¥åç§°" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item title="æ è¯ç¬¦" prop="no"> <el-input v-model="searchForm.no" placeholder="请è¾å ¥è®¾å¤æ è¯ç¬¦" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item title="设å¤å·" prop="doorNo"> <el-input v-model="searchForm.doorNo" placeholder="请è¾å ¥è®¾å¤å·" @keypress.enter.native="search"></el-input> </el-form-item> <section> <el-button type="primary" @click="search">æç´¢</el-button> <el-button @click="reset">éç½®</el-button> </section> </el-form> <!-- è¡¨æ ¼åå页 --> <template v-slot:table-wrap> <ul class="toolbar" v-permissions="['business:device:create', 'business:device:delete']"> <li><el-button type="primary" @click="$refs.operaDeviceWindow.open('æ°å»ºçµè¡¨')" icon="el-icon-plus" v-permissions="['business:device:create']">æ°å»º</el-button></li> <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:device:delete']">å é¤</el-button></li> </ul> <el-table :height="tableHeightNew" v-loading="isWorking.search" :data="tableData.list" stripe > <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="åç§°" fixed min-width="150" align="center"></el-table-column> <el-table-column prop="no" label="çµè¡¨å°åå" min-width="100" align="center" ></el-table-column> <el-table-column prop="doorNo" label="设å¤å·" min-width="120" align="center" show-overflow-tooltip></el-table-column> <el-table-column prop="channelNo" label="å¼å ³åºå·" align="center" min-width="100"></el-table-column> <el-table-column prop="manufature" label="åå" align="center" min-width="100" show-overflow-tooltip></el-table-column> <el-table-column prop="regionPathName" align="center" min-width="100" label="æå¨ä½ç½®"></el-table-column> <el-table-column prop="ip" label="IP" min-width="150" align="center" show-overflow-tooltip ></el-table-column> <el-table-column prop="port" label="端å£" align="center" ></el-table-column> <el-table-column prop="isUsed" label="æ¯å¦ä½¿ç¨"> <template slot-scope="{row}"> <el-switch @change="changeUsed($event, row)" v-model="row.isUsed" active-color="#13ce66" inactive-color="#ff4949" :active-value="0" :inactive-value="1"> </el-switch> </template> </el-table-column> <el-table-column prop="editDate" label="æè¿æ´æ°æ¶é´" align="center" min-width="150"></el-table-column> <el-table-column label="æä½" align="center" min-width="280" fixed="right" > <template slot-scope="{row}"> <el-button type="text" @click="$refs.operaDeviceWindow.open('ç¼è¾çµè¡¨', row)" icon="el-icon-edit" v-permissions="['business:device:update']">ç¼è¾</el-button> <el-button type="text" @click="$refs.operaDeviceDataWindow.open('æ¥ççµè¡¨æ°æ®', row)" icon="el-icon-view" v-permissions="['business:device:update']">æ°æ®</el-button> <el-button type="text" @click="send(row,1)" icon="el-icon-circle-check" v-permissions="['business:device:update']">å¼é¸</el-button> <el-button type="text" class="red" @click="send(row,0)" icon="el-icon-circle-close" v-permissions="['business:device:update']">å ³é¸</el-button> <el-button type="text" class="red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:device:delete']">å é¤</el-button> </template> </el-table-column> </el-table> <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination" > </pagination> </template> <el-dialog :visible.sync="visibleSend" style="z-index: 100000" append-to-body width="50%" height="50%" :title="'æ§å¶çµè¡¨-ã'+ form.name+'ã'" > <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="æ§è¡æä½ï¼" > <b class="green" v-if="form.status ===1">å¼é¸</b> <b class="red" v-else>å ³é¸</b> </el-form-item> <el-form-item label="å¼å ³åºå·" prop="channelNo"> <el-input v-model="form.channelNo" type="text" placeholder="请è¾å ¥å¼å ³åºå· ï¼å¤ä¸ªç¨è±æéå·éå¼ï¼å¦ 1,2,3" v-trim/> </el-form-item> <p class="tip-warn" style="width: 100%;"><i class="el-icon-warning"></i>设å¤åå§å¼å ³åºå·ä¿¡æ¯ï¼{{form.channelNo1}}ï¼æ§å¶å¤ä¸ªå¼å ³ï¼è¯·ç¨è±æéå·éå¼ï¼å¦ 1,2;</p> </el-form> <template v-slot:footer > <el-button @click="sendAction()" type="primary" v-if="form.status === 1" :loading="isWorkSending">确认å¼é¸</el-button> <el-button @click="sendAction()" type="danger" v-if="form.status !== 1" :loading="isWorkSending">ç¡®è®¤å ³é¸</el-button> <el-button @click="sendClose()">è¿å</el-button> </template> </el-dialog> <!-- æ°å»º/ä¿®æ¹ --> <OperaDeviceDuanluqiWindow ref="operaDeviceWindow" @success="handlePageChange"/> <OperaDeviceDataListWindow ref="operaDeviceDataWindow" @success="handlePageChange"/> </TableLayout> </template> <script> import BaseTable from '@/components/base/BaseTable' import TableLayout from '@/layouts/TableLayout' import Pagination from '@/components/common/Pagination' import OperaDeviceDataListWindow from '@/components/business/OperaDeviceDataListWindow' import OperaDeviceDuanluqiWindow from '@/components/business/OperaDeviceDuanluqiWindow' export default { name: 'DeviceDuanluqi', extends: BaseTable, components: { TableLayout, Pagination, OperaDeviceDuanluqiWindow ,OperaDeviceDataListWindow}, data () { return { // æç´¢ searchForm: { doorNo: '', no: '', name: '', type: 6 }, isWorkSending: false, form: { id: '', name: '', channelNo: '', channelNo1: '', status: null }, visibleSend: false, options: [], rules: { channelNo: [{ required: true, message: '请è¾å ¥éè¦æä½çå¼å ³åºå·', trigger: 'blur' }], } } }, created () { this.config({ module: '设å¤ä¿¡æ¯è¡¨', api: '/business/device', 'field.id': 'id', 'field.main': 'id' }) this.search() }, methods: { changeUsed (e, row) { this.api.updateUsedById({ id: row.id, isUsed: e }) }, showPassward (row) { if (!row.showPwd) { this.$set(row, 'showPwd', true) } else { this.$set(row, 'showPwd', false) } }, sendAction () { if (!this.form.channelNo) { return } this.$dialog.actionConfirm('确认è¿è¡çµè¡¨ã' + (this.form.status === 1 ? 'å¼é¸' : 'å ³é¸') + 'ãæä½åï¼', 'æä½ç¡®è®¤æé') .then(() => { this.isWorkSending = true this.api.duanluqiCmd(this.form) .then(res => { this.$tip.apiSuccess(res || 'è¯·æ±æå') this.sendClose() }) .catch(e => { }) .finally(() => { this.isWorkSending = false }) }) .catch(() => {}) }, send (row, type) { this.visibleSend = true this.form = { id: row.id, name: row.name, channelNo: row.channelNo, status: type ,channelNo1:row.channelNo} }, sendClose () { this.visibleSend = false this.isWorkSending = false this.form = { id: '', name: '', channelNo: '', status: '',channelNo1:'' } } } } </script> admin/src/views/business/screenBoard.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,328 @@ <template> <div class="main_app1" > <div class="main_head"> <div class="main_head_bottom"> <div class="main_head_item blue"> <span :class="index==0?'active':''" @click="showPage('LogisticsCenter',0)">æ°æºæå管æ§</span> </div> <div class="main_head_item red"> <span :class="index==1?'active':''" @click="showPage('LogisticsEfficiency',1)">è°åº¦è½æè·è¸ª</span> </div> <div class="main_head_item yellow"> <span :class="index==2?'active':''" @click="showPage('TaskEfficiency',2)">ä½ä¸æè½ç»ç¹</span> </div> <div class="main_head_item orange"> <span :class="index==3?'active':''" @click="showPage('SecurityControl',3)">æºè½å®é²ç®¡æ§</span> </div> <div class="main_head_item darkBlue"> <span :class="index==4?'active':''" @click="showPage('FireFighting',4)">æºæ §æ¶é²ç®¡æ§</span> </div> <div class="main_head_item yellow"> <span :class="index==5?'active':''" @click="showPage('EnergyConsum',5)">绿è²ä½ç¢³è¿è¥</span> </div> </div> </div> <div class="main_table"> <div style="display: block; position: fixed;right: 60px;bottom: 60px;"><el-button icon="el-icon-view" style="background : #002138;border: #002138;color: white;" @click="newWIn">æ°çªå£æå¼</el-button></div> <iframe :src="pageUrl" width="100%" style="min-height: 900px;"></iframe> </div> </div> </template> <script> import BaseOpera from '@/components/base/BaseOpera'; export default { name: 'screenBoard', extends: BaseOpera, data () { return { prefix: process.env.VUE_APP_SCREEN_URL_PREFIX, pageUrl: process.env.VUE_APP_SCREEN_URL_PREFIX, index: 0, pages: [] } }, mounted () { }, methods: { showPage (url,index) { this.index = index this.pageUrl = this.prefix + url // window.open(this.prefix + url) }, newWIn () { window.open(this.pageUrl) } } } </script> <style lang="scss" scoped> .main_app1 { width: 100%; height: calc(100% - 44px); overflow-y: auto; overflow-x: hidden; padding: 15px; box-sizing: border-box; background-color: #F4F7FC; .main_head { width: 100%; display: flex; align-items: center; flex-direction: column; margin-bottom: 10px; background-color: #ffffff; padding: 20px; box-sizing: border-box; .main_head_title { width: 100%; display: flex; align-items: center; margin-bottom: 20px; span { font-weight: 500; font-size: 18px; color: #222222; margin-right: 30px; } } .main_head_bottom { width: 100%; display: flex; align-items: center; justify-content: space-between; .blue { border-left: 8px solid #12BB8B; } .red { border-left: 8px solid #F6CF46; } .yellow { border-left: 8px solid #5DC9FB; } .orange { border-left: 8px solid #FF9E56; } .darkBlue { border-left: 8px solid #6B6EFF; } .active{ font-size: 18px !important; font-weight: 800 !important; color: #5DC9FB !important; } .main_head_item { width: 19%; height: 60px; display: flex; flex-direction: column; align-items: center; justify-content: center; cursor: pointer; box-sizing: border-box; border-radius: 5px; background-color: #F4F7FC; span { &:nth-child(1) { font-weight: 600; font-size: 16px; color: #222222; } &:nth-child(2) { font-weight: 400; font-size: 14px; color: #222222; } } } } } .main_table { display: flex; align-items: flex-start; justify-content: space-between; margin-top: 10px; .main_table_list { background-color: #ffffff; padding: 20px; box-sizing: border-box; width: 69%; .title { display: flex; align-items: center; span { font-weight: 500; font-size: 18px; color: #222222; } } .list_wu { width: 100%; height: 100px; line-height: 100px; text-align: center; font-size: 16px; color: #222222; } .list_head { width: 100%; height: 50px; display: flex; align-items: center; background-color: #F7F7F7; border-left: 1px solid #DFE2E8; border-top: 1px solid #DFE2E8; margin-top: 15px; .list_head_item { flex: 1; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 13px; color: #222222; font-weight: 500; border-right: 1px solid #DFE2E8; } } .table_box { width: 100%; border-bottom: 1px solid #DFE2E8; .list_content { width: 100%; height: 50px; display: flex; align-items: center; border-left: 1px solid #DFE2E8; border-top: 1px solid #DFE2E8; .list_head_item { flex: 1; height: 100%; display: flex; border-right: 1px solid #DFE2E8; align-items: center; justify-content: center; font-size: 13px; color: #222222; } } } } .main_table_list1 { margin-left: 10px; width: 30%; padding: 20px; box-sizing: border-box; flex-shrink: 0; background-color: #ffffff; .title { font-weight: 500; font-size: 18px; color: #222222; } .list_wu { width: 100%; height: 100px; line-height: 100px; text-align: center; font-size: 16px; color: #222222; } .list_head { width: 100%; height: 50px; display: flex; align-items: center; background-color: #F7F7F7; border-left: 1px solid #DFE2E8; border-top: 1px solid #DFE2E8; margin-top: 15px; .list_head_item { flex: 1.8; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 13px; color: #222222; font-weight: 500; border-right: 1px solid #DFE2E8; &:last-child { flex: 1; } } } .table_box { width: 100%; border-bottom: 1px solid #DFE2E8; .list_content { width: 100%; height: 50px; display: flex; align-items: center; border-left: 1px solid #DFE2E8; border-top: 1px solid #DFE2E8; .list_head_item { flex: 1.8; height: 100%; display: flex; align-items: center; border-right: 1px solid #DFE2E8; justify-content: center; text-align: center; font-size: 13px; color: #222222; &:last-child { flex: 1; } } } } } } .main_content { display: flex; align-items: center; justify-content: space-between; height: 350px; .title { font-weight: 500; font-size: 18px; color: #222222; } .type_wrap { flex: 1; height: 100%; background-color: #ffffff; padding: 20px; box-sizing: border-box; /*border-right: 12px solid #f7f7f7;*/ .echart1 { width: 100%; height: 100%; margin-top: 18px; } } .dept_wrap { width: 520px; flex-shrink: 0; height: 100%; background-color: #ffffff; padding: 20px; box-sizing: border-box; margin-left: 10px; #echart2 { width: 100%; height: 100%; } } } } </style> screen/src/assets/images/default_nowarning.png
server/startsh/service_start.sh
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ #!/bin/bash killall java redis-server & /usr/local/nginx/sbin/nginx /usr/local/nacos/nacos/bin/startup.sh -m standalone nohup java -jar /usr/local/jars/system_gateway.jar > /dev/null 2>&1 & nohup java -jar /usr/local/jars/admin_timer.jar > /dev/null 2>&1 & nohup java -jar /usr/local/jars/system_timer.jar > /dev/null 2>&1 & nohup java -jar /usr/local/jars/admin_interface.jar > /dev/null 2>&1 & nohup java -jar /usr/local/jars/meeting_admin.jar > /dev/null 2>&1 & server/visits/device_service/src/main/java/com/doumee/tcp/WaterElectricityUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,507 @@ package com.doumee.tcp; import com.alibaba.fastjson.JSONObject; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.Socket; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; public class WaterElectricityUtil { private static double parseBcdToDouble(byte[] bcdBytes) { StringBuilder sb = new StringBuilder(); for (byte b : bcdBytes) { sb.append(String.format("%02X", b)); } try { return Double.parseDouble(sb.toString()); } catch (NumberFormatException e) { return 0.0; } } private static byte[] reverseAddress(String address) { byte[] result = new byte[6]; for (int i = 0; i < 6; i++) { if (i * 2 + 1 < address.length()) { String hex = address.substring(i * 2, Math.min((i + 1) * 2, address.length())); result[i] = (byte) Integer.parseInt(hex, 16); } } return result; } private static byte calculateChecksum(byte[] data, int offset, int length) { int sum = 0; for (int i = offset; i < offset + length; i++) { sum += data[i] & 0xFF; } return (byte) (sum & 0xFF); } private static byte[] hexStringToByteArray(String hex) { int len = hex.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16)); } return data; } public static byte calcCS(byte[] data) { int sum = 0; for (byte b : data) { sum += b & 0xFF; } return (byte) (sum & 0xFF); } public static byte[] getRequestParam(int feCount, byte[] address, byte control, byte[] data) throws IOException { ///FEFEFE 68 999999999999 68 01 02 65 F3C1 16 // byte b = (byte) 0xFE; // byte[] msg = {(byte) 0xFE,0x68}; ByteArrayOutputStream frame = new ByteArrayOutputStream(); for (int i = 0; i < feCount; i++) { frame.write(0xFE); } // 2. 帧起å§ç¬¦ frame.write(0x68); // 3. å°åå frame.write(address); // 4. 忬¡å¸§èµ·å§ç¬¦ frame.write(0x68); // 5. æ§å¶ç frame.write(control); // 6. æ°æ®é¿åº¦ frame.write(data.length); // 7. æ°æ®å frame.write(data); // 8. è®¡ç® CSï¼ä»ç¬¬ä¸ä¸ª 68 å¼å§ï¼ byte[] csData = frame.toByteArray(); int start = feCount; // 第ä¸ä¸ª 68 çä½ç½® byte cs = calcCS(Arrays.copyOfRange(csData, start, csData.length)); frame.write(cs); // 9. ç»æç¬¦ frame.write(0x16); return frame.toByteArray(); } private static byte[] readDeviceData(String ip, int port, byte[] data) { Socket socket = null; try { socket = new Socket(ip, port); socket.setSoTimeout(5000); java.io.OutputStream out = socket.getOutputStream(); java.io.InputStream in = socket.getInputStream(); out.write(data); out.flush(); // 读åååº byte[] buffer = new byte[2048]; int bytesRead = in.read(buffer); byte[] response = Arrays.copyOf(buffer, bytesRead); // è§£æååºæ°æ® return response; } catch (Exception e) { // e.printStackTrace(); throw new RuntimeException("Failed to read from device", e); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { } } } } private static String bytesToHex(byte[] bytes) { StringBuilder hexString = new StringBuilder(); for (byte b : bytes) { String hex = String.format("%02X", b & 0xFF); hexString.append(hex); } return hexString.toString(); } /** * å°12ä½åè¿å¶å°å转æ¢ä¸º6åèBCDå°ç«¯åºå°å * * @param decimalAddress 12ä½åè¿å¶å°åå符串 * @return 6åèçBCDå°åï¼å°ç«¯åºï¼ */ private static byte[] convertToBCDAddress(String decimalAddress) { // 1. éªè¯è¾å ¥ if (decimalAddress == null || decimalAddress.length() != 12) { throw new IllegalArgumentException("å°åå¿ é¡»æ¯12ä½åè¿å¶æ°"); } if (!decimalAddress.matches("\\d{12}")) { throw new IllegalArgumentException("å°åå¿ é¡»å ¨é¨æ¯æ°å"); } // 2. åå¤ç»ææ°ç»ï¼6åèï¼ byte[] result = new byte[6]; // 3. ä»å³åå·¦æ¯2ä½ä¸ç»å¤çï¼å°ç«¯åºï¼ for (int i = 0; i < 6; i++) { // 计ç®å¨å符串ä¸çä½ç½®ï¼ä»å³åå·¦ï¼ int strIndex = 10 - (i * 2); // å 为è¦å两ä½ï¼æä»¥æ¯10,8,6,4,2,0 String twoDigits = decimalAddress.substring(strIndex, strIndex + 2); // å°ä¸¤ä½åè¿å¶æ°è½¬æ¢ä¸ºBCDåè // ä¾å¦ï¼"25" -> 0x25 result[i] = (byte) Integer.parseInt(twoDigits, 16); } // 注æï¼ä¸é¢ç循ç¯é¡ºåºå·²ç»æ¯å°ç«¯åºï¼result[0]åçæ¯æä½ä¸¤ä½ return result; } private static String subByte(String value, byte sub) { byte b = (byte) Integer.parseInt(value, 16); int result = (b & 0xFF) - (sub & 0xFF); // ç¡®ä¿ç»æå¨0-255èå´å ï¼å¤çè´æ°ï¼ if (result < 0) { result += 256; } String hexResult = String.format("%02X", result & 0xFF); return hexResult; } private static String[] parseSub33Reverse(String msg, int n) { //33333333 3333 String[] nArr = new String[n]; byte _33 = 0x33; for (int i = 0; i < n; i++) { int index = i * 2; String twoDigits = msg.substring(index, index + 2); String hexResult = subByte(twoDigits, _33); // åååå¨ï¼nArr[n - i - 1] å®ç°å转 nArr[n - i - 1] = hexResult; } return nArr; } public static Map<String, Object> water(String ip, int port, String address) throws IOException { byte[] address_buf = convertToBCDAddress(address); byte control = 0x01; byte[] data = {0x43, (byte) 0xC3}; byte[] bufReq = getRequestParam(3, address_buf, control, data); byte[] resp = readDeviceData(ip, port, bufReq); String hex = bytesToHex(resp); //FEFEFE6899254652010068810843C3333433333333E916 // System.out.println(hex); String msg = hex.substring(30, 30 + 8 + 4); String[] nArr = parseSub33Reverse(msg, 4); Double total = strArrNum(nArr); Map<String, Object> r = new HashMap<>(); r.put("total", total); msg = hex.substring(40, 40 + 2); byte sub = 0x33; String hexResult = subByte(msg, sub); String v = hexToBinary(hexResult); /** * Y0.B0ãåå¨å¨ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B1ãéé¨ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B2ãä¿¡å·ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B3ãçµæ± ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B4ãä¿çï¼ * Y0.B5ãä¿çï¼ * Y0.B6ãæ°´è¡¨éè®¯ç¶æï¼ 1:æ é,0:æ£å¸¸ï¼ï¼ * Y0.B7ãéé¨å¼å ³ç¶æ (1: å,0:å¼)ï¼ * 注æï¼ç¶æä½æ æ¶ä¸º 0ï¼æ£å¸¸ï¼ * 红è²ï¼æ è®°å¿ç´è¯»è¡¨çç¶æ */ r.put("status", v); return r; } private static void electricityTotal(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException { byte control = 0x11; byte[] data = {0x33, 0x33, 0x33, 0x33}; byte[] bufReq = getRequestParam(4, addressBuf, control, data); byte[] respBuf = readDeviceData(ip, port, bufReq); String resp = bytesToHex(respBuf); String msg = resp.substring(28 + 8, 28 + 8 + 8); String[] nArr = parseSub33Reverse(msg, 4); Double total = strArrNum(nArr); map.put("total", total); } private static void electricityStatus(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException { byte control = 0x11; byte[] data = {0x36, 0x38, 0x33, 0x37}; byte[] bufReq = getRequestParam(4, addressBuf, control, data); byte[] respBuf = readDeviceData(ip, port, bufReq); String resp = bytesToHex(respBuf); String msg = resp.substring(36, 36 + 4); System.out.println(resp); String[] nArr = parseSub33Reverse(msg, 2); String status = hexToBinary1(nArr); // String resp = "FEFEFEFE 68 615121010000 68 91 06 36383337 3333 7916"; map.put("status", status); } private static void electricityTime(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException { byte control = 0x11; byte[] data = {0x3F, 0x34, 0x33, 0x37}; byte[] bufReq = getRequestParam(4, addressBuf, control, data); byte[] respBuf = readDeviceData(ip, port, bufReq); String resp = bytesToHex(respBuf); String msg = resp.substring(36, 36 + 14); // System.out.println(msg); String[] nArr = parseSub33Reverse(msg, 7); String ts = hexToBinary1(nArr); String time = "20"+ts.substring(0,6)+ts.substring(8); Date date = getDateByStr(time); // String resp = "FEFEFEFE 68 615121010000 68 91 06 36383337 3333 7916"; map.put("currentTime", formatData(date)); } public static Date getDateByStr(String date) { TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai"); if(date!=null ){ int i = date.indexOf("+"); if(i >0){ date = date.substring(0,i); } } DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); df.setTimeZone(tz); Date dates = null; try { dates = df.parse(date); } catch (Exception e) { e.printStackTrace(); } return dates; } public static String formatData(Date date) { DateFormat df = new SimpleDateFormat("yyyyå¹´MMæddæ¥HHæ¶mmåssç§"); try { return df.format(date); } catch (Exception e) { } return null; } public static Map<String, Object> electricity(String ip, int port, String address) throws IOException { Map<String, Object> r = new HashMap<>(); byte[] addressBuf = convertToBCDAddress(address); electricityTotal(ip, port, addressBuf, r); electricityStatus(ip, port, addressBuf, r); electricityTime(ip, port, addressBuf, r); return r; } private static String hexToBinary(String hex) { StringBuilder sb = new StringBuilder(); for (char c : hex.toCharArray()) { int val = Integer.parseInt(String.valueOf(c), 16); sb.append(String.format("%4s", Integer.toBinaryString(val)).replace(' ', '0')); } return sb.toString(); } private static String hexToBinary(String[] hexArr) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < hexArr.length; i++) { sb.append(hexToBinary(hexArr[i])); } return sb.toString(); } private static String hexToBinary1(String[] hexArr) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < hexArr.length; i++) { sb.append(hexArr[i]); } return sb.toString(); } private static String addHex(String hex1, String hex2) { int num1 = Integer.parseInt(hex1.replace("0x", ""), 16); int num2 = Integer.parseInt(hex2.replace("0x", ""), 16); int sum = num1 + num2; return "0x" + Integer.toHexString(sum).toUpperCase(); } private static void testWater() throws IOException { //"00000152462599"; 000152462599 //FEFEFE 68 999999999999 68 01(C) 02(L) 65(DI0) F3(DI1) C1(CSæ ¡éªç ) 16(ç»æç¬¦) //FEFEFE6899254652010068010243C33016 //FEFEFE6899254652010068810843C3333333333333E816 // FEFEFE6899254652010068810843C3333333333333E816 String ip = "192.168.1.78"; int port = 1030; // DeviceData d = readDeviceData(ip, port, "00000152462599"); // System.out.println(d); // String address = "000152462599"; String address = "000152462599"; //00000152462599 byte[] address_buf = convertToBCDAddress(address); // byte[] address_buf = hexStringToByteArray(address); // System.out.println(buf); /** * * FEFEFE 68 000152462599 68010243C33016 * FEFEFE 68 992546520100 68010243C33016 */ byte control = 0x01; byte[] data = {0x43, (byte) 0xC3}; byte[] datas = getRequestParam(3, address_buf, control, data); System.out.println(bytesToHex(datas)); System.out.println("FEFEFE6899254652010068010243C33016"); // datas = hexStringToByteArray("FEFEFE6899254652010068010243C33016"); byte[] resp = readDeviceData(ip, port, datas); String r = bytesToHex(resp); System.out.println(r); /** * * FEFEFE 68 992546520100 68 01 02 43C3 30 16 * FEFEFE 68 992546520100 68 81 08 43C3 33333333 3333 E8 16 */ // String r = "FEFEFE6899254652010068810843C3333333333333E816"; String msg = r.substring(30, 30 + 8 + 4); System.out.println(msg); String[] nArr = parseSub33Reverse(msg, 4); System.out.println(strArrNum(nArr)); // byte d10 = 0x10; // byte add = 0x33; // String hex = String.format("%02X", (d10 + add) & 0xFF); // System.out.println(hex); // r = addHex("0x10", "0x33"); // System.out.println(r); // // r = addHex("0x90", "0x33"); // System.out.println(r); msg = r.substring(40, 40 + 2); System.out.println(msg); byte sub = 0x33; String hexResult = subByte(msg, sub); String v = hexToBinary(hexResult); System.out.println(v); } /** * æåä¸ä½æ¯å°æ°ç¹ * * @param nArr * @return */ private static Double strArrNum(String[] nArr) { if (nArr == null || nArr.length == 0) { return 0.0; } // å°ææé¨åæ¼æ¥èµ·æ¥ StringBuilder sb = new StringBuilder(); for (int i = 0; i < nArr.length; i++) { sb.append(nArr[i]); } // å¨éå½ä½ç½®æå ¥å°æ°ç¹ String combined = sb.toString(); int totalLength = combined.length(); int decimalLength = nArr[nArr.length - 1].length(); // æå ¥å°æ°ç¹ String numberStr = combined.substring(0, totalLength - decimalLength) + "." + combined.substring(totalLength - decimalLength); return Double.parseDouble(numberStr); } public static void electricityTest() throws IOException { //000001215161 // FEFEFEFE 68 615121010000 68 11 04 33333333 8516 // FEFEFEFE6861512101000068910833333333A93333334B16 // FEFEFEFE6861512101000068910833333333AC3333334E16 String ip = "192.168.1.78"; int port = 1030; String address = "000001215161"; byte[] addressBuf = convertToBCDAddress(address); // byte control = 0x11; // byte[] data = {0x33, 0x33, 0x33, 0x33}; //// // byte[] bufReq = getRequestParam(4, addressBuf, control, data); //// String req = bytesToHex(bufReq); ////// String param = "FEFEFE68615121010000681104333333338516"; //// System.out.println(req); ////// System.out.println(param); //// byte[] buf = hexStringToByteArray(param); // byte[] respBuf = readDeviceData(ip, port, bufReq); // String hex = bytesToHex(respBuf); //// System.out.println(hex); // String resp = "FEFEFEFE6861512101000068910833333333AC3333334E16"; //// FEFEFEFE68615121010000 68 91 08 33333333 A9 333333 4B16 // // String msg = resp.substring(28, 28 + 8); // System.out.println(msg); // // String[] nArr = parseSub33Reverse(msg, 4); // System.out.println(strArrNum(nArr)); // msg = resp.substring(28 + 8, 28 + 8 + 8); // System.out.println(msg); // // nArr = parseSub33Reverse(msg, 4); //// parseSub33Reverse // System.out.println(strArrNum(nArr)); // String msgStatus = "FEFEFEFE 68 379707010000 68 11 04 36383337 9316"; // String msgStatus = "FEFEFEFE68379707010000681104363833379316"; // byte control = 0x11; // byte[] data = {0x36, 0x38, 0x33, 0x37}; // byte[] bufReq = getRequestParam(4, addressBuf, control, data); // String req = bytesToHex(bufReq); // System.out.println(req); // System.out.println(msgStatus); // byte[] respBuf = readDeviceData(ip, port, bufReq); // String resp = bytesToHex(respBuf); // System.out.println(resp); // FEFEFEFE 68 615121010000 68 91 06 36383337 3333 79 16 // FEFEFEFE 68 615121010000 68 91 06 36383337 3333 79 16 String resp = "FEFEFEFE686151210100006891063638333733337916"; String msg = resp.substring(36, 36 + 4); System.out.println(msg); String[] nArr = parseSub33Reverse(msg, 2); // System.out.println(strArrNum(nArr)); String v = hexToBinary(nArr); v="0000000000010000"; System.out.println(v); System.out.println(v.charAt(11)); } public static void main(String[] args) throws IOException { // testWater(); // electricityTest(); water("192.168.1.78",1030,"000152462599"); Map<String, Object> map = electricity("192.168.1.78", 1030, "000001215161"); System.out.println(JSONObject.toJSONString(map)); // FEFEFE6899254652010068810 843C3333433333333 E9 16 // FEFEFE6899254652010068810 84 3C3333433333333E916 // Map<String, Object> map1 = water("192.168.1.78", 1030, "000152462599"); // System.out.println(JSONObject.toJSONString(map1)); } } server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/SensorStatusStatisticResponse.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.doumee.core.haikang.model.param.respose; import lombok.Data; @Data public class SensorStatusStatisticResponse { private Integer sensorNum ;// Number false ä¼ æå¨æ»æ° private Integer sensorMainNum ;// Number false ä¼ æå¨ç»´ä¿æ° private Integer sensorMainRate ;// Number false ä¼ æå¨ç»´ä¿ç private Integer sensorMainMonthNum ;// Number false ä¼ æå¨æ¬ææ°å¢ç»´ä¿æ° } server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsCarInParkDataResponse.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.doumee.core.wms.model.response; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; import java.util.List; /** * @author æ±è¹è¹ * @date 2023/11/23 14:03 */ @Data @ApiModel("WMSæ¥å£å¤çè·åè½¦è¾æ¯å¦å ¥åè¿ådataåæ°") public class WmsCarInParkDataResponse { @ApiModelProperty(value = "å ¥åæ¶é´" ,example = "1") private Date eventDate; @ApiModelProperty(value = "车çå·" ,example = "1") private String carNo; @ApiModelProperty(value = "æ¯å¦å¨å" ,example = "1") private Boolean inPark; }