Coder Social home page Coder Social logo

openatx / atxserver2 Goto Github PK

View Code? Open in Web Editor NEW
1.3K 51.0 415.0 1.63 MB

Smart Phone Management. Reimplement of atx-server with Python

License: MIT License

Python 41.67% HTML 58.00% JavaScript 0.22% Dockerfile 0.07% Shell 0.04%
atx platform smartphone

atxserver2's Introduction

atxserver2

移动设备管理平台(支持Android和iOS), 欢迎加入QQ群交流

image-20190619180012756

img

部署方案1 (docker-compose方式)

代码Clone到本地

接下来切换到代码目录,只需要再执行一条命令即可。

docker-compose up

部署方案2 (手动部署)

Step 1

先准备好一个rethinkdb服务器(推荐部署到Linux上) 具体方法查看RethinkDB安装文档

Step 2

安装并启动Server,这里需要Python3.6以上版本

先将代码clone到本地,使用下面的方法安装依赖

pip3 install -r requirements.txt

最简单的启动方法 (默认连接的rethinkdb地址 localhost:28015)

# 启动方式,这也是最简单的启动方法
python3 main.py

# 指定认证方式
python3 main.py --auth simple # 默认是一个非常simple的认证,输入邮箱就可以
python3 main.py --auth openid # 网易内部使用
python3 main.py --auth github # github 认证, 需要在 `settings.py` 里面配置 `client_id` 和 `client_secret` 相关信息
# 其他的认证方式还有待添加,非常欢迎PR

# 设置监听端口
python3 main.py --port 4000 # 默认监听的就是这个地址

# 默认支持运行在Nginx下,支持 X-Real-Ip/X-Forwarded-For
# 如果不需要可以通过 --no-xheaders 关闭该功能

通过环境变量的修改,可以更改RethinkDB的连接地址

# Linux环境
# the bellow is default value
export RDB_HOST=localhost
export RDB_PORT=28015
export RDB_USER=admin
export RDB_PASSWD=
export RDB_DBNAME=atxserver2

python3 main.py

启动之后,浏览器打开 http://localhost:4000,完成认证之后就可以顺利的看到设备列表页了。不过目前还是空的,什么都没有。

image

Step 3: Android设备接入

接下来,进行安卓设备接入。这时需要用到另外一个项目 atxserver2-android-provider 这个项目运行需要Python3.6+和NodeJS

如果你用的是Linux系统,推荐使用Docker部署,其他平台需要用源码部署,具体请参考文档 atxserver2-android-provider

SERVER_URL="http://10.0.0.1:4000" # 这个修改成自己的atxserver2地址
IMAGE="codeskyblue/atxserver2-android-provider"
docker pull $IMAGE
docker run --rm --privileged -v /dev/bus/usb:/dev/bus/usb --net host \
    ${IMAGE} python main.py --server ${SERVER_URL}

该镜像会把所有必要的资源 (atx-uiautomator.apk, minicap, minitouch, atx-agent) 全部推送到手机上。 一切就绪后,你可以进行远程真机的操作了。

atxserver2-remotecontrol

Step 3: iOS设备接入

参考项目介绍 atxserver2-ios-provider

私有设备接入(Beta)

目前只实现了Android

atxserver2-android-provider启动的时候可以通过传递参数 --owner=xingxing 声明该provider所有连接的设备属于xingxing这个组所有,或者[email protected] 声明为panpan个人所有

通过点击导航栏的下拉菜单,点击用户信息,在这个标签页下可以获取个人的token,也可以进行组的管理。(目前还没有组成员管理的功能)

管理员功能

默认第一个登录的用户会成为管理员

管理员有哪些特权呢?

  1. 可以释放他人正在使用的设备。(按住ALT,然后双击正在使用按钮)
  2. 使用他人的身份占用设备(参考API文档)
  3. 获取设备的source信息(参考API文档)
  4. 将他人设置为管理员,导航栏可以看到后台管理链接
  5. 有权修改资产编号字段

操作指南

鼠标操作

  • Right-Click: BACK
  • Middle-Click: HOME

Developers

目前采用tornado+rethinkdb

目录结构参考了django, 代码绝大多数都用到的async的功能

|-- static  静态目录
|-- templates 前端界面
|-- web  网页代码
      |-- urls.py 路由整合文件
      |-- settings.py 配置文件
      |-- database.py 数据库操作相关
      |-- utils.py 常用配置
      |-- views 每个界面的逻辑
        |-- slave.py 与atxslave通信用
        |-- device.py 设备相关路由
        |-- base.py 基于RequestHandler的基类

