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() {
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;
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() {
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);
}
}

Test-SDIC2018-2(answer)

  • 1.
    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); } }