python用于物联网_使用Python来做物联网,就是这么简单!

搭建整套物联网系统的方法有很多,最近四处捣鼓,使用python + 阿里云搭建一套最简单的物联系统,可以将单片机上的数据通过阿里云传输到PC端。

一、基本结构

先看架构图

?

二、设备端接入

物联网终端是用的ESP32,是一款自带蓝牙和Wifi的单片机。利用它可以直接接入互联网,无需其他模块。当然你可以将现在流行的NB-Iot模块来联网,不过需要自己写一下驱动程序。我买的模块是支持micropython开发的,在淘宝上可以搜索到,用起来很方便。有时间我会补上这一块的初步教程。

?

Micropython是可以在低端硬件上运行的python,可以使用python语言直接操作IO 和MCU的外设比如UART、I2C等,用起来非常方便,不要搭建复杂的开发环境,也不需要学习寄存器配置。作为一个对传统MCU开发非常熟悉的硬件工程师来说,感觉操作起来非常简单。目前Micropython已经支持很多硬件了,应该用比较广泛的STM32部分系列也被支持。Micropython也已经支持很多常用的库,比如蓝牙,telnet,mqtt等。

ESP32 通过wifi 接入互联网,使用mqtt协议接入阿里云,将温度数据上传至阿里云。在云端通过消息订阅可以直接查看温度信息。在PC端使用python调用MQTT协议,接入到阿里云。但是PC端和ESP32在阿里云上是两个不同的设备,需要通过阿里云来转发信息,这样PC就可以拿到ESP32上传的数据了。

ESP32 上的代码如下:

from umqtt.simple import MQTTClient

import usocket as socket

import time

import wifi

wifi.connect()

#Demo_01

ProductKey = "*********"#使用你自己的

ClientId = "1234|securemode=3,signmethod=hmacsha1|"

DeviceName = "Demo_01"

DeviceSecret = "*******************************"#使用你自己的

strBroker = ProductKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"

Brokerport = 1883

user_name = "Demo_01&*********"#使用你自己的

user_password = "**********************************************"#使用你自己的

print("clientid:",ClientId,"\n","Broker:",strBroker,"\n","User Name:",user_name,"\n","Password:",user_password,"\n")

def connect():

client = MQTTClient(client_id = ClientId,server= strBroker,port=Brokerport,user=user_name, password=user_password,keepalive=60)

#please make sure keepalive value is not 0

client.connect()

temperature =25.00

while temperature < 30:

temperature += 0.5

send_mseg = ‘{"params": {"IndoorTemperature": %s},"method": "thing.event.property.post"}‘ % (temperature)

client.publish(topic="/sys/*************/Demo_01/thing/event/property/post", msg=send_mseg,qos=1, retain=False)#*号处为product id

time.sleep(3)

while True:

pass

#client.disconnect()

有几点需要说明:

1.代码中的wifi.connect()函数需要自己编写,网上能搜到类似的,也可以打赏私信我所要源码。

2.阿里云物联网平台的接入需要进行三元组认证,会根据一定的规则生成登录名和密码,这个网上信息还是比较全面的。

3.向阿里云物联网平台发布消息的格式一定要按照代码中所写,网上很多代码,但是对这一块的描述都不清楚。

Micropython使用的umqtt.simple库,一定要设置keepalive时间,否则无法连接。这一点我是摸索了好久,最终通过查看库的源码才发现的问题。

三、云端设置

在云端建立一个高级产品,并创建两个设备,以供ESP32 和PC连接。

?

需要在产品中定义一下功能。

?

云端和设备端都建立好了之后,可以查看设备运行状态看到数据上传

?

这是查看数据记录得到的结果

?

当你看到正确的数据之后,就说明你的成功接入物联网并上传了数据。

接下来就是最重要的部分——设置是使用规则引擎来进行数据转发,将设备demo_01的数据转发到demo_02。这一步的语法很重要,虽然有官网有详细教程,但是当时还是搞了好久才完全正确。

规则查询语句:

SELECT items.IndoorTemperature.value as IndoorTemperature FROM "/sys/use-your-productkey-here/Demo_01/thing/event/property/post" WHERE items.IndoorTemperature.value > 0

