December 22, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[54호]Smart Nutrient Dish(스마트 식판)

54 ict 스마트식판 (12)

2019 ICT 융합 프로젝트 공모전 참가상

Smart Nutrient Dish(스마트 식판)

글 | 단국대학교 우경은, 고승일, 박찬희

1. 심사평
칩센 음식물 쓰레기를 줄이는데 기술로 처리한 부분이 좋습니다. 관심이 많은 다이어트나 영양소에 대한 부분도 고려한 부분이 고민을 많이 한 것 같습니다. 식판으로서 대량 배식 및 식기 세척 등에 대한 고민도 하였지만 식판과 개별 그릇으로 분리되는 부분이 실제 실용성 측면에서는 조금 떨어질 것 같습니다.
뉴티씨 아이들의 식사량을 자동으로 체크할 수 있도록 한 점은 영양공급 상태 등을 파악할 수 있는 단서가 되리라 봅니다. 이를 구현하고, 관리할 수 있도록 만든 것은 매우 좋은 아이디어입니다. 또한, 서로 협력하여 팀을 이루어서 작품을 이루어가는 과정도 잘 묘사하였습니다. 다만, 실제 생활에서 실용적으로 적용하는 부분에서 조금 더 아이디어가 이뤄지면 좋겠다는 생각을 해 봅니다.
위드로봇 식판에 무게를 측정할 수 있는 센서를 장착하고, 스마트폰 앱과 연동하는 부분은 재미있는 아이디어입니다. 보고서 상으로 어디까지 완성되었고, 어떤 부분이 문제가 있는지 확인할 수 없는 부분은 아쉽습니다.

2. 작품 개요
예전부터 음식물 쓰레기는 사회의 큰 문제들 중 하나였습니다. 정부에서는 음식물 폐기물 직접 매립을 금지하고, 종량제 봉투를 사용하게 함으로서 음식물 쓰레기를 줄이려는 노력을 하였습니다. 하지만 군대나 학교 등 대량의 음식물 쓰레기가 지속적으로 나오는 곳에서의 노력은 부족한 편이며, 특별한 방법 또한 나오지 않고 있습니다. 초·중·고교 학교 급식 음식물 쓰레기 발생량이 한해 6만여톤에 달하고 처리 비용도 70억에 달한다고 합니다. 스마트 식판은 체계적인 데이터 분석과 아이들의 보상심리를 이용하여 음식물 쓰레기를 줄이는데 주목하였습니다.
일단 식판의 각 그릇에 무게 센서 모듈을 달아 음식을 받은 후, 먹기 전의 무게와 먹은 후의 무게를 측정해 실제로 먹은 양의 센서 값을 서버로 넘겨 센서 값을 처리합니다.
아이들의 경우, 음식을 먹은 양을 포인트로 환산하여 스마트폰으로 연동해 나타내며, 포인트를 바로바로 확인하여 아이들의 보상심리를 자극해 음식을 남기지 않고 먹게 할 수 있습니다. 이렇게 쌓인 포인트를 사용 가능하게 하여 아이들이 사고 싶은 물건, 간식 등을 살 수 있게하여 흥미를 자극할 수 있다면 확실하게 잔반을 줄일 수 있을 것입니다. 그리고 음식물쓰레기 감축 뿐만 아니라 다른 것들도 확인이 가능합니다. 각 그릇에 무게 차를 확인할 수 있어서, 아이들이 어떤 음식을 먹었는지 확인할 수 있습니다. 이에 따라 아이들이 섭취한 영양소와 아이들이 선호하는 음식을 확인해 볼 수 있습니다.
이 기술을 학교나 어린 아이들에게만 사용할 수 있는 것은 아닙니다. 요양원, 실버타운과 같은 시설에 있는 노인들을 위한 식단 관리에도 적용이 가능합니다. 고령화 사회는 65세 이상 노인 인구의 비중이 7% 인 경우로 대한민국의 경우 2017년부터 고령화 사회에 접어들고 있습니다. 따라서 요양원, 실버타운과 같은 노인들을 위한 시설이 증가하고 있습니다. 이러한 시설에서 중요시 하는 것은 의식주 중에 하나인 먹는 것입니다. 하지만 이곳에는 다수의 사람이 존재하여 식단 관리의 어려움을 느낄 뿐만 아니라 이를 위한 노동력이 필요합니다. 따라서 스마트 식판의 경우 노동력을 감소시켜 인건비를 줄일 뿐만 아니라 체계적인 분석을 통해 환자의 식단관리를 할 수 있습니다.
편식하거나 먹지 않는 음식과 과도하게 먹는 음식에 대한 영양 성분의 데이터가 쌓이게 되고 이 데이터를 통해 부족한 영양소와 과도한 영양소에 대한 정보를 볼 수 있어 이를 보충할 수 있는 음식에 대한 정보도 볼 수 있어 노인들 각각에 알맞은 음식을 추가로 보충할 수 있도록 도와줍니다. 특정한 질병으로 인해 식단관리를 필요로 하는 사람에게 맞추어 설정하여 사람마다 필요에 알맞게 식단조절 또한 가능하게 됩니다. 그리고 이에 대한 환자의 영양관리 정보를 환자의 보호자도 열람 가능하게 하고 하루하루 데이터를 메시지로 전송하여 보호자를 안심할 수 있게 합니다.

