2013-07-01 29 views
6

Tôi cần phát triển hệ thống thông báo đẩy cho các ứng dụng Android, không sử dụng tin nhắn điện toán đám mây của google (lý do bảo mật). Ở đây máy chủ sẽ thông báo cho tất cả các thiết bị hiện đang đăng nhập vào một ứng dụng Android cụ thể.Làm thế nào để phát triển các thông báo đẩy cho android mà không cần sử dụng tin nhắn điện toán đám mây của google?

Tôi biết câu hỏi khá rộng, nhưng bất kỳ ai cũng có thể chỉ cho tôi các giải pháp khả thi.

Xin cảm ơn trước.

+0

lý do bảo mật nào khiến bạn nghĩ rằng hai lần nếu tôi có thể yêu cầu – tyczj

+0

Đây là một phần của ứng dụng ngân hàng. Và vì lý do rất giống tôi đã được bảo rằng tôi không thể sử dụng GCM. – Newbie

+0

xem http://stackoverflow.com/questions/15297246/are-there-any-alternative-to-gcm-google-cloud-messaging-for-custom-android-bui –

Trả lời

2

Bạn có thể sử dụng MQTT để xây dựng dịch vụ thông báo đẩy. (Lưu ý: các ứng dụng như Facebook sử dụng MQTT cho các thông báo đẩy).

Vì vậy, để xây dựng một dịch vụ thông báo push bạn cần một nhà môi giới MQTT chạy trên máy chủ (Tôi khuyên bạn nên MQTT Mosquitto và dịch vụ bachground chạy trên thiết bị Android.

Mã cho dịch vụ MQTT (có thể dùng cả trên máy chủ và trên sode khách hàng):

/** 
* MQTTManager class provide methods to connect, subscribe, publish, and listen to MQTT broker 
*/ 
public class MQTTManager { 

private final String TAG = "MQTT"; 
private final String BROKER_URL = "http://mqtt-dashboard.com/info/broker:1883"; //change it to your broker URL 
private MqttClient mqttClient; 
private String CLIENT_ID = "123" 
private String topic = "ABC" 
private int keepAliveInterval=60*5; 
private MqttConnectOptions opt; 

/** 
* Constructor 
* @throws MqttException 
*/ 
protected MQTTManager() throws MqttException { 
    opt=new MqttConnectOptions(); 
    opt.setKeepAliveInterval(keepAliveInterval); 
    opt.setConnectionTimeout(10); 
    mqttClient = new MqttClient(BROKER_URL, CLIENT_ID, new MemoryPersistence()); 
    mqttClient.setCallback(new MQTTCallback(BROKER_URL, CLIENT_ID, topic)); 
} 

/** 
* Connects to the MQTT broker service on server side. 
*/ 
public void connect(){ 
    try { 
     mqttClient.connect(opt); 
    } catch (MqttException e) { 
     Log.e(TAG, "Error while connecting to mqtt broker: "+e.toString()); 
    } 
} 

/** 
* Subscribes the device to the topic provided via constructor 
*/ 
public void subscribeDevice(){ 
    try { 
     mqttClient.subscribe(this.topic); 
    } catch (MqttException e) { 
     Log.e(TAG, "Error while subscribing to mqtt broker: "+e.toString()); 
    } 
} 

/** 
* Publishes the message to the MQTT broker service. 
* @param String Message that needs to be published 
*/ 
public void publishToDevice(String message){ 
    try { 
     MqttTopic mtopic=mqttClient.getTopic(this.topic); 
     MqttMessage msg= new MqttMessage(message.getBytes()); 
     mtopic.publish(msg); 
    } catch (MqttException e) { 
     Log.e(TAG, "Error while publishing to mqtt broker: "+e.toString()); 
    } 
} 


/** 
* Inner class for mqtt callback 
*/ 
public class MQTTCallback implements MqttCallback{ 

    final private String TAG = "MQTT"; 
    private String BROKER_URL; 
    private String CLIENT_ID;     
    private String TOPIC; 
    private MqttClient mqttClient; 

    public MQTTCallback(String BROKER_URL, String CLIENT_ID, String TOPIC) { 
     this.BROKER_URL= BROKER_URL; 
     this.CLIENT_ID = CLIENT_ID; 
     this.TOPIC=TOPIC; 
    } 

    public void connectionLost(Throwable arg0) { 
     connect();   
    } 

    public void deliveryComplete(MqttDeliveryToken arg0) { 
     if(arg0==null) 
      System.out.print("Message delivered");   
    } 

    public void messageArrived(MqttTopic arg0, MqttMessage arg1) 
      throws Exception { 
     // MESSAGE ARRIVES HERE!! argo-> device id & arg1 --> message 
    } 
} 
} 

Để tìm hiểu thêm, bạn có thể kiểm tra các dịch vụ thông báo push MQTT thực hiện trong dự án này. SenSocial mà tôi thực hiện

Nếu bạn không có một nhà môi giới chạy trên máy chủ của bạn, sau đó bạn có thể thử một nhà môi giới dựa trên MQTT Mosquitto có sẵn công khai: MQTT BROKER

+0

Câu trả lời hay. Cám ơn vì đã chia sẻ. Tôi đã chỉnh sửa với tiết lộ. – Drew

0

Tôi khuyên bạn không nên sử dụng GCM. Việc duy trì kết nối liên tục từ điện thoại đến máy chủ đẩy rất tốn kém (về việc sử dụng pin mà còn là tiền thực tế) và GCM thực hiện điều đó miễn phí cho bạn. Nó cũng không rõ ràng làm thế nào để bạn có kế hoạch để có một người nghe socket liên tục trong nền. Nó có khả năng là nó sẽ bị giết bởi khuôn khổ tại một số điểm do áp lực bộ nhớ. GCM chạy trong một quá trình đặc quyền mà là cách khó giết hơn.

Bảo mật khôn ngoan tôi khuyên bạn nên mã hóa bất kỳ tải trọng nào bạn có trước khi gửi cho thiết bị, sau đó giải mã trong chính điện thoại. Đó sẽ là cách rẻ hơn về chi phí phát triển và sử dụng pin.

+0

Bạn sẽ triển khai các thông báo đẩy trên mạng riêng như thế nào (như trong một nhà máy điện không có kết nối internet bên ngoài) trong khi vẫn duy trì các lợi ích sử dụng điện của GCM? – Jeremy

Các vấn đề liên quan