获取OneNET云平台数据并显示折线图
使用到的框架和技术 OkHttpGo、FastJson、MpAndroidChart
有了前两篇随笔的基础后,现在将获取到的数据显示到折线图中,获取到的数据会暂存在ArrayList中,因为这些数据将会被用到折线图中的,所以Array中<>需要写Entry(MpAndroidChart中有定义,不同的图不同的实体)。需要获取的传感器有5个,所以一开始用for循环add(增添)5个数据,在每次线程中再去set它,规定了下标号0是温度,1是溶解氧,2是电导率,3是酸碱度,4是浊度。本次代码实时数据更新部分主要参照MpAndroidChart中的RealtimeLineChartActivity文件https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/RealtimeLineChartActivity.java。这次的例程会间隔一段时间再插入新的数据,最多只会显示10个点。(效果图一开始的是赋初值,在init函数有写到,不同的传感器赋不同的初值,0~4,但是没用单片机上传数据了,所以云平台的数据都是0)
1 package com.example.helloworld.zhenghe1; 2 3 import androidx.annotation.NonNull; 4 import androidx.appcompat.app.AppCompatActivity; 5 6 import android.content.Context; 7 import android.graphics.Color; 8 import android.os.Bundle; 9 import android.provider.Settings; 10 import android.view.View; 11 import android.view.ViewGroup; 12 import android.widget.ArrayAdapter; 13 import android.widget.ListView; 14 import android.widget.Toast; 15 16 import com.alibaba.fastjson.JSONArray; 17 import com.alibaba.fastjson.JSONObject; 18 import com.example.helloworld.R; 19 import com.github.mikephil.charting.charts.LineChart; 20 import com.github.mikephil.charting.components.Legend; 21 import com.github.mikephil.charting.components.LegendEntry; 22 import com.github.mikephil.charting.components.YAxis; 23 import com.github.mikephil.charting.data.Entry; 24 import com.github.mikephil.charting.data.LineData; 25 import com.github.mikephil.charting.data.LineDataSet; 26 import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; 27 import com.github.mikephil.charting.utils.ColorTemplate; 28 import com.lzy.okgo.OkGo; 29 import com.lzy.okgo.callback.StringCallback; 30 import com.lzy.okgo.model.Response; 31 32 import java.text.DecimalFormat; 33 import java.util.ArrayList; 34 import java.util.List; 35 36 public class ZhengHe1Main extends AppCompatActivity { 37 38 /**StoreValue是用于储存OneNET获取下来传感器的数据 39 * 其中 [0]是温度[1]溶解氧[2]电导率[3]ph[4]浊度 40 *该arraylist一开始在赋值为0,然在线程中set重新赋值*/ 41 ArrayList<Float> StoreValue = new ArrayList<>(); 42 LineChart lineChartWenDu,lineChartDo,lineChartPh,lineChartTDS,lineChartZhuoDu; 43 private String url = "https://api.heclouds.com/devices/523698851/datapoints"; 44 45 @Override 46 protected void onCreate(Bundle savedInstanceState) { 47 super.onCreate(savedInstanceState); 48 setContentView(R.layout.activity_zheng_he1_main); 49 setTitle("整合1 从OneNET获取数据并画表"); 50 51 init();//运行初始化函数 52 feedMultiple();//线程 53 } 54 55 /** 56 *初始化函数 57 *@author home 58 *@time 2021/3/1 9:38 59 */ 60 private void init() { 61 for(int i=0;i<5;i++) {//初始化arrylist赋值 先增加值,再修改值 62 StoreValue.add(i,(float) i); 63 } 64 65 lineChartWenDu = findViewById(R.id.chart_wendu); 66 lineChartDo = findViewById(R.id.chart_do); 67 lineChartTDS = findViewById(R.id.chart_tds); 68 lineChartPh = findViewById(R.id.chart_ph); 69 lineChartZhuoDu = findViewById(R.id.chart_zhuodu); 70 71 //设置数据部分(一定要为不同的传感器设置不同的LineData) 72 LineData dataWendu = new LineData(); 73 dataWendu.setValueTextColor(Color.BLACK); 74 lineChartWenDu.setData(dataWendu); 75 76 LineData dataDo = new LineData(); 77 dataDo.setValueTextColor(Color.BLACK); 78 lineChartDo.setData(dataDo); 79 80 LineData dataTds = new LineData(); 81 dataTds.setValueTextColor(Color.BLACK); 82 lineChartTDS.setData(dataTds); 83 84 LineData dataPh = new LineData(); 85 dataPh.setValueTextColor(Color.BLACK); 86 lineChartPh.setData(dataPh); 87 88 LineData dataZhuoDu = new LineData(); 89 dataZhuoDu.setValueTextColor(Color.BLACK); 90 lineChartZhuoDu.setData(dataZhuoDu); 91 92 getJsonFromOneNet(); 93 lineChartSetting();//设置表格样式 94 95 lineChartWenDu.invalidate(); 96 lineChartDo.invalidate(); 97 lineChartPh.invalidate(); 98 lineChartTDS.invalidate(); 99 lineChartZhuoDu.invalidate(); 100 } 101 102 /** 103 *设置表格的各种属性 104 *@author home 105 *@time 2021/2/28 13:01 106 */ 107 private void lineChartSetting() { 108 Legend legendWenDu = lineChartWenDu.getLegend(); 109 Legend legendDo = lineChartDo.getLegend(); 110 Legend legendTds = lineChartTDS.getLegend(); 111 Legend legendPh = lineChartPh.getLegend(); 112 Legend legendZhuoDu = lineChartZhuoDu.getLegend(); 113 114 legendWenDu.setEnabled(true); 115 legendWenDu.setTextColor(Color.BLACK); 116 legendWenDu.setTextSize(12); 117 legendWenDu.setForm(Legend.LegendForm.LINE); 118 legendWenDu.setFormSize(18); 119 legendWenDu.setXEntrySpace(15); 120 legendWenDu.setFormToTextSpace(8); 121 122 legendDo.setEnabled(true); 123 legendDo.setTextColor(Color.BLACK); 124 legendDo.setTextSize(12); 125 legendDo.setForm(Legend.LegendForm.LINE); 126 legendDo.setFormSize(18); 127 legendDo.setXEntrySpace(15); 128 legendDo.setFormToTextSpace(8); 129 130 legendTds.setEnabled(true); 131 legendTds.setTextColor(Color.BLACK); 132 legendTds.setTextSize(12); 133 legendTds.setForm(Legend.LegendForm.LINE); 134 legendTds.setFormSize(18); 135 legendTds.setXEntrySpace(15); 136 legendTds.setFormToTextSpace(8); 137 138 legendPh.setEnabled(true); 139 legendPh.setTextColor(Color.BLACK); 140 legendPh.setTextSize(12); 141 legendPh.setForm(Legend.LegendForm.LINE); 142 legendPh.setFormSize(18); 143 legendPh.setXEntrySpace(15); 144 legendPh.setFormToTextSpace(8); 145 146 legendZhuoDu.setEnabled(true); 147 legendZhuoDu.setTextColor(Color.BLACK); 148 legendZhuoDu.setTextSize(12); 149 legendZhuoDu.setForm(Legend.LegendForm.LINE); 150 legendZhuoDu.setFormSize(18); 151 legendZhuoDu.setXEntrySpace(15); 152 legendZhuoDu.setFormToTextSpace(8); 153 154 LegendEntry[] legendEntriesWenDu = new LegendEntry[1]; 155 LegendEntry entryWenDu = new LegendEntry(); 156 entryWenDu.formColor = Color.BLUE;//不设置颜色将不会出现 157 entryWenDu.label = "温度"; 158 legendEntriesWenDu[0] = entryWenDu; 159 160 LegendEntry[] legendEntriesDo = new LegendEntry[1]; 161 LegendEntry entryDo = new LegendEntry(); 162 entryDo.formColor = Color.RED; 163 entryDo.label = "溶解氧"; 164 legendEntriesDo[0] = entryDo; 165 166 LegendEntry[] legendEntriesTds = new LegendEntry[1]; 167 LegendEntry entryTds = new LegendEntry(); 168 entryTds.formColor = Color.GREEN; 169 entryTds.label = "电导率(TDS)"; 170 legendEntriesTds[0] = entryTds; 171 172 LegendEntry[] legendEntriesPh = new LegendEntry[1]; 173 LegendEntry entryPh = new LegendEntry(); 174 entryPh.formColor = Color.YELLOW; 175 entryPh.label = "PH"; 176 legendEntriesPh[0] = entryPh; 177 178 LegendEntry[] legendEntriesZhuoDu = new LegendEntry[1]; 179 LegendEntry entryZhuoDu = new LegendEntry(); 180 entryZhuoDu.formColor = Color.DKGRAY; 181 entryZhuoDu.label = "浊度"; 182 legendEntriesZhuoDu[0] = entryZhuoDu; 183 184 legendWenDu.setCustom(legendEntriesWenDu); 185 legendDo.setCustom(legendEntriesDo); 186 legendTds.setCustom(legendEntriesTds); 187 legendPh.setCustom(legendEntriesPh); 188 legendZhuoDu.setCustom(legendEntriesZhuoDu); 189 } 190 191 /** 192 *添加不同传感器的数据 193 *@author home 194 *@time 2021/2/28 16:56 195 */ 196 private void addEntry() { 197 198 LineData dataWenDu = lineChartWenDu.getData(); 199 LineData dataDo = lineChartDo.getData(); 200 LineData dataTds = lineChartTDS.getData(); 201 LineData dataPh = lineChartPh.getData(); 202 LineData dataZhuoDu = lineChartZhuoDu.getData(); 203 204 //温度 205 if (dataWenDu != null) { 206 207 ILineDataSet setWenDu = dataWenDu.getDataSetByIndex(0); 208 // set.addEntry(...); // can be called as well 209 210 if (setWenDu == null) { 211 setWenDu = createSet(); 212 dataWenDu.addDataSet(setWenDu); 213 } 214 215 // StoreValue.set(0,(float) 0);//测试用 看下数据是否能显示 216 dataWenDu.addEntry(new Entry(setWenDu.getEntryCount(), StoreValue.get(0)),0); 217 dataWenDu.notifyDataChanged(); 218 219 // let the chart know it's data has changed 220 lineChartWenDu.notifyDataSetChanged(); 221 // limit the number of visible entries 222 lineChartWenDu.setVisibleXRangeMaximum(120); 223 // chart.setVisibleYRange(30, AxisDependency.LEFT); 224 225 // move to the latest entry 226 lineChartWenDu.moveViewToX(dataWenDu.getEntryCount()); 227 228 // this automatically refreshes the chart (calls invalidate()) 229 // chart.moveViewTo(data.getXValCount()-7, 55f, 230 // AxisDependency.LEFT); 231 } 232 233 //DO 234 if (dataDo != null) { 235 236 ILineDataSet setDo = dataDo.getDataSetByIndex(0); 237 // set.addEntry(...); // can be called as well 238 239 if (setDo == null) { 240 setDo = createSet(); 241 dataDo.addDataSet(setDo); 242 } 243 244 // StoreValue.set(1,(float) 1);//测试用 看下数据是否能显示 245 dataDo.addEntry(new Entry(setDo.getEntryCount(), StoreValue.get(1)),0); 246 dataDo.notifyDataChanged(); 247 248 lineChartDo.notifyDataSetChanged(); 249 lineChartDo.setVisibleXRangeMaximum(120); 250 lineChartDo.moveViewToX(dataDo.getEntryCount()); 251 } 252 253 //TDS 254 if (dataTds != null) { 255 256 ILineDataSet setTds = dataTds.getDataSetByIndex(0); 257 // set.addEntry(...); // can be called as well 258 259 if (setTds == null) { 260 setTds = createSet(); 261 dataTds.addDataSet(setTds); 262 } 263 264 // StoreValue.set(2,(float) 2);//测试用 看下数据是否能显示 265 dataTds.addEntry(new Entry(setTds.getEntryCount(), StoreValue.get(2)),0); 266 dataTds.notifyDataChanged(); 267 268 lineChartTDS.notifyDataSetChanged(); 269 lineChartTDS.setVisibleXRangeMaximum(120); 270 lineChartTDS.moveViewToX(dataTds.getEntryCount()); 271 } 272 273 //Ph 274 if (dataPh != null) { 275 276 ILineDataSet setPh = dataPh.getDataSetByIndex(0); 277 // set.addEntry(...); // can be called as well 278 279 if (setPh == null) { 280 setPh = createSet(); 281 dataPh.addDataSet(setPh); 282 } 283 284 // StoreValue.set(3,(float) 3);//测试用 看下数据是否能显示 285 dataPh.addEntry(new Entry(setPh.getEntryCount(), StoreValue.get(3)),0); 286 dataPh.notifyDataChanged(); 287 288 lineChartPh.notifyDataSetChanged(); 289 lineChartPh.setVisibleXRangeMaximum(120); 290 lineChartPh.moveViewToX(dataPh.getEntryCount()); 291 } 292 293 //浊度 294 if (dataZhuoDu != null) { 295 296 ILineDataSet setZhuoDu = dataZhuoDu.getDataSetByIndex(0); 297 // set.addEntry(...); // can be called as well 298 299 if (setZhuoDu == null) { 300 setZhuoDu = createSet(); 301 dataZhuoDu.addDataSet(setZhuoDu); 302 } 303 304 // StoreValue.set(4,(float) 4);//测试用 看下数据是否能显示 305 dataZhuoDu.addEntry(new Entry(setZhuoDu.getEntryCount(), StoreValue.get(4)),0); 306 dataZhuoDu.notifyDataChanged(); 307 308 lineChartZhuoDu.notifyDataSetChanged(); 309 lineChartZhuoDu.setVisibleXRangeMaximum(120); 310 lineChartZhuoDu.moveViewToX(dataZhuoDu.getEntryCount()); 311 } 312 } 313 314 315 316 private LineDataSet createSet() { 317 318 LineDataSet set = new LineDataSet(null, "Dynamic Data"); 319 set.setAxisDependency(YAxis.AxisDependency.LEFT); 320 set.setColor(ColorTemplate.getHoloBlue()); 321 set.setCircleColor(Color.BLACK); 322 set.setLineWidth(2f); 323 set.setCircleRadius(4f); 324 set.setFillAlpha(65); 325 set.setFillColor(ColorTemplate.getHoloBlue()); 326 set.setHighLightColor(Color.rgb(244, 117, 117)); 327 set.setValueTextColor(Color.BLACK); 328 set.setValueTextSize(9f); 329 set.setDrawValues(false); 330 return set; 331 } 332 333 private Thread thread; 334 335 private void feedMultiple() { 336 337 if (thread != null) 338 thread.interrupt(); 339 340 final Runnable runnable = new Runnable() { 341 342 @Override 343 public void run() { 344 //getJsonFromOneNet(); 345 addEntry();//更新数据 346 } 347 }; 348 349 thread = new Thread(new Runnable() { 350 351 @Override 352 public void run() { 353 for (int i = 0; i < 10; i++) { 354 355 // Don't generate garbage runnables inside the loop. 356 runOnUiThread(runnable); 357 358 try { 359 Thread.sleep(5000); 360 } catch (InterruptedException e) { 361 e.printStackTrace(); 362 } 363 } 364 } 365 }); 366 367 thread.start(); 368 } 369 370 @Override 371 protected void onDestroy() { 372 super.onDestroy(); 373 //Activity销毁时,取消网络请求 374 OkGo.getInstance().cancelTag(this); 375 } 376 377 /** 378 *OkHttpGo与FastJson结合,从OneNET云平台获取数据,并存入arraylist中 379 *@author home 380 *@time 2021/2/28 14:44 381 */ 382 private void getJsonFromOneNet() { 383 384 OkGo.<String>get(url)//文档说的第一行泛型一定要添加是指这里 385 .headers("api-key", "4VdbaFeRQZRwaSTWNhWxb2UEHaw=")//设备的api-key 386 .headers("Content-Type","application/json") 387 .tag(this) 388 .execute(new StringCallback() { 389 @Override 390 public void onSuccess(Response<String> response) {//请求成功回调onSuccess方法 391 392 String value = "", id = ""; 393 int count = 0; 394 395 JSONObject jsonObjectData = JSONObject.parseObject(response.body()).getJSONObject("data");//获取json对象后再获取json对象,即第二层data 396 count = jsonObjectData.getIntValue("count");//count是Datastreams数组的下标值 397 JSONArray jsonArrayDatastreams = jsonObjectData.getJSONArray("datastreams");//获取json数组即datastearms 398 399 for(int j = 0; j < count; j++) {//遍历Datastreams数组 400 JSONObject jsonObjectIndex = jsonArrayDatastreams.getJSONObject(j); 401 id = jsonObjectIndex.getString("id"); 402 JSONArray jsonArrayDatapoints = jsonObjectIndex.getJSONArray("datapoints"); 403 JSONObject jsonObjectValue = jsonArrayDatapoints.getJSONObject(0);//Datapoints数组只有一个元素(对象),所以下标是1 404 value = jsonObjectValue.getString("value"); 405 switch (id) { 406 case "3303_0_5700": //温度 407 //System.out.println("温度" + value + id); 408 //tv_wendu.setText("温度" + value + "\t设备号" + id); 409 float a1 = Float.parseFloat(value); 410 StoreValue.set(0,a1); 411 System.out.println("温度" + StoreValue.get(0)); 412 break; 413 case "3300_0_5700": //溶解氧 414 System.out.println("DO" + value + id); 415 float a2 = Float.parseFloat(value); 416 StoreValue.set(1,a2); 417 break; 418 case "3327_0_5700": //电导率 419 System.out.println("电导率" + value + id); 420 float a3 = Float.parseFloat(value); 421 StoreValue.set(2,a3); 422 break; 423 case "3326_0_5700": //ph 424 System.out.println("ph" + value + id); 425 float a4 = Float.parseFloat(value); 426 StoreValue.set(3,a4); 427 break; 428 case "3300_1_5700": //浊度 429 System.out.println("浊度" + value + id); 430 float a5 = Float.parseFloat(value); 431 StoreValue.set(4,a5); 432 break; 433 } 434 } 435 } 436 437 @Override 438 public void onError(Response<String> response) { 439 Toast.makeText(getApplicationContext(), "接口请求错误!", Toast.LENGTH_LONG).show(); 440 } 441 }); 442 } 443 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <LinearLayout 7 android:layout_width="match_parent" 8 android:layout_height="match_parent" 9 android:orientation="vertical"> 10 11 <com.github.mikephil.charting.charts.LineChart 12 android:id="@+id/chart_wendu" 13 android:layout_width="match_parent" 14 android:layout_height="200dp" /> 15 16 <com.github.mikephil.charting.charts.LineChart 17 android:layout_marginTop="20dp" 18 android:id="@+id/chart_do" 19 android:layout_width="match_parent" 20 android:layout_height="200dp" /> 21 22 <com.github.mikephil.charting.charts.LineChart 23 android:layout_marginTop="20dp" 24 android:id="@+id/chart_tds" 25 android:layout_width="match_parent" 26 android:layout_height="200dp" /> 27 28 29 <com.github.mikephil.charting.charts.LineChart 30 android:layout_marginTop="20dp" 31 android:id="@+id/chart_ph" 32 android:layout_width="match_parent" 33 android:layout_height="200dp" /> 34 35 <com.github.mikephil.charting.charts.LineChart 36 android:layout_marginTop="20dp" 37 android:id="@+id/chart_zhuodu" 38 android:layout_width="match_parent" 39 android:layout_height="200dp" /> 40 41 </LinearLayout> 42 43 44 </ScrollView>
打包apk发送到手机运行时,提示了如下错误 Static interface methods are only supported starting with Android N ,参照了博客https://blog.csdn.net/z1web/article/details/88787382,在bulid.gradle(app)中的...加入 就可以了。
```
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
```
posted on 2021-03-01 11:03 stuMartin 阅读(2151) 评论(0) 编辑 收藏 举报