您当前的位置:首页 > 新闻 > 科技

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

时间:2020-03-23 17:05:46  来源:  作者:

一、基本结构

先看架构

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

 

框架.png

二、设备端接入

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

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

 

ESP32模块.jpg

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

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

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

三、云端设置

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

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

 

device.JPG

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

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

 

device_define.JPG

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

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

 

云端数据查看.JPG

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

用python + 阿里云搭建物联系统,可将单片机上的数据传输到PC端

 

云端数据记录.JPG

当你看到正确的数据之后,就说明你的成功接入物联网并上传了数据。接下来就是最重要的部分——设置是使用规则引擎来进行数据转发,将设备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语言的人根本不需要什么学习就可以上手。



Tags:阿里云   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  Tags: 阿里云  点击:(1)  评论:(0)  加入收藏
阿里云和腾讯云都是非常好的云服务器平台,大多数用户完全不用纠结腾讯云还是阿里云,特别是微信开发用户,自然是首选腾讯云,其次是学生或个人以及财政紧张的小公司微型业务,腾讯云...【详细内容】
2021-12-14  Tags: 阿里云  点击:(14)  评论:(0)  加入收藏
本文作者宗志刚(花名瑄珉),网络领域从业十五余年,现任阿里云网络产品线资深技术专家,负责阿里云网络洛神平台的技术规划、架构设计以及网元产品研发工作。在刚刚过去的云栖大会上...【详细内容】
2021-11-02  Tags: 阿里云  点击:(98)  评论:(0)  加入收藏
Windows电脑将阿里云盘挂载为本地磁盘,全速访问资源,本篇文章依赖于阿里云盘的webdav功能,如果没有搭建的童鞋可以先搭建好webdav搭建阿里云盘webdav的文章群晖NAS同步阿里云盘...【详细内容】
2021-08-09  Tags: 阿里云  点击:(686)  评论:(0)  加入收藏
关于阿里云ACP认证,其实涉及了很多方向。今年在阿里云合作伙伴大会上,阿里将认证这个板块分为了计算和数据智能两大类,细分又可以分为云计算、云原生、云安全、大数据、数据库...【详细内容】
2021-07-16  Tags: 阿里云  点击:(152)  评论:(0)  加入收藏
近日有粉丝问阿里云和华为云的部署区别是啥,其实阿祥没有搭建过阿里云,具体用啥工具部署,部署的步骤和具体方法并不知道(ps:后续如果能找到类似资料,阿祥会给大家分享),所以我这次先...【详细内容】
2021-07-13  Tags: 阿里云  点击:(136)  评论:(0)  加入收藏
一、对象存储OSS阿里云对象存储OSS(Object Storage Service)具有丰富的安全防护能力,支持服务器端加密、客户端加密、防盗链白名单、细粒度权限管控、日志审计、合规保留策略(WO...【详细内容】
2021-06-24  Tags: 阿里云  点击:(102)  评论:(0)  加入收藏
视频点播(ApsaraVideo for VoD)是集音视频采集、编辑、上传、自动化转码处理、媒体资源管理、分发加速于一体的一站式音视频点播解决方案。 1、应用场景 音视频网站:无论是初创...【详细内容】
2021-06-23  Tags: 阿里云  点击:(142)  评论:(0)  加入收藏
阿里云Tair云原生内存数据库线上名字为阿里云数据库Redis企业版(又称阿里云Tair),从2009年开始正式承载集团业务,是一款历经磨练的企业级产品。它完全兼容Redis的数据结构和通讯协议,包括API接口,并且在内部逐步打磨的过程...【详细内容】
2021-06-21  Tags: 阿里云  点击:(99)  评论:(0)  加入收藏
1.ubuntu 20.04 LTS 更换阿里云源第一步:先备份下原始源:sudo cp /etc/apt/source.list /etc/apt/source.list.backup第二步:修改文件vim /etc/apt/source.list清除原有的,替换...【详细内容】
2021-06-07  Tags: 阿里云  点击:(100)  评论:(0)  加入收藏
▌简易百科推荐
非法购买公民信息、开发人脸认证规避技术&hellip;&hellip;今年年初,广东省公安厅网安部门侦破全国首例破解“青少年防沉迷系统”的新型网络犯罪案件,抓获犯罪嫌疑人13名,查处非...【详细内容】
2021-12-28    人民日报客户端  Tags:数据安全步   点击:(5)  评论:(0)  加入收藏
就在今天,腾讯方面宣布将在2022年1月31日下架企业QQ和营销QQ,其实这一消息的降临并不让笔者意外,因为早在今年的10月28日20点之后,企业QQ和营销QQ就被停止了续费服务。相信很多...【详细内容】
2021-12-27  科技探险家    Tags:企业QQ   点击:(22)  评论:(0)  加入收藏
日前,上海交通大学发布《全球电竞之都评价报告》,对全球15个致力于发展电竞之都的城市进行评价,上海作为中国城市电竞发展的排头兵,其拥有众多优质电竞企业及完整产业集群,因此排...【详细内容】
2021-12-27  经济日报    Tags:电竞   点击:(3)  评论:(0)  加入收藏
为优化网络氛围环境,微博又开始整顿用户信息了。本月月初,微博官方发布公告,要求昵称中带有如“二货”“SB”“瘪三”“娘炮”等明显低俗或侮辱性词汇的用户尽快修改,否则将面临...【详细内容】
2021-12-24  运了个营    Tags:微博   点击:(10)  评论:(0)  加入收藏
昨日谷歌宣布,自2022年12月19日开始停止对OnHub的软件支持,OnHub路由器仍将提供Wi-Fi信号,但用户无法用谷歌Home应用程序管理它。无法更新Wi-Fi网络设置、添加额外的Wifi设备或...【详细内容】
2021-12-22  雷峰网    Tags:Google OnHub   点击:(5)  评论:(0)  加入收藏
IT之家 12 月 20 日消息,百度网盘青春版 iOS 客户端今日晚间率先开启内测,安卓客户端将在稍后内测。使用苹果 iPhone 的IT之家小伙伴可以点此下载内测版,需要先下载 TestFlight...【详细内容】
2021-12-21  IT之家    Tags:百度网盘   点击:(10)  评论:(0)  加入收藏
对于拼车单,是接还是不接,不少网约车司机表示很矛盾。接吧,钱少事多,常常跑了个寂寞,不接吧,车多客少,挑三拣四没饭吃。 在平台大力推广拼车单之下,不少司机迫于生活压力,最终还是打...【详细内容】
2021-12-17  网约车情报分享    Tags:滴滴   点击:(9)  评论:(0)  加入收藏
蓝鲸TMT频道12月16日讯,据饿了么官方微信公众号,近日,在圆桌会上,蓝骑士与平台交流了配送安全问题。饿了么表示,线上将技术手段融入安全防护;线下将持续进行安全培训,并试点智能头...【详细内容】
2021-12-17    金融界  Tags:饿了么   点击:(24)  评论:(0)  加入收藏
开源最前线(ID:OpenSourceTop) 猿妹编译项目地址: https://github.com/restic/restic全球知名代码托管平台 GitHub 今天就重磅发布了今年的年度报告&mdash;&mdash;《2021 年度 O...【详细内容】
2021-12-17  Python部落    Tags:   点击:(9)  评论:(0)  加入收藏
新京报快讯 据中国网络视听节目服务协会网站消息,12月15日,中国网络视听节目服务协会发布了《网络短视频内容审核标准细则》(2021)。中国网络视听节目服务协会组织有关短视频平...【详细内容】
2021-12-16    新京报  Tags:短视频   点击:(11)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条