四、PC端接入

PC 端使用python模拟MQTT设备登陆阿里云订阅消息就行了,只要装好python很快就可以实现,网上也有很多代码。代码的很大一部分就是在做三元组认证,可以将这部分稍微修改一下来计算ESP32 登陆时所需的

PC端python代码如下:

# coding=utf-8

import datetime

import time

import hmac

import hashlib

import math

try:

import paho.mqtt.client as mqtt

except ImportError:

print("MQTT client not find. Please install as follow:")

print("pip install paho-mqtt")

# 设置连接信息

#Demo_02

ProductKey = "*********"#使用你自己的

ClientId = "2234" # 自定义clientId

DeviceName = "Demo_02"

DeviceSecret ="************************************8**"#使用你自己的

# 获取时间戳(当前时间毫秒值)

us = math.modf(time.time())[0]

ms = int(round(us * 1000))

timestamp = str(ms)

# 计算密码(签名值)

def calculation_sign(signmethod):

data = "".join(("clientId", ClientId, "deviceName", DeviceName,

"productKey", ProductKey, "timestamp", timestamp))

if "hmacsha1" == signmethod:

# ret = hmac.new(bytes(DeviceSecret),

# bytes(data), hashlib.sha1).hexdigest()

ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),

bytes(data, encoding="utf-8"),

hashlib.sha1).hexdigest()

elif "hmacmd5" == signmethod:

# ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),

# bytes(data, encoding="utf-8"), hashlib.md5).hexdigest()

ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),

bytes(data, encoding="utf-8"),

hashlib.md5).hexdigest()

else:

raise ValueError

return ret

# ======================================================

strBroker = ProductKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"

port = 1883

client_id = "".join((ClientId,

"|securemode=3",

",signmethod=", "hmacsha1",

",timestamp=", timestamp,

"|"))

username = "".join((DeviceName, "&", ProductKey))

password = calculation_sign("hmacsha1")

print("="*60)

print(strBroker)

print("client_id:", client_id)

print("username:", username)

print("password:", password)

print("="*60)

# 成功连接后的操作

def on_connect(client, userdata, flags, rc):

print("OnConnetc, rc: " + str(rc))

# 成功发布消息的操作

def on_publish(client, msg, rc):

if rc == 0:

print("publish success, msg = " + msg)

# 成功订阅消息的操作

def on_subscribe(mqttc, obj, mid, granted_qos):

print("Subscribed: " + str(mid) + " " + str(granted_qos))

def on_log(mqttc, obj, level, string):

print("Log:" + string)

def on_message(mqttc, obj, msg):

curtime = datetime.datetime.now()

strcurtime = curtime.strftime("%Y-%m-%d %H:%M:%S")

print(strcurtime + ": " + msg.topic + " " + str(msg.qos) + " " + str(msg.payload))

on_exec(str(msg.payload))

def on_exec(strcmd):

print("Exec:", strcmd)

strExec = strcmd

if __name__ == ‘__main__‘:

mqttc = mqtt.Client(client_id)

mqttc.username_pw_set(username, password)

mqttc.on_message = on_message

mqttc.on_connect = on_connect

mqttc.on_publish = on_publish

mqttc.on_subscribe = on_subscribe

mqttc.on_log = on_log

mqttc.connect(strBroker, port, 120)

# mqttc.loop_start()

time.sleep(1)

temperature =27.55

mqttc.subscribe("/sys/************/Demo_02/thing/service/property/set", qos=1) # 换成自己的

#send_mseg = ‘{"pm_25": %s,"area":"%s","time":"%s"}‘ % (0, 0, datetime.datetime.now())

#send_mseg = ‘{"id": "1234", "version": "1.0","params": {"IndoorTemperature": %s},"method": "thing.event.property.post"}‘%(temperature)

send_mseg = ‘{"params": {"IndoorTemperature": %s},"method": "thing.event.property.post"}‘ % (temperature)

print(‘send_mseg is : ‘,send_mseg)

mqttc.loop_forever()

五、总结

工作之余了解了一下物联网的发展,看到有意思的东西打算学一下,刚好看到了microPython,震惊之余,决心做点小东西玩玩。

