智能農業

這裏寫圖片描述
這個就是智能農業的大綱如今咱們來詳細的解釋一下
總體的佈局就不用我在過多的敘述而後咱們就進入咱們的重點
頁面的滑動能夠查看咱們的前面的viewpage+Fragment的組合我也在這不進行過多的敘述
對於咱們在登陸框輸入本身的ip以及多少秒以後自動的跳轉咱們經過下面的代碼來更好的瞭解web

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操做咱們首先建立一個類就是關於訪問網絡的代碼以下面json

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() {app

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) {ide

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;

上面是判斷如今的狀態下面是改變如今的狀態
以上所有就是智能農業的大體過程。svg