我将要编写一个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的值,我认为这是件好事。
答案 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,我想您可以将其与另一个结合使用以构建您指定的内容。
希望这会有所帮助!