用python通过MQTT协议去连接阿里云来实现数据的上下交互(并将得到的云上数据发送到某人的QQ邮箱中)

库函数的需要

  首先我们需要下载一个模块,可以使用pip命令进行安装

pip install aliyun-iot-linkkit

(这篇博文撰写的时候,他的版本处在1.2.0)

任务描述

  首先,我们需要在阿里云平台上创建一个产品和一台设备,然后本地程序通过连接这台云上设备来进行数据的上下交换。数据的交互我们凭借的是阿里云上自带的规则引擎去实现的(这些我都会一一讲述如何实现)对于将数据传递到QQ邮箱,我会在下面进行介绍,下面紧跟着的代码是没有这个功能的。

如何创建阿里云上的设备

  这个问题在我之前的文章 已经写过了,可以前往那篇文章进行查看,在云端的创建上是一模一样的 :https://blog.csdn.net/qq_19408097/article/details/96346936

如何创建一条新的云上数据传输规则

  这个问题在我之前的文章 已经写过了,可以前往那篇文章进行查看,在云端的创建上是一模一样的 :https://blog.csdn.net/qq_19408097/article/details/96452193

本地代码

本地代码如下,有些数据需要填入自己的信息:

from linkkit import linkkit
import time
import json
	//连接阿里云
def on_connect(session_flag, rc, userdata):
    print("on_connect:%d,rc:%d,userdata:" % (session_flag, rc))
    pass
    //取消连接阿里云
def on_disconnect(rc, userdata):
    print("on_disconnect:rc:%d,userdata:" % rc)
def on_subscribe_topic(mid, granted_qos, userdata):#订阅topic
    print("on_subscribe_topic mid:%d, granted_qos:%s" %
          (mid, str(','.join('%s' % it for it in granted_qos))))
    pass
    //接收云端的数据
def on_topic_message(topic, payload, qos, userdata):
    #print("on_topic_message:" + topic + " payload:" + str(payload) + " qos:" + str(qos))
    //不知道为什么下行的数据是“123”,设备端的接收到的数据却是b:"123"
    //所以我在这里用了一个切片去处理数据
    print("阿里云上传回的数值是:",str(payload)[2:-1])
    pass
//终止订阅云端数据
def on_unsubscribe_topic(mid, userdata):
    print("on_unsubscribe_topic mid:%d" % mid)
    pass
//发布消息的结果,判断是否成功调用发布函数
def on_publish_topic(mid, userdata):
    print("on_publish_topic mid:%d" % mid)
//设置连接参数,方法为“一机一密”型
lk = linkkit.LinkKit(
    host_name="cn-shanghai",//填自己的host_name
    product_key="***",//填自己的product_key
    device_name="***",//填自己的device_name
    device_secret="***")//填自己的device_secret
//注册接收到云端数据的方法
lk.on_connect = on_connect
//注册取消接收到云端数据的方法
lk.on_disconnect = on_disconnect
//注册云端订阅的方法
lk.on_subscribe_topic = on_subscribe_topic
//注册当接受到云端发送的数据的时候的方法
lk.on_topic_message = on_topic_message
//注册向云端发布数据的时候顺便所调用的方法
lk.on_publish_topic = on_publish_topic
//注册取消云端订阅的方法
lk.on_unsubscribe_topic = on_unsubscribe_topic

//连接阿里云的函数(异步调用)
lk.connect_async()
//因为他是他是异步调用需要时间所以如果没有这个延时函数的话,他就会出现not in connected state的错误
time.sleep(2)
//订阅这个topic,不需要写prodect_key和device_name
rc, mid = lk.subscribe_topic(lk.to_full_topic("user/get"))
a=input("你想要将什么数值传到阿里云上去?")
//调用数据上传的函数,将string类的a上传到阿里云上去
rc, mid = lk.publish_topic(lk.to_full_topic("user/update"), str(a))