3. 주요 동작 및 특징
Smart Nutrient Dish(스마트 식판)은 하드웨어(모듈화된 스마트 식판), 센서부(무게 센서)와 어플을 통한 DB(데이터베이스) 구축으로 이루어져 있습니다.
무게 센서로는 로드셀 무게 센서(Weight Sensor (Load Cell) 0-750g [NT314990000])을 사용하였고 MCU는 WiFi가 내장된 NODEMCU를 사용하여 핸드폰과 통신이 가능합니다.
전체적인 과정은 다음과 같이 진행됩니다. 아두이노에서 로드셀 무게 센서를 통해 식사 전후에 각 식판에 담긴 음식의 무게를 측정합니다. 그 차이(음식을 먹은 양)의 무게 센서값을 받아서 데이터베이스 구축을 위해 json 형식으로 바꿔 웹서버로 보내줍니다. 이때, JSON(Java Script Object Notation)형식은 경량의 DATA-교환 형식으로 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하여 선택하게 되었습니다. JSON은 XML보다 기능이 적기 때문에 용량이 적으며 파싱도 빠르고 간단하여 모바일과 서버에서 매우 유용하게 사용할 수 있습니다.
json형식으로 바꾸어 웹서버에 올린 센서값을 핸드폰의 어플리케이션을 통해 받게 됩니다. 이러한 식으로 받은 센서값을 이용하여 먹은양을 퍼센트에이지로 표시해줍니다. 이러한 값들에 대해 DB를 구축하여 포인트로 환산해 줍니다. 또한, 식사 전 집단의 식단표를 통해 음식을 얼마나 먹었는지를 알 수 있으므로 영양관리를 효율적으로 해 줄 수 있습니다.

3.1. 소프트웨어
1. 아두이노
처음에 아두이노에서 무게 센서값을 받아오게 되는데 이것을 웹서버에 올려 어플에서 이 값들을 받아와 DB 구축 과정이 필요하기 때문에 센서값을 json 형식으로 바꾸는 과정이 필요합니다.

54 ict 스마트식판 (1) 54 ict 스마트식판 (2)

2. 세팅
처음 세팅은 작품을 이용하는 해당 집단의 식단표와 각 음식들의 칼로리표를 DB에 저장함으로써 어떤 음식을 얼만큼 먹었는지 그리고 그 무게 센서값을 받아줍니다. 이후 섭취한 칼로리를 cal/g을 통해 계산할 수 있는 환경을 만들어줍니다. 이렇게 세팅된 설정은 각 음식들이 가지고 있는 필수 영양소를 고려해주고 무게 센서값을 통해 부족한 영양소와 섭취한 총 칼로리를 하루 또는 한달을 기준으로 표시해 줌으로써 균형있는 건강한 식단관리를 할 수 있도록 도와줍니다.
해당 집단의 식단표를 등록한 후, 각 식판의 칸마다 포인트를 책정합니다. 그 후에 오늘의 식단을 각 칸에 띄워주고 처음에 밥을 먹기 시작할 때 시작(START)버튼을 누르고 끝날 때 끝남(FINISH)버튼을 눌러 식사 전 후의 센서 값들을 받아온 후 json 형식으로 변환하여 웹서버에 넘깁니다. 그리고 받아온 값을 바탕으로 그림 3의 listview에 얼마나 먹었는지 칸마다 퍼센트를 표시해줍니다. 이는 이후 그림 4와 같이 어플을 통해 영양소와 칼로리에 대한 전체적인 통계를 확인할 수 있습니다.

