當前位置:首頁 » 操作系統 » XMPP安卓源碼

XMPP安卓源碼

發布時間: 2023-07-19 03:54:32

① 如何寫一個MQTT連接的android客戶端

MQTT是一個輕量級的消息發布/訂閱協議,它是實現基於手機客戶端的消息推送伺服器的理想解決方案。 我們可以從這里下載該項目的實例代碼,並且可以找到一個採用php書寫的伺服器端實現。 架構如下所示: wmqtt.jar 是IBM提供的MQTT協議的實現。你可以從如下站點下載它。你可以將該jar包加入你自己的Android應用程序中。 Really Small Message Broker (RSMB) ,他是一個簡單的MQTT代理,同樣由IBM提供。預設打開1883埠,應用程序當中,它負責接收來自伺服器的消息並將其轉發給指定的移動設備。 SAM是一個針對MQTT寫的PHP庫。你可以從這個下載它. send_mqtt.php是一個通過POST接收消息並且通過SAM將消息發送給RSMB的PHP腳本。 實例代碼: Ø 採用XMPP協議實現Android推送 這是我在項目中採用的方案。事實上Google官方的C2DM伺服器底層也是採用XMPP協議進行的封裝。 XMPP(可擴展通訊和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終允許網際網路用戶向網際網路上的其他任何人發送即時消息。 androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的客戶端和伺服器端。經過源代碼研究我發現,該伺服器端基本是在另外一個開源工程openfire基礎上修改實現的,不過比較郁悶的是androidpn的文檔是由韓語寫的,所以整個研究過程基本都是讀源碼。它的實現示意圖如下: androidpn客戶端需要用到一個基於java的開源XMPP協議包asmack,這個包同樣也是基於openfire下的另外一個開源項目smack,不過我們不需要自己編譯,可以直接把androidpn客戶端裡面的asmack.jar拿來使用。客戶端利用asmack中提供的XMPPConnection類與伺服器建立持久連接,並通過該連接進行用戶注冊和登錄認證,同樣也是通過這條連接,接收伺服器發送的通知。 androidpn伺服器端也是java語言實現的,基於openfire開源工程,不過它的Web部分採用的是spring框架,這一點與openfire是不同的。Androidpn伺服器包含兩個部分,一個是偵聽在5222埠上的XMPP服務,負責與客戶端的XMPPConnection類進行通信,作用是用戶注冊和身份認證,並發送推送通知消息。另外一部分是Web伺服器,採用一個輕量級的HTTP伺服器,負責接收用戶的Web請求。伺服器架構如下: 最上層包含四個組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager負責管理客戶端與伺服器之間的會話,Auth Manager負責客戶端用戶認證管理,Presence Manager負責管理客戶端用戶的登錄狀態,NotificationManager負責實現伺服器向客戶端推送消息功能。 伺服器端界面如下,分別對應了上述的幾個功能模塊: 發送以後,我們可以在手機端看到接收的消息:

② 怎麼實現伺服器給android客戶端主動推送消息

一、消息推送基礎
消息推送,就是在互聯網上通過定期傳送用戶需要的信息來減少信息過載的一項新技術。推送技術通過自動傳送信息給用戶,來減少用於網路上搜索的時間。它根據用戶的興趣來搜索、過濾信息,並將其定期推給用戶,幫助用戶高效率地發掘有價值的信息
當我們開發需要和伺服器交互的移動應用時,基本上都需要和伺服器進行交互,包括上傳數據到伺服器,同時從伺服器上獲取數據。
一般情況下,客戶端與伺服器之間通訊客戶端是主動的,但這就存在一個問題就是一旦伺服器數據有更新或者伺服器要下發通知給客戶端只能等客戶端連接的時候才能實現。這種方式使消息失去了實時性。
如何使客戶端能夠實時的收到伺服器的消息和通知,總體來說有兩種方式,第一種是客戶端使用Pull(拉)的方式,就是隔一段時間就去伺服器上獲取一下信息,看是否有更新的信息出現。第二種就是 伺服器使用Push(推送)的方式,當伺服器端有新信息了,則把最新的信息Push到客戶端上。這樣,客戶端就能自動的接收到消息。 
雖然Pull和Push兩種方式都能實現獲取伺服器端更新信息的功能,但是明顯來說Push方式比Pull方式更優越。因為Pull方式更費客戶端的網路流量,更主要的是費電量,還需要我們的程序不停地去監測服務端的變化。  
二、幾種常見的解決方案實現原理
1)輪詢(Pull)方式:客戶端定時向伺服器發送詢問消息,一旦伺服器有變化則立即同步消息。
2)SMS(Push)方式:通過攔截SMS消息並且解析消息內容來了解伺服器的命令,但這種方式一般用戶在經濟上很難承受。
3)持久連接(Push)方式:客戶端和伺服器之間建立長久連接,這樣就可以實現消息的及時行和實時性。
三、消息推送解決方案概述
A、C2DM雲端推送方案
在Android手機平台上,Google提供了C2DM(Cloudto Device Messaging)服務。Android Cloud to Device Messaging (C2DM)是一個用來幫助開發者從伺服器向Android應用程序發送數據的服務。該服務提供了一個簡單的、輕量級的機制,允許伺服器可以通知移動應用程序直接與伺服器進行通信,以便於從伺服器獲取應用程序更新和用戶數據。
該方案存在的主要問題是C2DM需要依賴於Google官方提供的C2DM伺服器,由於國內的網路環境,這個服務經常不可用。
B、MQTT協議實現Android推送
採用MQTT協議實現Android推送功能也是一種解決方案。MQTT是一個輕量級的消息發布/訂閱協議,它是實現基於手機客戶端的消息推送伺服器的理想解決方案。
wmqtt.jar 是IBM提供的MQTT協議的實現。我們可以從這里(https://github.com/toku/AndroidPushNotificationsDemo)下載該項目的實例代碼,並且可以找到一個採用PHP書寫的伺服器端實現(https://github.com/toku/PhpMQTTClient)。
C、RSMB實現推送功能
Really Small Message Broker (RSMB) ,是一個簡單的MQTT代理,同樣由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。預設打開1883埠,應用程序當中,它負責接收來自伺服器的消息並將其轉發給指定的移動設備。SAM是一個針對MQTT寫的PHP庫。我們可以從這個http://pecl.php.net/package/sam/download/0.2.0地址下載它.
D、XMPP協議實現Android推送
Google官方的C2DM伺服器底層也是採用XMPP協議進行的封裝。XMPP(可擴展通訊和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終允許網際網路用戶向網際網路上的其他任何人發送即時消息。
androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的客戶端和伺服器端。但也存在一些不足之處:
1) 比如時間過長時,就再也收不到推送的信息了。
2)性能上也不夠穩定。
3)如果將消息從伺服器上推送出去,就不再管理了,不管消息是否成功到達客戶端手機上。
如果我們要使用androidpn,則還需要做大量的工作,需要理解XMPP協議、理解Androidpn的實現機制,需要調試內部存在的BUG。
E、使用第三方平台
目前國內、國外有一些推送平台可供使用,但是涉及到收費問題、保密問題、服務質量問題、擴展問題等等,又不得不是我們望而卻步。
四、消息推送完美方案
綜合以上論述,在建立Android消息推送方面可謂方案多多,但每一款方案都有其優缺點。但無論如何,還是自己搭建一個推送平台是上策。因為你有、他有不如自己有。
舉個例子,在搭建自有推送平台上建議使用《某某Android消息推送組件》。該組不僅可以拿來即用,並且還可以提供源碼以便擴展,實現自己的特殊需求。
A、推送原理
Android消息推送組件基於XMPP協議實現Android推送。XMPP(可擴展通訊和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終允許網際網路用戶向網際網路上的其他任何人發送即時消息。

③ 如何自己搭建一個xmpp,實現推送消息

Android推送方案分析(MQTT/XMPP/GCM)
蝸牛TT 發布於 4個月前,共有 11 條評論
本文主旨在於,對目前Android平台上最主流的幾種消息推送方案進行分析和對比,比較客觀地反映出這些推送方案的優缺點,幫助大家選擇最合適的實施方案。
方案1、使用GCM服務(Google Cloud Messaging)
簡介:Google推出的雲消息服務,即第二代的G2DM。
優點:Google提供的服務、原生、簡單,無需實現和部署服務端。
缺點:Android版本限制(必須大於2.2版本),該服務在國內不夠穩定、需要用戶綁定Google帳號,受限於Google。

方案2、使用XMPP協議(Openfire + Spark + Smack)
簡介:基於XML協議的通訊協議,前身是Jabber,目前已由IETF國際標准化組織完成了標准化工作。
優點:協議成熟、強大、可擴展性強、目前主要應用於許多聊天系統中,且已有開源的Java版的開發實例androidpn。
缺點:協議較復雜、冗餘(基於XML)、費流量、費電,部署硬體成本高。

方案3、使用MQTT協議(更多信息見:http://mqtt.org/)
簡介:輕量級的、基於代理的「發布/訂閱」模式的消息傳輸協議。
優點:協議簡潔、小巧、可擴展性強、省流量、省電,目前已經應用到企業領域(參考:http://mqtt.org/software),且已有C++版的服務端組件rsmb。
缺點:不夠成熟、實現較復雜、服務端組件rsmb不開源,部署硬體成本較高。

方案4、使用HTTP輪循方式
簡介:定時向HTTP服務端介面(Web Service API)獲取最新消息。
優點:實現簡單、可控性強,部署硬體成本低。
缺點:實時性差。

對各個方案的優缺點的研究和對比,推薦使用MQTT協議的方案進行實現,主要原因是:MQTT最快速,也最省流量(固定頭長度僅為2位元組),且極易擴展,適合二次開發。接下來,我們就來分析使用MQTT方案進行Android消息的原理和方法,並架設自己的推送服務。

如果還不明白的 話,要看分析的話,給你個網址:http://m.oschina.net/blog/82059
自己看看。

④ 如何實現消息推送功能

?可以用第三方軟體極光推送來實現。對於定製化需求較強的,或者想擁有自己推送平台的開發者,極光提供全功能的私有雲方案。
極光推送快速開始步驟: 1、到極光推送官方網站注冊開發者帳號;
2、登錄進入管理控制台,創建應用程序,得到 Appkey(SDK 與伺服器端通過 Appkey 互相識別);
3、在推送設置中給 Android 設置包名、給 iOS 上傳證書、啟用 WinPhone,根據你的需求進行選擇;
4、下載 SDK 集成到 App 里。
客戶端初始化 JPush 成功後,JPush 服務端會分配一個 Registration ID,作為此設備的標識(同一個手機不同 App 的 Registration ID 是不同的)。開發者可以通過指定具體的 Registration ID 來進行對單一設備的推送。

⑤ openfire怎麼不修改源碼加入消息回執

遵循原則:
1.message 消息的id由服務端或者客戶端統一生成,採用全球唯一id生成策略。
2.客戶端收到 message消息後必須回執服務端
3.取消openfire伺服器消息總是存儲的設置
4.設置openfire離線表ofoffline的messageId欄位為字元串類型
實現:
創建openfire組件類:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.component.Component;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManager;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

/**
* 處理 回執信息
*
* @author longyingan
*
*/
public class ReceiptComponent implements Component {
private static final Logger log = LoggerFactory.getLogger(ReceiptComponent.class);

private final static String name = "receiptComponent";

@Override
public String getDescription() {
return null;
}

@Override
public String getName() {
return name;
}

@Override
public void initialize(JID jid, ComponentManager componentManager)
throws ComponentException {

}

@Override
public void processPacket(Packet packet) {

if (packet instanceof Message) {
if (packet.getTo() != null
&& packet.getTo().getDomain()
.startsWith("receipt")) { // 群消息回執
Message message = (Message) packet.createCopy();
// 獲取消息 id 和 用戶
String messageId = message.getID();
String username = message.getFrom().getNode();
// 刪除離線消息
if (!StringUtils.isEmpty(messageId)){
//TODO 刪除openfire離線表的對應數據
}
}
}
}

@Override
public void shutdown() {

}

@Override
public void start() {

}

}

創建消息攔截類,把所有message消息存儲離線:

import java.util.Date;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;
import org.dom4j.Element;
import org.dom4j.QName;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.util.XMPPDateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

/**
* 搜索引擎攔截器
* @author longyingan
*
*/
public class SearchEngineInterceptor implements PacketInterceptor {

private static final Logger log = LoggerFactory.getLogger(SearchEngineInterceptor.class);
Random m_rndGen = new Random();
@Override
public void interceptPacket(Packet packet, Session session,
boolean incoming, boolean processed) throws PacketRejectedException {

// 程序執行中;是否為結束或返回狀態(是否是當前session用戶發送消息)
if (processed || !incoming) {
return;
}

if (packet instanceof Message) {
if(packet.getTo()!=null
&& !XMPPServer.getInstance().getServerInfo().getXMPPDomain().equals(packet.getTo().getDomain())
||("receipt."+XMPPServer.getInstance().getServerInfo().getXMPPDomain()).equals(packet.getFrom().getDomain()))
return ;

//TODO 1.存儲消息到openfire 離線表
//TODO 2.如果message 沒有 id 則產生一個保持
//TODO 3.根據自己的業務判斷哪些需要存儲,哪些不需要

}
}

}

好,到這來服務端的兩個主要類代碼已經完成。下面寫個客戶端如何測試的例子(只是一個簡單事例,可能用的時候不是這樣的哈):

Chat chat = ChatManager.getInstanceFor(connection).createChat(
"xxx伺服器的域", new MessageListener() {
public void processMessage(Chat chat,Message message) {
System.out.println(message.toXML());
Message rep = new Message();
rep.setFrom(message.getTo());
rep.setTo("receipt." + message.getFrom());
rep.setPacketID(message.getPacketID());
rep.setBody("null");
rep.setType(Type.chat);
try {
connection.sendPacket(rep);
} catch (NotConnectedException e1) {
e1.printStackTrace();
}
}
});

⑥ netty 是不是 xmpp伺服器

1、可以使用openfire,以前做項目用過,必要時可以修改源碼滿足需求。
2、現在做IM第三方的API有很多。如環信,極推等。
3、Socket socket = new Socket();
socket .connect(new InetSocketAddress(host, port), 20000);
socket .setSoTimeout(45000);
byte[] byte = date;//你要傳輸的數據
BufferedInputStream is = new BufferedInputStream(socket.getInputStream(), 512);
DataInputStream dis = new DataInputStream(is);
out = new BufferedOutputStream(socket.getOutputStream());
out.write(bytes);
服務端寫個socketServer監聽客戶端的請求就可以了
如果你想做復雜點兒,還可以擴展個私有協議

⑦ androidpn服務端源碼修改後怎麼編譯

1.伺服器:
ConfigManager--配置信息載入類,
Config--配置信息管理類,可以得到配置文件中指定屬性的值;
CopyMessageUtil--將IQ中的id得到賦值給回執對象;
AuthManager--提供用戶認證的相關功能;
IQAuthHandler--接收並處理命名空間為「jabber:iq:auth」的消息請求,用於處理用戶驗證業務;
IQRegisterHandler--接收並處理命名空間為 "jabber:iq:register"的消息請求,用於處理用戶注冊業務;
IQRosterHandler--接收處理命名空間為"jabber:iq:roster"的消息請求,用於處理用戶獲取花名冊業務;--未提供實現,如需此功能需要擴展;
PresenceUpdateHandler--接收處理用戶的狀態變更請求信息;
Connection--一個XMPP連接伺服器的實例,提供發送消息及得到伺服器連接相關信息;
ConnectionCloseListener--客戶端與伺服器之間的連接斷開監聽器;
StanzaHandler--一個消息處理類,處理傳入的XML節,把接收到的消息轉換成一個XML的對象;
XmppIoHandler--繼承於MINA中的IOHandler,用於從MINA中接收消息,並把消息交給StanzaHandler類處理;
PresenceManager--用於管理用戶的在線狀態;
NotificationManager--消息通知發送管理類,提供了發送消息給客戶端的功能:
A.sendBroadcast--給所有在線用戶發送消息;
B.sendNotifcationToUser--給指定用戶發送消息 ;
C.sendNotifications--給指定的多個或一個用戶發送消息;
D.sendOfflineNotification--發送離線消息;
IQRouter--IQ請求路由類,繼承了IQHandler的IQ消息處理類需要在IQRouter類中注冊,IQRounter就會跟命名空間把消息路由到相應的處理類中去處理;
MessageRouter--Message消息路由類;
PresenceRouter--Presence消息路由類;
PacketDeliverer--發送到連接的會話;
PacketRouter--Packet路由類,在這個類里有IQRouter、PresenceRouter、MessageRouter三個類的對象,可以對三種類型的消息都可以進行處理路由;
ClientSession--代表一個客戶端與伺服器之間的連接;從這個連接中可以得到這個連接的相關信息,如用戶名,狀態等;
SessionManager--管理所有與伺服器之間的連接;

伺服器端接收客戶端消息處理流程:

2.Android端:
NotificationService類--後台運行並響應來自伺服器的事件推送通知服務;
ServiceManager類--載入客戶端中的配置信息,並管理NotifactionService服務的啟動與關閉;
XmppManager類--管理客戶端和伺服器之間的連接,向伺服器發送連接、注冊、登陸請求任務;
NotificationDetailsActivity --用於終端接收到的通知詳細視圖顯示;
NotificationIQ--通知實體;
NotificationIQProvider--一個xml的處理類,負責把一個xml結構的消息內容轉換成一個NotificationIQ通知實體對象;
NotificationPacketListener---接收從伺服器端推送過來的Packet;
NotificationSettingsActivity--設置信息;
NotificationReceiver--推送通知消息的廣播接收器;
PersistentConnectionListener--監控客戶端與伺服器之間的連接關閉和重新連接事件;
PhoneStateChangeListener--監聽手機狀態;
ConnectivityReceiver--網路變化廣播接收器;

PacketReader--從MINA中讀取推送過來的信息;
PacketWriter--向MINA中寫入回執信息;

接收消息處理流程:

PacketReader
init():
readerThread = new Thread() {
public void run() {
parsePackets(this);
}
};
-》parsePackets
-》processPacket
-》NotificationPacketListener
-》NotificationIQProvider
-》NotificatioIQ
-》Intent
-》發送回執、發出接收到消息的廣播
-》點擊消息的時候,再次給服務端發送一個查看請求,修改伺服器中消息的狀態;

如果服務端發送一個message類型的消息到客戶端後,客戶端是無法處理的。
也就是說客戶端可以發送不同類型的消息到服務端,但是卻不能處理服務端發回的除IQ認證消息以外的其他類型的消息。
如果需要擴展,需要在NotificationPacketListener類中加入處理邏輯,並提供相應的Provider、消息實體及後續處理邏輯。

熱點內容
怎麼搭建linux伺服器ftp 發布:2025-03-16 07:07:38 瀏覽:987
晶元存儲原理 發布:2025-03-16 06:58:21 瀏覽:284
c語言中的整型 發布:2025-03-16 06:40:48 瀏覽:184
分部資料庫伺服器的IP地址有效 發布:2025-03-16 06:33:40 瀏覽:192
安卓項目如何配置tomacat 發布:2025-03-16 06:31:13 瀏覽:431
寫腳本測試 發布:2025-03-16 06:20:07 瀏覽:780
多個撥號寬頻如何配置 發布:2025-03-16 05:51:35 瀏覽:688
管理員c語言 發布:2025-03-16 05:40:17 瀏覽:342
安卓軟體上的圖案如何更改 發布:2025-03-16 05:35:57 瀏覽:748
2010編譯c中文亂碼 發布:2025-03-16 05:33:40 瀏覽:550