Я собираюсь написать приложение для 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, я думаю, что это хорошо.