OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3907|回复: 0

人工智能应用实操:手把手教你用Python控制IoT智能硬件

[复制链接]

183

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
812
金钱
812
注册时间
2020-5-19
在线时间
78 小时
发表于 2020-12-7 14:14:54 | 显示全部楼层 |阅读模式
人工智能和机器学习的火热,将Python语言的热度带到了一个新高度,朋友圈经常刷到的Python小课,甚至让很多非技术的同学一度怀疑,不会点Python都不好意思说自己是现代人。关于Python的基础知识,网上内容很多,感兴趣的都可以找到大量资料学习。本篇文章,我主要从一些读者关注的问题出发,比如在各种IoT智能设备普及的今天,如何利用Python去控制智能硬件,实现一些功能演示呢?比如我们可以利用Python控制灯泡的开关、亮度调节、颜色变化等等。
实际上,这些控制硬件设备的能力,并不需要你完全自己去开发程序实现,通过现成的平台,通过简单的Python代码编程,就可以实现智能设备的控制和交互,真正让你掌握软件和硬件能力的打通。
下面,我会利用涂鸦云开发平台手把手教你如何使用该平台并通过 Python 调用相关 API 控制一款智能设备。利用涂鸦云开发平台,您可以获取涂鸦 IoT 平台 OpenAPI 的调用权限。通过简单的代码编程就可以轻易控制 Powered By Tuya 智能设备。
物料清单
硬件:一款智能硬件设备,任何 Powered By Tuya 设备皆可,您也可以前往涂鸦智选平台采购样品。
软件:一款 Python IDE,例如 PyCharm、VS Code、IDLE 等
步骤第 1 步:创建云开发项目
想要使用涂鸦API,您需要先在 涂鸦云开发平台 创建一个项目。


创建成功后,在项目详情页面,您可以获得授权密钥(Access ID 和 Access Secret 的组合)。请复制出来妥善保管,调用 API 时您需要用到授权密钥。


第 2 步:关联设备到项目
使用涂鸦 OpenAPI 主要是为了控制智能设备,所以我们需要先将设备关联到云开发项目中。
设备关联方式
涂鸦提供了4种关联设备的维度:
由于前 3 种需要您开发智能硬件产品或移动应用,为了快速体验 IoT 应用构建流程,本文使用第 4 种方式关联设备关联。
  • 推荐方式一:使用涂鸦智能 App 添加智能设备
  • 推荐方式二:添加虚拟设备
如果您没有可用的 Powered By Tuya 设备,您还可以通过添加虚拟设备来完成调试。
  • 关联产品下的设备:通过产品 PID 关联您开发的智能设备。
  • 关联微信小程序配网添加的设备:通过 App schema 关联您开发的小程序下的设备。
  • 关联 App 配网添加的设备:通过 App schema 关联您开发的 App 下的设备。
  • 关联 App 账号下的设备:通过使用涂鸦智能 App 关联您的 IoT 账号里配网的设备。
  • 在手机里安装涂鸦智能 App 或智能生活 App。
  • 将智能设备配网到 App。
  • 打开云开发 关联设备 页面。
  • 选择 关联 App 账号下的设备 页签。
  • 使用涂鸦智能 App 进行扫码即可将账号下的所有设备授权给云开发项目使用。
  • 智能设备关联到云开发项目后,您可以在 设备管理 > 设备列表 查看到通过各种方式关联的设备。
  • 添加完成后,可以先将设备 ID 复制出来备用,假设您获取的设备 ID 为6c7asa9b55fs632c12zcwy。
  • 打开云开发 虚拟设备 页面。
  • 选择 添加虚拟设备
  • 选择一款产品,然后选择 添加虚拟设备 > 关联到涂鸦 App 账号
  • 使用涂鸦智能 App 进行扫码即可将账号下的虚拟设备授权给云开发项目使用。虚拟设备都被独立放置在 设备管理 > 虚拟设备 页面。
  • 添加完成后,可以先将设备 ID 复制出来备用,假设您获取的虚拟设备 ID 为 vdevo160544422718591。
第 3 步:申请 API 调用权限
涂鸦 IoT 平台 OpenAPI 默认是非开通状态,您需要以分组为单位发起 API 开通申请方可使用。如果您调用未开通的 API,将产生权限不足的调用错误。
本文操作中,您需要在 云开发 API 分组页面 申请的 API 分别为 授权管理、设备管理、设备控制。


至此,在涂鸦云开发平台上的准备工作已经完成,接下来请选择任意一个Python IDE 进行接下来的编程实践。

