슬라이드 1 One M2M Application Android Sample User Guide Ver0 5

oneM2M-Application-AndroidSample_User_Guide_ver0_5

oneM2M-Application-AndroidSample_User_Guide_ver0_5

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 37

Download슬라이드 1 One M2M-Application-Android Sample User Guide Ver0 5
Open PDF In BrowserView PDF
IoT Open Source, OCEAN

oneM2M Application AndroidSample UserGuide

KETI (Korea Electronic Technology Institute)

(araha@keti.re.kr)

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio download and installation
https://developer.android.com/sdk/index.html ( Android Studio Install …, Java Development Kit 7u79 Install )

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio download and installation
https://developer.android.com/sdk/index.html ( Android Studio Install )

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio download and installation
https://developer.android.com/sdk/index.html ( Android Studio Install )

IoT Open Source, OCEAN

Android Studio Installation
 Execute Android Studio
 Click “Start a new Android Studio project”.
 Type the application name and company domain

IoT Open Source, OCEAN

Android Studio Installation
 Configure ADK version and activity for targeting android devices
 Change Minimum SDK to API 23
 Select “Blank Activity”

IoT Open Source, OCEAN

Android Studio Installation
 Customize the activity
 Input activity name and click “Finish” button.
 Right menu show the project file structure.

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio Virtual Devices

 Click “AVD Manager” menu
1. The default virtual device is Nexus 5
2. [Add a new virtual device]
3. Click “Create Virtual Device”
4. Select a the phone type as VD

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio Virtual Devices
Select OS image

Android Virtual Device(AVD) Configuration

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio Virtual Devices
 Click start button to turn on the VD

IoT Open Source, OCEAN

Android Studio Installation
 Android Studio Virtual Devices
 Wait for the VD system loading

IoT Open Source, OCEAN

Web View APP
 Basic Default Code
activity_main.xml

MainActivity.Java

AndroidManifest.xml

AndroidManifest?
Descript and configure the android project
•

App name, ID, icon, theme

•

App access right

•

Activity, Service, Intent

IoT Open Source, OCEAN

Mobius and APP connectivity
 Import sample project
Android Project Import

* Download the sample source from IoT OCEAN (www.iotocean.org)

IoT Open Source, OCEAN

Mobius and APP connectivity
 Import sample project
Android/app/manifest(AndroidMainifest.xml)

Android/app/res/layout/activity_main.xml(Design)

IoT Open Source, OCEAN

Mobius and APP connectivity
 USB Debugging Mode on Android
Change device to debugging mode

Click “Build number” continue

IoT Open Source, OCEAN

Mobius and APP connectivity
 App Running

Android Phone Device Debugging Mode Connect

IoT Open Source, OCEAN

Mobius and APP connectivity
 App Running

Retrieve
CO2

Retrieve
CO2(MQTT)

Control LED

Control LED

Control LED

Control LED

IoT Open Source, OCEAN

App Code Review
 Internet Permission Setting [ MQTT ]
AndroidManifest.xml

















IoT Open Source, OCEAN

App Code Review
 Code Structure Review

IoT Open Source, OCEAN

App Code Review
 Code Structure Review [ AE Create or AE Retrieve …]



/mobius-yt
2
20160928T161212
/mobius-yt/ncubeapp
20160928T161212
0.2.481.2.0001.001.0001114
xxxxxx
true


Note: In oneM2M standard Android Application is mapping with Application Entity(AE). It should use the AE-ID as request “origin”
to do other resource operation(Create, Retrieve, Update, Delete).

IoT Open Source, OCEAN

App Code Review
 Code Structure Review [ CO2 Retrieve, LED Control ]
/mobius-yt/ae-edu0/cntled420160925T121654/mobius-yt/ae-edu0/cntled/420160925121654339wkyn20160925T121654189007
1992547409911text4

/mobius-yt/ae-edu0/cntco2420160925T130205/mobius-yt/ae-edu0/cnt-co2/420160925130205542urps20160925T13020537569007199
2547409913719

IoT Open Source, OCEAN

App Code Review
 Code Structure Review [ Subscription create for MQTT ]

/mobius-yt/ae-edu0/cntco22320160925T133651/mobius-yt/ae-edu0/cntco2/s201609251054113610oz3_rn20160925T13365103mqtt://192.168.25.47/S201609251054113610oz3_sub2S201609251054113610oz3

IoT Open Source, OCEAN

App Code Review
 Code Structure Review [ Button Click Event ]
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnRetrieve: {
RetrieveRequest req = new RetrieveRequest();
textViewData.setText("");
req.setReceiver(new IReceived() {
@Override
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
textViewData.setText("************** CO2 조회 ***;
}
});
}
});
req.start();
break;
}
…
..
.

