SMACK 4.3.0 으로 OpenFire Server 에 로그인하는 기능을 적어둔다.
4.1.0 으로 해도 에러가 발생하고 ... 엄청난 삽질을 하고서 겨우 제대로 로그인되는 걸 확인했다.
build.gradle
repositories { maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } mavenCentral() }
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'gun0912.ted:tedpermission:2.0.0' implementation 'com.google.code.gson:gson:1.7.2' implementation "org.igniterealtime.smack:smack-tcp:4.3.0" implementation "org.igniterealtime.smack:smack-extensions:4.3.0" implementation "org.igniterealtime.smack:smack-experimental:4.3.0" implementation ("org.igniterealtime.smack:smack-android:4.3.0"){ exclude module:'smack-omemo' exclude module:'smack-omemo-signal' } } |
로그인이 성공되어야 채팅 기능을 만드는 걸 해볼 수 있는데 smack 4.2.0 으로 테스트하면 로그인에서 거부당한다.
아래 코드는 로그인이 성공적으로 잘 되는 걸 확인했으며, 동영상 예제를 따라하면서 적은 코드를 수정 보완한 것이라고 보면 된다.
따라서 구글링으로 검색된 다른 코드와는 약간 다르다. 즉 확장성이 떨어질 수 있다는 말이다.
로그인이 성공적으로 동작되도록 하는 코드라고 이해하면 된다.
Anroid 8.0에서 테스트를 했으며, 보안 강화로 IP주소를 직접 적으면 동작에 오류가 발생하는 거 같다.
private String loginURL = "abc.com"; // IP주소 적으면 오류 발생함 (The public/private ip address don't work) private AbstractXMPPConnection mConnection; public static final String TAG = MainActivity.class.getSimpleName();
private void setConnection() { // Create the configuration for this new connection new Thread() { @Override public void run() { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
InetAddress addr = null; try { addr = InetAddress.getByName(loginURL); Log.e(TAG,"addr : "+addr); } catch (UnknownHostException e) { e.printStackTrace(); } HostnameVerifier verifier = new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return false; } }; DomainBareJid serviceName = null; try { serviceName = JidCreate.domainBareFrom(loginURL); Log.e(TAG,"serviceName : "+serviceName); } catch (XmppStringprepException e) { e.printStackTrace(); } SmackConfiguration.DEBUG = true; XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() //.setUsernameAndPassword("test02", "test1234") .setPort(5222) .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) .setXmppDomain(serviceName) .setHostnameVerifier(verifier) .setHostAddress(addr) //.setDebuggerEnabled(true) // smack 4.3.0 error, smack 4.2.0 ok .setSendPresence(true) .build();
SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1"); SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5"); SASLAuthentication.unBlacklistSASLMechanism("PLAIN"); mConnection = new XMPPTCPConnection(config); mConnection.setReplyTimeout(10000);
// Connect to the server try { Log.e(TAG,"mConnection.connect try"); mConnection.connect(); mConnection.login("test01", "test1234"); if (mConnection.isAuthenticated() && mConnection.isConnected()) { // message send and receive code here. Log.e(TAG,"run auth done and connected successfully"); } else{ Log.e(TAG,"connected fail"); }
} catch (SmackException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XMPPException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } |
참고 사이트(reference)