简介:包括内容如下(详细到每一个细节和步骤,如果还不清楚,可以进入阿里云控制台创建工单,请教阿里的工程师) 使用环境:(使用蜂窝网进行过测试,和WiFi直连并无差别,可以直接使用)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812100659309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
一、阿里云账号说明
1、基本功能说明
进入阿里云官网创建主账号
https://www.aliyun.com/?spm=a2c4g.11186623.amxosvpfn.2.15f5293ewZtPYC 创建完成之后,进入控制台并选择Access Key管理,如图所示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812100353236.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
创建子账号,并将物联网平台的所有权限给予子账号,以后我们就用子账号进行各类操作,注意保存得到的三元组,这是接入物联网平台的关键之一 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812100427963.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
2、开通物联网服务
https://www.aliyun.com/product/iot?spm=5176.10695662.J_3717714080.2.1ce83318Gaytdw 选择开通即可,前两个月赠送的免费消息足够用了,选择进入管理控制台 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812100459653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
https://iot.console.aliyun.com/lk/summary ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020081210050792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
指出来的这几个是需要用到的功能
二、物联网平台的基本使用
1、创建产品,如下图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812101006604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
2、添加设备
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812101031647.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
三、设备接入物联网平台
1、开发环境设置
https://help.aliyun.com/document_detail/98292.html?spm=a2c4g.11186623.6.683.7d5b1f19UYzxqv 环境win10,pycharm2020,python3.8(Ubuntu16 64-bit和Ubuntu18 arm架构同理) (1)python3.8的安装和pycharm的安装略过(python3.8需要安装pip下载工具) (2)环境配置 无需参考官方文档配置虚拟环境,直接用pycharm就好了 直接win+R进入win10命令行控制环境 输入:
pip install aliyun-iot-linkkit
2、连接
https://help.aliyun.com/document_detail/98293.html?spm=a2c4g.11186623.6.684.61c84912ccMTDp 使用一机一密方式进行
from linkkit import linkkit
import sys
#一机一密认证
lk = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="aG*******k",
device_name="Test1",
device_secret="****************")
#连接上物联网平台后的回调,成功连接session_flag和rc返回0
def onconnect(sessionflag, rc, userdata):
print("onconnect:%d,rc:%d:" % (sessionflag, rc))
pass
#断开连接物联网平台后的回调,断开后rc返回1
def on_disconnect(rc, userdata):
print("on_disconnect:rc:%d:" % rc)
#当出现网络波动时,程序会自动循环调用连接,显示的效果为这两个回调函数会被一直调用
lk.onconnect = onconnect
lk.ondisconnect = ondisconnect
lk.connect_async() # 连接物联网平台
lk.startworkerloop() # 保持连接
print("connected")
注意
1、lk后面的是你创建产品设备对应的三元组| 2、注意所有的回调函数放在连接之前,程序会一直执行,只要出现相应的操作回调函数就会被调用,即只要连接上时,就输出rc=0,只要断开连接时,就输出rc=1 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812101356794.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
3、自定义MQTT通信
(1)创建自定义的Topic(注意:Topic的权限与代码中的函数要一一对应,例如权限为订阅,那么在通信时选择的应该是subscribe回调,可以接收到云端消息,发布同理)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200812101411485.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
Topic的名字是作为通信的凭证 ![](https://img-blog.csdnimg.cn/20200812101419208.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE1NTY3Mw==,size_16,color_FFFFFF,t_70#pic_center)
(2)实现(首先需要连接上阿里云物联网平台,再构造逻辑进行相应操作,https://help.aliyun.com/document_detail/98295.html?spm=a2c4g.11186623.6.685.6d596dc9OWMDE9)
from linkkit import linkkit
import sys
import time
#一机一密认证
lk = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="a*************Gk",
device_name="Test1",
device_secret="****************************")
#连接上物联网平台后的回调,成功连接session_flag和rc返回0
def onconnect(sessionflag, rc, userdata):
print("onconnect:%d,rc:%d:" % (sessionflag, rc))
pass
#断开连接物联网平台后的回调,断开后rc返回1
def on_disconnect(rc, userdata):
print("on_disconnect:rc:%d:" % rc)
#订阅topic回调
def onsubscribetopic(mid, granted_qos, userdata):
print("onsubscribetopic mid:%d, granted_qos:%s" %
(mid, str(','.join('%s' % it for it in granted_qos))))
pass
#取消订阅回调
def onunsubscribetopic(mid, userdata):
print("onunsubscribetopic mid:%d" % mid)
pass
#接收消息回调,调用函数时会一直执行print,效果为:如果调用该方法,发布消息的topic每次发布消息都会被输出到控制台并打印出来
def ontopicmessage(topic, payload, qos, userdata):
print("ontopicmessage:" + topic + " payload:" + str(payload) + " qos:" + str(qos))
pass
#当出现网络波动时,程序会自动循环调用连接,显示的效果为这两个回调函数会被一直调用
lk.onconnect = onconnect
lk.ondisconnect = ondisconnect
lk.onsubscribetopic = onsubscribetopic # 订阅topic回调
lk.onunsubscribetopic = onunsubscribetopic # 取消订阅topic回调
lk.ontopicmessage = ontopicmessage # 接收topic消息回调
lk.connect_async() # 连接物联网平台
lk.startworkerloop() # 保持连接
print("connected")
#增加while循环的作用:保证物联网平台是连接上之后再进行通信的
while True:
try:
msg = input() # 获取从控制台的输入
except KeyboardInterrupt:
sys.exit()
else:
if msg == "1":
lk.disconnect()
elif msg == "2":
lk.connect_async()
elif msg == "3": # 输入为3时,订阅get这个topic,每个订阅的topic只需订阅一次即可,会在物联网平台的设备topic列表中显示
rc, mid = lk.subscribetopic(lk.tofull_topic("user/get")) # 注意topic只需要写成这样的格式即可,格式需要完全一致,全称会自动补全,不需要输入设备名
if rc == 0: # rc返回值为0时则表示订阅成功
print("subscribe topic success:%r, mid:%r" % (rc, mid))
else:
print("subscribe topic fail:%d" % rc)
elif msg == "4": # 取消订阅
rc, mid = lk.unsubscribetopic(lk.tofull_topic("user/get"))
if rc == 0:
print("unsubscribe topic success:%r, mid:%r" % (rc, mid))
else:
print("unsubscribe topic fail:%d" % rc)
elif msg == "5": # 发布消息“123”给自定义的reciver这个topic
rc, mid = lk.publishtopic(lk.tofull_topic("user/test"), "123")
if rc == 0:
print("publish topic success:%r, mid:%r" % (rc, mid))
else:
print("publish topic fail:%d" % rc)
elif msg == "6": # 同时订阅多个topic
rc, mid = lk.subscribetopic([(lk.tofull_topic("user/sender"), 1),
(lk.tofulltopic("user/get"), 1),
(lk.tofulltopic("user/test"), 1)]
|