智能农业项目的感悟:
写智能农业项目需要智能农业App素材,接口,项目需求说明书。
准备工作:
1,把项目的xml页面做好。
2,在build.gradle中把依赖库加入android-async-http或okhttp,asynchttpclient自带线程而okhttp没有每次耗时操作都需要创建子线程(使用okhttp可以更快)
dependencies {
compile 'com.loopj.android:android-async-http:1.4.9'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
}
3,加入联网联网权限
<uses-permission android:name="android.permission.INTERNET" />
几个界面的实现:
- 界面一
使用AlertDialog进行设置将EditText加入
private void modify() {
final EditText editText = new EditText(this);
android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this);
builder.setTitle("欢迎您,请先设置服务器IP");
builder.setView(editText);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
string=editText.getText().toString();
Intent intent = new Intent(StartActivity.this, MainActivity.class);
startActivity(intent);
}
});
builder.show();
}
- 界面二
底部菜单栏的设置
package com.example.intellsigentagriculture;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ViewPager viewPager;
private ShouFragment shouFragment;//菜单栏对应三个Fragment
private SetFragment setFragment;
private HelpFragment helpFragment;
private LinearLayout imageButton;//三个LinearLayout的点击事件
private LinearLayout imageButton2;
private LinearLayout imageButton3;
private ImageView img1;//菜单栏上的三个图片
private ImageView img2;
private ImageView img3;
private TextView title;
private TextView textView;//菜单栏上的三个文字
private TextView textView2;
private TextView textView3;
private ArrayList<Fragment> fragmentArrayList = new ArrayList<>();//Fragment的列
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewpager);//viewPager绑定ID
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//对viewPager进行监听
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {//在监听事件中查看当前选择的页面
if (position == 0) {
//当position=0的时候跳到第一个界面的图片和文字
one();
} else if (position == 1) {
//第二个界面
two();
} else if (position == 2) {
//第三个界面
three();
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
imageButton = findViewById(R.id.btn1);//绑定ID
imageButton2 = findViewById(R.id.btn2);
imageButton3 = findViewById(R.id.btn3);
img1 = findViewById(R.id.home);
img2 = findViewById(R.id.seting);
img3 = findViewById(R.id.help);
title = findViewById(R.id.title);
textView = findViewById(R.id.hometext);
textView2 = findViewById(R.id.settext);
textView3 = findViewById(R.id.helptext);
imageButton.setOnClickListener(this);
imageButton2.setOnClickListener(this);
imageButton3.setOnClickListener(this);
shouFragment = new ShouFragment();
setFragment = new SetFragment();
helpFragment = new HelpFragment();
fragmentArrayList.add(shouFragment);
fragmentArrayList.add(setFragment);
fragmentArrayList.add(helpFragment);
Asadapter asadapter = new Asadapter(getSupportFragmentManager(), fragmentArrayList);
//绑定适配器
viewPager.setAdapter(asadapter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1://监听第一个LinearLayout
viewPager.setCurrentItem(0);//viewPager到到第一个界面
one();//图片和文字变色
break;
case R.id.btn2:
viewPager.setCurrentItem(1);
two();
break;
case R.id.btn3:
viewPager.setCurrentItem(2);
three();
break;
}
}
private void three() {
title.setText("帮助");
img1.setImageResource(R.mipmap.b1);
textView.setTextColor(this.getResources().getColor(R.color.colorblack));
img2.setImageResource(R.mipmap.b2);
textView2.setTextColor(this.getResources().getColor(R.color.colorblack));
img3.setImageResource(R.mipmap.bangzhu_lu);
textView3.setTextColor(this.getResources().getColor(R.color.colormenc));
}
private void two() {
title.setText("设置");
img1.setImageResource(R.mipmap.b1);
textView.setTextColor(this.getResources().getColor(R.color.colorblack));
img2.setImageResource(R.mipmap.shezhi_lu);
textView2.setTextColor(this.getResources().getColor(R.color.colormenc));
img3.setImageResource(R.mipmap.b3);
textView3.setTextColor(this.getResources().getColor(R.color.colorblack));
}
private void one() {
title.setText("智能农业");
img1.setImageResource(R.mipmap.shouye_lu);
textView.setTextColor(this.getResources().getColor(R.color.colormenc));
img2.setImageResource(R.mipmap.b2);
textView2.setTextColor(this.getResources().getColor(R.color.colorblack));
img3.setImageResource(R.mipmap.b3);
textView3.setTextColor(this.getResources().getColor(R.color.colorblack));
}
private class Asadapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public Asadapter(FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
this.fragmentList = fragmentList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
}
Fragment的图片滑动
使用ViewPager+Fragment解决
fragmentA = new FragmentA();//新建Fragment
fragmentB = new FragmentB();
fragmentC = new FragmentC();
fragmentArrayList.clear();每次刷新一下
fragmentArrayList.add(fragmentA);//把fragment加入进来
fragmentArrayList.add(fragmentB);
fragmentArrayList.add(fragmentC);
Newadapter asadapter = new Newadapter(getFragmentManager(), fragmentArrayList);
//绑定适配器
//需要注意的是这里第一个参数变成了getFragmentManager(),而不是getSupportFragmentManager()
viewPager.setAdapter(asadapter);
圆形图片的实现
在dependencies 添加依赖库
dependencies {
compile 'com.makeramen:roundedimageview:2.2.1'
}
在xml中就可以实现圆形图片了
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/mimmap1"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_margin="10dp"
android:src="@drawable/co2"
app:riv_oval="true" />
co2浓度的获取
使用Okhttp获取co2浓度,以及开始界面EditText输入的IP的API的拼接,还有阈值传的值的接收
package com.example.intellsigentagriculture.use;
import android.util.Log;
import com.example.intellsigentagriculture.StartActivity;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URL;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* Created by wang3 on 2018/4/12.
*/
public class OkHttp {
private static final String HTTP="http://";
private static final String HTTP2= ":8890/type/jason/action/";
//API的拼接
private static OkHttpClient okHttpClient=new OkHttpClient();
public static final MediaType Json=MediaType.parse("application/json;charset=UTF-8");
public static void get(String url, Callback callback){
//使用Callback回调方法
Request request = new Request.Builder().url(getaddress(url)).build();
// 创建一个request对象
Call call= okHttpClient.newCall(request);
call.enqueue(callback);
}
public static void post(String url,String json,int number, Callback callback){
try {
JSONObject jsonObject=new JSONObject();
jsonObject.put(json,number);//传JSON数据(键值对)
RequestBody requestBody=RequestBody.create(Json,jsonObject.toString());
Request request = new Request.Builder().url(getaddress(url)).post(requestBody).build();
okHttpClient.newCall(request).enqueue(callback);
} catch (JSONException e) {
e.printStackTrace();
}
}
public static void logs(String url,String json,String number, Callback callback){
try {//从阈值改变设置值
JSONObject jsonObject=new JSONObject();
jsonObject.put(json,number);
RequestBody requestBody=RequestBody.create(Json,jsonObject.toString());
Request request = new Request.Builder().url(getaddress(url)).post(requestBody).build();
okHttpClient.newCall(request).enqueue(callback);
} catch (JSONException e) {
e.printStackTrace();
}
}
private static String getaddress(String url) {
return HTTP+ StartActivity.string+HTTP2+url;
}
}
开始获取co2的值
OkHttp.get("getSensor", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
progressDialog.dismiss();
Toast.makeText(getContext(), "访问失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String s = response.body().string();
//以字符串的形式接收JSON数据
try {
JSONObject jsonObject = new JSONObject(s);//解析JSON
airHumidity = jsonObject.getString("airHumidity");
airTemperature = jsonObject.getString("airTemperature");
soilTemperature = jsonObject.getString("soilTemperature");
co2 = jsonObject.getString("co2");
soilHumidity = jsonObject.getString("soilHumidity");
light = jsonObject.getString("light");
getActivity().runOnUiThread(new Runnable() {//创建线程(耗时)
@Override
public void run() {//
progressDialog.dismiss();
textView.setText(co2);
textView2.setText(light);
textView3.setText(soilTemperature);
textView4.setText(soilHumidity);
textView5.setText(airHumidity);
textView6.setText(airTemperature);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
设置值的获取
OkHttp.get("getConfig", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
progressDialog.dismiss();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
progressDialog.dismiss();
String m = response.body().string();
try {
JSONObject jsonObject = new JSONObject(m);//JSON的解析
minCo2 = jsonObject.getString("minCo2");//设置值的最小值与最大值
maxCo2 = jsonObject.getString("maxCo2");
minLight = jsonObject.getString("minLight");
maxLight = jsonObject.getString("maxLight");
minSoilHumidity = jsonObject.getString("minSoilHumidity");
maxSoilHumidity = jsonObject.getString("maxSoilHumidity");
minAirHumidity = jsonObject.getString("minAirHumidity");
maxAirHumidity = jsonObject.getString("maxAirHumidity");
getActivity().runOnUiThread(new Runnable() {//创建线程
@Override
public void run() {
progressDialog.dismiss();
numbercount.setText(minCo2);
numbercounttwo.setText(maxCo2);
numbercount2.setText(minLight);
numbercount2two.setText(maxLight);
numbercount3.setText(minSoilHumidity);
numbercount3two.setText(maxSoilHumidity);
numbercount4.setText(minAirHumidity);
numbercount4two.setText(maxAirHumidity);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
界面三
判断图片是打开还是关闭
点击事件实现计算第几次
public void onClick(View v) {
//点击事件中将判断语句加入
switch (v.getId()) {
case R.id.imageView:
anInt++;//每次加一
panduan();//跳到panduan方法中
kaishi("Blower", anInt % 2);//将值传入到获取控制器状态的协议中
break;
}
}
判断图片打开还是关闭
private void panduan() {//判断点击的值
if (anInt % 2 == 0) {//为0时是打开1是关闭
imageButton.setBackgroundResource(R.drawable.dakaifengshan);
} else {
imageButton.setBackgroundResource(R.drawable.dakaifengshan2);
}
}
获取控制器协议
public void kaishi(String string, int a) {
OkHttp.post("control", string, a, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(Co2Activity.this, "连接失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String s = response.body().string();
try {
JSONObject jsonObject = new JSONObject(s);
String Blower = jsonObject.getString("Blower");
String WaterPump = jsonObject.getString("WaterPump");
anInt = Integer.parseInt(Blower);
anInt2 = Integer.parseInt(WaterPump);
runOnUiThread(new Runnable() {
@Override
public void run() {
panduan();
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
界面四
点击确定按钮实现界面二中设置值的改变
package com.example.intellsigentagriculture;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.intellsigentagriculture.use.OkHttp;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class Co2SetingActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
private EditText edi1;
private EditText edi2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_co2_seting);
bindID();
}
private void bindID() {
btn=findViewById(R.id.co2_wl3);//绑定ID
edi1=findViewById(R.id.editText);
edi2=findViewById(R.id.editText2);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.co2_wl3://点击确定时传值
Toast.makeText(this, "设置成功", Toast.LENGTH_SHORT).show();
String co2min=edi1.getText().toString();
String co2max=edi2.getText().toString();
co2min("minCo2",co2min);//创建方法放入“接口的值”,换成输入的值
co2min("maxCo2",co2max);
break;
}
}
private void co2min(String co2min, String co2min1) {
OkHttp.logs("setConfig", co2min, co2min1, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
}