阿里云物模型物联网平台初探(python)
前言
家里买了个天猫精灵,发现这些随便加了个传感器的东西都好贵,想着自己做一个巨无霸整合传感器,剩下一大笔money。毕设也可以往这方面发展。
具体的步骤看官网的吧,稍微踩了点坑。初步的python示例在下面。
mqtt协议的学习光看官方文档还是有点枯燥,这里观看了b站的视频
MQTT协议视频
小白一个,都是本人的拙见,有错误欢迎指正,没有怎么正经学过,人菜勿骂。
无脑复制文档代码的后果
查了小半个小时,最后发现官方给的实例代码,居然是类复用的时候用的,想直接写进去调试,得把self去掉,实际开发肯定还是直接复用吧。
然后就是一定要先把json文件下载下来,我就在下载下来以后,放进同一文件夹,然后就没有后续了。。。想了好半天才发现。
然后就是在物模型上发现,在从云端设置属性的时候,阿里云的sdk是多进程操作的,直接在回调函数中设置全局变量并不能改掉属性值。初步考虑设个管道?常用的多进程通信操作,后面想了想,实际开发好像直接读写引脚更容易实现和理解。
总之最后是基本可以实现两边的通信了,下面打算连接板子试试看,正好有一块k210.课设试试做个人脸门锁,能上云的,k210资源还是挺丰富的,人脸模型直接用就行。拼积木的课设有点让人害羞。
import json
from linkkit import linkkit
lk = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="你的key",
device_name="设备名称",
device_secret="设备密码!不是产品")
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):
# 设备端的接收到的数据却是b:"123"用了一个切片去处理数据
print("阿里云上传回的数值是:", str(payload))
# 拿到接收来的数据
data = str(payload)[2:-1]
print("阿里云上传回的数值是:", data)
dataDict = json.loads(data)
print(topic)
print(qos)
print(userdata)
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 on_thing_enable(userdata):
print("on_thing_enable")
def on_thing_disable(userdata):
print("on_thing_disable")
def on_thing_prop_post(request_id, code, data, message, userdata):
print("on_thing_prop_post request id:%s, code:%d, data:%s message:%s" %
(request_id, code, str(data), message))
def on_thing_event_post(event, request_id, code, data, message, userdata):
print("on_thing_event_post event:%s,request id:%s, code:%d, data:%s, message:%s" %
(event, request_id, code, str(data), message))
def on_thing_prop_changed(params, userdata):
# 多进程操作,数据并不共享。现实使用直接读取引脚建议。
global prop_data
prop_data['NightLightSwitch'] = params['NightLightSwitch']
lk.thing_post_property(prop_data)
print('xiugai', prop_data['NightLightSwitch'])
def on_thing_call_service(identifier, request_id, params, userdata):
print("on_thing_call_service identifier:%s, request id:%s, params:%s" %
(identifier, request_id, params))
# 注册接收到云端数据的方法
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.thing_setup("objdect_model.json")
# 物模型可用?
lk.on_thing_enable = on_thing_enable
lk.on_thing_disable = on_thing_disable
# 属性
lk.on_thing_prop_post = on_thing_prop_post # 每改变一次就要提交一次。
lk.on_thing_prop_changed = on_thing_prop_changed
# 事件️
lk.on_thing_event_post = on_thing_event_post
# 服务器一步响应
lk.on_thing_call_service = on_thing_call_service
# 连接mqtt
lk.connect_async()
time.sleep(2)
prop_data = {
"NightLightSwitch": 1,
}
while True:
if prop_data['NightLightSwitch'] == 1:
prop_data['NightLightSwitch'] = 0
else:
prop_data['NightLightSwitch'] = 1
time.sleep(5)
print('ziji',prop_data['NightLightSwitch'])
pass