qpython androidhelper gps_SL4A、QPython学习笔记(2)

SL4A下使用Python WEB框架;

QPython之WEB APP的前后端通讯问题;

ANDROID设备与PC等的数据通讯的Python解决方案;

这一次对上述这些问题进行了一番钻研与实验,结论如下:

1. SL4A下使用Python 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。

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,取得方位角弧度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值