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

时间:2021-12-12 10:12:37

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

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

界面效果如下:

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

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联系我,非常感谢。