package com.pekall.pctool.client;
import com.example.tutorial.AddressBookProtos.AddressBook;
import com.example.tutorial.AddressBookProtos.Person;
import com.pekall.pctool.protos.AppInfoProtos.AppInfoP;
import com.pekall.pctool.protos.AppInfoProtos.AppInfoPList;
import com.pekall.pctool.protos.MsgDefProtos.AccountRecord;
import com.pekall.pctool.protos.MsgDefProtos.AgendaRecord;
import com.pekall.pctool.protos.MsgDefProtos.AppRecord;
import com.pekall.pctool.protos.MsgDefProtos.AttachmentRecord;
import com.pekall.pctool.protos.MsgDefProtos.CmdRequest;
import com.pekall.pctool.protos.MsgDefProtos.CmdResponse;
import com.pekall.pctool.protos.MsgDefProtos.CmdType;
import com.pekall.pctool.protos.MsgDefProtos.ConnectParam;
import com.pekall.pctool.protos.MsgDefProtos.ConnectParam.ConnectType;
import com.pekall.pctool.protos.MsgDefProtos.ContactRecord;
import com.pekall.pctool.protos.MsgDefProtos.IMRecord;
import com.pekall.pctool.protos.MsgDefProtos.IMRecord.IMType;
import com.pekall.pctool.protos.MsgDefProtos.MMSRecord;
import com.pekall.pctool.protos.MsgDefProtos.ModifyTag;
import com.pekall.pctool.protos.MsgDefProtos.PhoneRecord;
import com.pekall.pctool.protos.MsgDefProtos.PhoneRecord.PhoneType;
import com.pekall.pctool.protos.MsgDefProtos.SlideRecord;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.List;
public class Main {
private static final String HOME_DIR = "/home/dev01";
// private static final String HOME_DIR = "/home/shaobin";
public static void main(String[] args) throws Exception {
//setup();
//testUninstallAppInWifiMode();
//teardown();
testConnectViaWifi();
}
private static void setup() throws Exception {
stopMainServer();
Thread.sleep(2000);
startMainServer();
Thread.sleep(2000);
forwardMainServerPort();
Thread.sleep(2000);
}
private static void teardown() throws Exception {
stopMainServer();
}
private static void forwardMainServerPort() {
System.out.println("adb forward tcp:12580 tcp:12580");
executeCommand(HOME_DIR + "/opt/android-sdk/platform-tools/adb forward tcp:12580 tcp:12580");
}
private static void startMainServer() {
System.out
.println("adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_MAIN_SERVER_START -n com.pekall.pctool/.AmCommandReceiver");
executeCommand(HOME_DIR
+ "/opt/android-sdk/platform-tools/adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_MAIN_SERVER_START -n com.pekall.pctool/.AmCommandReceiver");
}
private static void stopMainServer() {
System.out
.println("adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_MAIN_SERVER_STOP -n com.pekall.pctool/.AmCommandReceiver");
executeCommand(HOME_DIR
+ "/opt/android-sdk/platform-tools/adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_MAIN_SERVER_STOP -n com.pekall.pctool/.AmCommandReceiver");
}
private static void installAPK() {
System.out.println("adb install -r TestNettyAndroid.apk");
executeCommand(HOME_DIR + "/opt/android-sdk/platform-tools/adb install -r TestProtobufAndroidServer.apk");
}
private static void forwardFtpServerPort() {
System.out.println("adb forward tcp:2121 tcp:2121");
executeCommand(HOME_DIR + "/opt/android-sdk/platform-tools/adb forward tcp:2121 tcp:2121");
System.out.println("adb forward tcp:2120 tcp:2120");
executeCommand(HOME_DIR + "/opt/android-sdk/platform-tools/adb forward tcp:2120 tcp:2120");
}
private static void startFtpServer() {
System.out
.println("adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_FTP_SERVER_START -n com.pekall.pctool/.AmCommandReceiver");
executeCommand(HOME_DIR
+ "/opt/android-sdk/platform-tools/adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_FTP_SERVER_START -n com.pekall.pctool/.AmCommandReceiver");
}
private static void stopFtpServer() {
System.out
.println("adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_FTP_SERVER_STOP -n com.pekall.pctool/.AmCommandReceiver");
executeCommand(HOME_DIR
+ "/opt/android-sdk/platform-tools/adb shell am broadcast -a com.pekall.pctool.AmCommandReceiver.ACTION_FTP_SERVER_STOP -n com.pekall.pctool/.AmCommandReceiver");
}
private static void executeCommand(String cmd) {
try {
Process proc = Runtime.getRuntime().exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
// any error???
int exitVal = proc.waitFor();
System.out.println("ExitValue: " + exitVal);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//
// APP
//
private static void testQueryApp() {
System.out.println("testQueryApp E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_APP);
postCmdRequest(builder, true);
System.out.println("testQueryApp X");
}
//
// Sms
//
private static void testQuerySms() {
System.out.println("testQuerySms E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_SMS);
postCmdRequest(builder, true);
System.out.println("testQuerySms X");
}
//
// Mms
//
private static void testQueryMmsAttachment() {
System.out.println("testQueryMmsAttachment E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_MMS);
CmdResponse cmdResponse = postCmdRequest(builder, false);
if (cmdResponse.getCmdType() == CmdType.CMD_QUERY_MMS) {
List<MMSRecord> mmsRecords = cmdResponse.getMmsRecordList();
for (MMSRecord mmsRecord : mmsRecords) {
if (mmsRecord.getMsgId() == 51) {
for (SlideRecord slideRecord : mmsRecord.getSlideList()) {
for (AttachmentRecord attachmentRecord : slideRecord.getAttachmentList()) {
System.out.println("attachment type = " + attachmentRecord.getType() + ", name = "
+ attachmentRecord.getName() + ", size = " + attachmentRecord.getSize());
FileOutputStream fos = null;
try {
fos = new FileOutputStream(attachmentRecord.getName());
fos.write(attachmentRecord.getContent().toByteArray());
System.out.println("write " + attachmentRecord.getName());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
break;
}
}
}
System.out.println("testQueryMmsAttachment X");
}
//
// Calendar
//
private static void testQueryCalendar() {
System.out.println("testQueryCalendar E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_CALENDAR);
postCmdRequest(builder, true);
System.out.println("testQueryCalendar X");
}
private static void testQueryAgenda() {
System.out.println("testQueryAgenda E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_AGENDAS);
AgendaRecord.Builder agendaRecordBuilder = AgendaRecord.newBuilder();
agendaRecordBuilder.setCalendarId(1);
builder.setAgendaParams(agendaRecordBuilder);
postCmdRequest(builder, true);
System.out.println("testQueryAgenda X");
}
//
// Contact
//
private static void testQueryAccount() {
System.out.println("testQuerryAccount E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_GET_ALL_ACCOUNTS);
postCmdRequest(builder, true);
System.out.println("testQuerryAccount X");
}
private static void testQueryContact() {
System.out.println("testQueryContact E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_CONTACTS);
postCmdRequest(builder, /* dumpResponse */true);
System.out.println("testQueryContact X");
}
private static void testAddContact() {
System.out.println("testAddContact E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_ADD_CONTACT);
ContactRecord.Builder contactRecordBuilder = ContactRecord.newBuilder();
AccountRecord.Builder accountRecordBuilder = AccountRecord.newBuilder();
PhoneRecord.Builder phoneRecordBuilder = PhoneRecord.newBuilder();
accountRecordBuilder.setName("contacts.account.name.local");
accountRecordBuilder.setType("contacts.account.type.local");
contactRecordBuilder.setAccountInfo(accountRecordBuilder.build());
contactRecordBuilder.setName("testAddContact");
contactRecordBuilder.setNickname("NICK testAddContact");
phoneRecordBuilder.setType(PhoneType.MOBILE);
phoneRecordBuilder.setNumber("18601219014");
contactRecordBuilder.addPhone(phoneRecordBuilder.build());
builder.setContactParams(contactRecordBuilder);
postCmdRequest(builder, true);
System.out.println("testAddContact X");
}
private static void testUpdateContact() {
System.out.println("testUpdateContact E");
CmdRequest.Builder builder = CmdRequest.newBuilder();
builder.setCmdType(CmdType.CMD_QUERY_CONTACTS);
CmdResponse cmdResponse = postCmdRequest(builder, true);
List<ContactRecord> contactRecordList = cmdResponse.getContactRecordList();
ContactRecord contactRecord = contactRecordList.get(0);
System.out.println("original");
System.out.println(contactRecord.toString());
ContactRecord.Builder contactRecordBuilder = contactRecord.toBuilder();
contactRecordBuilder.setNickname("testUpdateContact");
IMRecord.Builder imRecordBuilder = IMRecord.newBuilder();
imRecordBuilder.setAccount("65491117");
imRecordBuilder.setType(IMType.QQ);
imRecordBuilder.setModifyTag(ModifyTag.ADD);
imRecordBuilder.setName("");
contactRecordBuilder.addIm(imRecordBuilder);
ContactRecord contactRecordParam = contactRecordBuilder.build();
System.out.println("modified");
System.out.println(contactRecordParam.toString());
builder.clear();
builder.setCmdType(CmdType.CMD_EDIT_CONTACT);
builder.setContactParams(contactRecordParam);
cmdResponse = postCmdRequest(builder, true);
System.out.println("testUpdateContact X");
}
private static CmdResponse postCmdRequest(CmdRequest.Builder cmdRequestBuilder, boolean dumpResponse) {
return postCmdRequest("localhost", cmdRequestBuilder, dumpResponse);
}
private static CmdResponse postCmdRequest(String host, CmdRequest.Builder cmdRequestBuilder, boolean dumpResponse) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://" + host + ":12580/rpc");
post.setHeader("Content-Type", "application/x-protobuf");
final CmdRequest cmdRequest = cmdRequestBuilder.build();
post.setEntity(new ByteArrayEntity(cmdRequest.toByteArray()));
try {
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
CmdResponse cmdResponse = CmdResponse.parseFrom(entity.getContent());
EntityUtils.consume(entity);
if (dumpResponse) {
System.out.println(cmdResponse.toString());
}
return cmdResponse;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
post.releaseConnection();
client.getConnectionManager().shutdown();
}
return null;
}
private static final int DISCOVERY_PORT = 2562;
private static void testReceiveWifiBroadcast() {
try {
DatagramSocket socket = new DatagramSocket(DISCOVERY_PORT);
byte[] buf = new byte[10];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
while (true) {
socket.receive(packet);
System.out.println("sender address: " + packet.getAddress().getHostAddress());
String payload = new String(buf, 0, packet.getLength());
System.out.println("sender payload: " + payload);
break;
}
String address = packet.getAddress().getHostAddress();
CmdRequest.Builder cmdRequestBuilder = CmdRequest.newBuilder();
cmdRequestBuilder.setCmdType(CmdType.CMD_CONNECT);
ConnectParam.Builder connectParamBuilder = ConnectParam.newBuilder();
connectParamBuilder.setConnectType(ConnectType.WIFI);
connectParamBuilder.setSecret("fdaa");
cmdRequestBuilder.setConnectParam(connectParamBuilder);
postCmdRequest(address, cmdRequestBuilder, true);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testConnectViaWifi() {
CmdRequest.Builder cmdRequestBuilder = CmdRequest.newBuilder();
cmdRequestBuilder.setCmdType(CmdType.CMD_CONNECT);
ConnectParam.Builder connectParamBuilder = ConnectParam.newBuilder();
connectParamBuilder.setConnectType(ConnectType.WIFI);
connectParamBuilder.setSecret("Zg==");
cmdRequestBuilder.setConnectParam(connectParamBuilder);
String address = "192.168.40.102";
postCmdRequest(address, cmdRequestBuilder, true);
}
public static void testConnectViaUsb() {
try {
stopMainServer();
Thread.sleep(3000);
startMainServer();
Thread.sleep(3000);
forwardMainServerPort();
Thread.sleep(3000);
CmdRequest.Builder cmdRequestBuilder = CmdRequest.newBuilder();
cmdRequestBuilder.setCmdType(CmdType.CMD_CONNECT);
ConnectParam.Builder connectParamBuilder = ConnectParam.newBuilder();
connectParamBuilder.setConnectType(ConnectType.USB);
String hostname = InetAddress.getLocalHost().getHostName();
connectParamBuilder.setHostName(hostname);
cmdRequestBuilder.setConnectParam(connectParamBuilder);
String address = "localhost";
CmdResponse cmdResponse = postCmdRequest(address, cmdRequestBuilder, true);
if (cmdResponse.getResultCode() == 0) {
System.out.println("connect ok");
}
System.out.println("now sleep 10s");
cmdRequestBuilder = CmdRequest.newBuilder();
cmdRequestBuilder.setCmdType(CmdType.CMD_DISCONNECT);
cmdResponse = postCmdRequest(address, cmdRequestBuilder, true);
if (cmdResponse.getResultCode() == 0) {
System.out.println("disconnect ok");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
stopMainServer();
}
}
public static void testQueryContactsBenchmark() {
try {
stopMainServer();
Thread.sleep(3000);
startMainServer();
Thread.sleep(3000);
forwardMainServerPort();
Thread.sleep(3000);
CmdRequest.Builder cmdRequestBuilder = CmdRequest.newBuilder();
cmdRequestBuilder.setCmdType(CmdType.CMD_QUERY_CONTACTS);
String address = "localhost";
long begin = System.currentTimeMillis();
int count = 0;
for (int i = 0; i < 50; i++) {
postCmdRequest(address, cmdRequestBuilder, false);
count++;
}
System.out.println("count: " + count);
long end = System.currentTimeMillis();
System.out.println("query contact cost: " + (end - begin) + "ms");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
stopMainServer();
}
}
private static void testUninstallAppInWifiMode() {
CmdRequest.Builder cmdRequestBuilder = CmdRequest.newBuilder();
cmdRequestBuilder.setCmdType(CmdType.CMD_UNINSTALL_APP);
AppRecord.Builder appRecordBuilder = AppRecord.newBuilder();
appRecordBuilder.setPackageName("com.jingdong.app.mall");
cmdRequestBuilder.setAppParams(appRecordBuilder);
String address = "localhost";
CmdResponse cmdResponse = postCmdRequest(address, cmdRequestBuilder, true);
}
//
// Test import Apk
//
private static void testImportApk() {
try {
stopMainServer();
Thread.sleep(3000);
startMainServer();
Thread.sleep(3000);
forwardMainServerPort();
Thread.sleep(3000);
String url = "http://localhost:12580/import";
String description = "UC Web";
String filename = "com.UCMobile-1.apk";
File apk = new File(filename);
String response = executeMultiPartRequest(url, apk, filename, description);
System.out.println(response);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* A generic method to execute any type of Http Request and constructs a
* response object
*
* @param requestBase the request that needs to be exeuted
* @return server response as <code>String</code>
*/
private static String executeRequest(HttpRequestBase requestBase) {
String responseString = "";
InputStream responseStream = null;
HttpClient client = new DefaultHttpClient();
try {
HttpResponse response = client.execute(requestBase);
if (response != null) {
HttpEntity responseEntity = response.getEntity();
Header[] headers = response.getAllHeaders();
for (Header header : headers) {
System.out.println(header.toString());
}
if (responseEntity != null) {
responseStream = responseEntity.getContent();
if (responseStream != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(responseStream));
String responseLine = br.readLine();
String tempResponseString = "";
while (responseLine != null) {
tempResponseString = tempResponseString + responseLine
+ System.getProperty("line.separator");
responseLine = br.readLine();
}
br.close();
if (tempResponseString.length() > 0) {
responseString = tempResponseString;
}
}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (responseStream != null) {
try {
responseStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
client.getConnectionManager().shutdown();
return responseString;
}
/**
* Method that builds the multi-part form data request
*
* @param urlString the urlString to which the file needs to be uploaded
* @param file the actual file instance that needs to be uploaded
* @param fileName name of the file, just to show how to add the usual form
* parameters
* @param fileDescription some description for the file, just to show how to
* add the usual form parameters
* @return server response as <code>String</code>
*/
public static String executeMultiPartRequest(String urlString, File file, String fileName, String fileDescription) {
HttpPost postRequest = new HttpPost(urlString);
// try {
MultipartEntity multiPartEntity = new MultipartEntity();
// The usual form parameters can be added this way
// multiPartEntity.addPart("fileDescription", new StringBody(fileDescription != null ? fileDescription : ""));
// multiPartEntity.addPart("fileName", new StringBody(fileName != null ? fileName : file.getName()));
/*
* Need to construct a FileBody with the file that needs to be
* attached and specify the mime type of the file. Add the fileBody
* to the request as an another part. This part will be considered
* as file part and the rest of them as usual form-data parts
*/
FileBody fileBody = new FileBody(file, "application/octect-stream");
multiPartEntity.addPart("attachment", fileBody);
postRequest.setEntity(multiPartEntity);
// } catch (UnsupportedEncodingException ex) {
// ex.printStackTrace();
// }
return executeRequest(postRequest);
}
// ------------------------------------------------------------------------
//
// ------------------------------------------------------------------------
private static void testGetAddressBook() {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://localhost:12580/test");
try {
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
AddressBook addressBook = AddressBook.parseFrom(entity.getContent());
EntityUtils.consume(entity);
for (Person p : addressBook.getPersonList()) {
System.out.println("{id: " + p.getId() + ", name: " + p.getName() + "}");
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
get.releaseConnection();
client.getConnectionManager().shutdown();
}
}
private static void testGetAppInfoPList() {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://localhost:12580/apps");
try {
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
AppInfoPList appInfoPList = AppInfoPList.parseFrom(entity.getContent());
EntityUtils.consume(entity);
System.out.println("app count = " + appInfoPList.getAppInfosCount());
AppInfoP appInfoP = appInfoPList.getAppInfos(0);
System.out.println("appInfoP at index 0 label: " + appInfoP.getLabel());
System.out.println("appInfoP at index 0 package: " + appInfoP.getPackageName());
System.out.println("appInfoP at index 0 apk path: " + appInfoP.getApkFilePath());
System.out.println("appInfoP at index 0 apk size: " + appInfoP.getApkFileSize());
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
get.releaseConnection();
client.getConnectionManager().shutdown();
}
}
}