算了下时间居然有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