这套框架全部使用python实现,比我了解到的绝大多数物联网方案要简单太多,虽然有些开发首先,但是用来实现一些简单设计应该是不成问题的,只要你会python,这套系统可以很快构建。当然python也是非常好学的,长期使用C语言的人根本不需要什么学习就可以上手。

当然这一套系统也是在学习了很多东西之后才搭建成功的,中间也经历很难多曲折和摸索,前前后后大概花了两周。很多细节无法在一篇文章中展现,如果你在搭建过程中遇到问题可以留言,我看到了尽量回复。

原文:https://www.cnblogs.com/heiyu123/p/14005196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java遍历数组练习(for循环、foreach)

java遍历数组练习&#xff08;for循环、foreach&#xff09; /* * 遍历数组 for循环 foreach * */ public class Test01 {public static void main(String[] args) {int[] arr {11,3,45,6,78,89,23,4};//for循环遍历数组for (int index 0;index<arr.length;index){Sys…

mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...

1、什么是生成器我们可以把生成器理解为一个高端的列表。生成器就是一个集算法和列表还有依次读取于一体的功能。因为如果列表存储的内容过多就会造成内存的浪费。但是如果“列表”内的元素可以通过某种规则展示出来、且我们只需要前几项的元素&#xff0c;我们就可以通过使用生…

从键盘上录入10科考试分数,输出最高分最高分输入的序号

从键盘上录入10科考试分数&#xff0c;输出最高分最高分输入的序号 import java.util.Scanner;/* * 从键盘上录入10科考试分数&#xff0c;输出最高分最高分输入的序号 * */ public class Test02 {public static void main(String[] args) {Scanner sc new Scanner(System.in…

pycharm项目目录结构_「Actix-web项目」-项目整体目录结构

前言完成一个前后端分离项目&#xff0c;后端技术选型Rust的框架Actix-web&#xff0c;那么用这个框架完成后端代码它的项目目录很重要&#xff0c;今天就来着重介绍一下。目录结构下面是自己用Rust Actix-web框架写web后端的目录结构&#xff0c;如图所示&#xff1a;目录结构…

java查询数组中元素的索引

