Как построить данные в реальном времени из MQTT в LineChart?- MPAndroidChart - PullRequest
0 голосов
/ 15 мая 2019

Я собираюсь написать приложение для Android, и я новичок в java и Android Studio. У меня есть датчики звука, температуры, гула, пламени, которые публикуют данные для брокера MQTT. Я подписан на темы temp / hum и получаю данные из них. Я хочу сделать в реальном времени LineChart с MPAndroidChart, на одном linechart я хочу видеть значения этих двух датчиков в режиме реального времени. Если бы я мог сделать это, я мог бы сделать все другие датчики также. Я думаю, что главная проблема в том, что я не могу получить свое mqttmessage значение для построения графика.

Я на самом деле получил свой mqtt и мой график, начиная с wildans techblog . Так что я не понимаю весь код.

public class SoundActivity extends AppCompatActivity {
MqttHelper mqttHelper;
TextView dataRecieved;
LineChart soundLineChart;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sound);


    soundLineChart = (LineChart) findViewById(R.id.sound_line_chart);
    dataRecieved=(TextView)findViewById(R.id.soundDataRecieved);
    LineDataSet soundDataSet = new LineDataSet(soundData(),null);

    ArrayList<ILineDataSet> dataSets = new ArrayList<>();
    dataSets.add(soundDataSet);

    LineData data = new LineData(dataSets);
    soundLineChart.setData(data);
    soundLineChart.invalidate();

    startMqtt();

}
private ArrayList<Entry> soundData(){

    ArrayList<Entry> value = new ArrayList<Entry>();
    value.add(new Entry(1,20)); // THIS IS ONE VALUE WHIC IS ON THE CHART.


    return value;
}


private void startMqtt(){
    mqttHelper = new MqttHelper(getApplicationContext());
    mqttHelper.setCallback(new MqttCallbackExtended() {
        @Override
        public void connectComplete(boolean b, String s) {

        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Debug",mqttMessage.toString());
            dataRecieved.setText(mqttMessage.toString());

        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
    });
}//startmqttvége

public void addEntry(float value) {

    LineData data = soundLineChart.getData();

    if (data != null){

        ILineDataSet set = data.getDataSetByIndex(0);
        // set.addEntry(...); // can be called as well

        if (set == null) {
            set = createSet();
            data.addDataSet(set);
        }

        data.addEntry(new Entry(set.getEntryCount(),value),0);
        Log.w("chart", set.getEntryForIndex(set.getEntryCount()-1).toString());

        data.notifyDataChanged();

        // let the chart know it's data has changed
        soundLineChart.notifyDataSetChanged();

        // limit the number of visible entries
        soundLineChart.setVisibleXRangeMaximum(10);
        // mChart.setVisibleYRange(30, AxisDependency.LEFT);

        // move to the latest entry
        soundLineChart.moveViewTo(set.getEntryCount()-1, data.getYMax(), YAxis.AxisDependency.LEFT);

        // this automatically refreshes the chart (calls invalidate())
        // mChart.moveViewTo(data.getXValCount()-7, 55f,
        // AxisDependency.LEFT);
    }
}

private LineDataSet createSet() {
    LineDataSet set = new LineDataSet(null, "Data");
    set.setAxisDependency(YAxis.AxisDependency.LEFT);
    set.setColor(Color.rgb(67, 164, 34));
    //set.setCircleColor(Color.WHITE);
    set.setLineWidth(2f);
    //set.setCircleRadius(4f);
    set.setFillAlpha(65);
    set.setFillColor(Color.rgb(67, 164, 34));
    set.setHighLightColor(Color.rgb(67, 164, 34));
    set.setValueTextColor(Color.rgb(67, 164, 34));
    set.setValueTextSize(9f);
    set.setDrawValues(false);
    return set;
}

@Override
public void onValueSelected(Entry e, Highlight h) {
    Log.i("Entry selected", e.toString());
}

@Override
public void onNothingSelected(){
    Log.i("Nothing selected", "Nothing selected.");
}

}

Я могу отобразить данные, которые были объявлены, но я не совсем понимаю, как отобразить данные, поступающие через mqtt. Я сделал textview, который обновляет значение из mqtt, я думаю, что это хорошо.

1 Ответ

0 голосов
/ 17 мая 2019

Вы можете очень легко получить данные датчика на основе MQTT в приложение для Android с помощью готового протокола , например, предоставленного Ably . Адаптер протокола по существу транслирует между различными протоколами, такими как MQTT (эффективный и подходящий для ваших датчиков) и WebSockets (эффективный и подходящий для вашего приложения Android). Вам не нужно иметь дело со сложностью перевода или даже с проблемами масштабируемости, которые могут возникнуть по мере взросления вашего приложения.

Вот учебник, который я нашел, который позволяет вам создать игру-змейку с контроллером на базе MQTT , связывающуюся с веб-приложением, используя адаптер протокола, который я упоминал ранее. Я думаю, что это должно быть довольно легко отслеживать и заменить веб-часть с вашим приложением для Android. У них также есть базовое руководство по Pub / Sub для Android , которое, я думаю, вы можете использовать в сочетании с другим, чтобы создать то, что вы указали.

Надеюсь, это поможет!

...