放最近项目中用到ADB工具,在C#程序中获取手台的LTE消息,并进行解析处理。下面说一下如何通过C#控制ADB工具,从手台获取LTE消息。
首先通过进程类Process设置进程信息,代码如下:
然后获取ADB进程
adb = processHelper.GetProcess(AppSettings.GetValue("adb_file")); adb.StartInfo.Arguments = "shell su \"cat /dev/ttyUSB-21\"; cat /dev/ttyUSB-21" ;上述代码中adb_file是adb.exe文件的绝对路径。
获取进程后启动ADB进程并设置数据重定向点,开始异步读取
if (adb.Start()) { try { adb.OutputDataReceived += OutputDataOnReceived; adb.ErrorDataReceived += OutputErrorDataOnReceived; adb.BeginOutputReadLine(); } catch (Exception e) { log.Error(e.Message); } } 然后在OutputDataOnReceived函数中接收并处理数据。
有几点需要注意:
1. 进入ADB shell之后就可以直接同手台进行互通,这里给手台发送消息的格式为 shell + 命令,比如查看当前目录的命令为:shell pwd;如果需要发送多条命令,则可以使用字符‘&’或者‘;’,比如查看当前目录并显示当前目录下的文件命令为:shell pwd & ls或者shell pwd; ls。有部分命令需要特殊权限,此时需要先获取命令权限,然后再执行,如上述例子中所示,命令为:shell su \"cat /dev/ttyUSB-21\"; cat /dev/ttyUSB-21
2. 我重定向了输入之后,使用adb.StandardInput.Write()命令无效,不了能写入命令,原因没有查清楚;如果遇到这种情况,请自行查阅,也烦请告知鄙人解决方法。
3. 使用异步读取时,不能与同步操作同时使用,原因见此
使用Process类控制进程的启动和结束,以及向启动的进程写入命令、参数或者从进程中读取输出操作,会时常出现这样那样的问题,有些问题是控制程序本身的问题,许多时候也跟我们要控制的进程有关,所以遇到的问题形形色色,有时候只能另辟他径。