admin 管理员组

文章数量: 1184232


2024年4月29日发(作者:斗战神按键精灵编程)

技术与应用

*********************

生活·技术·探索

用Python写一个基于Web的

物联网应用程序

寒假期间,忙里偷闲设计了一

个名叫“sfarm”的开源智慧农场

方案。sfarm采用了应用最广泛的

MQTT协议,多节点设备汇集到一

个服务器上,不仅能自动灌溉,还实

现了远程控制,定时采集各种数据。

方案中涉及的开源硬件、传感器、电

磁阀和其他灌溉设备,在淘宝上都

能买到,因而得到了很多朋友的关

注。其中福州连江五中的卢老师就

在学校的大花坛上部署了一套,运

行效果很好。

虽然系统运行正常,但很快就

产生了新的需求:当有嘉宾或者学

生来参观智慧农场系统的时候,如

何快速展示这一系统的“物联”功

能?毕竟打开SIoT(MQTT服务器)

的Web管理页面,再进行演示总不

够便捷,也难以体现个性化。这就

需要写一个物联网应用程序,对接

入的各个节点设备进行直观的管

理。当然,我们期望这个物联网应用

程序的开发难度不能太高,最好学

生也能够开发。这样,智慧农场就和

学生的物联网学习、编程学习密切

结合起来了。

78

中国信息技术教育

谢作如 浙江省温州中学

用Web方式开发物联网应

用程序的优势分析

物联网应用程序的开发有很多

种方式可以选择,比较常见的是用

VB、C#之类的语言来编写,但是开

发的应用程序要运行在电脑上,无

论是演示还是平时管理都不够灵

活。用App inventor编写一个手机

App也是不错的选择,技术门槛也

低,中学生大都能参与编写。但美中

不足的是,这个App要事先安装,而

且只能运行在安卓手机上,不够灵

活且不具备普适性。

用类Scratch的软件来编写应

用程序,也是可行的一种选择,如

Mind+(一款图形化编程软件)内置

了MQTT模块,可以编写物联网应

用程序。Mind+的门槛很低,小学生

也能够编写出一个非常个性化的物

联网应用。但遗憾的是,Mind+的代

码不能脱离Mind+环境运行,也不

能编译为一款独立的软件。

毫无疑问,最灵活的方式肯定

是采用B/S架构,编写一个单独的

管理网页,即WebApp。在服务器上

运行该程序,任何手机的浏览器都

能打开这个特定的网页,看到各种

采集的数据,还可以通过网页按钮

来控制“浇水”。这样的应用场景显

然很“智能”很“贴心”,但遗憾的是,

编写WebApp一般需要掌握一定的

网页前端开发技术,而目前学生普

遍缺少这方面的编程基础。

用Python开发WebApp

能不能用Python来编写

WebApp?现在的中学信息技术教

材几乎都采用Python语言了,如果

能够用Python来编写网页,学生就

不需要学习HTML、JS和CSS等网

页开发技术。当然,答案是肯定的,

一个名叫“Remi”的Python库,就

是用来开发WebApp的。

库简介

Remi是一个用于Python应

用程序的GUI库,它将应用程序的

界面转换为HTML,以便在Web浏

览器中呈现。严格地说,我们不能

用Remi库来编写传统的网站,而

只将他当成Web形式的Tkinter库

(Python最经典的图形界面库)来

使用。如果要做网站,还是要老老实

实学点前端知识,然后结合Python

*********************

技术与应用

from remi import start, App, gui

class MyApp(App):

def init(self, args):

super(MyApp, self).init(args)

def main(self):

container = (width=300, height=200, style={'margin':'5px auto'})

= ('你好,我是一个WebApp!')

= ('请点击这里')

(_button_pressed)

()

()

return container

def on_button_pressed(self, widget):

_text('你点击了按钮!')

start(MyApp)

图1

库(paho-mqtt)编写出来的代码冗

长,不好理解,于是委托上海蘑菇云

团队在paho-mqtt的基础上进行了

新的封装。siot库可以通过pip命令

来安装,命令如下:

pip install siot

1.物联网应用的工作流程

因为“sfarm”每一个节点都

有采集土壤、光线信息的功能,都

具备单独的电磁阀,用物联网消

息来控制。那么,这个应用程序既

需要显示消息,又要能够发送消

息(控制指令),工作流程如图4所

的Flask框架来开发。

库的安装

Remi可以采用pip命令安装,

具体如下:

pip install remi

库的代码示例(如图1)

运行这段代码后,浏览器会自

动打开一个本地的网址,出现如图2

所示的界面。将“127.0.0.1”换成IP

地址,就能通过其他电脑、手机的浏

览器来访问了。

点击“请点击这里”按钮,界面

会发生变化,如图3所示。不用写复

杂的JS代码,在Remi的支持下,网页

交互就变得这么简单。

如果需要了解更多关于Remi

库的资源,可以访问github或者官

方文档。

github地址:/

dddomodossola/remi

文档地址:remi.

/en/latest/

示。其实,绝大多数的物联网应用

程序,都需要同时具备订阅和发送

消息功能。

2.核心代码1:物联网消息的

