2015年9月16日 星期三

openfire client 端開發範例.docx

openfire client 端開發範例.docx

一、圖說
image
說明:
1. 公司內部或第三方開發的伺服端服務(如ERP、財會、流程等),透過尋得相對應語言且支援XMPP的程式庫,便可將訊息發往 openfire server,讓終端使用者收到訊息;這類支援XMPP的程式庫有開源免費的,也有需要收錢的。例如:如果 ERP 系統是 java 語言開發,便可利用 openfire 官方提供的 smack library(免費),建立起與 openfire server 的通訊。假如公司內部的流程系統是使用 C# 開發,那就需要一個支援 XMPP 的 .NET 程式庫,如 Matrix(收費)。
2. 如果要開發自己的桌機版或行動版的即時通訊終端軟體(Instant messaging client 簡稱 IM client,例如 Skype client、MSN messager、Yahoo Messager、Pidgin等...都算是,只是支援的通訊協定不同。),同第1點說明,只要尋找相對應語言程式庫即可。當然要從頭開始,自行開發 XMPP 的通訊程式庫也無不可,假如時間很多的話。
3. 桌機版或行動版的 IM client 現成軟體不少,當中也有很多是免費的,例如 pidgin,openfire 官方社群也有提供免費的 IM client,名為spark。不過在尋找這類IM client時,要注意必須有支援 XMPP 或 jabber 字樣,方能與 openfire 溝通。
pidgin
image
spark
image
行動版不管 iOS 或 Android也有多個 IM App 可供選擇
Android參考(10 best free apps for xmpp client)
http://appcrawlr.com/android-apps/best-free-apps-xmpp-client
iOS 參考(Top10 Apps for Jabber Xmpp iPhone/iPad)
http://appcrawlr.com/ios-apps/best-apps-jabber-xmpp

二、java 使用 smack 程式庫為例(桌機或第三方整合適用)。
網址:
openfire 除了有伺服軟體外,還提供了 smack 這個程式庫,這是一個 java library,透過這個程式庫,可以省去與通訊伺服器間繁雜的 XMPP 協定處理。
通訊伺服器位址:192.168.1.112
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
傳送訊息:考核開始通知
訊息接收者帳號:e00104
image
import org.jivesoftware.smack.*;
public class Main {
    public static void main(String[] args) {
        final ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.112",Integer.parseInt("5222"));
        //允許自動連接
        config.setReconnectionAllowed(true);
        config.setSendPresence(true);
        AccountManager accountManager;
        Connection connection = new XMPPConnection(config);
        try {
            connection.connect();
            accountManager = connection.getAccountManager();
            connection.login("test1" , "test1");
            System.out.println(connection.getUser());
            connection.getChatManager().createChat("e00104@fire1",null).sendMessage("考核開始通知");
        }catch (XMPPException e){
            System.out.println("Connect error:" + e);
        }
    }
}

三、C# 使用 Matrix 程式庫為例(桌機或第三方整合適用)。
網址:http://www.ag-software.net/matrix-xmpp-sdk/
原理同 smack,只是支援語言不同,Matrix library 可以免費試用,使用時會出現延遲對話框,如果付費,就不會跳出延遲框。
Matrix 是 agsXMPP 版本的成功穩定版,agsXMPP 是免費的,官方建議商業正式環境中,應使用 Matrix 這個版本。
通訊伺服器位址:192.168.1.112
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
image
image
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Matrix;
using Matrix.Xmpp;
using Matrix.Xmpp.Client;
namespace hlchat
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, System.EventArgs e)
        {
            XmppClient xmppClient = new XmppClient { XmppDomain="fire1", Username="test1", Password="test1" };
            xmppClient.OnRosterEnd += delegate 
            { xmppClient.Send(new Matrix.Xmpp.Client.Message 
                { 
                    To=TargetUser.Text, 
                    Type=MessageType.chat, 
                    Body=MsgBody.Text 
                });
            };
            xmppClient.Open();
            textBox1.Text = "Send OK!!";
            //xmppClient.Close();
        }
    }
}

四、java 使用 asmack 程式庫為例(Android App 開發適用)。
網址:https://code.google.com/p/asmack/
asmack 算是 smack 的修正版,網路大部分討論都建議開發 Android 端使用 asmack 而非 smack。
通訊伺服器位址:192.168.1.31
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
傳送訊息:hello asmak
訊息接收者帳號:t001
image
package net.snoone.schat;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.*;
import java.util.Collection;
public class MyActivity extends Activity
{
    /** Called when the activity is first created. */
    public static final String HOST = "192.168.1.31";
    public static final int PORT = 5222;
    public static final String SERVICE = "jabber";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        createChat();
    }
    private void createChat(){
        ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT, SERVICE);
        XMPPConnection connection = new XMPPConnection(connConfig);
        try {
            connection.connect();
            connection.login("test1", "test1");
            Message msg = new Message("t001@of1", Message.Type.chat);
            msg.setBody("hello asmak");
            connection.sendPacket(msg);
        }catch (XMPPException e){
            connection = null;
        }
    }
}