ATX 学习 (三)-atxserver2-android-provider

服务端代码

代码clone到本地,搭好相应环境(怎么搭的这里就不介绍了,很好搭的哈)

一般库首先查看main.py文件,debug模式开始运行

一开始就是没接触过的tornado.ioloop,有点偏底层,头疼,还是加油干吧

为了理解的更深入些,先了解下ioloop的一些知识吧,在这之前先了解点预备知识

一、epoll

ioloop 的实现基于epoll,那么什么是epoll?epoll是Linux内核为处理大批量文件描述
符而作了改进的 poll。那什么是poll呢?首先,我们了解一下, socket 通信时的服务端,当它接受( accept )一个连接并建立通信后( connection )就进行通信,而此时我们并不知道连接的客户端有没有信息发完。 这时候有两种选择:
  •     一直在这里等着直到收发数据结束;
    
  •     每隔一定时间来看看这里有没有数据;
    

    第二种办法要比第一种好一些,多个连接可以统一在一定时间内轮流看一遍里面有没
    有数据要读写,看上去可以处理多个连接了,这个方式就是 poll / select 的解决方案。 看起来似乎解决了问题,但实际上,随着连接越来越多,轮询所花费的
    时间将越来越长,而服务器连接的 socket大多不是活跃的,所以轮询所花费的大部分
    时间将是无用的。为了解决这个问题, epoll 被创造出来,它的概念和 poll 类似,不过每次轮询时,他只会把有数据活跃的socket挑出来轮询,这样在有大量连接时轮询就节省了大量时间。

而对于epoll的操作,其实也很简单,只要 4 个 API 就可以完全操作它。

epoll_create

用来创建一个 epoll 描述符( 就是创建了一个 epoll )

epoll_ctl

操作 epoll 中的 event;可用参数有:
参数含义
EPOLL_CTL_ADD添加一个新的epoll事件
EPOLL_CTL_DEL删除一个epoll事件
EPOLL_CTL_MOD改变一个事件的监听方式

而事件的监听方式有七种,而我们只需要关心其中的三种:

宏定义含义
EPOLLIN缓冲区满,有数据可读
EPOLLOUT缓冲区空,可写数据
EPOLLERR发生错误

epoll_wait

就是让 epoll 开始工作,里面有个参数 timeout,当设置为非 0 正整数时,会监听(阻塞) timeout 秒;设置为 0 时立即返回,设置为 -1 时一直监听。

在监听时有数据活跃的连接时其返回活跃的文件句柄列表(此处为 socket 文件句柄)

close

关闭 epoll

现在简单了解了 epoll 后,我们就可以来了解ioloop代码

二 ioloop.py文件

ioloop是tornado的关键,是他的最底层。
ioloop就是对I/O多路复用的封装,它实现了一个单例,将这个单例保存在IOLoop._instance中
主要有两个要点。一个是configurable机制,一个就是epoll循环

2.1 创建IOLoop实例

来看IOLoop,它的父类是Configurable类,也就是说:IOLoop是一个直属配置子类
class IOLoop(Configurable):
......
这里就要结合Configurable类进行讲解:
Configurable中的new方法
1.首先实例化一个该直属配置子类的'执行类对象',也就是调用该类的configurable_default方法并返回赋值给impl:

2.2 epoll

从start()开始,啥都不说,上代码
![](/uploads/photo/2019/8e8c8230-e86b-4ca6-bb80-8a0cfa0015b0.png!large)

asyncio.get_event_loop()方法,在一个coroutine内部获取loop他不需要将loop作为参数传递给协程函数

注意get_event_loop()方法仅在同样的线程中生效,如果在一个新线程中,应该用new_event_loop()来获取新的loop,并通过set_event_loop(loop)来将其设为该线程下的loop。
(暂时深入到这里吧,跑偏题了,尴尬)
继续
main.py文件中运行开始  IOLoop.current().run_sync(async_main)是干什么的

IOLoop中的run_sync方法中调用的函数添加参数,这个好理解。
(这里暂时不在深入,怕又跑偏了,记录yi有时间的话继续)

async(协程的语法)

作者很给力,不断的使用新的东西,这是python3.5后为asyncio提供了async和await的新语法
想要了解协程的可以看下这篇,通过实例来了解更好些https://zhuanlan.zhihu.com/p/25228075
注意:通过async关键字定义一个协程(coroutine),协程也是一种对象。协程不能直接运行,需要把协程加入到事件循环(loop),由后者在适当的时候调用协程。
定义异步函数async def async_main()

三 继续看代码吧

