SL4A下使用Python WEB框架;javascript
QPython之WEB APP的先后端通信问题;前端
ANDROID设备与PC等的数据通信的Python解决方案;java
这一次对上述这些问题进行了一番钻研与实验,结论以下:python
1. SL4A下使用Python WEB框架android
SL4A中也能够像在QPython中那样使用Python web框架制做server,至少,使用单文件/模块web框架bottle十分容易。详见 http://www.marginhound.com/using-bottle-py-and-sl4a-to-build-an-android-web-server-for-your-phone-tablet/web
2. QPython之WEB APP的先后端通信问题后端
SL4A下存在一个先后端互送事件与数据的机制,但QPython中这个机制还没有实现,或者是个bug,我在QPython社区提了相关问题,从反馈看,QPython的研发者对这个问题模棱两可。我认为这是QPython应该解决的一个首要问题,只恨本身没那个技术,不然一定动手尝试修正。服务器
至于为何强调这个功能,ANDROID的webview目前不支持从服务器推送事件(server sent events)与WebSocket,因此,在QPython中,javascript前端只能周期轮询或者是采用一种称为long polling的方式,也就是异步模式中处理完一个response后再送出一个request。以以下Python服务器、VBA客户端代码演示其原理:框架
#Python server from bottle import route, run from random import randint import time @route("/") def hello(): time.sleep(randint(1,6)) c = str(randint(1,300)) + "\n" return c run(host='localhost', port=8080)
'VBA client Private WithEvents hr As WinHttpRequest '----------------------------------------- Private Sub CommandButton1_Click() Set hr = New WinHttpRequest hr.Open "GET", "http://localhost:8080/", True hr.send End Sub '----------------------------------------- Private Sub hr_OnResponseFinished() Debug.Print hr.responseText hr.send End Sub
若是上述问题能解决,界面更加友好一些,QPython有望成为一个Android平台上真正强有力的Python IDE。
dom
3. ANDROID设备与PC等其余设备数据通信的Python解决方案
不知道这个话题价值如何,只是忽然好奇,尝试将Android设备收集的数据实时输送到PC。首先尝试了蓝牙,没搞定Android端的蓝牙串口服务,做罢。不过,尝试在Excel下用VBA读串口,从蓝牙GPS读数据成功,代码以下:
Private onoff As Boolean Private fso As New FileSystemObject Private ts As TextStream '----------------------------- Private Sub CmdBtnOpenRead_Click() Dim gdata onoff = True Set ts = fso.OpenTextFile("COM6", ForReading) Do While Not ts.AtEndOfStream DoEvents TextBox1.Text = TextBox1.Text & ts.ReadLine & vbCrLf If onoff = False Then Exit Do Loop ts.Close End Sub '--------------------------------- Private Sub CmdBtnClose_Click() onoff = False End Sub
以后,尝试基于WLAN局域网Http服务器/客户端的方案。至于WLAN路由的问题,方法不少,除了路由器(独立路由器,电脑端的USB路由器之类的),也可使用Android设备的WLAN热点(AP)功能来实现,关键是取得服务器端的IP地址,在使用Android无线AP的状况下,使用用netcfg命令查询AP的IP地址(在QPython下,console中输入netcfg),我查到的是192.168.43.1,据网上资料,这个是AP的默认ip。
以下是一段示例代码,在QPython中实现的一个提供罗盘方位角数据的server:
#qpy:console from bottle import route, run import androidhelper import time droid = androidhelper.Android() droid.startSensingTimed(1, 250) @route("/azimuth", method="GET") def default(): s6data = droid.sensorsReadOrientation().result if len(s6data)>0: return str(s6data[0]) run(host='192.168.43.1', port=8080) droid.stopSensing()
客户端设备无线接入局域网,请求http://192.168.43.1:8080/azimuth,取得方位角弧度。