通过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通讯下)的更多相关文章

  1. Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)

    Android端的代码: 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ ...

  2. Android笔记之adb命令解析1

    要在cmd命令中直接使用adb,需要配置环境变量:目录XXX\sdk\platform-tools 查看adb -help 帮助命令打印出以下内容: Android Debug Bridge vers ...

  3. Android笔记(adb命令--reboot loader)

    Android 的机器通过adb进入升级模式的方法 # adb shell # reboot loader 通过上面两个命令就进入升级模式了,通过工具升级就好了 为什么会写这简单的一篇呢?因为今天干了 ...

  4. Android的常用adb命令

    第一部分:1. ubuntu下配置环境anroid变量:在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#setandroid environment2. 运行E ...

  5. android学习笔记31——ADB命令

    使用Adb shell command直接送key event給Androidadb shell input keyevent 7 # for key '0'adb shell input keyev ...

  6. android studio 使用adb命令传递文件到android设备

    一:文件传输 在android开发中,有时候需要将文件从pc端传递至android,或者将软件运行的日志,从android设备传递到pc进行分析,我们可以使用windows的cmd窗口,或者andro ...

  7. Android 里的adb命令

    ADB的全称为Android Debug Bridge,就是起到调试桥的作用. adb调试手机需要把usb调试打开 Android studio模拟器有的也要把模拟器usb调试打开,工具要灵活运用, ...

  8. Android开发中adb命令的常用方法

    Android的SDK中提供了很多有用的工具,在开发过程中如果能熟练使用这些工具,会让我们的开发事半功倍.adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge,用于 ...

  9. 如何获得Android设备名称(ADB命令详细介绍)

    豌豆荚.360手机管家等软件可以获取android设备名称,显示在界面上,如下图: 我们自己如何来获取设备名称 呢?答案如下: 在命令行中输入“adb shell”进入shell之后,再输入“cat ...

随机推荐

  1. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

  2. RocketMQ入门(1)

    转自:http://www.changeself.net/archives/rocketmq入门(1).html RocketMQ入门(1) RocketMQ是一款分布式.队列模型的消息中间件,具有以 ...

  3. ECSHOP在线手册之布局参考图-首页 index.dwt

        A.logo替换 1,设置方法 后台商店设置里,上传logo就行,注意logo的名称必须是logo.gif 2,代码相关 page_header.lbi 中 <a href=" ...

  4. ECshop数据库的访问统计和管理员日志的清空

    ECshop是个不错的系统,但是它有一定漏洞,若是访问量巨大的话,大量的访问统计代码会存入数据库的ecs_stats表中,甚至几天就可以达到几百兆,严重的网站直接就崩溃了.数据备份的时候也有很多不便, ...

  5. C# Winform 支持Hex与ASCII输入和切换的文本框

    最近一直在做一个支持串口,TCP,UDP通讯调试的一体化工具(也就是C#串口调试工具 v2.0的第三版),其中涉及到16进制数据和ASCII码的输入,所以继承了TextBox的基础上,写了这个支持He ...

  6. BZOJ 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  7. Jordan Lecture Note-3: 梯度投影法

    Jordan Lecture Note-3:梯度投影法 在这一节,我们介绍如何用梯度投影法来解如下的优化问题: \begin{align} \mathop{\min}&\quad f(x)\n ...

  8. 说说log4cplus

    <C++ primer 第五版>已经翻了一段时间了,每天早上的班车上看一个小时.书是好书,可惜很多知识还是停留在表面上.每天除了翻书,一是也找到不合适的方法进一步深入,晚上看到新闻联播的老 ...

  9. GCD多线程

    GCD本质线程自动管理指令包 GCD优点: 1.GCD 本身自带有线程锁的效果,能通过推迟昂贵计算任务并在后台运行它们来改善应用的响应性能. 2.GCD 提供了更易于使用的并发模型(效果方面类似于对锁 ...

  10. postgresql crosstab 行转列函数

    http://blog.csdn.net/hexin373/article/details/19242833