2018 스마트디바이스지능통신 기말고사(100)
Smart Device M2M
Date: 2018-06-08
1. Bluetooth가 Arduino와 Smartphone 통신에 사용될 때 장점을 4가지 이상 제시하시오. (20)
- Smartphone에 Bluetooth HW와 SW가 이미 구축되어 있어 개발할 때 Arduino
Bluetooth만 고려하며 됨
- Bluetooth는 BLE(Bluetooth Low Energy)를 지원하므로 저전력 운용이 가능함
- Bluetooth는 Master-Slave 구조를 지원하므로 Arduino에 부착된 Bluetooth는 저수준
Slave mode로 쉽게 동작시킬 수 있음
- Bluetooth는 다양한 profile을 제공하므로 SPP(Serial Port Profile)를 이용하면 Arduino와
serial port로 쉽게 연결할 수 있음
2. 다음 Arduino Code를 제시하시오. (30)
1) SoftwareSerial(SWS)로부터 “start”를 입력받으면 sensor 정보를 SWS에 회신
- SWS의 Rx는 10번, Tx는 11번에 연결됨, 연결 속도는 9600 bps
- SWS에서 문자열 입력받는 함수는 StringTok.inputSerial(SoftwareSerial & sws) 사용
- Sensor는 analog #0번에 연결됨, 회신할 때 format: getsen [sensor 정보]
#include <SoftwareSerial.h>
#include <StringTok.h>
#define SERIAL_BPS (9600)
#define DELAY_MS (1000)
SoftwareSerial mySerial(10, 11);
void setup() {
mySerial.begin(SERIAL_BPS);
}
void loop() {
2.
StringTok stInput; stInput.inputSerial(mySerial);
if(!stInput.isEmpty()) {
if (stInput.toString() == “start”) {
int nSensor = analogRead(A0);
String sSensor = “getsen ” + String(nSensor);
mySerial.println(sSensor);
}
}
delay(DELAY_MS)
}
3. 다음 Android Code를 제시하시오. (50)
1) App이 시작될 때 1부터 10,000까지 정수를 더하는 code를 multithread로 구성: 반드시
Thread와 Runnable 사용, app이 멈추지 않도록 Thread 실행해야 함 (20)
- Android Studio가 자동으로 추가하는 code는 쓸 필요 없음
public class MainActivity extends AppCompatActivity {
…
protected void onCreate(Bundle savedInstanceState) {
new Thread(new Runnable() {
@Override
public void run() {
long nSum = 0;
3.
for (long i= 0; i <= 10000; i++) nSum += i;
}
}).start();
}
}
2) 1)에서 정수를 더한 결과를 app에 있는 TextView에 직접 표시하려 한다. 이때 문제가 발생
하는 이유는? (10)
- 정수를 계산하는 thread(1)에 제시함)는 MainActivity를 구동한 Main Thread와 다르기
때문에, Main Thread 외부에 해당하는 정수 계산 thread에서 TextView에 접근해 상태를
표시할 수 없음
3) 2)가 문제 없이 동작될 수 있도록 BroadcastReceiver를 사용하는 code를 제시하라. (20)
- 1)에서 사용한 Runnable에서 sendBroacast() 사용
- MainActivity에서 StateReceiver를 등록하는 code: 2)를 처리하는 StateReceiver는 있다고 가정
public class MainActivity extends AppCompatActivity {
public static final String STR_SUM = “mokwon.ice.sum”;
public static final String STR_SUM_VAL = “mokwon.ice.sum.val”;
protected StateReceiver stateReceiver;
…
protected void onCreate(Bundle savedInstanceState) {
new Thread(new Runnable() {
@Override
public void run() {
4.
long nSum =0;
for (long i = 0; i <= 10000; i++) nSum += i;
Intent intent = new Intent(STR_SUM);
intent.putExtra(STR_SUM_VAL, nSum);
sendBroadcast(intent);
}
}).start();
stateReceiver = new StateReceiver(this); // StateReceiver()도 가능
IntentFilter intentFilter = new IntentFilter(STR_SUM);
registerReceiver(stateReceiver, intentFilter);
}
}