将 Android 手机作为稳定的网络服务器运行(用于 Python CGI 脚本)
Posted
技术标签:
【中文标题】将 Android 手机作为稳定的网络服务器运行(用于 Python CGI 脚本)【英文标题】:Running an Android phone as a stable webserver (for a Python CGI script) 【发布时间】:2013-09-19 11:49:59 【问题描述】:我是 android 新手。我有一个 Python 程序,它既是 CGI 脚本,也是小型数据库的基于 SMS 的交互系统。这是一个由草根组织运行的需求极低的系统(少数用户)。但它需要稳定性,即没有随机崩溃或停机时间。由于各种原因,在 Android 手机上运行它可以解决现有设置的一些问题。但是,在深入研究之前,我想检查一下这种系统的可行性。它必须:
运行可以执行 CGI 脚本(普通 CGI)的 Web 服务器 回复短信 处理 SQlite 数据库 在 Python 中执行此操作(由于时间限制,将其移植到 Java 是不可行的)现阶段不需要与电话用户交互。
我知道需要的部分存在 - web servers with CGI、SL4A 等。但网络服务器似乎主要供个人使用,SL4A 明确声明它 "is alpha quality software"。各种questions on SO relating to SL4A 似乎也没有对这种用例说太多。他们专注于手机应用程序开发(例如this one)。
简而言之,这样的系统会稳定吗?假设核心程序是健全的,我可以依靠它吗?
【问题讨论】:
如果你投反对票,你能在 cmets 中说出原因吗? 【参考方案1】:TLDR:CherryPy 是一个可靠的服务器,而 Android 可能足够可靠,可以在这些天构建服务器。
我曾经维护一个使用 CherryPy 和 SL4A(使用 ws4py 用于 websockets)的项目。
CherryPy 3.2.2 在 Python 2.6 和 Python 3.2 上完美运行。
应用程序经常运行一两天。好像跑得久一点就好了,但是在开发的过程中重启了很多次。
CherryPy 一直都很好,但 Android 设备有时会崩溃,因此 SL4A 会不时退出,需要重新启动。在仅用作服务器的设备上,这可能不是问题。对我来说,当设备在一夜之间运行时它总是很稳定,但在我正常使用设备时偶尔会崩溃(这是我的实际手机)。所有这一切都是在 Galaxy SII 上完成的,那时 Android 还是那样的漏洞百出。
设置 CherryPy 很简单。它是纯 Python,因此您只需将副本拖放到路径中的某个位置并导入(您也不需要模拟器)。
您可能很难让设备保持唤醒状态。如果它一个人呆着,它就会去睡觉。您可以在开发者选项中告诉它保持唤醒状态,但我很确定只有在设备正在充电时才有效。
更新:如今,Android 更加稳定,但 SL4A 项目的工作已经基本结束。有一个名为 QPython 的项目将 SL4A 维护为更大应用程序的一部分,所以这些东西仍然可以完成。
【讨论】:
谢谢 - 第一个真正解决问题的答案,如果只是部分,所以无论如何我都会给你赏金:)。事实上,该系统目前使用笔记本电脑作为服务器和普通手机(即不是 Android 或智能手机)运行,处理 SMS 接口并通过 Gammu (www.wammu.eu) 连接到计算机。但是问题出现了,因为笔记本电池连续运行会老化,因为电话连接有点不稳定,因为我必须依靠我的固定宽带来连接网络服务器,这也是不可靠的。移动数据有望更好地发挥作用。 我希望唤醒锁能成为让手机保持清醒的解决方案(我认为这就是它们的用途?)。停电一般最多只持续约 2 小时,因此在此期间不应完全放电。另外,您知道收到短信是否会唤醒手机吗? Wakelocks 应该是你的朋友,但我对他们没有经验。关于通过短信唤醒电话,我不知道。我打算测试它,但后来认为它可能是特定于设备的,我只是没有资源来测试它。我只能建议让你的设备进入睡眠状态,然后给它发短信看看会发生什么。 抱歉,我才意识到我没有给你赏金,所以现在我有:)。有在 Android 手机上运行的 SMS 网关,所以我认为这个功能是可用的,至少在获得部分唤醒锁的情况下是这样。我目前正在测试对电池寿命的影响,方法是获取部分唤醒锁几个小时,然后查看结果使用了多少百分比的电池。 谢谢您,祝您一切顺利。如果您想在这里发布任何有趣的发现作为另一个答案,那就太好了。干杯。【参考方案2】:用于在 Android 中运行 Python CGI 脚本。基本上,您需要一个能够在 Android 平台上运行 CGI 脚本的 Web 服务器,但我没有找到。您需要玩具 CGI 脚本来适应 Cherrypy 网络服务器,它可以在 Android 上运行。
步骤在这里吗:
-
首先我们需要下载 SL4A (r4) 软件
安卓(2.3)模拟器。它可以通过您的 Android 浏览器完成
前往 SL4A 网站。现在在模拟器中安装软件。
然后从同一个 SL4A 站点安装适用于 Android 的 Python。它会
下载 r4 版本的 apk。
启动 SL4A 应用程序并检查 HelloWorld python 脚本是否
跑步。它将确保您的安装正常。
现在是安装 Cherrypy 库模块的时候了。可以找到
在http://www.cherrypy.org/wiki/CherryPyDownload。我已经拿了 3.2.0
版本。下载适用于 python 2.6 的 egg。
现在我们需要将 egg 文件传输到 Android 模拟器。使用亚行
push 命令将 egg 文件传输到 /mnt/sdcard/Download。
从模拟器启动 Python for Android,然后单击导入模块。
它将列出新上传的 egg 文件。选择它并安装。
现在我们可以编写一个 Cherrypy 脚本作为 CGI 运行。下面是一个
HelloWorld 示例取自 Cherrypy 教程(稍作修改)
# Import CherryPy global namespace import cherrypy class HelloWorld: """ Sample request handler class. """ def index(self, **params): # CherryPy will call this method for the root URI ("/") and send # its return value to the client. for key in params: print key, '=', params[key] return "Hello world!" # Expose the index method through the web. CherryPy will never # publish methods that don't have the exposed attribute set to True. index.exposed = True
# CherryPy always starts with app.root when trying to map request URIs
# to objects, so we need to mount a request handler root. A request
# to '/' will be mapped to HelloWorld().index().
cherrypy.config.update('server.socket_host': '127.0.0.1')
cherrypy.config.update('server.socket_port': 8080)
cherrypy.quickstart(HelloWorld(), '/')
8> 脚本需要转移到模拟器中的/mnt/sdcard/sl4a/scripts 目录下。然后您可以启动 SL4A 并点击脚本以运行。如果您在 SL4A 控制台中运行,则可以看到调试输出。
9> 在 Android 浏览器中,检查 URL http://localhost:8080/
。它会说“Hello world”。
这个网络服务器集我们可以放置 python 脚本来访问 Android 手机数据和其他可以暴露给外部客户端的东西。
致谢: see the screen shots here
其他信息:
micro-httpd (GET / POST / CGI support) cross-compiled to Android
python-for-android
Running "Hello, world!" as a CGI Script
我的建议:
我建议在树莓派中使用任何轻量级 Web 服务器(如 node.js)
参考:
Raspberrry pi python lightweight web servers web application framework for Node.js【讨论】:
感谢您的提示,但我的问题是关于此类系统的稳定性,因为它是 alpha 质量软件。你有这方面的经验吗? micro httpd 和groomdroid 也声称运行cgi,这不是真的吗? 我已经尝试使用树莓派作为我朋友的学术项目模型!在那我用手机做了一些黑客攻击。我猜 node.js 更好! 我知道 Raspberry Pi,事实上,这个系统已经在基于 ARM 的插入式计算机上运行了一年。但是这些系统都不能很好地工作,因为我住在一个经常停电的地区,我们没有钱为它们安排备用电池。这一直是个大问题。因此产生了使用手机的想法。 code.google.com/p/i-jetty jetty for java web-server on Android,仅用于您所在地区的断电修改解决方案!:) 您提供了很多细节,但与问题无关,无论如何都不正确。【参考方案3】:这是我的一篇博客文章的链接,该文章描述了如何在大约 10 分钟内使用 Py4A / SL4A 将您的 Android 手机转换为基本的 CGI 网络服务器http://matbaker.wordpress.com/2013/01/29/android-webserver-in-10-minutes/
【讨论】:
感谢您的提示,但问题的主要焦点不在于这是否可能——我猜它是可能的——而是生成的设置有多稳定。你的系统有多稳定?您是否能够在一段时间内 24/7 全天候运行它?这就是我要检查的内容。 也许对我来说最不可靠的部分似乎是我的服务提供商。这里还需要考虑快速休眠 (androidforums.com/samsung-galaxy-s2-international/…)。包括我的 nexus 4 在内的手机经常在 UMTS 和 HSPA 之间切换以延长电池寿命。好消息是,上述方法似乎很容易启动和运行,您可以启动一些东西并进行一些测试,几乎没有障碍。【参考方案4】:您的应用程序需要运行服务器,该服务器假定持续可用性、连接性和不受限制的处理能力。手机不提供这些。
移动电话旨在通过最大限度地减少处理和电源需求来延长电池寿命。这两点与运行服务器直接不一致。
但它需要稳定性,即没有随机崩溃或停机时间。
假设您的软件编写正确,您可能不必担心崩溃,但操作系统会不断尝试使系统进入睡眠状态。
运行可以执行 CGI 脚本(普通 CGI)的 Web 服务器 回复短信 处理 SQlite 数据库 在 Python 中这样做(由于时间限制,将其移植到 Java 是不可行的)
为什么不只使用小型虚拟服务器?您可以轻松地以每月 5 美元的价格购买服务器(例如DigitalOcean)并使用Twilio 作为 SMS 网关(每条 SMS 几美分)。便宜、可用、可靠和高度可用。你会得到一个预装的 Ubuntu 映像,在那里安装一些额外的包,然后你就可以使用 Python 和 SQLite。而且您完全不必担心移动/短信方面的事情(信号强度、网络可用性等)。此解决方案将满足以上所有这些点。
如果您不想在外部操作服务器(即“在云中”),那么您可以使用旧 PC 并安装 Linux。或者甚至使用plug computer 并拥有一个几乎不可见的服务器。比手机更适合的硬件选择太多了。
由于各种原因,在 Android 手机上运行它可以解决现有设置的一些问题。
怎么样?是什么让 Android 更受欢迎?如果您指的是笔记本电脑的电池问题,那么手机将遭受类似(如果不是更糟)的命运。
简而言之,这样的系统会稳定吗?假设核心程序是健全的,我可以依赖它吗?
您可能会一直在与操作系统和硬件作斗争。一台服务器想要持续运行,一部手机想要尽可能少地运行。整个硬件和软件堆栈都针对节能进行了优化。手机设计为使用间歇充电的电池运行,其热管理系统旨在尽可能不频繁地唤醒 CPU。如果您尝试将移动设备作为服务器运行,您可能会很快耗尽硬件。它们根本不是为 24/7 运行而设计的。你可以运行这样一个系统,它可能会工作一段时间,但我预计你很快就会不得不更换硬件。
使用适合运行服务器任务的硬件。旧电脑现在很容易买到,应该可以免费获得一台可以胜任这项任务的电脑。
另外,CGI 真的是必需品吗?你真的应该看看 WSGI;它的效率要高得多。 CherryPi 是一个不错的 Python 服务器,Flask 也绝对值得一看。
【讨论】:
当前系统非常符合您的要求,但这就是我需要改变的:)。它曾经是一个连接到带有 gammu 的电话的插电式计算机,现在是一台笔记本电脑。这些是问题:断电使插头计算机/“旧PC”不合适;通过蓝牙的电话连接会定期断开;蓝牙加密狗本身会定期死机;笔记本电脑偶尔会出现内核崩溃;固定电话互联网不可靠;等等。总之,系统有太多的故障点。完全基于云的解决方案不起作用,因为这里(印度)的 Twilio 式 SMS 网关对我们来说太贵了。 目前我实际上正在考虑将 Android 手机作为 SMS 网关运行,并将其余基础设施放在云中(AWS 免费层,至少第一年)。也许那将是世界上最好的。手机仍然需要足够清醒才能处理接收/发送短信。 这篇 Quora 帖子似乎有一些关于印度 SMS 服务的好信息:quora.com/SMS-Gateways/… Twilio 只是 1c/SMS 出站,但目前不支持入站。 我仍然认为你最好不要使用手机。它只是不适合服务器角色。在云中运行可以避免上面列出的大部分问题。希望您能找到负担得起的 SMS 网关。以上是关于将 Android 手机作为稳定的网络服务器运行(用于 Python CGI 脚本)的主要内容,如果未能解决你的问题,请参考以下文章