xmpp web 链接

package com.lemon.snapservice.service;

import lombok.extern.slf4j.Slf4j;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.chat2.ChatManager;
import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
import org.jivesoftware.smack.filter.IQTypeFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.json.JSONObject;
import org.jxmpp.stringprep.XmppStringprepException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;

/**
 * @description: xmpp连接使用
 * @author: immortal
 * @modified By:
 * @create: 2021-08-11 11:33
 **/
@Slf4j
@Service
public class XmppService {
    @Resource
    MyThreadQueue myThreadQueue;
    @Resource
    MyCache myCache;

    //服务器信息
    String  server_host="120.79.1.180";
    String  XMPP_DOMAIN_NAME="vrcam";

    @Value("${xmpp.name}")
    private String  XMPP_NAME;
    // private String  XMPP_NAME="gxk_sztest";
    @Value("${xmpp.password}")
    String  XMPP_PASSWORD;
   // String  XMPP_PASSWORD="123456";
    Integer  SERVER_PORT=5222;
    String codeStr ="2,4,5"; // 保存想设备发送的命令
    AbstractXMPPConnection connection=null;

    Boolean connectionStatus = false; // xmpp 连接状态
    public  XmppService()
    {
        ProviderManager.addIQProvider(VrcamIQ.NAME, VrcamIQ.NAME_SPACE, new VrcamIQProvider());
    }
    /**
     * 服务自启动
     */
    @PostConstruct
    public void getConnection() {
        toConnection();
    }

    /**
     * 连接服务器并登陆
     */
    public void toConnection(){
        /**
         * 连接服务器
         * */
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setUsernameAndPassword(XMPP_NAME, XMPP_PASSWORD);
        try {
            configBuilder.setXmppDomain(XMPP_DOMAIN_NAME);
        } catch (XmppStringprepException e) {
            e.printStackTrace();
        }
        configBuilder.setHost(server_host);
        configBuilder.setPort(SERVER_PORT);
        configBuilder.setDebuggerEnabled(true);
        configBuilder.setSecurityMode(SecurityMode.disabled);

        try {
            if(connection!=null) {
                connection.disconnect();
                connection=null;
            }
            connection = new XMPPTCPConnection(configBuilder.build());
            ((XMPPTCPConnection)connection).setUseStreamManagement(false);
            connection.addConnectionListener(connListener);

            StanzaListener stanzaListener=new StanzaListener(){
                @Override
                public void processStanza(Stanza stanza) throws SmackException.NotConnectedException, InterruptedException {
                    log.info((new Date()).toString()+ "- 11111:" + stanza.toXML());
                    if(!(stanza instanceof VrcamIQ)) {
                        return;
                    }

                    //回应这个IQ packet,避免重复下发
                    IQ vrcam=IQ.createResultIQ((IQ)stanza);
                    connection.sendStanza(vrcam);

                    VrcamIQ vrcamIQ=(VrcamIQ)stanza;
                    log.info("- 收到 IQ 数据:{}" , vrcamIQ.toXML());
                    JSONObject json=new JSONObject();
                    json.put("devid",vrcamIQ.getDevid());
                    json.put("code",Integer.parseInt(vrcamIQ.getCode()));
                    json.put("timestamp",vrcamIQ.getTimestamp());
                    json.put("imageid",vrcamIQ.getImageid());
                    Integer code = json.getInt("code");
                    if(code == 1){ // 表示图片上传
                        if (myCache.getQueue().size()>4){
                            JSONObject currentJson = myCache.getQueue().poll();
                            myThreadQueue.toAction(currentJson);
                        }
                        myCache.setTemporaryVariable(json.toString()); // 保存最新的数据
                        myCache.getQueue().add(json);
                    }else{ // 发送指令
                       // deviceService.sendAllCode(json);
                    }
                }
            };
            connection.addAsyncStanzaListener(stanzaListener, IQTypeFilter.SET);

            ChatManager chatManager = ChatManager.getInstanceFor(connection);
            chatManager.addIncomingListener((IncomingChatMessageListener) (from, message, chat) -> {
                log.info("收到 message 数据:");
                log.info(message.getBody());
            });

            connection.connect();
            log.info("连接成功");
            MyCache.setXmppStatus(true);
            // 添加连接监听
            connection.login(XMPP_NAME,XMPP_PASSWORD);
            log.info("登陆成功");
            this.connectionStatus = true;
        } catch (Exception e) {
            this.connectionStatus=false;
            connection.disconnect();
            log.error("執行closeConnection操作");
            log.error(e.getMessage() + " HATA");
        }
    }


    /**
     * 对 xmpp 连接进行监听
     */
    ConnectionListener connListener = new ConnectionListener() {
        @Override
        public void connected(XMPPConnection xmppConnection) {
             // toConnection();
            log.info("SMACK-connected");
        }

        @Override
        public void authenticated(XMPPConnection xmppConnection, boolean b) {
            log.info("SMACKConnection authenticated");
        }

        @Override
        public void connectionClosed() {
            toConnection();
            log.info("connection111111Closed");
        }

        @Override
        public void connectionClosedOnError(Exception e) {
            while (!connectionStatus){
                try {
                    toConnection();
                    Thread.sleep(5000);
                    log.info("定时执行连接");
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
            }
            log.info("connecti2222222onClosed");
        }

        @Override
        public void reconnectionSuccessful() {
            log.info("connecti333333onClosed");

        }

        @Override
        public void reconnectingIn(int i) {
            log.info("connec444444tionClosed");

        }
        @Override
        public void reconnectionFailed(Exception e) {
            log.info("conn555555555ectionClosed");

        }

    };

}

需要的引入的jar

<!-- spring  websocket 服务端-->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-websocket</artifactId>
      </dependency>
   <!-- spring websocket client -->
      <dependency>
         <groupId>org.java-websocket</groupId>
         <artifactId>Java-WebSocket</artifactId>
         <version>1.3.8</version>
      </dependency>
      <dependency>
         <groupId>org.json</groupId>
         <artifactId>json</artifactId>
         <version>20201115</version>
      </dependency>
      <!-- 额外的 jar-->
      <dependency>
         <groupId>org.igniterealtime.smack</groupId>
         <artifactId>smack-java7</artifactId>
         <version>4.2.0</version>
      </dependency>
      <dependency>
         <groupId>org.igniterealtime.smack</groupId>
         <artifactId>smack-tcp</artifactId>
         <version>4.2.0</version>
      </dependency>
      <dependency>
         <groupId>org.igniterealtime.smack</groupId>
         <artifactId>smack-core</artifactId>
         <version>4.2.0</version>
      </dependency>
      <dependency>
         <groupId>org.igniterealtime.smack</groupId>
         <artifactId>smack-im</artifactId>
         <version>4.2.0</version>
      </dependency>
      <dependency>
         <groupId>org.igniterealtime.smack</groupId>
         <artifactId>smack-extensions</artifactId>
         <version>4.2.0</version>
      </dependency>

      <dependency>
         <groupId>org.igniterealtime</groupId>
         <artifactId>tinder</artifactId>
         <version>1.2.1</version>
      </dependency>
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-log4j12</artifactId>
         <version>1.5.2</version>
      </dependency>

源码下载:大象模版 (elephant-template.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值