2 * ***************************************************************
\r
4 * Copyright 2015 Samsung Electronics All Rights Reserved.
\r
8 * Licensed under the Apache License, Version 2.0 (the "License");
\r
9 * you may not use this file except in compliance with the License.
\r
10 * You may obtain a copy of the License at
\r
12 * http://www.apache.org/licenses/LICENSE-2.0
\r
14 * Unless required by applicable law or agreed to in writing, software
\r
15 * distributed under the License is distributed on an "AS IS" BASIS,
\r
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
17 * See the License for the specific language governing permissions and
\r
18 * limitations under the License.
\r
20 * ****************************************************************
\r
23 package org.iotivity.service.easysetup.mediator;
\r
25 import java.util.Timer;
\r
26 import java.util.TimerTask;
\r
28 import org.iotivity.service.easysetup.core.EasySetupManager;
\r
29 import org.iotivity.service.easysetup.core.EnrolleeInfo;
\r
30 import org.iotivity.service.easysetup.core.IOnBoardingStatus;
\r
31 import org.iotivity.service.easysetup.core.IProvisioningListener;
\r
32 import org.iotivity.service.easysetup.core.ProvisionEnrollee;
\r
33 import org.iotivity.service.easysetup.core.ip.WiFiSoftAPManager;
\r
35 import android.content.Context;
\r
36 import android.net.wifi.WifiConfiguration;
\r
37 import android.util.Log;
\r
40 * This is a ready to use class for Enrollee device having Soft AP as on-boarding connectivity.
\r
42 public class EnrolleeDeviceWiFiOnboarding extends EnrolleeDevice {
\r
44 public static final String TAG = EnrolleeDeviceWiFiOnboarding.class.getName();
\r
46 final Context mContext;
\r
47 final WiFiSoftAPManager mWifiSoftAPManager;
\r
48 EnrolleeInfo connectedDevice;
\r
49 private EasySetupManager easySetupManagerNativeInstance;
\r
50 ProvisionEnrollee provisionEnrolleInstance;
\r
53 IOnBoardingStatus deviceScanListener = new IOnBoardingStatus() {
\r
56 public void deviceOnBoardingStatus(EnrolleeInfo enrolleStatus) {
\r
58 Log.d("ESSoftAPOnBoarding", "Entered");
\r
59 if (mState == EnrolleeState.DEVICE_ON_BOARDING_STATE) {
\r
60 Log.d("ESSoftAPOnBoarding", "Device in OnBoarding State");
\r
61 if (enrolleStatus != null && enrolleStatus.getIpAddr() != null) {
\r
62 String finalResult = "Easy Connect : ";
\r
64 if (enrolleStatus.isReachable()) {
\r
65 finalResult = "Device OnBoarded" + "["
\r
66 + enrolleStatus.getIpAddr() + "]";
\r
68 connectedDevice = enrolleStatus;
\r
69 IpOnBoardingConnection conn = new IpOnBoardingConnection();
\r
71 conn.setConnectivity(true);
\r
72 conn.setIp(connectedDevice.getIpAddr());
\r
73 conn.setHardwareAddress(enrolleStatus.getHWAddr());
\r
74 conn.setDeviceName(enrolleStatus.getDevice());
\r
76 Log.d("ESSoftAPOnBoarding", "Entered" + finalResult);
\r
77 mOnBoardingCallback.onFinished(conn);
\r
83 IpOnBoardingConnection conn = new IpOnBoardingConnection();
\r
84 conn.setConnectivity(false);
\r
85 mOnBoardingCallback.onFinished(conn);
\r
87 Log.e("ESSoftAPOnBoarding", "Device NOT in OnBoarding State. Ignoring the event");
\r
93 protected EnrolleeDeviceWiFiOnboarding(Context context, OnBoardingConfig onBoardingConfig,
\r
94 ProvisioningConfig provConfig) {
\r
95 super(onBoardingConfig, provConfig);
\r
97 mWifiSoftAPManager = new WiFiSoftAPManager(mContext);
\r
101 protected void startOnBoardingProcess() {
\r
102 Log.i(TAG, "Starting on boarding process");
\r
104 //1. Create Soft AP
\r
105 boolean status = mWifiSoftAPManager.setWifiApEnabled((WifiConfiguration)
\r
106 mOnBoardingConfig.getConfig(), true);
\r
108 mState = EnrolleeState.DEVICE_ON_BOARDING_STATE;
\r
110 Log.i(TAG, "Soft AP is created with status " + status);
\r
112 myTimer = new Timer();
\r
113 myTimer.schedule(new TimerTask() {
\r
115 public void run() {
\r
116 // Below function to be called after 5 seconds
\r
117 mWifiSoftAPManager.getClientList(deviceScanListener, 300);
\r
123 protected void stopOnBoardingProcess() {
\r
124 Log.i(TAG, "Stopping on boarding process");
\r
126 boolean status = mWifiSoftAPManager.setWifiApEnabled(null, false);
\r
127 Log.i(TAG, "Soft AP is disabled with status " + status);
\r
131 protected void startProvisioningProcess(OnBoardingConnection conn) {
\r
133 Log.i(TAG, "waiting for 20 seconds to start provisioning");
\r
134 Thread.sleep(20000);//Sleep for allowing thin device to start the services
\r
135 } catch (InterruptedException e) {
\r
136 e.printStackTrace();
\r
139 mState = EnrolleeState.DEVICE_PROVISIONING_STATE;
\r
140 mProvisioningCallback.onProgress(this);
\r
141 final EnrolleeDevice device = this;
\r
142 if (mProvConfig.getConnType() == ProvisioningConfig.ConnType.WiFi) {
\r
144 provisionEnrolleInstance = new ProvisionEnrollee(mContext);
\r
146 provisionEnrolleInstance.registerProvisioningHandler(new IProvisioningListener() {
\r
148 public void onFinishProvisioning(int statuscode) {
\r
150 Log.i(TAG, "Provisioning is finished with status code " + statuscode);
\r
151 mState = (statuscode == 0) ? EnrolleeState.DEVICE_PROVISIONED_STATE
\r
152 : EnrolleeState.DEVICE_INIT_STATE;
\r
153 stopOnBoardingProcess();
\r
154 mProvisioningCallback.onProgress(device);
\r
155 mProvisioningCallback.onFinished(EnrolleeDeviceWiFiOnboarding.this);
\r
159 IpOnBoardingConnection connection = (IpOnBoardingConnection) conn;
\r
160 WiFiProvConfig wifiProvConfig = (WiFiProvConfig) mProvConfig;
\r
162 easySetupManagerNativeInstance = EasySetupManager.getInstance();
\r
163 easySetupManagerNativeInstance.setApplicationContext(mContext);
\r
164 easySetupManagerNativeInstance.initEasySetup();
\r
166 // Native Api call to start provisioning of the enrolling device
\r
167 easySetupManagerNativeInstance.provisionEnrollee(connection.getIp(), wifiProvConfig
\r
168 .getSsId(), wifiProvConfig.getPassword(), 1);
\r