2015-11-16 13 views
10

Ho passato un po 'di tempo a cercare un modo per inviare dati da un'applicazione Android a Matlab - senza alcun approccio. Preferirei farlo con JSON tramite un webservice Restful.Invia dati a Matlab da Android/Java

Probabilmente ho in mente il concetto sbagliato su come funzionerà.

Matlab dovrebbe essere in esecuzione/in attesa di richieste POST dal mio dispositivo Android per ricevere i dati, portarli in formato matlab da json, farli avanzare e inviarli di nuovo - che attendere ancora per nuove richieste.

Il "servizio web RESTful" come "webread" sembra non attendere i dati in arrivo e attivarli.


Come consentire a Matlab di ascoltare i dati in arrivo con json? o come consentire a Matlab di ricevere dati da programmi basati su Android/java? Ho bisogno di un altro framework, API o anche un server con Database per fare ciò?

Qualcuno può darmi qualche suggerimento?

+1

webread è un client, non un server. Hai davvero bisogno di aggiungere un server riposante a MATLAB. Ma qual è il tuo problema generale? Forse c'è un approccio migliore. – zapl

+0

Grazie per le informazioni con un server, cercherò di far funzionare un server java spring che chiamerà matlab. – Ghalion

+0

https://www.mathworks.com/matlabcentral/answers/326764-how-can-i-read-a-json-file?requestedDomain=www.mathworks.com – Ibrahim

risposta

5

Approccio 1:

Matlab fornisce anche Matlab mobile https://de.mathworks.com/products/matlab-mobile.html, che è in grado di eseguire codice Matlab dal dispositivo, tuttavia non è possibile inviare le immagini a Matlab.

Tuttavia, è possibile utilizzare WebCam https://play.google.com/store/apps/details?id=com.pas.webcam&hl=en e aprire un server, che è piuttosto semplice. È possibile eseguire l'applicazione in background e poi conencto a Matlab tramite Matlab-Mobile, e accedervi tramite il vostro indirizzo IP e di solito porta 8080.

Approccio 2:

È possibile utilizzare un websocket -Server che viene realizzato qui:

https://de.mathworks.com/matlabcentral/fileexchange/50040-jebej-matlabwebsocket

per ulteriori informazioni su come farlo funzionare è possibile seguire le indicazioni riportate sul readme GitHub, qui: https://github.com/jebej/MatlabWebSocket

Un server Websocket si trova sul livello più alto del 7 ° livello (livello applicazione) del modello OSI https://en.wikipedia.org/wiki/OSI_model e si basa sul 4 ° livello (TCP). Tuttavia, non è necessario specificare elementi quali la dimensione del buffer, ecc.

Il seguente codice di esempio viene preso direttamente dal codice di esempio dal progetto github. Per completare il risultato desiderato nell'applicazione Android, è l'approccio migliore per ricostruire l'applicazione client su Android.

Echo Server:

classdef EchoServer < WebSocketServer 
    %ECHOSERVER Summary of this class goes here 
    % Detailed explanation goes here 

    properties 
    end 

    methods 
     function obj = EchoServer(varargin) 
      %Constructor 
      [email protected](varargin{:}); 
     end 
    end 

    methods (Access = protected) 
     function onOpen(obj,conn,message) 
      fprintf('%s\n',message) 
     end 

     function onTextMessage(obj,conn,message) 
      % This function sends an echo back to the client 
      conn.send(message); % Echo 
     end 

     function onBinaryMessage(obj,conn,bytearray) 
      % This function sends an echo back to the client 
      conn.send(bytearray); % Echo 
     end 

     function onError(obj,conn,message) 
      fprintf('%s\n',message) 
     end 

     function onClose(obj,conn,message) 
      fprintf('%s\n',message) 
     end 
    end 
end 

di eseguirlo in Tipo di MATLAB:

s = EchoServer(30000); 

Questo sarà quindi utilizzare il 30000 porta della macchina locale.

Su Android è sufficiente creare un client WebSocket e utilizzare l'URI, che è possibile scoprire utilizzando ipconfig (Windows) o ifconig (Linux). In Android i dell'URI dovrebbero simile al seguente:

ws://192.168.1.102:30000 

Qualora l'indirizzo IP può cambiare secondo il vostro indirizzo IP

4

Qui sono i miei 2 centesimi.

Il tuo approccio sembra giusto.

Passaggio 1: È necessario eseguire un server Web utilizzando MATLAB sul dispositivo. Passando attraverso , sembra che tu possa utilizzarlo per eseguire webserver ed eseguire un file .m quando viene effettuata una richiesta POST o GET sul tuo server.

Fase 2: Diciamo che il server accetta le richieste sulla porta 8080. Dal tuo dispositivo Android, se si è sulla stessa rete, allora si può fare una richiesta HTTP POST per http://your.ip.address:8080 ed estrarre i dati ed eseguire il codice nel file .m.

Nota: È inoltre possibile ottenere un URL pubblico per il server locale in esecuzione sul dispositivo utilizzando l'utilità ngrok. Quindi fai una richiesta POST a quell'URL pubblico. Non è necessario essere sulla stessa rete per fare una richiesta. Ecco alcune spiegazioni: Accessing localhost from android over wifi.


Edit: domanda supplementare dice:

Matlab è possibile di ricevere dati tramite client TCP/IP, ma come fa il sito di Android bisogno di fare il POST/GET algoritmo e come può rispondere Matlab responsabile ad esso?

Lasciatemi riformulare quello che ho capito. In primo luogo, vuoi sapere come dal codice Android, si può fare una richiesta POST/GET e in secondo luogo come risponderà Matlab alla richiesta?

  • In Android è possibile effettuare una richiesta POST in thread in background sia usando AsyncTask (Android HttpURLConnection with AsyncTask Tutorial) o se si vuole fare in modo corretto, è possibile utilizzare libreria di retrofit per fare POST/GET chiamate (Using Retrofit 2.x as REST client - Tutorial ).
  • Quando si utilizza WebServer come indicato nel collegamento in precedenza, quando il file .m viene eseguito sulla chiamata POST, è possibile inviare la risposta alla richiesta POST da lì. Su Android, dove hai avviato la chiamata, puoi ricevere la richiamata.

Spero che questo aiuti un po '.

2

Hai provato il Android Support Package for MATLAB?

Anche se non consente l'accesso alla telecamera, quando viene utilizzato con MATLAB mobile esso fornisce l'accesso a:

  • accelerazione su 3 assi
  • del campo magnetico su 3 assi
  • angolare velocità di 3-assi
  • Azimuth, rollio, beccheggio
  • latitudine, longitudine, altitudine, precisione orizzontale, velocità, e naturalmente

Ecco come a link with more detailed information su come iniziare.