如何绘制从MQTT到LineChart的实时数据? -MPAndroid图表

时间:2019-05-14 21:42:02

标签: android real-time mqtt mpandroidchart dynamic-data

我将要编写一个android应用程序的代码,并且是java和android studio的初学者。我有声音,温度,嗡嗡声,火焰传感器,它们正在将数据发布到MQTT代理。我已经订阅了临时/嗡嗡声主题并从中获取数据。我想使用MPAndroidChart实时制作LineChart,在一个linechart上,我想实时查看这两个传感器的值。如果我能做到这一点,那么我也可能会做所有其他传感器。我认为主要的问题是我无法获取mqttmessage的值来绘制图表。

我实际上从 wildans techblog 获得了我的mqtt和图表入门资料。所以我不明白整个代码。

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 :(得分:0)

通过使用现成的协议适配器such as the one provided by Ably,您可以非常轻松地将基于MQTT的传感器数据获取到Android应用程序。协议适配器实质上是在各种协议之间进行转换,例如MQTT(高效且适合您的传感器)和WebSockets(高效且适合您的Android应用)。您无需处理翻译的复杂性,甚至不需要处理随着应用程序成熟而出现的可伸缩性问题。

这是我发现的一个教程,它使您可以build a snake game with MQTT based controller,使用前面提到的协议适配器与Web应用程序通信。我认为遵循并用您的android应用程序替换Web部件应该相当容易。他们也有一个基本的Pub/Sub tutorial with Android,我想您可以将其与另一个结合使用以构建您指定的内容。

希望这会有所帮助!