第 4 步:调用 API 控制设备
本步骤中所有涉及的 Python 代码已经打包生成为 python_iot_code_sample.py,您可以提前下载使用。
4.1 获取 access_token
涂鸦 IoT 采用 HMAC-SHA256 创建摘要,根据不同应用场景,云开发平台提供两套签名算法。其中,令牌管理接口(获取令牌、刷新令牌)算法如下:
sign = HMAC-SHA256(client_id + t, secret).toUpperCase()
以下为对应的 Python 应用代码逻辑:
# 从云开发项目获得的授权密钥client_id = '3meqtq4x9wr22a90lee4'secret = '7b121dd8196043f3b6944250fa3ad4ab'# 各接口使用方请根据自身所在区域调用相应接口。# 中国区 https://openapi.tuyacn.com  # 美洲区 https://openapi.tuyaus.com  # 欧洲区 https://openapi.tuyaeu.com   # 印度区 https://openapi.tuyain.combase = 'https://openapi.tuyacn.com'# 签名算法函数def calc_sign(msg,key):  import hmac  import hashlib  sign = hmac.new(msg=bytes(msg, 'latin-1'),key = bytes(key, 'latin-1'), digestmod = hashlib.sha256).hexdigest().upper()  return signimport timeimport requestst = str(int(time.time()*1000))r = requests.get(base+'/v1.0/token?grant_type=1',                 headers={                    'client_id':client_id,                    'sign':calc_sign(client_id+t, secret),                    'secret':secret,                    't':t,                    'sign_method':'HMAC-SHA256',                  })res = r.json()['result']print(res)4.2 编写通用请求函数
所有业务 API 都需要带公共参数,为了避免重复繁琐的操作,建议您编写 GET 和 POST 请求,方便后续使用。同时,业务接口的签名算法与之前步骤中获取 Token 时使用的不同,算法如下:
sign = HMAC-SHA256(client_id + access_token + t, secret).toUpperCase()
以下为对应的 Python 应用代码逻辑:
import json# get 请求函数def GET(url, headers={}):  t = str(int(time.time()*1000))  default_par={      'client_id':client_id,      'access_token':res['access_token'],      'sign':calc_sign(client_id+res['access_token']+t, secret),      't':t,      'sign_method':'HMAC-SHA256',        }  r = requests.get(base + url, headers=dict(default_par,**headers))  r = json.dumps(r.json(), indent=2, ensure_ascii=False) # 美化request结果格式,方便打印查看  return r# post 请求函数def POST(url, headers={}, body={}):  import json  t = str(int(time.time()*1000))  default_par={      'client_id':client_id,      'access_token':res['access_token'],      'sign':calc_sign(client_id+res['access_token']+t, secret),      't':t,      'sign_method':'HMAC-SHA256',        }  r = requests.post(base + url, headers=dict(default_par,**headers), data=json.dumps(body))  r = json.dumps(r.json(), indent=2, ensure_ascii=False) # 美化request结果格式,方便打印查看  return r4.3 双向控制设备
通过 获取设备最新状态 的 API,您可以获得设备的最新状态,需要使用设备 ID 作为参数调用 API。
以下为对应的 Python 应用代码逻辑:
# 云开发项目里关联设备的IDdevice_id = '65057368c44f3380cc4b'r = GET(url=f'/v1.0/devices/{device_id}/status')print(r)
返回结果示例如下所示,更多详情,请参考智能设备的 指令集:
{  "result": [    {      "code": "switch",      "value": true    },    {      "code": "countdown_1",      "value": 0    },    {      "code": "cur_current",      "value": 68    },    {      "code": "cur_power",      "value": 3    },    {      "code": "cur_voltage",      "value": 2125    }  ],  "success": true,  "t": 1606880360840}
在控制一个未知的设备之前,有时您并不知道可以下发哪些指令来控制设备。这时就可以先用这个 API 获得这个设备所有可用的控制指令,然后再下发具体指令来控制设备。
r = GET(url=f'/v1.0/devices/{device_id}/functions')print(r)
以智能插座为例,返回结果示例如下:
{  "result": {    "category": "cz",    "functions": [      {        "code": "switch",        "desc": "[插座]开关",        "name": "开关",        "type": "Boolean",        "values": "{}"      },      {        "code": "countdown_1",        "desc": "开关1倒计时",        "name": "开关1倒计时",        "type": "Integer",        "values": "{\"unit\":\"s\",\"min\":0,\"max\":86400,\"scale\":0,\"step\":1}"      }    ]  },  "success": true,  "t": 1606880309547}
获取到设备指令集后,您可以调用 下发设备指令 API 来控制智能设备。
# 根据该设备的控制指令集组装参数d = {"commands":[{"code":"switch","value":True},]}r = POST(url=f'/v1.0/devices/{device_id}/commands', body=d)print(r)
返回结果示例:
{  "result": true,  "success": true,  "t": 1606880463013}
详情 :基于涂鸦云开发平台的 Python IoT 开发实践 (tuya.com)
小结
本文介绍了如何使用 Python 基于涂鸦云开发平台,调用基础 API 控制一个智能设备。由于 Powered By Tuya 设备体系严格的统一性,您可以将这个控制方式拓展到所有 Powered By Tuya 设备中。让您无需考虑设备异构性,能够快速构建 IoT 应用和服务。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 17:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表