java查询数组中元素的索引 /*** java查询数组中元素的索引*/ public class Test03 {public static void main(String[] args) {int[] arr {5,7,4,9,5,7,2,8,1,5,0};//查询元素 2 的索引int value 2;//准备一个变量用于存储目标元素的索引int index -1;//查找元素在数组中第…

python数据清洗代码_8段用于数据清洗Python代码(小结)

最近&#xff0c;大数据工程师Kin Lim Lee在Medium上发表了一篇文章&#xff0c;介绍了8个用于数据清洗的Python代码。数据清洗&#xff0c;是进行数据分析和使用数据训练模型的必经之路&#xff0c;也是最耗费数据科学家/程序员精力的地方。这些用于数据清洗的代码有两个优点&…

完善三个数字对象排序程序。MOOC,Java第四章 面向对象和类 第一次作业

题目内容&#xff1a; 完善以下程序&#xff0c;利用swap函数&#xff0c;完成数字按从小到大的顺序输出。例如输入5 4 3 输出3,4,5。 输入格式: 输入3个数字。 输出格式&#xff1a; 数字从小到大排列 输入样例&#xff1a; 5 4 3 输出样例&#xff1a; 3,4,5 代码…

触发器及其应用实验报告总结_双面喷绘材料的分类及其应用,超全总结!(建议收藏)...

▲ 东川 | 点击图片获取更多信息▲ 东川 | 点击图片获取更多信息双面喷绘材料&#xff0c;有适合水性机器喷的双面摭光画布&#xff0c;有适合弱溶剂和UV喷绘的PVC双喷、PET双喷、双喷网格布、双面牛筋布&#xff0c;它们有个共同的特点就是&#xff0c;即可以单面打画面&#…

java实现程序输出以下5*5数字方格

请实现程序输出以下5*5数字方格。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 需要在main函数的输入参数中设置5&#xff0c;输出5*5的数字方格。如果是输入7&#xff0c;则是7*7的数字方格。 代码如下&#xff1…

java请实现程序输出以下星塔||输出菱形

java请实现程序输出以下星塔||输出菱形 请实现程序输出以下星塔。 * *** ***** *** * 需要在main函数的输入参数中设置5&#xff0c;输出5层星塔。如果是输入7&#xff0c;则是7层星塔。假设输入参数都是奇数&#xff0c;且都大于等于5&#xff0c;小于等于11。 第一种写法&a…

为什么自己编写的页面总是在那里抖动_别克威朗为什么销量不佳?

汽车发展到现在有些车企经历了几十年&#xff0c;而有些车企则是经历了上百年&#xff0c;所以在历史长河的积淀当中&#xff0c;总会有大起大落&#xff0c;混得好的就成为了百年车企&#xff0c;混得不好的就早早退市。而对于车型而言&#xff0c;同样也是如此&#xff0c;有…

java数组的扩容,将两个数组合并成一个数组

java数组的扩容&#xff0c;将两个数组合并成一个数组 //将下列两个数组合成一个数组 public class Test04 {public static void main(String[] args) {int[] a {1,3,4,56,7,8,9,3};int[] b {12,34,56,43,78,74,36};int[] c new int[a.lengthb.length];//将数组a中的元素方…

java开发项目实例_学java开发,项目经验最重要

不想做将军的士兵不是好士兵&#xff01;相信没有人一开始学java&#xff0c;就是为了将来一直做一名初级java开发工程师。只需掌握一些简单代码技巧&#xff0c;别人告诉想要实现的效果&#xff0c;然后自己能用代码堆砌来实现。更何况&#xff0c;现在企业对java开发工程师的…

java在原数组中追加一个元素

java在原数组中追加一个元素 /* * 在原数组中追加一个元素 * */ public class Test05 {public static void main(String[] args) {//在下面这个数组中追加一个元素9int[] a {1,2,3,4,5,6,7,8};int b 9;int[] c new int[a.length1];//复制旧数组到新数组中去for (int i 0;i…

java组件是什么意思_年前面试京东3面凉经~ 面试过程与真题全分享+备战春招(java)...

1月4号得到通知&#xff0c;京东无望了&#xff0c;哭晕在厕所&#xff0c;现在给大家把这些面试题分享出来&#xff0c;希望给想要进京东的一些程序员点点帮助&#xff01;接下来开始分享我去面试的时候面试官问我的那些面试题京东java一面记录简单介绍下自己介绍主要用到的技…

java如何在指定索引位置插入新元素

在arr数组中索引为3的位置&#xff0c;插入一个元素 10 /* * 在arr数组中索引为3的位置&#xff0c;插入一个元素 10 * */ public class Test06 {public static void main(String[] args) {int[] arr {2,6,8,4,9,5,1,3};//要插入索引的位置int x 3;//创建新数组int[] newArr…

java从数组中删除元素(数组的缩容)

java从数组中删除元素&#xff08;数组的缩容&#xff09; 1&#xff0c;解决方案一 /* * 数组的缩容&#xff08;删除元素&#xff09; * 第一种解决方案 * 移动元素&#xff0c;被删除元素后面的元素往前移一位 * 优点&#xff1a;不需要创建新数组&#xff0c;省内存&…

利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理

大家好&#xff01;我是CSRobot&#xff0c;从今天开始&#xff0c;我将会发布一些技术文章&#xff0c;内容就是结合春招以来的面试所遇到的问题进行分享&#xff0c;首先会对知识点进行一个探讨和整理&#xff0c;在最后会给出一些面试题并作出解答&#xff0c;希望可以帮助到…

将下列数组中奇数和偶数分别存放于两个不同的两个数组

将下列数组中奇数和偶数分别存放于两个不同的两个数组 /* * 将下列数组中奇数和偶数分别存放于两个不同的两个数组 * */ public class Test09 {public static void main(String[] args) {int[] arr {12,34,23,47,72,84,22,28,45,57,91};//用于统计偶数元素个数int o 0;for (…

python发布_python网站发布

"""/etc/python3File : IO_HTTP.pyTime : 2020/7/18 下午3:26Author : wangyongqiEmail : 92644827qq.comSOftware : PyCharm"""from socket import *from select import *importreclassWebServer:def __init__(self,host0.0.0.0,port8000,htmlN…