본문 바로가기
Spring

Android에서 연동

by noddu 2021. 4. 30.
728x90
반응형

 

 

 

 

 

dependencies

 

 

 

 

 

 

 

 

 

 

 

devices.js

// MQTT Server 연결
const { response } = require("express");
var express=require("express");
var router=express.Router();
const mqtt=require("mqtt");

const DHT11=require("../modules/dht11")   //DHT11모듈 가져오기


const client=mqtt.connect("mqtt://210.223.239.164");
router.post("/led", function(req, res, next){
    res.set("Content-Type", "text/json");

    if(req.body.flag=="on"){
        client.publish("led","1");
        res.send(JSON.stringify({led:"on"}));
    }else{
        client.publish("led","2");
        res.send(JSON.stringify({led:"off"}));
    }
});

router.post("/device", function(req,res,next){
    if(req.body.sensor=="dht11"){
        DHT11.find({}).sort({create_at: -1}).limit(10)
        .then(data=>{
            res.send(JSON.stringify(data));
        });
    }else{
        // 다른 센서 정보를 전달
    }
});

module.exports = router  // 다른데서도 쓸 수 있게

DHT11 , router.post("/device"

 

 

 

 

 

 

DHT11sensor.java

public class DHT11sensor extends StringRequest {
    // node.js에 요청하는 URL
    final static String URL = "http://210.223.239.164:3000/devices/device";

    private Map<String, String> parameters;

    public DHT11sensor(String sensor, Response.Listener<String> listener) {
        super(Method.POST, URL, listener, null);    // 요청되는 부분
        // sensor=dht11 식으로 작성해야함
        // sensor=mq2
        parameters = new HashMap<String, String>();
        parameters.put("sensor", sensor);
    }

    @Override
    protected Map<String, String> getParams(){
        return parameters;
    }
}

 

 

 

 

 

 

 

LEDsensor.java

public class LEDsensor extends StringRequest {
    // node.js에 요청하는 URL
    final static String URL = "http://210.223.239.164:3000/devices/led";

    private Map<String, String> parameters;

    public LEDsensor(String led, Response.Listener<String> listener) {
        super(Method.POST, URL, listener, null);    // 요청되는 부분
        // flag = on
        // flag = off

        parameters = new HashMap<String, String>();
        parameters.put("flag", led);
    }

    @Override
    protected Map<String, String> getParams() {
        return parameters;
    }
}

 

 

 

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String[] sensors = {"dht11", "mq2"};
        ArrayAdapter<String> spinnerAdapter =
                new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, sensors);  // 기본 제공 layout

        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        spinner.setAdapter(spinnerAdapter);


        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int i, long id) {  // i = position
                // 다이얼로그
                final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
                dialog.setMessage("센서 로그 정보 수신중;;;");
                dialog.show();

                // 2. 받는 방법 -> Listener(JSON)
                Response.Listener<String> listener = new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {   // JSON으로 받는쪽 [{tmp,hum,create_at}, { }, { }....] <- JSONArray
                        dialog.dismiss();   // 받으면 다이얼로그 종료
                        try {
                            JSONArray array = new JSONArray(response);
                            items.clear();  // 실행할때 ArrayList clear하고 시작

                            for (int i = 0; i < array.length(); i++) {
                                JSONObject obj = array.getJSONObject(i);    // {tmp,hum,create_at}
                                // (vo) Item(묶고) -> ArrayList(담고)
                                items.add(new Item(obj.getInt("tmp"), obj.getInt("hum"), obj.getString("create_at")));
                            }// for

                            // DATA -> Adapter(제공,커스텀) -> ListView에 연결
                            ItemAdapter adapter = new ItemAdapter(MainActivity.this);
                            ListView listView = findViewById(R.id.listview);
                            listView.setAdapter(adapter);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };


                // node.js 서버로 dth11 센서의 온도, 습도, 날짜 데이터를 요청
                // 1. 요청하는 방법 -> API(Volley) : 별도의 클래스 - DHT11sensor
                StringRequest dht11 = new DHT11sensor(sensors[i], listener);
                dht11.setShouldCache(false);    // cache 사용x (새롭게 데이터 요청)
                RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
                requestQueue.add(dht11);    // 실행


            }
            // 지우지말것
            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }// onCreate

    public void clickLedOnButton(View view){
        Response.Listener<String> listener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject obj = new JSONObject(response);
                    Toast.makeText(getApplicationContext(),"LED가 켜짐ㅋ"+obj.get("led"),
                            Toast.LENGTH_SHORT).show();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        };
        StringRequest led = new LEDsensor("on", listener);
        led.setShouldCache(false);
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
        requestQueue.add(led);  //실행

    }// clickLedOnButton

    public void clickLedOffButton(View view){
        Response.Listener<String> listener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject obj = new JSONObject(response);
                Toast.makeText(getApplicationContext(),"LED가 꺼짐ㅋ"+obj.get("led"),
                        Toast.LENGTH_SHORT).show();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    };
    StringRequest led = new LEDsensor("off", listener);
        led.setShouldCache(false);
    RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
        requestQueue.add(led);  //실행

    }//clickLedOffButton

    class Item {
        int temp, humidity;
        String created_at;

        Item(int temp, int humidity, String created_at) {
            this.temp = temp;
            this.humidity = humidity;
            this.created_at = created_at;
        }
    }//Item

    ArrayList<Item> items = new ArrayList<Item>();

    // 커스텀뷰
    class ItemAdapter extends ArrayAdapter {
        public ItemAdapter(Context context) {
            super(context, R.layout.list_sensor_item, items);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view=convertView;

            if(view==null){
                LayoutInflater inflater=
                        (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
                view=inflater.inflate(R.layout.list_sensor_item, null);
            }
            TextView tempText=view.findViewById(R.id.temp);
            TextView humidityText=view.findViewById(R.id.humidity);
            TextView createdAtText=view.findViewById(R.id.created_at);
            tempText.setText("온도:"+items.get(position).temp);
            humidityText.setText("습도:"+items.get(position).humidity);
            createdAtText.setText("수집정보(날짜/시간)"+items.get(position).created_at);

            return view;
        }
    }

}//class
반응형

'Spring' 카테고리의 다른 글

[Spring Boot/IntelliJ] SpringBoot 시작  (0) 2022.04.13
Spring - mysql 연동 환경설정  (0) 2021.05.24
LBS 활용하기  (0) 2021.04.30
카메라 사용  (0) 2021.04.14
MONGO + MQTT로 브라우저LED제어  (0) 2021.04.07