case R.id.btnControl_Green: {
if (((ToggleButton) v).isChecked()) {
ControlRequest req = new ControlRequest("1");
req.setReceiver(new IReceived() {
@Override
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
textViewData.setText("************** LED Green 제어(켜짐)..”);
}
});
}
});
req.start();
} else {
ControlRequest req = new ControlRequest("2");
req.setReceiver(new IReceived() {
@Override
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
textViewData.setText("************** LED Green 제어(꺼짐)..”);
}
});
}
});
req.start();
}
break;
}

IoT Open Source, OCEAN

App Code Review
 Code Structure Review [Switch onCheckChanged Event]
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
if (isChecked) {
Log.d(TAG, "MQTT Create");
MQTT_Create(true);
} else {
Log.d(TAG, "MQTT Close");
MQTT_Create(false);
}
}
/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
public void run() { … }
});
}
});
subcribeResource.start();
/* MQTT Subscribe */
mqttClient = new MqttAndroidClient(this.getApplicationContext(), "tcp://" + csebase.getHost()
+ ":" + csebase.getMQTTPort(), MqttClient.generateClientId());
mqttClient.setCallback(mainMqttCallback);
try {
IMqttToken token = mqttClient.connect();
token.setActionCallback(mainIMqttActionListener);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
/* MQTT unSubscribe or Client Close */
mqttClient.setCallback(null);
mqttClient.close();
mqttClient = null;
}
}

IoT Open Source, OCEAN

App Code Review
 Retrieve by POSTMAN [ CO2 Sensing Data ]

IoT Open Source, OCEAN

App Code Review
 Retrieve by Java Code [ CO2 Sensing Data ]
@Override
public void run() {
try {
String sb = csebase.getServiceUrl() + "/" + ServiceAEName + "/" + ContainerName + "/" + "latest";

private String ServiceAEName = "ae-edu1";
…

URL mUrl = new URL(sb);

public void GetAEInfo() {
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);

csebase.setInfo("192.168.25.47","7579","mobius-yt","1883"); //Sample IP
…

}

…

conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", ae.getAEid() );
conn.setRequestProperty("nmtype", "long");
conn.connect();
String strResp = "";
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

/* Retrieve Co2 Sensor */
class RetrieveRequest extends Thread {
private final Logger LOG = Logger.getLogger(RetrieveRequest.class.getName());
private IReceived receiver;
private String ContainerName = "cnt-co2";
public RetrieveRequest(String containerName) {
this.ContainerName = containerName;
}
public RetrieveRequest() {}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }

String strLine= "";
while ((strLine = in.readLine()) != null) {
strResp += strLine;
}
if ( strResp != "" ) {
receiver.getResponseBody(strResp);
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.WARNING, exp.getMessage());
}

}
}

IoT Open Source, OCEAN

App Code Review
 Control by POSTMAN [ LED Control ]

1: Green LED ON
2: Green LED OFF

3: Blue LED ON
4: Blue LED OFF

IoT Open Source, OCEAN

App Code Review
 Control by Java Code [ LED Control ]

@Override
public void run() {
try {
String sb = csebase.getServiceUrl() +"/" + ServiceAEName + "/" + container_name;

URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(false);

private String ServiceAEName = "ae-edu1";
…

conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("Content-Type", "application/vnd.onem2m-res+xml;ty=4");
conn.setRequestProperty("locale", "ko");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", ae.getAEid() );

public void GetAEInfo() {
csebase.setInfo("192.168.25.47","7579","mobius-yt","1883");
…

}

String reqContent = contentinstance.makeXML();
conn.setRequestProperty("Content-Length", String.valueOf(reqContent.length()));

…

DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(reqContent.getBytes());
dos.flush();
dos.close();
BufferedReader in = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine="";
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
if (resp != "") {
receiver.getResponseBody(resp);
}
conn.disconnect();

class ControlRequest extends Thread {
private final Logger LOG = Logger.getLogger(ControlRequest.class.getName());
private IReceived receiver;
private String container_name = "cnt-led";
public ContentInstanceObject contentinstance;
public ControlRequest(String comm) {
contentinstance = new ContentInstanceObject();
contentinstance.setContent(comm);
}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }

} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}
}
}

IoT Open Source, OCEAN

App Code Review
 Content Instance Creation Java Code

public class ContentInstanceObject {
private String content = "";
public void setContent(String contentValue) {
this.content = contentValue;
}

public String makeXML() {
String xml = "";

public String makeXML() {
String xml = "";
xml
xml
xml
xml
xml
xml
xml

}

}

+=
+=
+=
+=
+=
+=
+=

"";
"";
"text";
"" + content + "";
"";

return xml;

xml += "";
xml += "";
xml += "text";
xml += "" + content + "";
xml += "";
return xml;
}

