通过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. php做EXCEL数据导出导入开发的一些小问题

    前两天刚刚做开发CRM系统项目,在做要做EXCEL导出导入功能,因为以前做.NET开发用的是NPOI,但可是没找到PHP版本的,所以就网搜找了个国外的开源PHPEXCEL , 一开始只是做了简单的导入 ...

  2. [html][转]常用返回顶部代码

    转至:http://jingyan.baidu.com/article/7082dc1ca6b928e40a89bd1a.html 一.使用HTML的锚标记最简单了 但是唯一的缺点就是样式不怎么样,会 ...

  3. 8000401a 错误及解决办法

    将web程序部署到服务器上时,偶尔会遇到下面的错误: System.Runtime.InteropServices.COMException (0x8000401A): 检索 COM 类工厂中 CLS ...

  4. CocoaPods使用命令

    5.需要在工程中创建一个Podfile文件, 使用命令: $cd /Users/shiyunlei/Desktop/CocoapodsSample(进入工程目录,cd后面的是工程的路径) $ touc ...

  5. C++ 变量初始化规则

    1.定义变量的时候,如果没有初始化,它的值是什么呢? 它的值取决于变量的类型和变量定义的位置. 2.考虑基本类型的变量,定义时没有初始化.如果定义在方法外部,初始化为0,如果定义在方法内部,不被初始化 ...

  6. hdu 5461 Largest Point 暴力

    Largest Point Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  7. 【转贴】gdb中的信号(signal)相关调试技巧

    一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛  http://www.magicunix.com/index_ch.html  http://www.m ...

  8. [Effective C++ --006]若不能使用编译器自动生成的函数,就该明确拒绝

    ■本文内容■□第一节 <引言> 在条款五的讲解中,我们已经知道编译器是聪明的家伙,它会帮助你生成类的构造函数.析构函数.一个copy构造函数和一个赋值运算符.有时真的要感谢编译器所做的这一 ...

  9. 第二章 使用JavaScript

    只要一提到把JavaScript放在网页中,就不得不涉及Web的核心语言-HTML.在当初开发JavaScript的时候,Netscape要解决的一个重要问题就是如何让JavaScript既能在HTM ...

  10. iOS 图片加载框架- SDWebImage 解读

    在iOS的图片加载框架中,SDWebImage可谓是占据大半壁江山.它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件.在项目中使用SDWebImage ...