基于Python Flask的手机与PC服务器通信
2018-04-09长江工程职业技术学院武汉430212
(长江工程职业技术学院,武汉 430212)
移动通信技术的讯猛发展,催生了移动互联网应用成井喷式的增长。根据Zenith Media的研究,到2017年,移动互联网流量将占互联网流量的比例将达到75%,占有互联网的绝大部分业务。皮尤报告显示,2017年中国大陆地区智能手机拥有量为8.6亿部。由于移动互联网终端设备小巧轻便,通信便捷的特点,使基于以智能手机为代表的移动应用几乎无处不在,各种APP可谓是呼之欲出,特别是各种基于手机的远程控制、远程数据交换的应用业务要求极速递增,实现这些移动应用业务的关键是解决智能手机与PC服务器之间的通信问题。对于Andriod平台,惯用方法是通过Java Scoket来实现,程序设计相对较为繁杂,本文利用 App Inventor的客户端浏览器组件与 Python Falsk架构的Web服务器实现了手机与PC间的双向数据通信,方法简单,易于实现。
1 通信平台简介
Android智能手机端采用App Inventor工具设计客户应用App,PC端使用Python语言第三方提供的Flask模块,通过Pip安装后设计服务器程序(其它网站可通过设计Web API方式通信),利用Flask的路由和视图函数实现数据的双向传输。
1.1 App Inventor
App Inventor是由Google公司开发的一款在线开放的Andriod编程工具软件,内嵌了若干传感器组件,可以直接调用设备的功能,比如位置传感器、加速度传感器、方向传感器、手机的拨打电话及收发短信功能[1]。通过图形化积木式拖放组件的编程方式来完成Apps开发。 App Inventor在2012年移交给麻省理工学院的MIT的行动学习中心,并由MIT发布使用,目前发布了第2版本。App Inventor提供了以图形化表示的常量、变量、自定义过程(函数)、组件和事件处理等编程元素,采用面向对象编程方法,其App结构如图1所示。
图1 AppInventorApp结构
1.2 Python Flask Web
Python语言近些年越来越火,其特点是开发迅速,语法简单,可移植、网络资源丰富等。Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2,Flask自带开发用服务器和debugger、集成单元测试 (unit testing)和RESTful 调度请求[2]。Python利用Flask开发RESTful API,主要由路由和视图函数组成资源,路由提供URL定位资源,实现网址到资源的映射,视图函数则是实现通过Get或Post方法传递通信参数(命令)对应的API处理单元,客户端通过路由调用API实现数据的存取,数据通常为JSON形式作为响应,REST API设计与工作模式如图2所示。
图2 RESTAPI设计与工作模式
2 通信系统设计
手机要通过移动接入网连接到互联网,也可通过WiFi实现手机与局域网内PC通信。通信协议为Http,分别由客户端的Web组件和服务端的Flask对协议进行了封装,开发者只需按通信约定格式进行程序设计,其通信过程如图3。
图3 客户端与服务器通信过程
2.1 手机端通信设计
手机端APP使用App Inventor的Web客户端组件,该组件的使用HTTP协议,提供了Get、Put及Post方法,实现与网络服务之间的信息交换。Web组件的Url属性指向服务器的网址,调用Web组件的Get、Put或Post方法发送请求,当请求成功有数据返回时,触发收到数据事件(Event),在事件处理程序中对收到的数据进行处理[3],程序流程如图4。
图4 手机端流程图
2.2 PC端通信设计
Flask是第三方提供的用Python开发Web应用的具有MVC架构的一个框架,它内置了简单的WSGI服务器,通过封装的Request和Response两个对象进行请求/响应操作,从而实现双向通信,服务器设计严格按照图5流程进行。图6为客户请求的响应过程。在Flask的应用中,路由是指用户请求的URL与视图函数之间的映射。Flask框架根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数,并将视图函数的执行结果返回WSGI服务器。
图5 服务器程序设计流程图
图6 Flask响应客户的请求过程
3 通信系统实现
为说明通信的实现方法,下面以手机APP的文本框作为命令参数,命令按钮发送请求,接收数据在文本框中显示为例进行APP和服务器程序设计。
手机APP程序如图7所示,程序分别由“发送请求按钮”和“Web客户端1”两个事件处理程序组成,在发送请求按钮事件中通过字符串合并操作,将服务器的网址与命令参数合并为Uul,以调用对应的视图函数,再发向服务器发送GET请求,当有数据返回时,触发“Web客户端1”获得文本事件,在该事件中,读取响应内容,存入“返回数据”文档框中显示。
PC服务器端的实现代码如下:
form flask import Flask #导入Flask
app = Flask(__name__) #实类化Flask
@app.route('/') #路由
def welcome():#视图函数
return "Welcome to use mobile communication"
@app.route('/api1')
def api1():
return "This is data of api1"
@app.route('/api2')
def api2():
return "This is data of api2"
app.run(host="192.168.1.1", debug=True) .#启动服务器
图7 手机端App程序
运行APP,在命令参数文本框中输入“api1”,单击“发送请求”按钮,在返回数据文本框中收到“This is data of api1”信息,同样,输入“api2”时,在返回数据文本框中收到“This is data of api2”,手机APP运行如图8。当单击“发送请求”按钮时,向服务器发送的请求为http://192.168.100.1/api1?,服务器收到后查路由表,找到对应的视图函数api1()并执行,由return返回数据,在手机端触发收到文本事件,在事件过程中进行相应的数据处理。
4 结束语
在利用App Inventor和Python Flask设计手机与PC通信时应用时,数据可以是各种格式,也可以是文件,视数函数中根据应用需要,可以包括对数据的各种操作及数据库处理。如果返回数据较复杂,可以考虑JSON格式,在手机端使用列表来解析数据。
图8 手机App运行结果
参考文献:
[1]邵瑛.App Inventor2应用开发[M].北京:高等教育出版社,2016.
[2]Miguel Grinberg.Flask Web开发:基于Python的Web应用开发实践[M].北京:人民邮电出版社,2017.
[3]David Wolber. App Inventor 编程实例及指南 [EB/OL].https://web.17coding.net.