IoT Open Source, OCEAN

App Code Review
 AE Create by POSTMAN

IoT Open Source, OCEAN

App Code Review
 AE Create by Java Code
private String ServiceAEName = "ae-edu1";
…
public void GetAEInfo() {
csebase.setInfo("192.168.25.47","7579","mobius-yt","1883");
ae.setAppName("ncubeapp");
…

}

…



0.2.481.2.0001.001.0001114
true


class aeCreateRequest extends Thread {
private final Logger LOG = Logger.getLogger(aeCreateRequest.class.getName());
String TAG = aeCreateRequest.class.getName();
private IReceived receiver;
int responseCode=0;
public ApplicationEntityObject applicationEntity;
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }
public aeCreateRequest(){
applicationEntity = new ApplicationEntityObject();
applicationEntity.setResourceName(ae.getappName());
}

public void run() {
try {
String sb = csebase.getServiceUrl();
URL mUrl = new URL(sb);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(false);
conn.setRequestProperty("Content-Type", "application/vnd.onem2m-res+xml;ty=2");
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("locale", "ko");
conn.setRequestProperty("X-M2M-Origin", "S");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-NM", ae.getappName() );
String reqXml = applicationEntity.makeXML();
conn.setRequestProperty("Content-Length", String.valueOf(reqXml.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(reqXml.getBytes());
dos.flush();
dos.close();
responseCode = conn.getResponseCode();
BufferedReader in = null;
String aei = "";
if (responseCode == 201) {
// Get AEID from Response Data
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine;
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
ParseElementXml pxml = new ParseElementXml();
aei = pxml.GetElementXml(resp, "aei");
ae.setAEid( aei );
Log.d(TAG, "Create Get AEID[" + aei + "]");
in.close();
}
if (responseCode != 0) {
receiver.getResponseBody( Integer.toString(responseCode) );
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}

IoT Open Source, OCEAN

App Code Review
 AE Retrieve POSTMAN [ AE-ID ]

IoT Open Source, OCEAN

App Code Review
 AE Retrieve Java Code

@Override
public void run() {
try {
String sb = csebase.getServiceUrl()+"/"+ ae.getappName();
URL mUrl = new URL(sb);

private String ServiceAEName = "ae-edu1";

HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);

…
public void GetAEInfo() {

conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("X-M2M-RI", "12345");
conn.setRequestProperty("X-M2M-Origin", "Sandoroid");
conn.setRequestProperty("nmtype", "short");
conn.connect();

csebase.setInfo("192.168.25.47","7579","mobius-yt","1883");
ae.setAppName("ncubeapp");
…

}

responseCode = conn.getResponseCode();

…

BufferedReader in = null;
String aei = "";
if (responseCode == 200) {
// Get AEID from Response Data
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String resp = "";
String strLine;
while ((strLine = in.readLine()) != null) {
resp += strLine;
}
ParseElementXml pxml = new ParseElementXml();
aei = pxml.GetElementXml(resp, "aei");
ae.setAEid( aei );
Log.d(TAG, "Retrieve Get AEID[" + aei + "]");
in.close();

/* Retrieve AE-ID */
class aeRetrieveRequest extends Thread {
private final Logger LOG = Logger.getLogger(aeCreateRequest.class.getName());
private IReceived receiver;
int responseCode=0;
public aeRetrieveRequest() {
}
public void setReceiver(IReceived hanlder) {
this.receiver = hanlder;
}

}
if (responseCode != 0) {
receiver.getResponseBody( Integer.toString(responseCode) );
}
conn.disconnect();
} catch (Exception exp) {
LOG.log(Level.SEVERE, exp.getMessage());
}
}

IoT Open Source, OCEAN

App Code Review
 Subscription Creation by POSTMAN

IoT Open Source, OCEAN

App Code Review
 Subscription Creation by Java Code
private String ServiceAEName = "ae-edu1";

private String ServiceAEName = "ae-edu1";

public void GetAEInfo() {

public void GetAEInfo() {

}

csebase.setInfo("192.168.25.47","7579","mobius-yt","1883");
ae.setAppName("ncubeapp");
…

}

csebase.setInfo("192.168.25.47","7579","mobius-yt","1883");
ae.setAppName("ncubeapp");
…

/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
public void run() {
…
}
});
}
});
subcribeResource.start();
…
}

/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
public void getResponseBody(final String msg) {
handler.post(new Runnable() {
public void run() {
…
}
});
}
});
subcribeResource.start();
…
}