数据的检查

  我们将数据上传到云上去了以后,我们可以登陆我们的阿里云,然后前往日记服务中查看我们的数据是否如我们所想的那样,已经在云上走了一遭了。

附:将云上得到的数据发送到某人的QQ邮箱里面去

  这里我们采用的是SMTP协议,关于这个这个协议的使用我在之前的一篇文章中有具体的讲过,可以前往那篇文章中查看:https://blog.csdn.net/qq_19408097/article/details/100546889

具体代码如下:

from linkkit import linkkit
import time #应对异步调用
import json #数据的处理(其实到头来完全没有用到...import smtplib#邮件发送的模块
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def on_connect(session_flag, rc, userdata):#连接阿里云
    print("on_connect:%d,rc:%d,userdata:" % (session_flag, rc))
    pass
def on_disconnect(rc, userdata):#取消连接阿里云
    print("on_disconnect:rc:%d,userdata:" % rc)
def on_subscribe_topic(mid, granted_qos, userdata):#订阅topic
    print("on_subscribe_topic mid:%d, granted_qos:%s" %
          (mid, str(','.join('%s' % it for it in granted_qos))))
    pass
def on_topic_message(topic, payload, qos, userdata):#接收云端的数据
    toaddr=input("请输入你要接收阿里云回传数据的QQ邮箱")
    #print("on_topic_message:" + topic + " payload:" + str(payload) + " qos:" + str(qos))
    print("阿里云上传回的数值是:",str(payload)[2:-1])#不知道为什么下行的数据是“123”,设备端的接收到的数据却是b:"123"
    send_email(toaddr,str(payload)[2:-1])
    pass#所以我在这里用了一个切片去处理数据
def on_unsubscribe_topic(mid, userdata):#终止订阅云端数据
    print("on_unsubscribe_topic mid:%d" % mid)
    pass
def on_publish_topic(mid, userdata):#发布消息结果
    print("on_publish_topic mid:%d" % mid)

def send_email(toaddr,message):#发送邮件的方法
    fromaddr = "***"#发送端的qq邮箱号码
    #toaddr = "***"#邮件接收端的qq邮箱号码
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr 
    msg['Subject'] = "阿里云的回传数据"
    body = message
    msg.attach(MIMEText(body, 'plain'))
    server = smtplib.SMTP("smtp.qq.com",587)
    server.starttls()
    server.login(fromaddr , "***")#邮件发出端的密钥
    text = msg.as_string()
    server.sendmail(fromaddr, toaddr, text)
    server.quit()

lk = linkkit.LinkKit(#设置连接参数,方法为“一机一密”型
    host_name="cn-shanghai",#自己的host_name
    product_key="***",#自己的product_key
    device_name="***",#自己的device_name
    device_secret="***")#自己的device_secret
lk.on_connect = on_connect
lk.on_disconnect = on_disconnect
lk.on_subscribe_topic = on_subscribe_topic
lk.on_topic_message = on_topic_message#注册接收到云端数据的方法
lk.on_publish_topic = on_publish_topic#注册云端发布消息结果的方法
lk.on_unsubscribe_topic = on_unsubscribe_topic#注册取消云端订阅的方法

lk.connect_async()#连接阿里云的函数(异步调用)
time.sleep(10)#因为他是他是异步调用需要时间所以如果没有这个延时函数的话,他就会出现not in connected state的错误
rc, mid = lk.subscribe_topic(lk.to_full_topic("user/get"))#订阅这个topic,不需要写prodect_key和device_name
a=input("你想要将什么数值传到阿里云上去?")
rc, mid = lk.publish_topic(lk.to_full_topic("user/update"), str(a))#调用数据上传的函数,将string类的a上传到阿里云上去

总结

  总的来说,用python写的代码比我之前用C#写的要简单的多,所以在这一点上,我建议还是用python去写这个程序,尽管其实阿里云提供的python的SDK其实有点乱,但能用还是可以用的,只是可能原本可以再简单一些的。

发布了39 篇原创文章 · 获赞 69 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_19408097/article/details/100862733