# 定义异步函数
async def async_main():
        # 建立解析对象ArgumentParser   formatter_class: 重置 help 信息输出的格式
        parser = argparse.ArgumentParser(
            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        # 为应用程序添加参数选项  带-的为可选参数,default默认参数值
        parser.add_argument(
            '-s', '--server', default='localhost:4000', help='server address')
        # action参数的处理方法
        parser.add_argument(
            "--allow-remote", action="store_true", help="allow remote connect device")
        parser.add_argument(
            '-t', '--test', action="store_true", help="run test code")
        # type参数的数据类型
        parser.add_argument(
            '-p', '--port', type=int, default=3500, help='listen port')
        parser.add_argument("--owner", type=str, help="provider owner email")
        parser.add_argument(
            "--owner-file", type=argparse.FileType("r"), help="provider owner email from file")

3.1调用parse_args()

来解析ArgumentParser对象中保存的命令行参数:将命令行参数解析成相应的数据类型并采取相应的动作,它返回一个Namespace对象。

    args = parser.parse_args()

3.2 heartbeat_connect 等待连接

    这里直接运行会出现


什么原因,应该很容易看到,需要连接localhost:4000,没有起服务,好吧,先运行rethinkdb数据库,然后启动atx-server2

好了,然后运行

3.3 进入make_app()

使用tornado.web.Application进行路由控制

3.4 heartbeat_connect去连接设备,这里可以看到过程中基本都是异步方法aysc,运行到_connect这个方法时:

  async def _connect(self):
        ws = await websocket.websocket_connect(self._server_ws_url)
        ws.__class__ = SafeWebSocket

        await ws.write_message({
            "command": "handshake",
            "name": self._name,
            "owner": self._owner,
            "secret": self._secret,
            "url": self._provider_url,
            "priority": self._priority,  # the large the importanter
        })
       发现通过websockt 服务来连接 

3.5 hbc.open()

      IOLoop.current().spawn_callback(coroutine_visit) #开始调用协程

3.6 device_watch()

  開始使用adb進行監控 127.0.0.1:5037 这里就不再说name多了
  _init_binaries() 这里刚开始获取了设备信息]  [设备名] [sdk: 28, abi: arm64-v8a, abis: ['arm64-v8a', 'armeabi-v7a', 'armeabi']
  根据设备选择要使用的atx 代理use atx-agent: atx-agent-armv7

3.7 _install_apk()安装whatsInput 和ATX这里只看这两个,另一个属于测试包

这里手机初始化准备好后会向前端页面发送
websocket send: {‘udid’: ‘2d869e6’, ‘platform’: ‘android’, ‘colding’: False, ‘provider’: {‘atxAgentAddress’: ‘127.0.0.1:20001’, ‘remoteConnectAddress’: ‘Ip:20004’,
‘whatsInputAddress’: ‘127.0.0.1:20003’}, ‘properties’: {‘serial’: ‘设备名’, ‘brand’: ‘Xiaomi’, ‘version’: ‘9’, ‘model’: ‘MI 9’, ‘name’: ‘MI 9’}, ‘command’: ‘update’}

暂时写到这里吧,明天有时间看下atx-server2的部分代码,觉得结合着看更方便去了解

目前还在学习中,希望会对大家有所帮助,觉得不错,就点赞支持一下。 另外,有什么错误的地方需要大家指正。谢谢!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ATX规范-版本2.2是一款针对电源和主板的技术标准。它定义了电源和主板之间的接口标准。ATX规范-版本2.2可以保证电源系统的稳定性和可靠性,同时也可以为电脑主板提供更多的电流和功率支持。此外,ATX规范-版本2.2还提供了一些其他特性,如睡眠模式、电源管理和电源自深度睡眠(S5)模式等等。 ATX规范-版本2.2的主要特点是它支持一个较高的功率输出,可以为主板和电脑提供足够的电流和功率。此外,在ATX规范-版本2.2中,主板和电源之间的接口标准更加完善,可以提高主板和电源之间的匹配性和互换性。此外,ATX规范-版本2.2保证了主机的节能性,通过对电源系统的管理和控制,可以让电脑进入睡眠模式,从而达到节能的目的。 ATX规范-版本2.2在电源的设计上对于节能和环保方面也有一定的贡献。它通过电源管理和电源自深度睡眠(S5)模式的应用,达到了更加节能的效果。同时,ATX规范-版本2.2采用了一些新的技术,如电源实现冷现场开机、使用直流电源实现电能回收等等,这些新技术都可以提高电源的能效和回收效率,减少了环境对于电脑的影响。 总的来说,ATX规范-版本2.2作为一款先进的电源和主板技术规范,为主板和电源的性能提升和节能环保做出了积极的贡献。同时,它也为电脑行业提供了更为可靠和稳定的硬件基础,为电脑的应用提供了更加良好的条件,也为电脑用户提供了更加高效和便利的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值