智能农业

这里写图片描述
这个就是智能农业的大纲现在我们来详细的解释一下
整体的布局就不用我在过多的叙述然后我们就进入我们的重点
页面的滑动可以查看我们的前面的viewpage+Fragment的组合我也在这不进行过多的叙述
对于我们在登录框输入自己的ip以及多少秒之后自动的跳转我们通过下面的代码来更好的了解

   handler.postDelayed(new Runnable() {  //使用handler的postDelayed实现延时跳转

            public void run() {

                        AlertDialog.Builder builder = new AlertDialog.Builder(ImgActivity.this);
                        View view = View.inflate(ImgActivity.this,R.layout.alert_dialog,null);
                        builder.setView(view);
                        builder.setCancelable(true);
                        editText = view.findViewById(R.id.dialog_et);
                        button = view.findViewById(R.id.dialog_btn);
                        AlertDialog dialog = builder.create();
                        dialog.show();
                        //上面就是输入框的我们首先创建一个xml布局,然后我们绑定id之后通过AlertDialog使这个跳出来之后我们输入ip然后就是下面的操作


                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(ImgActivity.this, MainActivity.class);
                        //使用Intent传递输入的iP然后我们第一个健是ip对于字符串我们使用String对于布尔类型我们使用的BooleanExtra传值
                        IP = editText.getText().toString();
                        intent.putExtra("IP",IP);
                        startActivity(intent);
                        finish();
                    }
                });

            }
        }, SPLASH_LENGTH);//3秒后跳转至应用主界面MainActivity
    }

之后我们要要讲我们输入的ip与服务器的地址进行拼接至于这个ip是真么得到的就是通过前面Intent的方法获得ip至于解析网址获得数据我们使用Okhttp的方法因为这个解析很快但是不能自动的更新UI所以我们还要在主线程中进行更新Ui操作我们首先创建一个类就是关于访问网络的代码如下面

public class Okhttp {

    private static OkHttpClient client = new OkHttpClient();

    public static void sendOkHttpRequest(String address,okhttp3.Callback callback){


        Request request = new Request.Builder().url(address).build();
        client.newCall(request).enqueue(callback);
    }

    public static void postJsonByOkHttp(String url, JSONObject jsonObject,okhttp3.Callback callback){

        MediaType mediaType = MediaType.parse("application/json;Charset=UTF-8");
        RequestBody requestBody = RequestBody.create(mediaType,jsonObject.toString());
        Request request = new Request.Builder().url(url).post(requestBody).build();
        client.newCall(request).enqueue(callback);

        }

}

至于为啥要使用static因为是这个修饰的是静态变量可以使用类名点方法名引用出来调引用这里面的方法之后我们就是访问网络提取里面的数据我们通过代码来看看

 private void getAppValues() {
        Intent intent = getActivity().getIntent();
        String relativeUrl = intent.getStringExtra("IP");
        String basicUrl2 = "http://"+relativeUrl+":8890/type/jason/action/getSensor?username=admin";
        Log.e(TAG, "getAppValues: "+basicUrl2 );
        Okhttp.sendOkHttpRequest(basicUrl2, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        closeProgressDialog();
                        Toast.makeText(getActivity(), "network failture", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                flag++;

                String responseString = null;
                try {
                    responseString = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Log.e(TAG, "onResponse: getval"+ responseString);
                Gson gson = new Gson();
                App app = gson.fromJson(responseString,App.class);
                airHumidity = app.getAirHumidity();
                PM25 = app.getPM25();
                airTemperature = app.getAirTemperature();
                soilTemperature = app.getSoilTemperature();
                co2 = app.getCo2();
                soilHumidity = app.getSoilHumidity();
                light = app.getLight();

                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        if(flag==2){
                            closeProgressDialog();
                        }

                        co2Tv.setText(co2+"");
                        lightTv.setText(light+"");
                        soilTempTv.setText(soilTemperature+"");
                        soilWetnessTv.setText(soilHumidity+"");
                        airTempTv.setText(airTemperature+"");
                        airWetnessTv.setText(airHumidity+"");

                        //Log.e(TAG, "onSuccess: "+responseString );
                        Toast.makeText(getActivity(), "success", Toast.LENGTH_SHORT).show();

                    }
                });

            }
        });

