2ff9b49ab315c1091703df784e8c6b2475d3a83e
[iot2.git] / benchmarks / other / PhoneInterface / Irrigation / app / src / main / java / com / example / xubin / irrigation / Helper.java
1 package com.example.xubin.irrigation;
2
3 import android.util.Log;
4
5 import org.apache.http.HttpResponse;
6 import org.apache.http.HttpVersion;
7 import org.apache.http.client.HttpClient;
8 import org.apache.http.client.methods.HttpPost;
9 import org.apache.http.conn.ClientConnectionManager;
10 import org.apache.http.conn.scheme.PlainSocketFactory;
11 import org.apache.http.conn.scheme.Scheme;
12 import org.apache.http.conn.scheme.SchemeRegistry;
13 import org.apache.http.conn.ssl.SSLSocketFactory;
14 import org.apache.http.entity.StringEntity;
15 import org.apache.http.impl.client.DefaultHttpClient;
16 import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
17 import org.apache.http.params.BasicHttpParams;
18 import org.apache.http.params.CoreConnectionPNames;
19 import org.apache.http.params.CoreProtocolPNames;
20 import org.apache.http.params.HttpParams;
21 import org.apache.http.protocol.HTTP;
22 import org.json.JSONArray;
23 import org.json.JSONObject;
24
25 import java.io.BufferedReader;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.InputStreamReader;
29 import java.io.BufferedInputStream;
30 import java.util.List;
31 import java.security.cert.CertificateFactory;
32 import java.security.cert.Certificate;
33 import java.security.cert.X509Certificate;
34 import java.security.KeyStore;
35
36 /**
37  * Created by xubin on 4/26/16.
38  */
39 public class Helper {
40     private static final int Driver_port = 8000;
41     private static final String Tag = "http";
42     private static final String KEYEXT = ".pem";
43
44     HttpClient httpclient;
45     //Set up
46     void setConnection(String destIP) {
47
48         httpclient = createClient(destIP);
49     }
50
51     HttpClient createClient(String destIP) {
52         HttpParams params = new BasicHttpParams();
53         params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
54         params.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, HTTP.DEFAULT_CONTENT_CHARSET);
55         params.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
56         params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30 * 1000);
57         params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 30 * 1000);
58
59         SchemeRegistry schReg = new SchemeRegistry();
60         schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), Driver_port));
61         schReg.register(new Scheme("https", newSslSocketFactory(destIP), 443));
62         ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
63
64         return new DefaultHttpClient(conMgr, params);
65     }
66
67     //Make http request
68     public void  makeRequest(String destIP, List<Object> paramObjects, String methodName) {
69         String url = "https://"+ destIP + ":"+Driver_port+ "/"+methodName;
70         System.out.println("URL: " + url);
71         InputStream inputStream = null;
72         String result = "";
73         try {
74             HttpPost httpPost = new HttpPost(url);
75             JSONArray params = new JSONArray();
76
77             JSONObject parent = new JSONObject();
78             for (int i = 0; i < paramObjects.size(); i++) {
79                 JSONObject content = new JSONObject();
80                 content.put("type", paramObjects.get(i).getClass().getName());
81                 content.put("value", paramObjects.get(i));
82                 params.put(i, content);
83             }
84             parent.put("params", params);
85             StringEntity se = new StringEntity(parent.toString());
86             httpPost.setEntity(se);
87             httpPost.setHeader("Accept", "application/json");
88             httpPost.setHeader("Content-type", "application/json");
89             HttpResponse httpResponse = httpclient.execute(httpPost);
90             // 9. receive response as inputStream
91             inputStream = httpResponse.getEntity().getContent();
92
93             // 10. convert inputstream to string
94             if(inputStream != null)
95                 result = convertInputStreamToString(inputStream);
96             else
97                 result = "Did not work!";
98             Log.v(Tag, result);
99         } catch (Exception ex) {
100             if (ex.getMessage() != null) {
101                 Log.v(Tag, ex.getMessage());
102             }
103             ex.printStackTrace();
104         }
105     }
106
107     private SSLSocketFactory newSslSocketFactory(String destIP) {
108         try {
109             // Load CAs from an InputStream
110             CertificateFactory cf = CertificateFactory.getInstance("X.509");
111             InputStream caInput = new
112                     BufferedInputStream(MainActivity.context.getAssets().open(destIP + KEYEXT));
113             Certificate ca;
114             try {
115                 ca = cf.generateCertificate(caInput);
116                 System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
117             } finally {
118                 caInput.close();
119             }
120             String keyStoreType = KeyStore.getDefaultType();
121             KeyStore keyStore = KeyStore.getInstance(keyStoreType);
122             keyStore.load(null, null);
123             keyStore.setCertificateEntry("ca", ca);
124             SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore);
125             return socketFactory;
126         } catch (Exception e) {
127             throw new AssertionError(e);
128         }
129     }
130
131     private static String convertInputStreamToString(InputStream inputStream) throws IOException {
132         BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
133         String line = "";
134         String result = "";
135         while((line = bufferedReader.readLine()) != null)
136             result += line;
137
138         inputStream.close();
139         return result;
140
141     }
142 }