python for minicap
a、查看CPU架构(adb shell getprop ro.product.cpu.abi)及查看android版本level(adb shell getprop ro.build.version.sdk)
b、根据获取的CPU和版本信息,将适合设备的可执行文件和.so文件push到手机的/data/local/tmp目录下,或者在STF框架的源码下找到vendor/minicap文件夹下 (adb push '文件路径' /data/local/tmp)
c、adb shell进入到目录下chmod 777 minicap
d、测试一下minicap是否可用:(-P后面跟的参数为你屏幕的尺寸)
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t
为了实现socket服务通信,必须将本地端口映射到minicap工具上 adb forward tcp:1717 localabstract:minicap
启动一个socket服务 adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0
banner模块:这一部分的信息只在连接后,只发送一次,是一些汇总信息,一般为24个16进制字符,每一个字符都表示不同的信息:
位置 信息
0 版本
1 该Banner信息的长度,方便循环使用
2,3,4,5 相加得到进程id号
6,7,8,9 累加得到设备真实宽度
10,11,12,13 累加得到设备真实高度
14,15,16,17 累加得到设备的虚拟宽度
18,19,20,21 累加得到设备的虚拟高度
22 设备的方向
23 设备信息获取策略
携带图片大小信息和图片二进制信息模块:得到上面的Banner部分处理完成后,以后不会再发送Banner信息,后续只会发送图片相关的信息。那么接下来就接受图片信息了,第一个过来的图片信息的前4个字符不是图片的二进制信息,而是携带着图片大小的信息,我们需要累加得到图片大小。这一部分的信息除去前四个字符,其他信息也是图片的实际二进制信息,比如我们接受到的信息长度为n,那么4~(n-4)部分是图片的信息,需要保存下来。
只携带图片二进制信息模块:每一个变化的界面都会有上面的[携带图片大小信息和图片二进制信息模块],当得到大小后,或许发送过来的数据都是要组装成图片的二进制信息,直到当前屏幕的数据发送完成。
1、创建Minicap类,定义一个connect()函数,使用socket模块和手机端服务器建立连接:
def connect(self):
try:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print(e)
sys.exit(1)
self.socket.connect((self.host, self.port))
2、创建app应用以及socketio对象,用于实现前后端的实时通信:
app = Flask(__name__)
socketio = SocketIO(app)
3、创建HTML页面,通过app路由将页面绑定到应用上:
@app.route('/')
def index():
return render_template('index.html',base64=base64)
4、创建响事件函数,当客户端发出连接时,该函数执行,运行与手机的socket通信,获取数据并发送到客户端:
@socketio.on('my event')
def handle(res):
...
emit('server_response', {'data': data})
5、客户端收到服务器并解析服务器发送的数据,生成并显示图片: