Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)
通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll。
可以在XXX\sdk\platform-tools目录下找到
界面效果如下:
namespace AndUsbClient
{
public partial class Form1 : Form
{
public const int WaitMs = 2000;
public const int TimeOut = 5000; private readonly TcpClient _tcpClient = new TcpClient();
private Boolean _flag = true;
private Thread _thread; public Form1()
{
InitializeComponent();
btnConnect.Click += btnConnect_Click;
FormClosed += new FormClosedEventHandler(Form1_FormClosed);
btnSend.Click += btnSend_Click;
btnClear.Click += btnClear_Click;
} private void btnSend_Click(object sender, EventArgs e)
{
if (_tcpClient.Connected)
{
var writer = new BinaryWriter(_tcpClient.GetStream());
String content = rtxtContent.Text;
try
{
byte[] bytes = new UTF8Encoding(false).GetBytes(content);
writer.Write(Int32ToByteArray(bytes.Length));
writer.Write(bytes);
writer.Flush();
SetResult(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " PC: " + content);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
} private void btnClear_Click(object sender, EventArgs e)
{
txtResult.Text = "";
} private void btnConnect_Click(object sender, EventArgs e)
{
try
{
btnConnect.Enabled = false;
if (_thread != null && _thread.IsAlive)
{
_thread.Abort();
_thread = null;
}
_thread = new Thread(() =>
{
OutMsg(@"开始连接Android手机...");
DoConnect();
});
_thread.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
btnConnect.Enabled = true;
} private void OutMsg(String msg)
{
AsyncAction(() => { lblInfo.Text = msg; });
} private void SetResult(String msg)
{
AsyncAction(() => { txtResult.Text += @"\r\n" + msg; });
} public void AsyncAction(Action action)
{
if (InvokeRequired)
{
Invoke(new Action<Action>(AsyncAction), action);
return;
}
action();
} //连接
public void DoConnect()
{
try
{
ExecuteCmd("kill-server", 0);
ExecuteCmd("devices", 0);
string strCmd = "shell am broadcast -a NotifyServiceStop"; //利用adb shell am broadcast命令发送广播
ExecuteCmd(strCmd, 0);
strCmd = "forward tcp:13333 tcp:10101"; //利用adb命令转发端口
ExecuteCmd(strCmd, 0);
strCmd = "shell am broadcast -a NotifyServiceStart";
ExecuteCmd(strCmd, 0);
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
_tcpClient.Connect(ipaddress, 13333);
OutMsg("连接成功!");
NetworkStream networkkStream = _tcpClient.GetStream();
networkkStream.ReadTimeout = TimeOut;
networkkStream.WriteTimeout = TimeOut;
//var reader = new BinaryReader(networkkStream);
var tempbuffer = new byte[4];
IAsyncResult result = networkkStream.BeginRead(tempbuffer, 0, tempbuffer.Length, null, tempbuffer);
_flag = true;
while (_flag)
{
if (result.IsCompleted && _tcpClient.Connected)
{
tempbuffer = (byte[])result.AsyncState;
int length = ByteArrayToInt32(tempbuffer);
var buffer = new byte[length];
int size = networkkStream.Read(buffer, 0, length);
if (size > 0)
{
SetResult(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " Android: " +
Encoding.UTF8.GetString(buffer, 0, size));
}
result = networkkStream.BeginRead(tempbuffer, 0, tempbuffer.Length, null, tempbuffer);
}
Thread.Sleep(200);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} private static byte[] Int32ToByteArray(Int32 m)
{
var arry = new byte[4];
arry[0] = (byte)(m & 0xFF);
arry[1] = (byte)((m & 0xFF00) >> 8);
arry[2] = (byte)((m & 0xFF0000) >> 16);
arry[3] = (byte)((m >> 24) & 0xFF);
return arry;
} private static int ByteArrayToInt32(byte[] bytes)
{
return BitConverter.ToInt32(bytes, 0);
} private String ExecuteCmd(string command, int seconds)
{
string output = ""; //输出字符串
if (!String.IsNullOrEmpty(command))
{
Console.WriteLine(command);
var process = new Process(); //创建进程对象
var startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
startInfo.FileName = "adb.exe"; //设定需要执行的命令
startInfo.Verb = "runas";
startInfo.Arguments = command; //“/C”表示执行完命令后马上退出
startInfo.UseShellExecute = false; //不使用系统外壳程序启动
startInfo.RedirectStandardInput = false; //不重定向输入
startInfo.RedirectStandardOutput = true; //重定向输出
startInfo.CreateNoWindow = true; //不创建窗口
process.StartInfo = startInfo;
Console.WriteLine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
try
{
if (process.Start()) //开始进程
{
if (seconds == 0)
{
process.WaitForExit(); //这里无限等待进程结束
}
else
{
process.WaitForExit(seconds); //等待进程结束,等待时间为指定的毫秒
}
output = process.StandardOutput.ReadToEnd(); //读取进程的输出
Console.WriteLine(output);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
process.Close();
}
}
return output;
} public string Obj2Json<T>(T data)
{
try
{
var json = new DataContractJsonSerializer(data.GetType());
using (var ms = new MemoryStream())
{
json.WriteObject(ms, data);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
catch (Exception ex)
{
throw ex;
}
} public object Json2Obj(string strJson, Type t)
{
try
{
var json = new DataContractJsonSerializer(t);
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
{
return json.ReadObject(ms);
}
}
catch (Exception ex)
{
throw ex;
}
} private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
_flag = false;
if (_tcpClient != null)
{
try
{
if (_tcpClient.Connected)
{
NetworkStream stream = _tcpClient.GetStream();
var writer = new BinaryWriter(stream);
byte[] bytes = new UTF8Encoding(false).GetBytes("EXIT");
writer.Write(Int32ToByteArray(bytes.Length));
writer.Write(bytes);
writer.Flush();
stream.Close();
stream.Dispose();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
_tcpClient.Close();
}
}
}
}
}
作者:sufish
出处:http://www.cnblogs.com/dotnetframework/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:dotnetframework@sina.com联系我,非常感谢。
Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)的更多相关文章
- Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)
Android端的代码: 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ ...
- Android笔记之adb命令解析1
要在cmd命令中直接使用adb,需要配置环境变量:目录XXX\sdk\platform-tools 查看adb -help 帮助命令打印出以下内容: Android Debug Bridge vers ...
- Android笔记(adb命令--reboot loader)
Android 的机器通过adb进入升级模式的方法 # adb shell # reboot loader 通过上面两个命令就进入升级模式了,通过工具升级就好了 为什么会写这简单的一篇呢?因为今天干了 ...
- Android的常用adb命令
第一部分:1. ubuntu下配置环境anroid变量:在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#setandroid environment2. 运行E ...
- android学习笔记31——ADB命令
使用Adb shell command直接送key event給Androidadb shell input keyevent 7 # for key '0'adb shell input keyev ...
- android studio 使用adb命令传递文件到android设备
一:文件传输 在android开发中,有时候需要将文件从pc端传递至android,或者将软件运行的日志,从android设备传递到pc进行分析,我们可以使用windows的cmd窗口,或者andro ...
- Android 里的adb命令
ADB的全称为Android Debug Bridge,就是起到调试桥的作用. adb调试手机需要把usb调试打开 Android studio模拟器有的也要把模拟器usb调试打开,工具要灵活运用, ...
- Android开发中adb命令的常用方法
Android的SDK中提供了很多有用的工具,在开发过程中如果能熟练使用这些工具,会让我们的开发事半功倍.adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge,用于 ...
- 如何获得Android设备名称(ADB命令详细介绍)
豌豆荚.360手机管家等软件可以获取android设备名称,显示在界面上,如下图: 我们自己如何来获取设备名称 呢?答案如下: 在命令行中输入“adb shell”进入shell之后,再输入“cat ...
随机推荐
- [二]JQueryMobile常用的组件介绍
1.页头.主要部门.页尾构成一个基本的页面 2.按钮组件(input.a) 3.列表组件(ul) 4.表格组件(table)
- 经验之巧妙的应用Map
后台: @RequestMapping("/cmci/v_divide_check_add.do") public String toDivideCheckAdd(HttpS ...
- iframe中的各种跳转方法
iframe中的各种跳转方法(转) 一.背景A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的iframe,在D中跳转页面的写法区别如下. 二.JS跳转window.l ...
- eclipse内使用tomcat项目究竟被部署到了哪里
笔者在使用eclipse+tomcat做本地调试,项目没跑起来,原因就很奇怪啊(某前辈说过:奇怪源于无知),然后就想它究竟是把项目放到哪个目录下呢,我的tomcat/webapps目录下并没有啊. 默 ...
- Windows 7 EXE图标丢失修复方法
有过Win7下的一些EXE文件图标莫名奇妙丢失,但功能却正常的情况吗?这是图标缓存的问题,应该是Win7的bug. 在命令提示符下输入下列命令即可恢复. 以下是代码片段: taskkill /im e ...
- iOS——UIButton响应传参数
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 方法是 ...
- Sublime Text 2&3中输入法不跟随光标移动的问题的解决方法
插件名称:IMESupport GitHub页面:https://github.com/chikatoike/IMESupport 安装方法: 手动安装和通过Package Control在线安装. ...
- Codeforces Round #324 (Div. 2) A. Olesya and Rodion 水题
A. Olesya and Rodion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/p ...
- 【剑指Offer学习】【面试题55:字符流中第一个不反复的字符】
题目:请实现一个函数用来找出字符流中第一个仅仅出现一次的字符. 举例说明 比如,当从字符流中仅仅读出前两个字符"go"时.第一个仅仅出现一次的字符是'g'.当从该字符流中读出前六个 ...
- linux 参数优化
脏页 vm.dirty_background_radio=10 (当脏页占内存10%,pdflush工作) vm.dirty_radio=40 (当进程自身脏页占内存40%,进程自己处理脏页,将其写入 ...