然后我们还是要使用解释数据至于使用什么方法就看我们自己的选择我在上面的代码中使用的是Gson方法解析对于使用这个方法我们要是用依赖条件就是Gson之后我门就是填充数据
还有前面的Okhttp的依赖条件

compile 'com.google.code.gson:gson:2.8.2'
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'```
    这是填充条件之后我们通过网络请求控制沙盘模拟器
    我们要是用控制沙盘模拟器 我们首先要网络请求那个沙盘模拟器各个开关的状态看看是 开还是关的
    然后判断的代码就是下面的

private void getStatus() {

    Intent intent1 = getActivity().getIntent();
    String relativeUrl = intent1.getStringExtra("IP");
    String basicUrl1 = "http://"+relativeUrl+":8890/type/jason/action/"+ "getContorllerStatus";
    Okhttp.sendOkHttpRequest(basicUrl1, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {

            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    closeProgressDialog();
                    Toast.makeText(getActivity(), "失败", Toast.LENGTH_SHORT).show();
                }
            });


        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException {

            flag++;

            String responseString = null;
            try {
                responseString = response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.e(TAG, "onSuccess: "+responseString );
            Gson gson = new Gson();

            AppStatus appStatus = gson.fromJson(responseString,AppStatus.class);
            Status.WaterPump = appStatus.getWaterPump();
            Status.Blower = appStatus.getBlower();
            Status.Roadlamp = appStatus.getRoadlamp();
            Status.Buzzer = appStatus.getBuzzer();
            Status.resultStr = appStatus.getResult();

            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    if(flag==2){
                        closeProgressDialog();
                    }

                    Toast.makeText(getActivity(), "成功", Toast.LENGTH_SHORT).show();

                }
            });

        }
    });
这个就是查看每一个开关按钮的状态之后我们通过这个来改变按钮的图片告诉我们下面我们按下按钮是开还是关然后我们还要一个类调用实现按钮的开关代码代码如下

public static void openFan(String basicUrl, final Context context) {

    final JSONObject[] jsonObject = {new JSONObject()};
    try {
        jsonObject[0].put("Blower", 1);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Okhttp.postJsonByOkHttp(basicUrl +"control", jsonObject[0], new okhttp3.Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String responseString = response.body().string();
            try {
                JSONObject jsonObject1 = new JSONObject(responseString);
                if (jsonObject1.getString("result").equals("ok")) {
                    Status.Blower = 1;
                    DeviceControl.Result = 1;
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    });

}

public static void closeFan(String basicUrl, Context context) {
    final JSONObject[] jsonObject = {new JSONObject()};
    try {
        jsonObject[0].put("Blower", 0);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Okhttp.postJsonByOkHttp(basicUrl +"control", jsonObject[0], new okhttp3.Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String responseString = response.body().string();
            try {
                JSONObject jsonObject1 = new JSONObject(responseString);
                if (jsonObject1.getString("result").equals("ok")) {
                    Status.Blower = 0;
                    DeviceControl.Result = 0;
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    });
}
由于方法是一样的的只是改变了参数所以为了方便就在这里只用一个来代替四个
之后通过读取服务器的返回值控制按钮改变图片以及我们通过按钮改变图片代码如下
 private  void modifierBlowerStatus() {
        if (Status.Blower == 0) {
            openFanImg.setImageResource(R.mipmap.dakaifengshan);
            DeviceControl.Result = 0;
        } else if (Status.Blower == 1) {
            openFanImg.setImageResource(R.mipmap.dakaifengshan2);
            DeviceControl.Result = 1;
        }
    }

  if (DeviceControl.alertResult == 0) {
                    openAlertImg.setImageResource(R.mipmap.dakaibaojing2);
                    Intent intent = getIntent();
                    String basicUrl = intent.getStringExtra("basicUrl");
                    DeviceControl.openAlert(basicUrl, AirActivity.this);
                    Toast.makeText(this, "开警报", Toast.LENGTH_SHORT).show();
                } else if (DeviceControl.alertResult == 1) {
                    openAlertImg.setImageResource(R.mipmap.dakaibaojing);
                    Intent intent = getIntent();
                    String basicUrl = intent.getStringExtra("basicUrl");
                    DeviceControl.closeAlert(basicUrl, AirActivity.this);
                    Toast.makeText(this, "关警报", Toast.LENGTH_SHORT).show();
                }
                break;

上面是判断现在的状态下面是改变现在的状态
以上全部就是智能农业的大致过程。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页