Autore Topic: Invio comandi da server web e device android e risposte (google GCM)  (Letto 365 volte)

Offline alexdi

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Un saluto a tutta la comunity.
In un mio precedente post (http://www.anddev.it/index.php/topic,17698.0.html)avevo posto il problema dell' invio di comandi da server web (php joomla) a device android.
Grazie all' aiuto di tonno16, ho risolto brillantemente utilizzando Google Cloud Messaging su device android e Curl su server php. Funziona tutto perfettamente.

Ora però, siccome purtroppo ho la testa dura e non sono più giovane, volevo capire quale fosse la strada migliore , una volta inviato il comando al device android, per poter ricevere dei dati dal medesimo.

Per esempio , con il comando che invio tramite GCM, chiedo al device di fornirmi la lista dei contatti o che ne so delle chiamate presenti sul device.
La richiesta lato server la faccio in ajax che richiama curl php e arriva perfettamente al device:

codice ajax:
Codice: [Seleziona]
function AjaxPushGcm(url,command,gcm_regid,AttendiDati){
       $.ajax(
       {
        type: 'POST',
        url: url,
        dataType: 'json',
        timeout:6000,//time out di attesa
        data: {
               gcm_regid:gcm_regid,//regid del dispositivo android
               task:'droidPush',//task da far eseguire nel controller
               command:command//comando da inviare al device android
        },
        success: function(result){
             ConsolleDebug('droidx.js<*>AjaxPushGcm->success');
             AttendiDati(result.success);
           },
           
        error: function(result){
            ConsolleDebug('droidx.js<*>AjaxPushGcm->error');
            result['esito'] = 'error: '+result.statusText;
            AttendiDati(result.success);
        }
       });//fine richiesta ajax   
   
}

codice php:
Codice: [Seleziona]
    //invia una notifica push al device android
    public function droidPush($command)
    {
        $url = costanti::GOOGLE_GCM_URL;
        $fields = array(
            'registration_ids' => array($this->gcm_regid),
            'data' => array(costanti::PUSH_COMMAND => $command),
        );
        $headers = array(
            'Authorization: key=' . costanti::GOOGLE_API_KEY,
            'Content-Type: application/json'
        );
       
        // Open connection
        $ch = curl_init();
 
        // Set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_URL, $url);
 
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
        // Disabling SSL Certificate support temporarly
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
 
        // Execute post
        $result = curl_exec($ch);
        if ($result === FALSE) {
            die('Curl failed: ' . curl_error($ch));
        }
 
        // Close connection
        curl_close($ch);
        return $result;
    }

Lato device android ho il seguente codice che mi conferma la ricezione del comando inviato:
Codice: [Seleziona]
public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";
    GoogleCloudMessaging gcm;



    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String SenderID = from;
        String command = data.getString(QuickstartPreferences.PUSH_COMMAND);
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "Message: " + command);

        if (from.startsWith("/topics/")) {
            // message received from some topic.
        } else {
            // normal downstream message.
        }

        // [START_EXCLUDE]
        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
        SelectCommandFunction(command);
        sendNotification(command);
        // [END_EXCLUDE]
    }
.......................................
........................................

Il problema e che sul server web ricevo la stringa json di conferma della ricezione dal comando inviato al device
Codice: [Seleziona]
"{"multicast_id":5479527655121081534,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1460906582685796%98722b8ef9fd7ecd"}]}"in corrispondenza dell' entrata nella onMessageReceived. La richiesta ajax, a questo punto va ovviamente in OK ed esce dall' attesa. Non ho quindi il tempo di gestire il comando ed iviare per esempio i dati dei contatti al server web (per esempio con HttpURLConnection). in poche parole, il tutto non è sincronizzato e non trovo un punto della classe GcmListenerService o delle sue sottoclassi dove poter intervenire, per gestire il comando ricevuto, e poter inviare la conferma quando i dati sono stati inviati al server.

Spero di essere riuscito a farmi capire, e questo sarebbe già molto !!

Spero anche che qualche buon'anima possa darmi uno spunto.

Grazie in anticipo.