1 package org.iotivity.base.examples.provisioningclient;
3 import android.app.Activity;
4 import android.content.BroadcastReceiver;
5 import android.content.Context;
6 import android.content.Intent;
7 import android.content.SharedPreferences;
8 import android.os.AsyncTask;
9 import android.os.Bundle;
10 import android.os.Message;
11 import android.preference.PreferenceManager;
12 import android.text.method.ScrollingMovementMethod;
13 import android.util.Log;
14 import android.view.Gravity;
15 import android.widget.LinearLayout;
16 import android.widget.TextView;
18 import org.iotivity.base.CredType;
19 import org.iotivity.base.EncodingType;
20 import org.iotivity.base.DeviceStatus;
21 import org.iotivity.base.KeySize;
22 import org.iotivity.base.ModeType;
23 import org.iotivity.base.OcException;
24 import org.iotivity.base.OcPlatform;
25 import org.iotivity.base.OcProvisioning;
26 import org.iotivity.base.OcSecureResource;
27 import org.iotivity.base.OicSecAcl;
28 import org.iotivity.base.OicSecAce;
29 import org.iotivity.base.OicSecResr;
30 import org.iotivity.base.OicSecValidity;
31 import org.iotivity.base.OicSecPdAcl;
32 import org.iotivity.base.OcPrmType;
33 import org.iotivity.base.OxmType;
34 import org.iotivity.base.PlatformConfig;
35 import org.iotivity.base.ProvisionResult;
36 import org.iotivity.base.QualityOfService;
37 import org.iotivity.base.ServiceType;
40 import java.io.FileNotFoundException;
41 import java.io.FileOutputStream;
42 import java.io.IOException;
43 import java.io.InputStream;
44 import java.io.OutputStream;
45 import java.util.ArrayList;
46 import java.util.EnumSet;
47 import java.util.List;
49 import org.iotivity.ca.OicCipher;
50 import org.iotivity.base.OcConnectivityType;
51 import org.iotivity.ca.CaInterface;
54 public class ProvisioningClient extends Activity implements
55 OcSecureResource.DoOwnershipTransferListener, OcSecureResource.ProvisionPairwiseDevicesListener {
57 private static final String TAG = "Provisioning Client: ";
58 private static final int BUFFER_SIZE = 1024;
60 int unownedDevCount = StringConstants.NUMBER_ZERO;
61 OcProvisioning.PinCallbackListener pinCallbackListener =
62 new OcProvisioning.PinCallbackListener() {
64 public String pinCallbackListener() {
65 Log.d(TAG, "Inside Pin Callback ");
69 private String filePath = "";
70 private OcSecureResource newSecureResource;
71 private List<OcSecureResource> deviceList;
72 private List<OcSecureResource> ownedDeviceList;
73 private TextView mEventsTextView;
75 OcSecureResource.ProvisionDirectPairingListener provisionDPListener =
76 new OcSecureResource.ProvisionDirectPairingListener() {
78 public void provisionDirectPairingListener(List<ProvisionResult> provisionResults,
80 Log.d(TAG, "Inside provisionDPListener");
81 ProvisionResult pResult = provisionResults.get(0);
82 if (hasError == StringConstants.ERROR_CODE) {
83 logMessage(TAG + "Provision direct pairing Failed for " + pResult.getDevId());
85 logMessage(TAG + "Provision direct pairing Successful for " + pResult.getDevId());
86 if (ownedDeviceList.size() == 1) {
87 new ProvisionACLAsyncTask().execute();
89 if (ownedDeviceList.size() > 1) {
90 new GetLinkedDevicesAsyncTask().execute();
96 OcSecureResource.ProvisionAclListener provisionAclListener =
97 new OcSecureResource.ProvisionAclListener() {
99 public void provisionAclListener(List<ProvisionResult> provisionResults,
101 Log.d(TAG, "Inside ProvisionAclListener ");
102 if (hasError == StringConstants.ERROR_CODE) {
103 logMessage("Error: ACL Provision failed !!");
105 logMessage("ACL Provision Done !!");
106 provisionCertChain();
110 OcSecureResource.ProvisionCredentialsListener provisionCredentialsListener =
111 new OcSecureResource.ProvisionCredentialsListener() {
113 public void provisionCredentialsListener(List<ProvisionResult> provisionResults,
115 Log.d(TAG, "Inside ProvisionCredentialsListener ");
116 if (hasError == StringConstants.ERROR_CODE) {
117 logMessage("Error: Provision Credentials failed !!");
119 logMessage("Provision Credentials Done !!");
120 new ProvisionACLAsyncTask().execute();
125 OcSecureResource.ProvisionTrustCertChainListener provisionTrustCertListener =
126 new OcSecureResource.ProvisionTrustCertChainListener() {
128 public void provisionTrustCertChainListener(List<ProvisionResult> provisionResults,
130 Log.d(TAG, "Inside provisionTrustCertChainListener ");
131 if (hasError == StringConstants.ERROR_CODE) {
132 logMessage("Error: Provision TrustCertChain failed !!");
134 logMessage("Provision TrustCertChain Done !!");
135 new DeviceRevocationAsyncTask().execute();
140 OcSecureResource.UnlinkDevicesListener unlinkDevicesListener =
141 new OcSecureResource.UnlinkDevicesListener() {
143 public void unlinkDevicesListener(List<ProvisionResult> provisionResults,
145 Log.d(TAG, "Inside unlinkDevicesListener ");
146 if (hasError == StringConstants.ERROR_CODE) {
147 logMessage("Error: UnLinking device !!");
149 logMessage("Unlink Done !!");
150 new ProvisionCredentialAsyncTask().execute();
154 OcSecureResource.RemoveDeviceListener removeDeviceListener =
155 new OcSecureResource.RemoveDeviceListener() {
157 public void removeDeviceListener(List<ProvisionResult> provisionResults,
159 if (hasError == StringConstants.ERROR_CODE) {
160 logMessage("Error: Remove Fail !!");
162 logMessage("Remove Device done !!");
168 protected void onCreate(Bundle savedInstanceState) {
169 super.onCreate(savedInstanceState);
170 setContentView(R.layout.activity_secure_provision_client);
171 mEventsTextView = new TextView(this);
172 mEventsTextView.setGravity(Gravity.BOTTOM);
173 mEventsTextView.setMovementMethod(new ScrollingMovementMethod());
174 LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
175 layout.addView(mEventsTextView, new LinearLayout.LayoutParams(
176 LinearLayout.LayoutParams.MATCH_PARENT, 0, 1f)
178 filePath = getFilesDir().getPath() + "/"; // data/data/<package>/files/
179 //copy CBOR file when application runs first time
180 SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
181 boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
184 SharedPreferences.Editor editor = wmbPreference.edit();
185 editor.putBoolean("FIRSTRUN", false);
190 int ret = CaInterface.setCipherSuite(OicCipher.TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
191 OcConnectivityType.CT_ADAPTER_IP);
192 Log.e(TAG,"CaInterface.setCipherSuite returned = "+ret);
196 * configure OIC platform and call findResource
198 private void initOICStack() {
199 //create platform config
200 PlatformConfig cfg = new PlatformConfig(
203 ModeType.CLIENT_SERVER,
204 "0.0.0.0", // bind to all available interfaces
206 QualityOfService.LOW, filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE);
207 OcPlatform.Configure(cfg);
210 byte [] deviceIdBytes= OcPlatform.getDeviceId();
211 String devId = new String(deviceIdBytes);
212 Log.d(TAG, "Get Device Id "+devId);
214 String setId = "adminDeviceUuid1";
215 OcPlatform.setDeviceId(setId.getBytes());
216 Log.d(TAG, "Set Device Id done");
220 * Initialize DataBase
222 String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") +
224 File file = new File(sqlDbPath);
225 //check files directory exists
226 if (!(file.isDirectory())) {
228 Log.d(TAG, "Sql db directory created at " + sqlDbPath);
230 Log.d(TAG, "Sql db directory exists at " + sqlDbPath);
231 OcProvisioning.provisionInit(sqlDbPath + StringConstants.OIC_SQL_DB_FILE);
232 } catch (OcException e) {
233 logMessage(TAG + "provisionInit error: " + e.getMessage());
234 Log.e(TAG, e.getMessage());
236 new DiscoveryOTTransferAsyncTask().execute();
240 synchronized public void doOwnershipTransferListener(List<ProvisionResult> ProvisionResultList,
242 ProvisionResult pResult = ProvisionResultList.get(0);
243 if (hasError == StringConstants.ERROR_CODE) {
244 logMessage(TAG + "Ownership Transfer Failed for " + pResult.getDevId());
246 logMessage(TAG + "Ownership Transfer Successful for "
247 + pResult.getDevId());
250 if (unownedDevCount == 0) { //When done with Ownership Transfer
251 new OwnedDiscoveryAsyncTask().execute();
256 private void doDPProvisioning() {
258 logMessage(TAG + "Provision direct pairing for " + ownedDeviceList.get(0).getDeviceID());
259 newSecureResource = ownedDeviceList.get(0);
260 String pin = "00000000";
261 List<OcPrmType> prmTypes = new ArrayList<OcPrmType>();
262 prmTypes.add(OcPrmType.DP_PRE_CONFIGURED);
264 List<String> resources = new ArrayList<String>();
265 List<String> periods = new ArrayList<String>();
266 List<String> recurrences = new ArrayList<String>();
267 resources.add(StringConstants.DEFAULT_RESOURCES);
268 OicSecPdAcl pdAcl = new OicSecPdAcl(recurrences, periods,
269 StringConstants.DEFAULT_PERMISSION, resources);
270 OicSecPdAcl[] oicSecPdAcls = new OicSecPdAcl[1];
271 oicSecPdAcls[0] = pdAcl;
272 newSecureResource.doProvisionDirectPairing(pin, oicSecPdAcls, prmTypes, edp,
273 provisionDPListener);
274 } catch (Exception e) {
275 logMessage(TAG + "Direct Pairing Provisioning error: " + e.getMessage());
276 Log.e(TAG, e.getMessage());
281 private void doPairwiseProvisioning() {
283 logMessage(TAG + "Pairwise Provisioning b/w " + ownedDeviceList.get(0).getDeviceID()
284 + " and " + ownedDeviceList.get(1).getDeviceID());
285 newSecureResource = ownedDeviceList.get(0);
287 List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
288 List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
289 List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
291 List<String> types1 = new ArrayList<String>();
292 types1.add(StringConstants.RESOURCE_TYPE_1A);
293 types1.add(StringConstants.RESOURCE_TYPE_1B);
294 List<String> types2 = new ArrayList<String>();
295 types2.add(StringConstants.RESOURCE_TYPE_2A);
296 types2.add(StringConstants.RESOURCE_TYPE_2B);
297 List<String> interfaces = new ArrayList<String>();
298 interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
299 interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
301 OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
302 OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
303 resources1.add(oicSecResr1a);
304 resources1.add(oicSecResr1b);
306 OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
307 OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
308 resources2.add(oicSecResr2a);
309 resources2.add(oicSecResr2b);
311 List<String> recurrences = new ArrayList<String>();
312 recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
313 recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
314 OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
316 validities.add(oicSecValidity);
318 OicSecAce oicsecace1 = new OicSecAce(newSecureResource.getDeviceID(),
319 StringConstants.DEFAULT_PERMISSION, resources1, validities);
320 OcSecureResource newSecureResource2 = ownedDeviceList.get(1);
321 OicSecAce oicsecace2 = new OicSecAce(newSecureResource2.getDeviceID(),
322 StringConstants.DEFAULT_PERMISSION, resources2, validities);
324 List<OicSecAce> oicSecAces1=new ArrayList<OicSecAce>();
325 oicSecAces1.add(oicsecace1);
326 List<OicSecAce> oicSecAces2=new ArrayList<OicSecAce>();
327 oicSecAces2.add(oicsecace2);
328 OicSecAcl acl1 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces1);
329 OicSecAcl acl2 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces2);
331 newSecureResource.provisionPairwiseDevices(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
332 KeySize.OWNER_PSK_LENGTH_128, acl1, newSecureResource2, acl2, this);
333 } catch (Exception e) {
334 logMessage(TAG + "Pairwise Provisioning error: " + e.getMessage());
335 Log.e(TAG, e.getMessage());
340 public void provisionPairwiseDevicesListener(List<ProvisionResult> ProvisionResultList,
342 if (hasError == StringConstants.ERROR_CODE) {
343 logMessage(TAG + "provisionPairwiseDevices Failed");
345 for (int i = 0; i < ProvisionResultList.size(); i++) {
346 ProvisionResult pResult = ProvisionResultList.get(i);
347 logMessage(TAG + "provisionPairwiseDevices Result for "
348 + pResult.getDevId() + "is " + pResult.getResult());
354 * get cert from asset folder & save trusted cert chain
356 private void saveCertChain() {
357 InputStream inputStream = null;
360 inputStream = getAssets().open(StringConstants.CRT_FILE);
361 byte[] fileBytes = new byte[inputStream.available()+1];
362 inputStream.read(fileBytes);
363 fileBytes[inputStream.available()]=0x00;
364 credId = OcProvisioning.saveTrustCertChain(fileBytes,
365 EncodingType.OIC_ENCODING_PEM);
366 logMessage(TAG + "saveTrustCertChain return credId = " + credId);
367 } catch (IOException e) {
368 logMessage(TAG + "Cert file not exist in Assets" + e.getMessage());
369 Log.e(TAG, e.getMessage());
370 } catch (OcException e) {
371 logMessage(TAG + "saveTrustCertChain failed " + e.getMessage());
372 Log.e(TAG, e.getMessage());
374 if (inputStream != null) {
377 } catch (IOException e) {
378 Log.e(TAG, e.getMessage());
386 * Provision cert chain
388 private void provisionCertChain() {
390 if (ownedDeviceList.size() > 0) {
392 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
393 logMessage(TAG + "Initiate provision cert chain credId = "
395 ocSecureResource.provisionTrustCertChain(
396 EnumSet.of(CredType.SIGNED_ASYMMETRIC_KEY), credId,
397 provisionTrustCertListener);
398 } catch (OcException e) {
399 logMessage(TAG + "Provision cert chain error: "
401 Log.e(TAG, e.getMessage());
408 * Copy svr db CBOR dat file from assets folder to app data files dir
410 private void copyCborFromAsset() {
411 InputStream inputStream = null;
412 OutputStream outputStream = null;
414 byte[] buffer = new byte[BUFFER_SIZE];
416 inputStream = getAssets().open(StringConstants.OIC_CLIENT_CBOR_DB_FILE);
417 File file = new File(filePath);
418 //check files directory exists
419 if (!(file.exists() && file.isDirectory())) {
422 outputStream = new FileOutputStream(filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE);
423 while ((length = inputStream.read(buffer)) != -1) {
424 outputStream.write(buffer, 0, length);
426 } catch (NullPointerException e) {
427 logMessage(TAG + "Null pointer exception " + e.getMessage());
428 Log.e(TAG, e.getMessage());
429 } catch (FileNotFoundException e) {
430 logMessage(TAG + "CBOR svr db file not found " + e.getMessage());
431 Log.e(TAG, e.getMessage());
432 } catch (IOException e) {
433 logMessage(TAG + StringConstants.OIC_CLIENT_CBOR_DB_FILE + " file copy failed");
434 Log.e(TAG, e.getMessage());
436 if (inputStream != null) {
439 } catch (IOException e) {
440 Log.e(TAG, e.getMessage());
443 if (outputStream != null) {
445 outputStream.close();
446 } catch (IOException e) {
447 Log.e(TAG, e.getMessage());
453 public void logMessage(String text) {
457 public void logMsg(final String text) {
458 runOnUiThread(new Runnable() {
460 Message msg = new Message();
462 mEventsTextView.append(text);
463 mEventsTextView.append("\n\n");
467 Intent intent = new Intent(getPackageName());
468 intent.putExtra(StringConstants.MESSAGE, text);
469 sendBroadcast(intent);
472 private class DiscoveryOTTransferAsyncTask extends AsyncTask<Void, String, String> {
475 protected void onPreExecute() {
476 super.onPreExecute();
480 protected String doInBackground(Void... params) {
483 * Discover Un-owned devices
485 publishProgress(TAG + "Discovering Unowned Devices");
486 deviceList = new ArrayList<OcSecureResource>(OcProvisioning.discoverUnownedDevices
487 (StringConstants.DISCOVERY_TIMEOUT_10));
488 if (deviceList.size() > 0) {
489 unownedDevCount = deviceList.size();
490 for (int i = 0; i < deviceList.size(); i++) {
491 publishProgress(TAG + "Un-owned Discovered Device " + (i + 1) + "= " +
492 deviceList.get(i).getDeviceID());
495 OcProvisioning.SetownershipTransferCBdata(OxmType.OIC_JUST_WORKS,
496 pinCallbackListener);
497 for (int i = 0; i < deviceList.size(); i++) {
498 publishProgress(TAG + "Doing Ownership Transfer for " +
499 deviceList.get(i).getDeviceID());
500 deviceList.get(i).doOwnershipTransfer(ProvisioningClient.this);
502 } catch (OcException e) {
503 publishProgress(TAG + "Ownership Transfer error: " + e.getMessage());
504 return "Ownership Transfer error: " + e.getMessage();
508 publishProgress(TAG + "No un-owned devices present");
509 new OwnedDiscoveryAsyncTask().execute();
511 } catch (OcException e) {
512 publishProgress(TAG + "Un-owned discovery error: " + e.getMessage());
513 return "Un-owned discovery error: " + e.getMessage();
519 protected void onProgressUpdate(String... values) {
520 logMessage(values[0]);
524 protected void onPostExecute(String s) {
525 super.onPostExecute(s);
529 private class ProvisionACLAsyncTask extends AsyncTask<Void, String, Void> {
532 protected void onPreExecute() {
533 super.onPreExecute();
537 protected Void doInBackground(Void... params) {
539 if (ownedDeviceList.size() > 0) {
540 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
542 publishProgress(TAG + "ACL Provision for " + ocSecureResource.getDeviceID());
543 List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
544 List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
545 List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
547 List<String> types1 = new ArrayList<String>();
548 types1.add(StringConstants.RESOURCE_TYPE_1A);
549 types1.add(StringConstants.RESOURCE_TYPE_1B);
550 List<String> types2 = new ArrayList<String>();
551 types2.add(StringConstants.RESOURCE_TYPE_2A);
552 types2.add(StringConstants.RESOURCE_TYPE_2B);
553 List<String> interfaces = new ArrayList<String>();
554 interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
555 interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
557 OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
558 OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
559 resources1.add(oicSecResr1a);
560 resources1.add(oicSecResr1b);
562 OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
563 OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
564 resources2.add(oicSecResr2a);
565 resources2.add(oicSecResr2b);
567 List<String> recurrences = new ArrayList<String>();
568 recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
569 recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
570 OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
572 validities.add(oicSecValidity);
574 OicSecAce oicsecace1 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID1,
575 StringConstants.DEFAULT_PERMISSION, resources1, validities);
577 OicSecAce oicsecace2 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID2,
578 StringConstants.DEFAULT_PERMISSION, resources2, validities);
580 List<OicSecAce> oicSecAces=new ArrayList<OicSecAce>();
581 oicSecAces.add(oicsecace1);
582 oicSecAces.add(oicsecace2);
584 OicSecAcl aclObject = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID, oicSecAces);
586 ocSecureResource.provisionACL(aclObject, provisionAclListener);
588 publishProgress(TAG + "No Owned devices present");
590 } catch (Exception e) {
591 publishProgress(TAG + "ProvisionACL error: " + e.getMessage());
597 protected void onProgressUpdate(String... values) {
598 logMessage(values[0]);
602 private class ProvisionCredentialAsyncTask extends AsyncTask<Void, String, Void> {
605 protected void onPreExecute() {
606 super.onPreExecute();
610 protected Void doInBackground(Void... params) {
612 if (ownedDeviceList.size() > 1) {
613 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
614 OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
615 publishProgress(TAG + "ProvisionCredential for " +
616 ocSecureResource.getDeviceID() + " with " +
617 ocSecureResourceDest.getDeviceID());
618 ocSecureResource.provisionCredentials(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
619 KeySize.OWNER_PSK_LENGTH_128,
620 ocSecureResourceDest, provisionCredentialsListener);
622 publishProgress(TAG + "Cannot perform credentials between devices");
624 } catch (Exception e) {
625 publishProgress(TAG + "Provision credentials error: " + e.getMessage());
631 protected void onProgressUpdate(String... values) {
632 logMessage(values[0]);
636 private class GetLinkedDevicesAsyncTask extends AsyncTask<Void, String, String> {
639 protected void onPreExecute() {
640 super.onPreExecute();
644 protected String doInBackground(Void... params) {
646 if (ownedDeviceList.size() > 1) {
647 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
648 publishProgress(TAG + "Get linked devices of " + ocSecureResource.getDeviceID());
649 List<String> linkedDevices = ocSecureResource.getLinkedDevices();
650 if (linkedDevices.size() > 0) {
651 for (int i = 0; i < linkedDevices.size(); i++) {
652 publishProgress(TAG + "Linked Devices " +
653 (i + 1) + "= " + linkedDevices.get(i));
656 publishProgress(TAG + "No linked Devices found");
659 publishProgress(TAG + "Cannot perform linked devices");
661 } catch (Exception e) {
662 publishProgress(TAG + "getLinked device error: " + e.getMessage());
669 protected void onProgressUpdate(String... values) {
670 logMessage(values[0]);
674 protected void onPostExecute(String s) {
675 if ("success".equals(s)) {
676 new ProvisionUnlinkAsyncTask().execute();
681 private class ProvisionUnlinkAsyncTask extends AsyncTask<Void, String, Void> {
684 protected void onPreExecute() {
685 super.onPreExecute();
689 protected Void doInBackground(Void... params) {
691 if (ownedDeviceList.size() > 1) {
692 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
693 OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
694 publishProgress(TAG + "Un linking " + ocSecureResource.getDeviceID() +
695 " with " + ocSecureResourceDest.getDeviceID());
696 ocSecureResource.unlinkDevices(ocSecureResourceDest, unlinkDevicesListener);
698 publishProgress(TAG + "Cannot perform unlink devices");
700 } catch (Exception e) {
701 publishProgress(TAG + "Unlink error: " + e.getMessage());
707 protected void onProgressUpdate(String... values) {
708 logMessage(values[0]);
712 private class DeviceRevocationAsyncTask extends AsyncTask<Void, String, Void> {
715 protected void onPreExecute() {
716 super.onPreExecute();
720 protected Void doInBackground(Void... params) {
722 if (ownedDeviceList.size() > 0) {
723 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
724 publishProgress(TAG + "Removing " + ocSecureResource.getDeviceID());
725 ocSecureResource.removeDevice(StringConstants.DISCOVERY_TIMEOUT_20,
726 removeDeviceListener);
728 publishProgress(TAG + "Cannot remove");
730 } catch (Exception e) {
731 publishProgress(TAG + "Remove Device error: " + e.getMessage());
737 protected void onProgressUpdate(String... values) {
738 logMessage(values[0]);
742 private class OwnedDiscoveryAsyncTask extends AsyncTask<Void, String, String> {
745 protected void onPreExecute() {
746 super.onPreExecute();
750 protected String doInBackground(Void... params) {
752 publishProgress(TAG + "Initiate Owned device Discovery");
753 ownedDeviceList = OcProvisioning.discoverOwnedDevices
754 (StringConstants.DISCOVERY_TIMEOUT_10);
755 if (ownedDeviceList.size() > 0) {
756 for (int i = 0; i < ownedDeviceList.size(); i++) {
757 publishProgress(TAG + "Owned Discovered Device " + (i + 1) + "= " +
758 ownedDeviceList.get(i).getDeviceID()
759 + "\nIP Address= " + ownedDeviceList.get(i).getIpAddr()
760 + "\nOwned Status= " + ownedDeviceList.get(i).getOwnedStatus()
761 + "\nDevice Status= " + ((ownedDeviceList.get(i).
762 getDeviceStatus() == DeviceStatus.ON) ? "ON" : "OFF")
766 publishProgress(TAG + "No Owned devices present");
768 } catch (OcException e) {
769 publishProgress(TAG + "Owned device Discovery error: " + e.getMessage());
770 return "Owned device Discovery error: " + e.getMessage();
776 protected void onProgressUpdate(String... values) {
777 logMessage(values[0]);
781 protected void onPostExecute(String s) {
784 if (ownedDeviceList.size() == 1 && "success".equals(s)) {
787 if (ownedDeviceList.size() > 1 && "success".equals(s)) {
788 doPairwiseProvisioning();
795 * to display on Server Message on Client screen
797 public class MessageReceiver extends BroadcastReceiver {
799 public void onReceive(Context context, Intent intent) {
800 final String message = intent.getStringExtra(StringConstants.MESSAGE);