SL4A、QPython學習筆記(2)

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

相關文章
相關標籤/搜索