接口

详情点击 接口REST API

Examples:

Thanks

微信打赏

以前我一直对打赏这种行为不屑一顾,但真正的收到社区成员千翻百计找到我的打赏码打赏的时候还是很开心,感觉工作得到的人认可,很开心。我也有时候会打赏别人,让激动的心情有了发泄的出口。 请不要打赏太多,知道了你们的心意就好了。我将会用收到的money通通拿来去楼下咖啡店买咖啡,买饮料。^_^

wechat

LICENSE

MIT

atxserver2's People

Contributors

codeskyblue avatar hboprc avatar trevorwang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

atxserver2's Issues

跨网段访问设备无法访问正确的设备ip

ATXServer2访问设备与服务器不在同一局域网内通过路由器转发进行访问,控制设备时,设备ip为服务器局域网ip,WEB上,设备无法显示屏幕.
ps:子路由器设置了DMZ,服务器所在网段192.168.31.1,设备服务器所在网段192.168.31.1,访问手机设备所在网段192.168.2.1,手机设备页面显示ip为192.168.31.1

设备屏幕同步中断,provider中提示apk安装失败

连了 6 台设备,其中有两天出现了中断的问题;重启也不会安装apk,手机安全相关设置都关闭了
provider:

[D 190717 10:21:33 device:127] [7DAMTS79FIMVUKJR] install vendor/app-uiautomator.apk
Traceback (most recent call last):
  File "/home/youkia/git/atxserver2-android-provider/device.py", line 128, in _install_apk
    self._device.install(path)
  File "/usr/local/python3/lib/python3.7/site-packages/adbutils/mixin.py", line 126, in install
    self.install_remote(dst, clean=True)
  File "/usr/local/python3/lib/python3.7/site-packages/adbutils/mixin.py", line 144, in install_remote
    raise AdbInstallError(output)
adbutils.errors.AdbInstallError: 	pkg: /data/local/tmp/tmp-1563330093231.apk
Failure [INSTALL_FAILED_OLDER_SDK]
[W 190717 10:21:34 device:131] [7DAMTS79FIMVUKJR] Install apk vendor/app-uiautomator.apk error 	pkg: /data/local/tmp/tmp-1563330093231.apk
    Failure [INSTALL_FAILED_OLDER_SDK]
None :  

环境:
CentOS 7.4
Python 3.7.3
设备:
魅族 魅蓝 S6
atxserver2 和 provider 都是python3 手动启动的

si min require

  • 跨网段设备连接
  • 显示设备的区域
  • 只显示连接成功的设备
  • 保留屏幕旋转的功能

Version in ".\docker-compose.yml" is unsupported.

