2012年4月21日星期六

在Windows Mobile上运行goagent

在Windows Mobile上运行goagent


介绍
转载请注明来源:sillybj.blogspot.com

goagent是什么就不用说了。

goagent是用Python写的,所以主要工作就是在WM上装上能够运行goagent的Python。

有一个项目叫PythonCE,是在WM上使用的Python:
Python CE http://pythonce.sourceforge.net/
可以下载cab安装包,直接安装就可以在WM上使用Python了。

直接跳到Python2.6部分,下载可以在WM上运行goagent的PythonCE

我测试用的goagent版本是1.7.10,在Python2.5下不能正常工作,主要是ssl这一部分,默认是没有编译进来的。

Python2.5源代码里面包含_ssl模块,通过socket模块调用,所以可以下载PythonCE的源码,修改配置文件后重新编译。


为了更新到最新的Python-2.5-20071004,需要下载Python-2.5-20071004-patch.zip

解压出源码,并用patch工具更新到最新版。

这里假设源码放在目录C:\PythonWM,

编译需要的软件:
- Python 2.5 for Windows 安装在PC上
- Microsoft eMbedded Visual C++ 4.0 with Service Pack 4
- Pocket PC 2003 SDK
- Visual C++ 6.0或以上版本

打开命令提示符,
进入目录C:\PythonWM\PCbuild\WinCE
运行scons.bat就可以开始编译了。
可以测试一下编译环境是否创建好了。

为了加入_ssl模块,需要修改C:\PythonWM\PCbuild\WinCE目录下的SConscript文件。
加入openssl的lib依赖,首先下载openssl的库(arm版)和头文件,解压出来libeay32和ssleay32的dll和lib,放到LIBPATH里,头文件放到Include里

编译后需要将下列文件复制到WM的对应目录中(假设PythonCE安装在\Program Files\Python25):
C:\PythonWM\PCbuild\WinCE\lib\Python25.zip 复制到 \Program Files\Python25\
C:\PythonWM\PCbuild\WinCE\release\*.pyd 复制到 \Program Files\Python25\DLLs\
C:\PythonWM\PCbuild\WinCE\release\python.exe和python25.dll 复制到 \Program Files\Python25\
C:\PythonWM\Lib\os.py 复制到 \Program Files\Python25\Lib\
libeay32.dll和sslea32.dll 复制到 \Program Files\Python25\
如果有编译sqlite的话,C:\PythonWM\PCbuild\WinCE\release\sqlite3.dll 也复制到 \Program Files\Python25\,没有编译就使用原来的

传到WM,使用socket.ssl不提示不存在了。

下载地址
PythonWM-source.zip,这个是基于pythonCE-2.5-20061219修改后的源码,除了加入_ssl模块之外,还加入OpenSSL模块等,是因为goagent中有import OpenSSL。
Python25.zip,这个是编译后的文件,可以直接解压到pythonCE的安装文件夹替换其中的文件即可使用。

修改goagent\local\proxy.py
在注释后面的第一行加入:
from __future__ import with_statement
是为了后面的with语句不报错;

将代码中调用ssl.wrap_socket的那行改为调用socket.ssl

导入证书那部分在WM上不能正常使用,先跳过,将这行:
if cmd and os.system(cmd) != 0:
改为:
if cmd:
即不执行cmd。

proxy.py 修改后的proxy.py,基于版本1.7.10,用于Python2.5

设置代理
以WM6.5为例,步骤如下:
打开:开始-设置-连接-连接,
切换到“高级”选项卡,点“选择网络”按钮,在“在程序自动连接到Internet时,使用”下面点“新建”,
ISP名称随便填,比如GOAGENT;
切换到“调制解调器”选项卡,点“新建”,连接名称随便填,选择调制解调器“Cellular Line (GPRS,3G)”,点“下一步”,接入点根据自己情况填,移动的一般是cmnet,联通的可以填3gnet,然后点“下一步”-“完成”,
切换到“代理服务器”选项卡,勾选“此网络连接到Internet”和“此网络使用代理服务器连接到Internet”,代理服务器填127.0.0.1,然后点“高级”,
将四个都改为127.0.0.1,端口8087
然后确定保存。

以后就直接可以在“选择网络”里面切换代理和不代理了。

使用测试
代理设置好之后,运行proxy.py
然后打开浏览器,我使用的是Opera Mobile 9.7,
但测试发现,除了google的http页面可以打开之外,其他的都打不开。
没有测试最新版的goagent,其实也用不着测试也知道结果。

Python2.6
测试版本
无法正常代理可能还是因为Python2.5的原因,所以希望最好能让Python2.6能在WM上运行,
于是下载了Python2.6源码,基于PythonCE和Python2.6源码,参照PythonCE修改,结果改得乱七八糟,不过最后总算能在WM上运行了。

下载地址
Python26.zip 解压出来的文件夹名还叫Python25是因为原始cab文件安装的位置是Python25,为了文件关联正常,所以没有改名,直接解压到pythonCE的安装文件夹替换其中的文件即可使用。


修改proxy.py
以goagent 1.7.10原始proxy.py为基础修改,将这行:
if cmd and os.system(cmd) != 0:
改为:
if cmd:
保存即可
不要使用上面那个用于Python2.5的proxy.py)

使用测试
代理的设置还是和上面一样,测试用浏览器是Opera Mobile 9.7 和 Opera Mobile 10,简单测试了一下,目测可以正常代理HTTP,但浏览HTTPS很不稳定,程序有时会自动退出。
另外,对WM原生Opera Mini 5无效,但对java版国际版Opera Mini有效(连接方式设为HTTP)。
如果Opera Mini连接到中国的服务器的话是不能使用的,这个可以从goagent的输出看到连接到哪个服务器。

运行时有时会提示很多错误,主要是:
AttributeError: 'module' object has no attribute 'EPIPE'
这是因为WM不支持,但是似乎不影响使用;
然后另外一个错误:
"HEAD http://google.cn/ HTTP/1.0" 501 -
code 501, message Unsupported method ('HEAD')
我测试时会导致Opera Mobile退出;
以及用Opera Mobile打开https网页时 提示302错误,也会导致Opera退出,原因我不清楚

欢迎测试和改进~

所以目前推荐使用国际版的Opera Mini(java版),通过它也可以访问https网页。

另外有一要注意的地方就是 运行proxy.py之后,点Menu--Exit之后,虽然窗口关闭,其实它还是在后台运行,仍然可以使用代理,此时如果再次运行proxy.py就会看不到连接提示,并且关闭后也会在后台运行,于是会越积越多。所以最好在关闭后用进程管理器结束掉,或者重启设备。

截图(浏览器使用的是java英文版Opera Mini 6.5)


下一步准备整理并上传python2.6的代码,同时测试下最新版的goagent。

经测试,goagent 1.8.3经过修改“if cmd and os.system(cmd) != 0:”这一行即可使用,修改方法同上。


已上传PythonCE2.6源码,在此下载:PythonCE2.6-source.zip,可以正常编译,但是由于加入OpenSSL的原因,import OpenSSL时会出现某些错误,要正常使用可以先不把OpenSSL模块传到设备,有时间再进行修改。


没有评论:

发表评论