54 ict 스마트식판 (3)

그 이후에는 앞의 퍼센트 값으로 DB를 구축 한 후 전체적으로 먹은 양을 그래프를 통해 표시해 줌으로써 어떤 음식을 얼마나 먹었는지 한눈에 알아 볼 수 있게 해줍니다. 그래프 밑에는 그림4와 같이 한 끼 중 가장 많이 먹지 않은 음식들의 순위를 만들어 어떠한 영양소가 부족한지 알려주고 음식 칼로리표를 통해 g당 cal(칼로리)를 계산함으로써 하루 권장 칼로리를 기준으로 소식이나 과식 여부를 판별해 주어 건강하고 효율적인 영양관리를 해줄 수 있습니다. 하루 권장 칼로리보다 적게 먹을 경우 식사를 해야 한다는 것을 알려주고 과식을 했을 경우 사용자의 몸무게를 기준으로 칼로리 계산기를 통해 운동(수영, 걷기, 계단, 줄넘기, 자전거 등)을 해야 하는 시간을 알려줌으로써 건강관리를 도와줄 수 있습니다. 따라서 성장기인 아이들과 몸이 많이 약해져서 영양관리가 필수적인 노인들에게 체내에서 합성되지 않고 음식물로 섭취해야되는 탄수화물, 단백질, 지방, 무기질, 비타민, 물과 같은 필수 영양소의 공급을 관리해줄 수 있습니다.

3. 서버
안드로이드에서는 SQLite라고 불리는 내부 DB를 통해 데이터를 저장하고 불러오지만 실시간으로 변하는 데이터나 다른 사용자의 데이터를 불러오기 위해서는 서버를 통한 DB통신이 필요하며 이와 같은 상황에선 SQLite만으로 해결할 수 없어 외부 DB를 사용해주었습니다. 하지만 안드로이드의 특성상 외부 DB에 직접 접근할 수 없도록 되어있어 중간 매체인 WEB을 활용해야하는데 그 방법은 아래와 같이 표현할 수 있습니다.

54 ict 스마트식판 (4)

이때, 외부 DB에 존재하는 데이터를 가져오기 위해 서버 통신을 하는데 서버 통신의 방법 중 하나인 HTTP 통신과 Soket 통신 중 여기서 서버와 통신하는데 사용한 방법은 HTTP 통신으로 자신의 DB와 WEB에서 데이터를 가져오기 위해 호스팅이나 개인서버를 구축한 후, URL(자신이 만든 WEB문서가 포함된 로컬호스트 주소)접속을 통해 데이터를 읽어오는 방법입니다. 데이터의 이동은 ‘DB -> Web(Servlet) -> Android’ 과정을 거치는데 쿼리를 통해 DB에서 select한 데이터를 웹에 출력하고 출력물을 안드로이드에서 파싱해오는 형태입니다. 이때, 그 방법이 이해하기 쉬우며 편리하여 ‘Android <-> Web(Servlet)’과 같은 통신에서 보다 원활하게 프로그래밍을 할 수 있는 JSONObject를 사용하였습니다.