�[31mERROR�[0m: Version in ".\docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a version of "2" (or "2.0") and place your service definitions under the services key, or omit the version key and place your service definitions at the root of the file to use version 1.

安卓(android9)设备初始化失败

android provider日志:

[D 190806 06:29:26 device:100] [9af1acf9] use atx-agent: atx-agent-armv7 [E 190806 06:29:31 main:258] Unknown error: [Errno 104] Connection reset by peer Traceback (most recent call last): File "main.py", line 241, in device_watch await device.init() File "/app/device.py", line 59, in init self._init_binaries() File "/app/device.py", line 102, in _init_binaries zipfile_path="vendor/atx-agent-latest.zip") File "/app/device.py", line 112, in _push_stf self._device.sync.push(f, dest, mode) File "/usr/local/lib/python3.7/site-packages/adbutils/__init__.py", line 519, in push c.conn.send(b"DATA" + struct.pack("<I", len(chunk))) ConnectionResetError: [Errno 104] Connection reset by peer [D 190806 06:29:31 main:228] DeviceEvent(present=False, serial='9af1acf9', status='device') [D 190806 06:29:31 heartbeat:93] websocket send: {'udid': '9af1acf9', 'provider': None, 'command': 'update', 'platform': 'android'}
手机未安装上atx,whatsInput等应用

web端点击停用设备后会回到主界面问题

再web端点击停用设备会回到主界面,而我不需要它回到主界面,因为我的脚本可能还在运行,这样会打乱我的脚本流程,所有把回到主界面的操作注释掉了(见下图)
image
然后再windows重新启动atxserver2运行没问题,也很符合我我需求

然后把同样操作再liunx上一样操作之后,结果却是没有效果,点击停用设备还是会回到主界面
操作步骤如下---liunx
1、注释掉 await adb.shell(self._serial, "input keyevent HOME")
2、docker-compose up -d --force-recreate
3、docker-compose build
4、重新启动atxserver2
希望大佬可以帮忙看下,我检查了项目代码,可是没有找到其他可能会导致回到主界面的操作,
拜谢

ADB远程连接报错,未开启防火墙

使用adb connect 10.168.143.16:20014远程调试时,报

unable to connect to 10.168.143.16:20014: cannot connect to 10.168.143.16:20014: 由于目标计算机积极拒绝,无法连接。 (1 0061)

直连手机ip时可以连接,如:
通过adb tcpip 5555后,adb connect phoneip:5555,正常。

image
image

连接不上minicap和minitouch

按照步骤配置好之后,打开设备页面,一直提示我无法链接到minicap和minitouch
image

手机和电脑在一个wifi下,电脑的网址是192.169.45.92,手机中atx软件显示的ip是192.169.45.38

还请大佬帮忙看看,我需要怎么处理一下

外部键盘无法使用

目前只能调用手机内部输入功能,在电脑上直接打字无法输入

注:在手机内部输入效率太低

怎样在本地,使用远程设备的音视频?

手机设备A,在远程机B中通过链接打开,怎样使远程机的摄像头,替换为设备A的摄像头和麦克风,说的有点乱,但是你懂得吧><
公司做视频直播的,所以有这个需求

输入框Input disabled

atxserver2显示输入框Input disabled,请问该如何解决
修复输入法吗?点击修复输入法后无反应。

atxserver2重启是出现 provider heartbeat无法重连问题

Traceback (most recent call last):                             
  File "/usr/local/lib/python3.7/site-packages/tornado/ioloop.py", line 605, in _run_callback                                  
    ret = callback()           
  File "/usr/local/lib/python3.7/site-packages/tornado/stack_context.py", line 277, in null_wrapper                            
    return fn(*args, **kwargs) 
  File "/usr/local/lib/python3.7/site-packages/tornado/ioloop.py", line 626, in _discard_future_result                         
    future.result()            
  File "/usr/local/lib/python3.7/site-packages/tornado/concurrent.py", line 238, in result                                     
    raise_exc_info(self._exc_info)                             
  File "<string>", line 4, in raise_exc_info                   
  File "/usr/local/lib/python3.7/site-packages/tornado/gen.py", line 1069, in run                                              
    yielded = self.gen.send(value)                             
  File "<string>", line 6, in _wrap_awaitable                  
  File "/Users/qard3/Deployments/atxserver2-ios-provider/heartbeat.py", line 77, in _drain_queue                               
    await self._ws.write_message(v)                            
  File "/Users/qard3/Deployments/atxserver2-ios-provider/heartbeat.py", line 37, in write_message                              
    return await super().write_message(message)                
TypeError: object NoneType can't be used in 'await' expression 

CentOS7 部署失败docker-compose up

[root@localhost atxserver2]# docker-compose up
Starting atxserver2_rethinkdb_1 ... done
Starting atxserver2_web_1 ... done
Attaching to atxserver2_rethinkdb_1, atxserver2_web_1
rethinkdb_1 | Could not create directory 'rethinkdb_data': Permission denied
atxserver2_rethinkdb_1 exited with code 1
--怎么处理?

atxserver2连接手机不显示手机界面

atxserver2安装完成,连接手机后,不显示手机的界面,手机型号是oneplus A6010 ,H2OS版本是10.0.4,用的chrome浏览器,界面上的所有按键点击都是可以有效操作手机的,就是无法看到手机的实时状态,应该显示手机界面的画面一直都是灰色的,这个该怎么办啊

释放过的设备,重新连接以后,截图时地址还保留之前的ip

1.某个设备在atx2上的远程地址为172.16.6.82:20197,
2.将其释放
3.重新连接该设备,此时该设备的远程地址为172.16.6.82:20199,
4.点击网页上的截图按钮
预期结果:可以正常截图
实际结果:报错,提示找不到172.16.6.82:20197的路径。

在设备被释放重新连接,更换ip以后,截图这块的地址未更新。

设备屏幕同步中断

所有步骤都完成了,看起来也没什么问题,设备都已经在线,但没有屏幕显示
提示“设备屏幕同步中断“
请问如何调试?

使用docker无法部署?

在win和lunix 直接docker-compose up
都会出现无法部署
windows是找不到数据库

rethinkdb_1 | error: Error in src/serializer/log/log_serializer.cc at line 81:
rethinkdb_1 | error: Could not rename database file /data/rethinkdb_data/tmp/metadata.create to permanent location /data/rethinkdb_data/metadata (Device or resource busy)
rethinkdb_1 | error: Backtrace:
rethinkdb_1 | error: Sat Mar 7 12:47:36 2020
lunix是

ERROR: for atxserver2_web_1 Cannot start service web: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: "scripts/wait-for-db.sh": permission denied": unknown

ERROR: for web Cannot start service web: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: "scripts/wait-for-db.sh": permission denied": unknown

Alt Text

CentOS7安装时,OCI runtime create failed,permission denied 错误

在安装的时候出现:OCI runtime create failed,permission denied 错误

[root@myserver atxserver2]# docker-compose up
atxserver2_rethinkdb_1 is up-to-date
Starting atxserver2_web_1 ... error

ERROR: for atxserver2_web_1 Cannot start service web: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: "scripts/wait-for-db.sh": permission denied": unknown

ERROR: for web Cannot start service web: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: "scripts/wait-for-db.sh": permission denied": unknown
ERROR: Encountered errors while bringing up the project.

[root@myserver atxserver2]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.3.1611 (Core)
Release: 7.3.1611
Codename: Core

环境问题

atxserver2的tornado包版本与项目 atxserver2-android-provider的tornado版本不一样,他们需要分开环境吗

git lfs pull 拉取不到数据,一直fetch fail

开发计划

阶段0(准备阶段)

  • 实时输入法
  • 网页手机终端
  • 滚轮滑动屏幕
  • 鼠标右键返回,中键HOME, 双击唤醒屏幕
  • 自定义快捷命令

阶段1(基本功能)

  • 粗略的API文档
  • 应用在线安装(这里为了降低实现难度,直接调用adb和ideviceinstaller安装)
  • 支持USB设备的接入
  • 设备长时间占用不使用,自动释放设备
  • 设备过长时间接入没有断电,自动提示拔掉设备(防止设备鼓包)

阶段2(完成后可逐步替换掉现有的iOS设备管理)

  • 支持iOS设备的简单控制和在线安装
  • 显示每个设备的占用率(天、周、月)
  • REST API文档(设备占用,获取adb connect地址,设备释放)

阶段3(针对游戏用户)

  • 支持手机控制手机(方便游戏控制)
  • 多机同时控制的功能
  • 可调节显示分辨率、每秒传输图片数
  • 尝试支持下h264
  • 提供设备的预约功能(当设备空闲是占用10分钟,并使用及时通信工具通知用户)

阶段4

  • 支持私有部署(非本组用户无法查看该设备)
  • 支持WIFI与USB设备同时接入
  • 跨网段设备接入(可以远程调试用户手机复现疑难问题)
  • 待补充

设备列表点击“停用”,一直显示“释放中”

说明:
server:centos(docker 部署)
android-provider:win7(手工部署)
重现步骤:
设备连接上后,点击“停用”,一直显示“释放中”
备注:

  • 服务器日志截图:
    [I 190515 09:30:22 web:2246] 200 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 12.02ms
    [I 190515 09:30:23 web:2246] 200 DELETE /api/v1/user/devices/6a5cde83 (192.168.255.254) 19.27ms
    [I 190515 09:30:28 web:2246] 200 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 12.02ms
    [I 190515 09:30:35 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 11.51ms
    [I 190515 09:30:41 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 12.04ms
    [E 190515 09:30:43 ioloop:763] Exception in callback functools.partial(<bound method IOLoop._discard_future_result of <tornado.platform.asyncio.AsyncIOMainLoop object at 0x7f89c99237f0>>, <Task finished coro=<D.release..cold_device() done, defined at /app/web/views/device.py:466> exception=HTTP 599: Timeout while connecting>)
    Traceback (most recent call last):
    File "/usr/local/lib/python3.6/site-packages/tornado/ioloop.py", line 743, in _run_callback
    ret = callback()
    File "/usr/local/lib/python3.6/site-packages/tornado/ioloop.py", line 767, in _discard_future_result
    future.result()
    File "/app/web/views/device.py", line 476, in cold_device
    await http_client.fetch(request)
    tornado.simple_httpclient.HTTPTimeoutError: Timeout while connecting
    [I 190515 09:30:47 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 11.35ms
    [I 190515 09:30:52 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 12.21ms
    [I 190515 09:30:58 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 11.21ms
    7a1461f20630[I 190515 09:31:04 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 11.20ms
    7a1461f20630[I 190515 09:31:11 web:2246] 304 GET /api/v1/user/devices/6a5cde83 (192.168.255.254) 11.42ms

  • 现象截图:

图片

ADB不能远程连接的问题

npm下载安装一个adbkit,找到node_modules文件,把node_modules把放到atxserver2-android-provider根目录就好了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.