订阅

因为要同时订阅多个主题的消

息,代码中采用了“定点存放定时处

理”的方式,即先将接收到的消息

放在一个字典(topic_msg_map)

中,然后定时在字典中查找是否有

新消息,读取新消息后就删除这一

消息,避免重复读取。参考代码如下

页图5所示。

3.核心代码2:物联网消息的

显示

显示消息需要不断刷新网页

图2

基于Remi编写基于Web的

物联网应用程序

既然是编写物联

网应用程序,那么肯定

还需要安装siot库。这

也是“虚谷物联”团队

开发的Python库,因为

图3

MQTT的官方Python

图4

MAY. 2021 NO.09

79

技术与应用

*********************

import siot,time

topic_msg_map={}

iot_server = '192.168.3.136' # mqtt服务器地址

iot_user = 'scope'

iot_pwd = 'scope'

projectid = 'sf88' # 项目编号

def on_topic_subscribe(client,userdata,msg):

global topic_msg_map

topic_msg_map[str()]=str(())

def on_topic_read(topic):

global topic_msg_map

result=topic_msg_(topic,None)

if result:

del topic_msg_map[topic]

return str(result)

('',iot_server,user=iot_user,password=iot_pwd)

t()

ibe(projectid + '/light',on_topic_subscribe)

ibe(projectid + '/soil',on_topic_subscribe)

()

图5

def showmqtt(self):

while True:

getcmd = on_topic_read(projectid + '/light')

if getcmd:

__text('环境光照值:' + getcmd)

getcmd = on_topic_read(projectid + '/soil')

if getcmd:

(target=tt)

()

图6

def on_button_pressed(self, widget):

global i,projectid

i=i+1

h(projectid + '/relay','1')

__text('成功发送浇水指令!次数:' + str(i))

图7

组件中的文字,这需要启动一个如图6所示。

新的进程来处理,然后在这个进

4.核心代码3:物联网消息的

程中不断循环读取字典(topic_

发送

msg_map)中的消息。参考代码消息发送通过“浇水”按钮来

80

中国信息技术教育

实现。参考代码如图7所示。

5.核心代码4:物联网设备的

切换

sfarm是一个多节点工作的

物联网系统,因而需要加上设备切

换功能,比较简单的做法是用一个

列表(project_list)记录需要呈现

的设备名称,然后在切换时修改全

局变量(id)。参考代码如下页图8

所示。

运行效果和反馈

Python的神奇,就在于其拥

有无穷无尽的“库”,能够用来快

速解决问题。从找到Remi库到写

出代码,我仅仅花了一个晚上的时

间,这种编程的感觉特别好。最终

的代码运行效果如下页图9所示。

福州连江五中的卢老师将代

码运行在sfarm系统的物联网服

务器上,然后将访问地址做成二

维码,用手机扫码(手机要能够

访问服务器)的方式来打开这个

网页,效果很不错,如下页图10所

示。从难度上看,只要有Python

编程基础,就能编出类似的程序。

他正在将这方面的内容开发成一

个物联网课程,让学生真正参与

到sfarm的开发和维护中。

完成了这个物联网应用后,

最大的收获并不是解决了sfarm

系统的演示问题,而在于找到了

一种设计Python程序界面的新

方法。例如,可以用Remi库写一

个基于Web的校园气象站、摄像

头远程控制程序等。相对来说,用

*********************

技术与应用

信息技术实验

字符的输入:计算机键盘的奥秘

丁伟 李艳 山东省淄博市博山区山头中心学校

随着技术的发展,计算机更多

地被用来处理文字、图像、声音、视

频等非直接用二进制形式呈现的信

息。例如,用键盘输入文章,就需要

把字母转换为计算机能够识别的二

进制数据,然后对它们进行存储和处

理,转换的过程需要用到计算机编码

的知识。现代的键盘就是使用ASCⅡ

编码的方式实现字符的输入的。

本实验通过使用掌控板模拟

键盘按键输入,让学生了解键盘

上的符号是如何通过编码的方式

输入到计算机中的。然后再通过

一个趣味输入的实验来体验其他

的输入方式。首

先,我们了解一下

Python如何读取

转换ASCII码。

Python进

行ASCII码转换

在Python

中使用ord函数将

ASCⅡ字符转换为对应的数值,反

之,使用chr函数,将数值转换为对

应的ASCⅡ字符,如图1所示。

图1 Python进行ASCII码转换

# 设备编号默认先呈现第一个

id = 0

def main(self):

container = (width=400, height=340,style={'margin':'0px auto'})

project_list= ['sf88','sf89']

= wn(['设备编号:' + x for x in

project_list],width=150,style={'font-size': '12px'})

(_dropdown_onchange)

return container

def on_dropdown_onchange(self, emitter, new_value):

global id

id = project_(new_value[5:])

图8

Remi库开发WebApp,比Flask

(一个Python开发的Web框

架)要简单得多,后者需要了解

大量的HTML、JS和CSS之类的

知识,对中学生来说门槛略高了

一些。

图9

图10

MAY. 2021 NO.09

81


本文标签: 需要 编写 消息 代码 设备