4. 어플
우리가 사용하는 안드로이드 어플리케이션에서 UI(버튼, 리스트, 텍스트뷰 등등)는 UI쓰레드라고 불리는 메인쓰레드가 관여하고 처리합니다. 이때, 여러 가지 작업을 동시에 수행할 수 있도록 메인쓰레드와 별개로 작업을 수행하고 그 결과를 UI에 나타낼 수 있도록 처리하는 ‘비동기 처리’를 사용합니다. 비동기적 처리 방법중 하나인 AsyncTask는 메인쓰레드를 작업을 좀 더 효율적이게 해줄 수 있는 백그라운드 처리 기법입니다. AsyncTask는 작업 수행 시간이 수 초간 진행될 때 유용하여 이 방법을 사용하였습니다.
AsyncTask 수행을 위해 생성된 객체는 execute()를 통해 단 한번만 실행 가능하며, 재 실행 시 예외 상황이 발생합니다. 또한 AsyncTask는 메인쓰레드에서만 실행되고 호출되어야합니다. AsyncTask는 백그라운드에서 수행되며, 그 결과를 메인쓰레드에 전달해 사용자에게 제공합니다. 이때, 주의해야 할 점은 AsyncTask에 백그라운드 작업을 요청한 메인쓰레드, 즉 AsyncTask를 호출한 Activity가 destroy 된다면 특별한 처리를 하지않는 이상 AsyncTask가 참조하고있던 UI가 사라져도 AsyncTask는 백그라운드에서 작업을 수행하게 됩니다. 그리고 코드에 의해 그 결과를 사라진 메인쓰레드에 넘겨주려 할 것이며, 이 과정에서 사라진 UI를 참조하게됩니다. 하지만 자신이 참조하는 UI는 이미 destroy되었으며 예외 상황이 발생하게됩니다. 또한 가비지컬렉터는 AsyncTask가 참조하고 있는 이전 Activity를 컬렉트할 수 없어 메모리릭이 발생할 수 있습니다. 또한 화면 회전에 의해 Activity가 destroy되고 새 인스턴스로 Activity를 생성할때도 이와같은 상황이 발생할 수 있습니다. 이를 위한 대비를 해야하며, cancel()을 통해 doInBackground() 실행 완료 후, onPostExcute() 호출을 막고 onCancelled를 호출하도록 해야합니다. 마지막으로 AsyncTask를 여러 개 실행하면 이는 순차적으로 수행이 이뤄집니다. ATask.execute()와 BTask.execute()를 순서대로 호출하면 ATask에 대한 작업이 끝나야 BTask에 대한 작업이 수행된다는 뜻입니다. 따라서 동시에 처리하기 위해서는 execute() 대신 executeOnExecutor()라는 메서드를 사용해 병렬처리를 해줍니다.

3.2. 하드웨어
1. 센서부
센서는 로드셀 무게 감지 센서를 사용하였습니다. 물체의 무게가 가지는 물리적인 힘을 전기적 신호로 변환시켜 주는 장치로 로드셀 표면에는 스트레인 게이지라고 하는 가변저항이 붙어 있습니다. 무게를 측정하기 위해서 로드셀에 물체를 올리면 스트레인 게이지의 형태가 변하게 되며, 그에 비례하여 저항도 변하게 됩니다. 즉, 스트레인 게이지를 변화시킨 만큼 저항이 변하게 되면 로드셀이 출력하는 전기신호에 변화가 생기고 이를 통해 무게를 측정할 수 있게 됩니다, 이때 사용되는 전압이 아주 미세하기 때문에 신호를 증폭시켜 주는 무게 센서 모듈 (SEN0160)을 사용하여 측정하게 됩니다. 출력전압은 0.8mV/V ±0.2이고 750g까지 측정 가능하며 크기는 45 x 9 x 6 mm으로 식판에 부착하기에 적절한 크기와 무게를 가진 무게 센서입니다.
그 밖의 스펙은 아래와 같습니다.
· Sensing : 750g
· Output Sensitivity : 0.02 (%FS)
· Insulation Resistance : 1000 (MΩ)
· Operating Voltage : 3~12(VDC)

54 ict 스마트식판 (5)

 

54 ict 스마트식판 (6)

 

2. 하드웨어 설계

하드웨어는 모듈 형식으로 제작하였습니다. 보통의 식판 같은 경우에는 일체형인 모습을 많이 볼 수 있지만 세척 및 교환이나 수리가 용이할 수 있도록 만들었습니다. 또한 MCU, 무게센서의 모습이 보이지 않게 하기 위해 식판 안으로 모습을 감추었으며 그릇의 형태가 원인 것을 고려하여 식판의 입구를 원으로 만들었습니다.

