现在的位置: 首页 > 综合 > 正文

Anroid 手机助手 详细解析 概述(四)

2017年11月10日 ⁄ 综合 ⁄ 共 1748字 ⁄ 字号 评论关闭

算了下时间居然有20天没来更新了,人变懒了,不过也没时间了,今天抽点时间上点干货,觉得有用的就收下吧。

有很多人问我如何和手机建立连接(USB数据线连接,至于wifi 那是以后讨论的),和手机通信最后还是通过socket,只是这中间借助了adb 的forward。要建立socket 连接必须要有ip地址和端口号。搞过socket 编程的人都知道服务端会监听某一个端口,直到有连接请求的时候才会产生一个socket,然后通过这个socket和客户端通信,所以这里就有两个问题

1)  手机的IP地址和端口号到底是多少

2)  服务端在哪里,手机如何接收PC 端发送的socket 连接。

 

首先第一个问题

再查看手机信息之前谁也不知道手机的IP 地址多少,端口号这个更加不知道用哪个了。神奇的ADB 给我提供了解决办法。ADB 里面有个forward 命令,这个命令的意思网上有很多解释。命令格式如下:

adb -s "xxxx" forward tcp: 10000 tcp: 2000

上面命令的10000,和2000是两个端口号,意思就是说所有发往本地计算机(127.0.0.1)10000端口号的消息都会被adb 重定向到手机的2000端口号,这里的10000和2000 是自己定的,随便定就可以了,但是不能和现有的冲突。所以第一个问题也就解决了,要连接上手机必须先调用重定向,然后再调用socket 函数 connect和服务端建立连接。步骤如下

1) adb -s "xxxx" forward tcp: 10000 tcp: 2000

2) 调用socket 函数,关键是 sockAddr 的初始化

SOCKADDR_IN sockAddr;
 memset(&sockAddr,0,sizeof(sockAddr));

 sockAddr.sin_family = AF_INET;
 sockAddr.sin_addr.s_addr = inet_addr(L"127.0.0.1");
 sockAddr.sin_port = htons(10000);

int r = ::connect( m_socket, (sockaddr*)&sockAddr, sizeof(sockAddr) );

 

至于第二个问题那就需要手机端的配合了,在上面调用了connect 函数,那就肯定得有个地方一直在accept,那这个地方在哪里?这个就需要你自己写一个APK 程序了,安装到手机上,然后监听端口,接收连接。要接收连接,就需要把socket 绑定到一个端口上,这回你肯定知道了这个要绑定的端口就是上面 forward 的2000端口。

 

 

最后来整理一下这个流程,下面是结合我自己的代码的一个流程

1) 使用adb 判断是否有设备,命令如下

      adb devices

 

2)  如果存在设备并且是device状态(这里不考虑驱动的问题,有关驱动的看上一节),则判断手机上是否已经安装了自己的APK 程序。如果没有安装则安装一个自己的APK。

       adb -s "xxx" install "xxxx.apk"

3)  安装成功之后 重定向端口号,也许你可能需要重定向多个不同端口号,那就多调用几次forward,传入不同的参数就可以。      

   adb -s "xxxx" forward tcp: 10000 tcp: 2000

 

 

4) 启动APK 的一个服务,或者APK 的activity都可以,目的就是要让手机端启动线程来接受PC 端发起的连接请求。可以参数adb 的命令

adb -s "xxx" shell am start

 

 

5)   和手机端进行socket 通信。

SOCKADDR_IN sockAddr;
 memset(&sockAddr,0,sizeof(sockAddr));

 sockAddr.sin_family = AF_INET;
 sockAddr.sin_addr.s_addr = inet_addr(L"127.0.0.1");
 sockAddr.sin_port = htons(10000);

int r = ::connect( m_socket, (sockaddr*)&sockAddr, sizeof(sockAddr) );

 

 

转让Android,IOS 手机助手各种技术资料,文档,以及源码,有需要的可以联系我QQ: 2506314894

 

 

 

 

 

抱歉!评论已关闭.