懒羊羊
2024-01-13 5f3a2e98c54ce815f270d149872b2b3d0d008ff0
接口websocket
已修改5个文件
已添加5个文件
448 ■■■■ 文件已修改
jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-framework/src/main/java/com/jcdm/framework/websocket/PostController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-framework/src/main/java/com/jcdm/framework/websocket/WebSocketServer.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-main/pom.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-main/src/main/java/com/jcdm/main/sc/stationConf/controller/ScStationConfController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-main/src/main/java/com/jcdm/main/util/IpInfoUtils.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-main/src/main/java/com/jcdm/main/webservice/Item.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-main/src/main/java/com/jcdm/main/webservice/ItemList.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-main/src/main/java/com/jcdm/main/webservice/test.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-ui/src/views/main/kb/stationTerminal/index.vue 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@
                // è¿‡æ»¤è¯·æ±‚
                .authorizeRequests()
                // å¯¹äºŽç™»å½•login æ³¨å†Œregister éªŒè¯ç captchaImage å…è®¸åŒ¿åè®¿é—®
                .antMatchers("/login", "/register", "/captchaImage","/websocket/**").permitAll()
                .antMatchers("/login", "/register", "/captchaImage","/websocket/**","/postWebsocket/**").permitAll()
                // é™æ€èµ„源,可匿名访问
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
jcdm-framework/src/main/java/com/jcdm/framework/websocket/PostController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.jcdm.framework.websocket;
import com.jcdm.common.core.domain.AjaxResult;
import com.jcdm.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import java.util.List;
import java.util.Map;
@RestController("/socketController")
public class PostController {
    @GetMapping("/postWebsocket")
    public AjaxResult list(@PathParam("locationCode") String locationCode)
    {
        Map<String, Session> map = WebSocketUsers.getUsers();
        //1、监听kepserver地址 æ¯”如:OP.OP1010.START ã€OP.OP1020.START ã€OP.OP1030.START
        //2、当其中一个点位发生变化时,判断该点位是哪一个工位
        //
        WebSocketUsers.sendMessageToUserByText(map.get(locationCode), "1");
        return AjaxResult.success();
    }
}
jcdm-framework/src/main/java/com/jcdm/framework/websocket/WebSocketServer.java
@@ -6,6 +6,7 @@
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -17,7 +18,7 @@
 * @author ruoyi
 */
@Component
@ServerEndpoint("/websocket/message")
@ServerEndpoint("/websocket/message/{userId}")
public class WebSocketServer
{
    /**
@@ -32,11 +33,14 @@
    private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);
    /**接收userId*/
    private String userId="";
    /**
     * è¿žæŽ¥å»ºç«‹æˆåŠŸè°ƒç”¨çš„方法
     */
    @OnOpen
    public void onOpen(Session session) throws Exception
    public void onOpen(Session session, @PathParam("userId") String userId) throws Exception
    {
        boolean semaphoreFlag = false;
        // å°è¯•èŽ·å–信号量
@@ -51,7 +55,8 @@
        else
        {
            // æ·»åŠ ç”¨æˆ·
            WebSocketUsers.put(session.getId(), session);
//            WebSocketUsers.put(session.getId(), session);
            WebSocketUsers.put(userId, session);
            LOGGER.info("\n å»ºç«‹è¿žæŽ¥ - {}", session);
            LOGGER.info("\n å½“前人数 - {}", WebSocketUsers.getUsers().size());
            WebSocketUsers.sendMessageToUserByText(session, "连接成功");
@@ -98,6 +103,6 @@
    public void onMessage(String message, Session session)
    {
        String msg = message.replace("ä½ ", "我").replace("吗", "");
        WebSocketUsers.sendMessageToUserByText(session, msg);
//        WebSocketUsers.sendMessageToUserByText(session, msg);
    }
}
jcdm-main/pom.xml
@@ -42,6 +42,22 @@
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.4</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
        </dependency>
    </dependencies>
</project>
jcdm-main/src/main/java/com/jcdm/main/sc/stationConf/controller/ScStationConfController.java
@@ -1,7 +1,10 @@
package com.jcdm.main.sc.stationConf.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jcdm.main.util.IpInfoUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -106,9 +109,10 @@
     * èŽ·å–工位终端配置详细信息
     */
    @GetMapping(value = "/getIpv4")
    public AjaxResult getIpv4()
    public AjaxResult getIpv4(HttpServletRequest request)
    {
        return success(scStationConfService.getIpv4());
        return success(IpInfoUtils.getIpAddr(request));
    }
}
jcdm-main/src/main/java/com/jcdm/main/util/IpInfoUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.jcdm.main.util;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
 * ip工具类
 *
 * @author fengshuonan
 * @Date 2018/9/27 ä¸Šåˆ10:47
 */
public class IpInfoUtils {
    /**
     * èŽ·å–客户端IP地址
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            if (ip.equals("127.0.0.1")) {
                //根据网卡取本机配置的IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                ip = inet.getHostAddress();
            }
        }
        // å¯¹äºŽé€šè¿‡å¤šä¸ªä»£ç†çš„情况,第一个IP为客户端真实IP,多个IP按照','分割
        if (ip != null && ip.length() > 15) {
            if (ip.indexOf(",") > 0) {
                ip = ip.substring(0, ip.indexOf(","));
            }
        }
        if ("0:0:0:0:0:0:0:1".equals(ip)) {
            ip = "127.0.0.1";
        }
        return ip;
    }
    /**
     * èŽ·å–客户端主机名称
     */
    public static String getHostName() {
        try {
            return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
        }
        return "未知";
    }
}
jcdm-main/src/main/java/com/jcdm/main/webservice/Item.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.jcdm.main.webservice;
import lombok.Data;
@Data
public class Item {
    private String MAKTX;
    private String FEVOR;
    private String WERKS;
    private String LGORT;
    private String ZHTH;
    private String GSTRP;
    private String AUFNR;
    private String PSMNG;
    private String DISPO;
    private String ZSCTZD;
    private String PLNBEZ;
    private String ZSTAT;
    private String DAUAT;
    private String ZWS;
    private String KDAUF;
    private String ZUSER;
    private String ZDATE;
    private String FERTH;
}
jcdm-main/src/main/java/com/jcdm/main/webservice/ItemList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.jcdm.main.webservice;
import java.util.List;
public class ItemList {
    private List<Item> item;
    // æ·»åŠ æž„造函数和getter/setter方法
    // æž„造函数
    public ItemList() {
    }
    // Getter和Setter方法
    public List<Item> getItem() {
        return item;
    }
    public void setItem(List<Item> item) {
        this.item = item;
    }
}
jcdm-main/src/main/java/com/jcdm/main/webservice/test.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.jcdm.main.webservice;
import java.io.InputStream;
import java.util.List;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.json.XML;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.io.IOUtils;
public class test {
    public static void main(String[] args) throws Exception {
        String serviceUrl = "http://podqapp.cfmoto.com.cn:50200/XISOAPAdapter/MessageServlet?senderParty=&senderService=BC_MES&receiverParty=&receiverService=&interface=SI_ZPP_CF_MES_005_SYN_OUT&interfaceNamespace=http://cfmoto.com/xi/MES";
        String content = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:sap-com:document:sap:rfc:functions\">\n" +
                "   <soapenv:Header/>\n" +
                "   <soapenv:Body>\n" +
                "      <urn:ZPP_CF_MES_005>\n" +
                "         <!--Optional:-->\n" +
                "         <IV_WERKS>1000</IV_WERKS>\n" +
                "         <!--Optional:-->\n" +
                "         <IV_ZSCTZD>A0055577</IV_ZSCTZD>\n" +
                "      </urn:ZPP_CF_MES_005>\n" +
                "   </soapenv:Body>\n" +
                "</soapenv:Envelope>";
        // HttpClient发送SOAP请求
        int timeout = 10000;
        HttpClient client = new HttpClient();
        //如果需要用户名密码验证;不需要验证登录则不需要以下4行
        String username = "POMESUSER";
        String password = "12345tgb";
        UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
        client.getState().setCredentials(AuthScope.ANY, creds);
        PostMethod postMethod = new PostMethod(serviceUrl);
        // è®¾ç½®è¿žæŽ¥è¶…æ—¶
        client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
        // è®¾ç½®è¯»å–时间超时
        client.getHttpConnectionManager().getParams().setSoTimeout(timeout);
        // ç„¶åŽæŠŠSoap请求数据添加到PostMethod中
        RequestEntity requestEntity = new StringRequestEntity(content, "text/xml", "UTF-8");
        // è®¾ç½®è¯·æ±‚头部,否则可能会报 â€œno SOAPAction header” çš„错误
        postMethod.setRequestHeader("SOAPAction", "");
        // è®¾ç½®è¯·æ±‚体
        postMethod.setRequestEntity(requestEntity);
        int status = client.executeMethod(postMethod);
        if (status == 200) {// æˆåŠŸ
            InputStream is = postMethod.getResponseBodyAsStream();
            // èŽ·å–请求结果字符串
            String result = IOUtils.toString(is);
            String jsonStr = xmlToJSON2(result);
            Gson gson = new Gson();
            // å°†json字符串转换成对象
            ItemList itemList = gson.fromJson(jsonStr, ItemList.class);
            System.out.println("返回结果:" + result);
        } else {
            System.out.println("错误代码:" + status + ":" + postMethod.getResponseBodyAsString());
        }
    }
    /**
     * æ–¹å¼--è´°
     * ä½¿ç”¨hutool工具包中的工具转化
     * @param xmlStr
     * @return
     */
    public static String xmlToJSON2(String xmlStr){
        JSONObject jsonObject1 = cn.hutool.json.XML.toJSONObject(xmlStr, true);
        Gson gson = new Gson();
        JsonObject jsonObject2 = gson.fromJson(jsonObject1.toString(), JsonObject.class);
        JsonObject etData = jsonObject2
                .getAsJsonObject("SOAP:Envelope")
                .getAsJsonObject("SOAP:Body")
                .getAsJsonObject("n0:ZPP_CF_MES_005.Response")
                .getAsJsonObject("ET_DATA");
        return etData.toString();
    }
}
jcdm-ui/src/views/main/kb/stationTerminal/index.vue
@@ -96,6 +96,18 @@
             </el-table>
           </el-col>
           <el-col :span="16">
<!--             <el-input v-model="url" type="text" style="width: 20%" /> &nbsp; &nbsp;-->
<!--             <el-button @click="join" type="primary">连接</el-button>-->
<!--             <el-button @click="exit" type="danger">断开</el-button>-->
<!--             <br />-->
<!--             <el-input type="textarea" v-model="message" :rows="9" />-->
<!--             <el-button type="info" @click="send">发送消息</el-button>-->
<!--             <br />-->
<!--             <br />-->
<!--             <el-input type="textarea" v-model="text_content" :rows="9" /> è¿”回内容-->
<!--             <br />-->
<!--             <br />-->
             <el-image style="height: 520px;width: 100%" :src="imgSrc"></el-image>
           </el-col>
         </el-tab-pane>
@@ -156,6 +168,12 @@
        pageSize: 10,
        sfcCode: null,
      },
      // æŸ¥è¯¢å‚æ•°
      StationConfQueryParams: {
        pageNum: 1,
        pageSize: 10,
        ipAddress: null,
      },
      cakeLamp: {
        plcState: 1, //plc
        scannerState: 1, //扫码枪
@@ -165,11 +183,29 @@
        release: 0 //允许放行
      },
      content: '',
      activeName: 'first'
      activeName: 'first',
      url: "ws://192.168.10.196:8081/websocket/message/",
      message: "",
      text_content: "",
      ws: null,
    }
  },
  beforeDestroy() {
    this.exit();
  },
  created() {
    this.getStationConfList();
    this.connectWebsocket();
    this.initStation();
    // this.getStationConfList();
    // setTimeout(() => {
    //   this.connectWebsocket();
    // }, 3000);
  },
  mounted() {
  },
  methods: {
    changeMenu(tab, event) {
@@ -204,23 +240,85 @@
      this.$message('保存节拍为'+this.workpieceInformation.beat+'秒');
    },
    /** æŸ¥è¯¢å·¥ä½ç»ˆç«¯é…ç½®åˆ—表 */
    getStationConfList() {
      let queryParams = {
        ipAddress: null,
      }
      getIpv4().then(response => {
        queryParams.ipAddress = response.msg
    async getStationConfList() {
      await getIpv4().then(response => {
        this.StationConfQueryParams.ipAddress = response.msg
        console.log('查询到本工位IP为'+this.StationConfQueryParams.ipAddress)
      });
      listStationConf(queryParams).then(response => {
      listStationConf(this.StationConfQueryParams).then(response => {
        let rows = response.rows[0]
        if(response.rows.length===0){
          this.$message('改ip沒有配置工序工位,請重試!');
          this.$message('该工位没有配置IP,请联系管理员配置IP');
          return
        }
        this.headContent.processesName = rows.processesName
        this.headContent.processesCode = rows.processesCode
        console.log('设置工位编码'+this.headContent.processesCode)
      });
    },
    connectWebsocket() {
      console.log('websocket连接工位为'+this.headContent.processesCode)
      const wsuri = this.url + this.headContent.processesCode;
      this.ws = new WebSocket(wsuri);
      const self = this;
      this.ws.onopen = function (event) {
        // self.text_content = self.text_content + "已经打开连接!" + "\n";
        this.$message('websocket连接成功!');
      };
      this.ws.onmessage = function (event) {
        self.text_content = event.data + "\n";
        console.log(event.data)
        if(event.data === "1"){
          self.cakeLamp.InPlace = "1"
        }
      };
    },
    exit() {
      if (this.ws) {
        this.ws.close();
        this.ws = null;
      }
    },
    send() {
      if (this.ws) {
        this.ws.send(this.message);
      } else {
        alert("未连接到服务器");
      }
    },
    async initStation(){
      await getIpv4().then(response => {
        this.StationConfQueryParams.ipAddress = response.msg
        console.log('查询到本工位IP为'+this.StationConfQueryParams.ipAddress)
      });
      await listStationConf(this.StationConfQueryParams).then(response => {
        let rows = response.rows[0]
        if(response.rows.length===0){
          this.$message('该工位没有配置IP,请联系管理员配置IP');
          return
        }
        this.headContent.processesName = rows.processesName
        this.headContent.processesCode = rows.processesCode
        console.log('设置工位编码'+this.headContent.processesCode)
      });
      console.log('websocket连接工位为'+this.headContent.processesCode)
      const wsuri = this.url + this.headContent.processesCode;
      this.ws = new WebSocket(wsuri);
      const self = this;
      this.ws.onopen = function (event) {
        // self.text_content = self.text_content + "已经打开连接!" + "\n";
        this.$message('websocket连接成功!');
      };
      this.ws.onmessage = function (event) {
        self.text_content = event.data + "\n";
        console.log(event.data)
        if(event.data === "1"){
          self.cakeLamp.InPlace = "1"
        }
      };
    }
  }
}
@@ -259,63 +357,4 @@
  font-size: 15px;
}
</style>
<!--<template>-->
<!--  <div>-->
<!--    <el-input v-model="url" type="text" style="width: 20%" /> &nbsp; &nbsp;-->
<!--    <el-button @click="join" type="primary">连接</el-button>-->
<!--    <el-button @click="exit" type="danger">断开</el-button>-->
<!--    <br />-->
<!--    <el-input type="textarea" v-model="message" :rows="9" />-->
<!--    <el-button type="info" @click="send">发送消息</el-button>-->
<!--    <br />-->
<!--    <br />-->
<!--    <el-input type="textarea" v-model="text_content" :rows="9" /> è¿”回内容-->
<!--    <br />-->
<!--    <br />-->
<!--  </div>-->
<!--</template>-->
<!--<script>-->
<!--export default {-->
<!--  data() {-->
<!--    return {-->
<!--      url: "ws://127.0.0.1:8081/websocket/message",-->
<!--      message: "",-->
<!--      text_content: "",-->
<!--      ws: null,-->
<!--    };-->
<!--  },-->
<!--  methods: {-->
<!--    join() {-->
<!--      const wsuri = this.url;-->
<!--      this.ws = new WebSocket(wsuri);-->
<!--      const self = this;-->
<!--      this.ws.onopen = function (event) {-->
<!--        self.text_content = self.text_content + "已经打开连接!" + "\n";-->
<!--      };-->
<!--      this.ws.onmessage = function (event) {-->
<!--        console.log("后端发过来的消息"+event.data)-->
<!--        self.text_content = event.data + "\n";-->
<!--      };-->
<!--      this.ws.onclose = function (event) {-->
<!--        self.text_content = self.text_content + "已经关闭连接!" + "\n";-->
<!--      };-->
<!--    },-->
<!--    exit() {-->
<!--      if (this.ws) {-->
<!--        this.ws.close();-->
<!--        this.ws = null;-->
<!--      }-->
<!--    },-->
<!--    send() {-->
<!--      if (this.ws) {-->
<!--        this.ws.send(this.message);-->
<!--      } else {-->
<!--        alert("未连接到服务器");-->
<!--      }-->
<!--    },-->
<!--  },-->
<!--};-->
<!--</script>-->