Отправка данных из Matlab в Pachube (Cosm) с использованием методов Java

Я использую JPachube.jar и Matlab для отправки данных в свой поток данных. . Этот код Java работает на моей машине:

package smartclassroom;
import Pachube.Data;
import Pachube.Feed;
//import Pachube.FeedFactory;
import Pachube.Pachube;
import Pachube.PachubeException;

public class SendFeed {     

    public static void main(String arsg[]) throws InterruptedException{
        SendFeed s = new SendFeed(0.0);
        s.setZainteresovanost(0.3);
        double output = s.getZainteresovanost();      
        System.out.println("zainteresovanost " + output);             

        try {
                Pachube p = new Pachube("MYAPIKEY");
                Feed f = p.getFeed(MYFEED);
                f.updateDatastream(0, output);
            } catch (PachubeException e) {
                System.out.println(e.errorMessage);
            }
    }

    private double zainteresovanost;    
    public SendFeed(double vrednost) {
        zainteresovanost = vrednost;
    }
    public void setZainteresovanost(double vrednost) {
        zainteresovanost = vrednost;
    }
    public double getZainteresovanost() {
        return zainteresovanost;
    }

}

но мне нужно сделать это из Matlab. Я попытался переписать пример (пример из ссылки работает на моей машине): я скомпилировал класс java с javac и добавил JPachube .jar и SendFeed.class в путь, а затем используйте этот код в Matlab:

javaaddpath('C:\work')
javaMethod('main','SendFeed','');    
pachubeValue = SendFeed(0.42);

Я получаю сообщение об ошибке:

??? Error using ==> javaMethod
No class SendFeed can be located on Java class path

Error in ==> post_to_pachube2 at 6
javaMethod('main','SendFeed','');

Это странно, потому что, как я уже сказал, пример из ссылки работает.

После этого я решил включить JPachube непосредственно в код Matlab и написать эквивалентный код в Matlab:

 javaaddpath('c:\work\JPachube.jar')

import Pachube.Data.*
import Pachube.Feed.*
import Pachube.Pachube.*
import Pachube.PachubeException.*

pachube = Pachube.Pachube('MYAPIKEY');
feed = pachube.getFeed(MYFEED);
feed.updateDatastream(0, 0.54);

И я получаю эту ошибку:

??? No method 'updateDatastream' with matching signature found for class 'Pachube.Feed'.

Error in ==> post_to_pachube2 at 12
feed.updateDatastream(0, 0.54);

Так что я перепробовал почти все и ничего! Любой метод, делающий эту работу, подойдет для меня. Спасибо за помощь заранее!


person supermus    schedule 10.01.2013    source источник


Ответы (2)


Этот трюк для меня (ответ от здесь)

javaaddpath('c:\work\httpcore-4.2.2.jar');
javaaddpath('c:\work\httpclient-4.2.3.jar');


import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity


httpclient = DefaultHttpClient();

httppost = HttpPost('http://api.cosm.com/v2/feeds/FEEDID/datastreams/0.csv?_method=put');
httppost.addHeader('Content-Type','text/plain');
httppost.addHeader('X-ApiKey','APIKEY');

params = StringEntity('0.7');
httppost.setEntity(params);

response = httpclient.execute(httppost);
person supermus    schedule 23.01.2013
comment
это, безусловно, хорошее решение, хотя вам нужно получить банки, а urlread2 использует уже имеющиеся sun.net.www.protocol.http и sun.net.www.protocol.https. Я предполагаю, что если вы собираетесь использовать только одну конечную точку API, то вы можете взять некоторые фрагменты кода из urlread2 и поместить их в функцию, что сделает ваш код в значительной степени свободным от зависимостей. Я не слишком уверен, лучше ли HTTP-клиент Apache, чем клиент Sun, есть идеи? - person errordeveloper; 23.01.2013
comment
Это решение простое. Я много раз пытался использовать urlread2 для POST-данных с разными заголовками, но безуспешно. Спасибо, в любом случае :) - person supermus; 24.01.2013

Я бы предпочел использовать встроенные методы. В Matlab есть urlread/urlwrite, который может работать, если все, что вы хотите сделать, это запросить некоторые данные CSV из Cosm API. Если вам нужно использовать JSON, это можно сделать в Matlab через плагин< /а>.

Передача ключа Cosm API, это можно сделать с помощью параметра key следующим образом:

cosm_feed_url = "https://api.cosm.com/v2/feeds/61916.csv?key=<API_KEY>"
cosm_feed_csv = urlread(cosm_feed_url)

Однако методы стандартной библиотеки urlread/urlwrite довольно ограничены. На самом деле функция urlwrite предназначена только для ввода в файл, и я даже не вижу официального примера того, как вместо нее можно было бы использовать форматированную строку. Создание временного файла было бы разумно, если только это не несколько строк CSV. Вам, вероятно, придется использовать urlread2 для чего-то более серьезного.

ОБНОВЛЕНИЕ: похоже, что urlread2 может быть проблематичным.

person errordeveloper    schedule 21.01.2013
comment
Я хотел бы расширить пример, но, к сожалению, у меня нет под рукой Matlab. - person errordeveloper; 22.01.2013
comment
Я обнаружил, что urlread по умолчанию использует жестко заданный тип контента. Мне нужно отправить POST, используя urlead с типом контента text/plain; charset=utf-8 и добавить ключ API в заголовок. - person supermus; 23.01.2013