/* Subscribe Co2 Content Resource */
class SubscribeResource extends Thread {
private IReceived receiver;
private String container_name = "cnt-co2"; //change to control container name

/* Subscribe Co2 Content Resource */
class SubscribeResource extends Thread {
private IReceived receiver;
private String container_name = "cnt-co2"; //change to control container name

public ContentSubscribeObject subscribeInstance;
public SubscribeResource() {
subscribeInstance = new ContentSubscribeObject();
subscribeInstance.setUrl(csebase.getHost());
subscribeInstance.setResourceName(ae.getAEid()+"_rn");
subscribeInstance.setPath(ae.getAEid()+"_sub");
subscribeInstance.setOrigin_id(ae.getAEid());
}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }

public ContentSubscribeObject subscribeInstance;
public SubscribeResource() {
subscribeInstance = new ContentSubscribeObject();
subscribeInstance.setUrl(csebase.getHost());
subscribeInstance.setResourceName(ae.getAEid()+"_rn");
subscribeInstance.setPath(ae.getAEid()+"_sub");
subscribeInstance.setOrigin_id(ae.getAEid());
}
public void setReceiver(IReceived hanlder) { this.receiver = hanlder; }

IoT Open Source, OCEAN

App Code Review
 MQTT Client Subscription, Listener, Callback, Response Java Code
private String ServiceAEName = "ae-edu1";
public void GetAEInfo() {

}

/* MQTT Listener */
private IMqttActionListener mainIMqttActionListener = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
String payload = "";
int mqttQos = 1; /* 0: NO QoS, 1: No Check , 2: Each Check */

csebase.setInfo("192.168.25.47","7579","mobius-yt","1883");
ae.setAppName("ncubeapp");
…
MQTT_Req_Topic = "/oneM2M/req/:mobius-yt/"+ae.getAEid()+"_sub"+"/xml";
MQTT_Resp_Topic = "/oneM2M/resp/:mobius-yt/"+ae.getAEid()+"_sub"+"/xml";

/* MQTT Subscription */
public void MQTT_Create(boolean mtqqStart) {
if (mtqqStart && mqttClient == null) {
/* Subscription Resource Create to Yellow Turtle */
SubscribeResource subcribeResource = new SubscribeResource();
subcribeResource.setReceiver(new IReceived() {
…
subcribeResource.start();
/* MQTT Subscribe */
mqttClient = new MqttAndroidClient(this.getApplicationContext(), "tcp://" +
csebase.getHost() + ":" + csebase.getMQTTPort(), MqttClient.generateClientId());
mqttClient.setCallback(mainMqttCallback);
try {
IMqttToken token = mqttClient.connect();
token.setActionCallback(mainIMqttActionListener);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
/* MQTT unSubscribe or Client Close */
mqttClient.setCallback(null);
mqttClient.close();
mqttClient = null;
}
}

MqttMessage message = new MqttMessage(payload.getBytes());
try {
mqttClient.subscribe(MQTT_Req_Topic, mqttQos);
} catch (MqttException e) {
e.printStackTrace();
}
}
…
};
/* MQTT Broker Message Received */
private MqttCallback mainMqttCallback = new MqttCallback() {
@Override
public void connectionLost(Throwable cause) { Log.d(TAG, "connectionLost"); }
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.d(TAG, "messageArrived");
textViewData.setText("");
textViewData.setText("**** MQTT CO2 실시간 조회 ****\r\n\r\n" +
message.toString().replaceAll("\t|\n", ""));
ArrayList mqttMessage = new ArrayList();
mqttMessage = MqttClientRequestParser.notificationParse(message.toString());
String responseMessage = MqttClientRequest.notificationResponse(mqttMessage);
/* Make xml for MQTT Response Message */
MqttMessage resmessage = new MqttMessage(responseMessage.getBytes());
try {
mqttClient.publish(MQTT_Resp_Topic, resmessage);
} catch (MqttException e) { e.printStackTrace(); }
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.d(TAG, "deliveryComplete");
}
};

IoT Open Source, OCEAN

App Code Review
 Android Studio Generate APK
 Build -> Generate Signed APK...
 If have Key store, Select “Choose existing”
 If do not have Key store, Select “Create new”
 Save location and input file name, Password, Alias, Certification information.

 Select key file
 Locate the APK path.



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : No
Page Count                      : 37
Language                        : ko-KR
Tagged PDF                      : Yes
Title                           : 슬라이드 1
Author                          : kim-juyeon
Create Date                     : 2017:07:10 16:53:29+09:00
Modify Date                     : 2017:07:10 16:53:29+09:00
Producer                        : Microsoft® PowerPoint® 2010
Creator                         : Microsoft® PowerPoint® 2010
EXIF Metadata provided by EXIF.tools

Navigation menu