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 ...
随机推荐
- 运用集合来做一个DVD管理器(全代码)
package DVD;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Array ...
- openstack系列阅读目录
一 keystone系列 keystone基础 网关协议cgi,fastcgi,wsgi,uwsgi keystone源码分析 keystone部署及使用 keystone客户端工作介绍 二 glan ...
- C# & SQLite - Storing Images
Download source code - 755 KB Introduction This article is to demonstrate how to load images into ...
- 函数中的$input
$input 在此属于一个特殊变量,一般在函数中用于接收输入 function FindWindowsFolder { $input | where-object {$_.Name -eq " ...
- ORM之一:适合我的ORM
一.常见开源ORM框架 比喻:Kerosene ORM,DbLinq,Dapper,DynamicQuery,elinq,glinq,NPoco,Relinq,EF,ServiceStack.OrmL ...
- 使用python编写批量卸载android应用的脚本
该脚本的功能是卸载android手机中安装的所有第三方应用,主要是使用adb shell pm.adb uninstall 命令,所以使用的前提是需要配好adb的环境变量,下面上代码: #!/usr/ ...
- MongoDB入门简单介绍
有关于MongoDB的资料如今较少,且大多为英文站点,以上内容大多由笔者翻译自官网,请翻译或理解错误之处请指证.之后笔者会继续关注MongoDB,并翻译“Developer Zone”和“Admin ...
- android学习日记03--常用控件progressbar/seekbar
常用控件 5.progressbar 进度条,比较常用的组件,在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度.一个进度条也 ...
- [Effective C++ --011]在operator=中处理“自我赋值”
一.何谓“自我赋值”? 1.1.场合一 直接赋值 w = w; 1.2.场合二 同一数组 a[i] = a[j]: 1.3.场合三 指针 *px = *py: 1.4. ...
- Sync FrameWork 文件同步 (源码)
Sync Framework 是一个功能完善的同步平台,实现了应用程序.服务和设备的协作和脱机访问.Sync Framework 提供了一些可支持在脱机状态下漫游.共享数据和获取数据的技术 和工具.通 ...