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

由于本人学习Android也挺长时间了,一直把日记记在evernote里面,由于刚离职比较空闲就打算把evernote里的日志一遍遍整理出来发布到网上分享。

本篇将分别使用C#和java语言,来实现和android端通讯的PC客户端代码。

通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll。

可以在XXX\sdk\platform-tools目录下找到

首先看C#语言的实现:

界面效果如下:

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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:[email protected]联系我,非常感谢。

时间: 2024-11-06 18:07:01

Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)的相关文章

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

由于本人学习Android也挺长时间了,一直把日记记在evernote里面,由于刚离职比较空闲就打算把evernote里的日志一遍遍整理出来发布到网上分享. Android端的代码: 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&quo

Android笔记之adb命令解析1

由于本人学习Android也挺长时间了,一直把日记记在evernote里面,由于刚离职比较空闲就打算把evernote里的日志一遍遍整理出来发布到网上分享. 要在cmd命令中直接使用adb,需要配置环境变量:目录XXX\sdk\platform-tools 查看adb -help 帮助命令打印出以下内容: Android Debug Bridge version 1.0.31 <!--安卓调试桥接器 版本号:1.0.31--> -a - directs adb to listen on all

Android开发中adb命令

作用: adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge就是调试桥的作用,用于在调试时连接本机和手机设备. 借助这个工具,我们可以管理设备或手机模拟器的状态. 还可以进行以下的操作:  1.快速更新设备或手机模拟器中的代码,如应用或Android 系统升级: 2.在设备上运行shell命令: 3.管理设备或手机模拟器上的预定端口: 4.在设备或手机模拟器上复制或粘贴文件: 详解: 没开启一个Android 模拟器, 就相当于开启了一个新的单独系统,这个系统

Android开发执行adb 命令行命令

1.在Android开发中调用adb命令进行应用安装,将应用安装到 /system/app目录下 /** * install the app in use adb command,this style is silent * */ private void adbInstallTheAPP(){ //adb push core code String command = "cp" + "the android apk file path" + "/syst

Android 常用的adb命令

1.安装APK(如果加 -r 参数,保留已设定数据,重新安装filename.apk) adb install xxx.apk adb install -r xxx.apk 2.卸载APK(如果加 -k 参数,为卸载软件但是保留配置和缓存文件) adb uninstall xxx.apk adb uninstall -k xxx.apk 3.查看当前所有连接的模拟器设备 adb devices 4.对某一模拟器操作 adb -s 模拟器编号 命令 5.导入文件到模拟器 (该命令也可以实现安装AP

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

豌豆荚.360手机管家等软件可以获取Android设备名称,显示在界面上,如下图: 我们自己如何来获取设备名称 呢?答案如下: 在命令行中输入"adb shell"进入shell之后,再输入"cat /system/build.prop"其实,设备信息,主要是存放在"/system/build.prop"文件,通过"cat"命令就可以查看了. 下面附上ADB命令的详细介绍 adb 介绍 adb的全称为Android Debug

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

Android的SDK中提供了很多有用的工具,在开发过程中如果能熟练使用这些工具,会让我们的开发事半功倍.adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge,用于在调试时连接本机和手机设备. adb有很多命令,本文只列出一些常用的命令,要查看所有的adb命令和用法, 可以在命令行中输入adb进行查看. 这些命令都是根据本人在开发过程中的使用进行总结的,以后如果发现其他常用的和有用的命令,会加入本文中.下面是一些常用的命令和用法. 一    adb常用命令 a

Android测试 常用adb命令总结

针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中. Android Debug Bridge adb 其实就是 Android Debug Bridge, Android 调试桥的缩写,adb 是一个 C/S 架构的命令行工具,主要由 3 部分组成: 运行在 PC 端的 Client : 可以通过它对 Android 应用进行安装.卸载及调试 Eclips

Android Studio使用adb命令连接平板

有需要使用adb命令连接调试平板的同学可以参考下(下面是android官方文档,有点老). http://donandroid.com/how-to-install-adb-interface-drivers-windows-7-xp-vista-623 1.android studio 里安装google usb driver,安装完重启Android studio即可. 2.进入电脑设备管理器查看是否安装成功:截图显示是已经安装ok的.  3.找到sdk安装目录,在Android studi