54 ict 스마트식판 (7)

 

54 ict 스마트식판 (8)

3.3. 전체 시스템 구성

54 ict 스마트식판 (9)

3.4. 개발환경(개발 언어, Tool, 사용시스템 등)
1. 개발 언어 : C언어, JAVA
가장 보편적이고 쉽게 접할 수 있는 C언어와 모바일 어플 코드에 가장 많이 사용되는 JAVA를 선택하여 코딩을 하게 되었습니다.

2. 개발 Tool : 아두이노, android studio
무게 센서값을 받고 json형식으로 변환 후 웹 서버에 올리는 코드는 오픈소스코드가 많고 보편적으로 사용되는 아두이노를 사용하였고 DB구축 및 모바일 어플 구성은 Android Studio 를 통해 코딩을 하게 되었습니다.

3. 사용 시스템 : 아두이노
아두이노, 아트메가, 망고보드, cortex시리즈 등 여러 MCU중에서 서버와 안드로이드 어플 제작 과정이 용이하고 더 많은 기능을 활용할 수 있는 아두이노를 선정하게 되었습니다.

4. 기타(회로도, 소스코드)
4.1. 무게값을 json형식으로 변환 후 웹서버에 올려주는 소스코드

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include “HX711.h”
#include <ArduinoJson.h>
#define calibration_factor -7050 //This value is obtained using the SparkFun_HX711_Calibration sketch

#define zero_factor 47200
#define zero_factor2 139200
#define zero_factor3 -55500
#define zero_factor4 90000
#define zero_factor5 -63500 //This large value is obtained using the SparkFun_HX711_Calibration sketch

#define DOUT D0
#define CLK D3
#define DOUT2 D0
#define CLK2 D3
#define DOUT3 D8
#define CLK3 D7
const char* ssid = “NewMaze2.4GHz”;
const char* pass = “19930821″;
//const char* ssid = “woo”;
//const char* pass = “jdds7531″;
HX711 scale(DOUT, CLK);
HX711 scale2(DOUT2, CLK2);
HX711 scale3(DOUT3, CLK3);
HX711 scale4(DOUT4, CLK4);
HX711 scale4(DOUT5, CLK5);
//POST Data Set//
String jsondata = “”;

//JsonObject& data = jsonBuffer.createObject(“data”);
WiFiServer server(80);
void setup(void){
Serial.begin(9600);

scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
scale.set_offset(zero_factor); //Zero out the scale using a previously known zero_factor
scale2.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
scale2.set_offset(zero_factor2); //Zero out the scale using a previously known zero_factor
scale3.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
scale3.set_offset(zero_factor3); //Zero out the scale using a previously known zero_factor
scale4.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
scale5.set_offset(zero_factor5); //Zero out the scale using a previously known zero_factor

Serial.println(“”);

WiFi.begin(ssid, pass);

while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(“.”);
}

// Start the server
server.begin();

// Print the IP address
Serial.print(“Use this URL to connect: “);
Serial.print(“http://”);
Serial.print(WiFi.localIP());
Serial.println(“/”);
}
void loop() {
float weight1= scale.get_units();
float weight2= scale2.get_units();
float weight3= scale3.get_units();
float weight4= scale4.get_units();
float weight5= scale5.get_units();
WiFiClient client = server.available();
if (!client) {
return;
}

// Wait until the client sends some data
Serial.println(“new client”);
while(!client.available()){
delay(1);
}

// Read the first line of the request
String request = client.readStringUntil(‘\r’);
Serial.println(request);
client.flush();

// Return the response
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”); // the connection will be closed after completion of the response
client.println(“Refresh: 2″); // refresh the page automatically every 5 sec
client.println();
//client.println(“<!DOCTYPE HTML>”);
//client.println(“<html>”);

StaticJsonBuffer<256> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
JsonArray& levels = root.createNestedArray(“levels”);

JsonObject& nested_1 = levels.createNestedObject();
nested_1["1"] = “1″;
nested_1["2"] = “밥”;
nested_1["3"] = weight1;

