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 ...
随机推荐
- Linux就是这个范儿之第一次亲密接触(3)
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息和本声明.否则将追究法律责 1.4 返璞归真的命令行 有一种说法,现代计算机不是靠电力驱动,而是靠“鼠标”.多少应用程序的界面需 ...
- 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++ ...
- Java NIO 备忘
$.backlog:可以把它简单理解为一个 listening socket 的请求连接队列的限制.当队列中的连接请求达到队列限制时,kernel 会拒绝信的连接请求.只有当应用程序通过 accept ...
- Android事件分发原理
终于用上了word 2013来写博客,感觉真是老好了,以前在网页上写,老是要把网页拖上拖下的,每次都要吐一升老血啊,现在用上本地的word,瞬间感觉好多了.还有感谢为word写插件的这个大神,代码高亮 ...
- android129 zhihuibeijing 聊天机器人
上屏幕界面activity_main.xml: 语音识别界面 <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...
- [019]转--C++ operator关键字(重载操作符)
原博客:http://www.cnblogs.com/speedmancs/archive/2011/06/09/2076873.html operator是C++的关键字,它和运算符一起使用,表示一 ...
- 网页媒体播放利器 - JW Player使用心得
序言 前段时间在做一个网站项目,要求能在线播放视频.音乐,这个以前还真没接触过.恰好今天在坛子里闲逛时,发现有同志对这方面也感兴趣,遂把这些整理了下,同时自己也可以复习下. 播放器需要满足以下需求: ...
- Models and the ServiceManager
Models and the ServiceManager In the previous chapter we've learned how to create a "Hello Worl ...
- MySQL(3):数据库操作
1.创建数据库: 数据定义语言(DDL): create database db_name[数据库选项] 注:数据库命名规则:大小写取决于当前操作系统,见名知意,推荐下划线 标识符的字符: 使用任意字 ...
- AppScan在项目中的使用流程
AppScan在项目中的使用流程 http://www.docin.com/p-829022229.html