JsonObject& nested_2 = levels.createNestedObject();
nested_2["1"] = “2″;
nested_2["2"] = “국”;
nested_2["3"] = weight2;

JsonObject& nested_3 = levels.createNestedObject();
nested_3["1"] = “3″;
nested_3["2"] = “반찬1″;
nested_3["3"] = weight3;

JsonObject& nested_4 = levels.createNestedObject();
nested_3["1"] = “4″;
nested_3["2"] = “반찬2″;
nested_3["3"] = weight4;

JsonObject& nested_3 = levels.createNestedObject();
nested_3["1"] = “3″;
nested_3["2"] = “반찬3″;
nested_3["3"] = weight5;
root.prettyPrintTo(jsondata);

}

4.2. 안드로이드 어플 구성 코드

package com.tistory.webnautes.myapplication;

import android.app.ProgressDialog;
import android.os.AsyncTask;
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.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {

private static String TAG = “phptest_MainActivity”;

private static final String TAG_JSON=”levels”;
private static final String TAG_ID = “1″;
private static final String TAG_NAME = “2″;
private static final String TAG_ADDRESS =”3″;

 

private TextView mTextViewResult;
ArrayList<HashMap<String, String>> mArrayList;
ListView mlistView;
String mJsonString;

 

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

mTextViewResult = (TextView)findViewById(R.id.textView_main_result);
mlistView = (ListView) findViewById(R.id.listView_main_list);
mArrayList = new ArrayList<>();
Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GetData task = new GetData();
task.execute(“http://192.168.0.119″);
}
});
}

private class GetData extends AsyncTask<String, Void, String> {
ProgressDialog progressDialog;
String errorString = null;

@Override
protected void onPreExecute() {
super.onPreExecute();

progressDialog = ProgressDialog.show(MainActivity.this,
“Please Wait”, null, true, true);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);

progressDialog.dismiss();
mTextViewResult.setText(result);
Log.d(TAG, “response – ” + result);

if (result == null){

mTextViewResult.setText(errorString);
}
else {

mJsonString = result;
showResult();
}
}
@Override
protected String doInBackground(String… params) {

String serverURL = params[0];
try {

URL url = new URL(serverURL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setReadTimeout(5000);
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.connect();
int responseStatusCode = httpURLConnection.getResponseCode();
Log.d(TAG, “response code – ” + responseStatusCode);

InputStream inputStream;
if(responseStatusCode == HttpURLConnection.HTTP_OK) {
inputStream = httpURLConnection.getInputStream();
}
else{
inputStream = httpURLConnection.getErrorStream();
}
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, “UTF-8″);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

StringBuilder sb = new StringBuilder();
String line;

while((line = bufferedReader.readLine()) != null){
sb.append(line);
}
bufferedReader.close();
return sb.toString().trim();
} catch (Exception e) {

Log.d(TAG, “InsertData: Error “, e);
errorString = e.toString();

return null;
}
}
}
private void showResult(){
try {
JSONObject jsonObject = new JSONObject(mJsonString);
JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);

for(int i=0;i<jsonArray.length();i++){

JSONObject item = jsonArray.getJSONObject(i);

String id = item.getString(TAG_ID);
String name = item.getString(TAG_NAME);
String address = item.getString(TAG_ADDRESS);

HashMap<String,String> hashMap = new HashMap<>();

hashMap.put(TAG_ID, id);
hashMap.put(TAG_NAME, name);
hashMap.put(TAG_ADDRESS, address);

mArrayList.add(hashMap);
}

ListAdapter adapter = new SimpleAdapter(
MainActivity.this, mArrayList, R.layout.item_list,
new String[]{TAG_ID,TAG_NAME, TAG_ADDRESS},
new int[]{R.id.textView_list_id, R.id.textView_list_name, R.id.textView_list_address}
);

mlistView.setAdapter(adapter);

} catch (JSONException e) {

Log.d(TAG, “showResult : “, e);
}

}

}

 

4.3. 회로도

54 ict 스마트식판 (10) 54 ict 스마트식판 (11)

 

Leave A Comment

*