阿里云物联网平台体验(树莓派 + Python 篇)
虽然对阿里云物联网平台比较熟悉了, 从一开始就有幸参与了飞凤平台 (Link Develop 一站式开发平台的前身) 的一些偏硬件接入的工作. 但是同时也见证了阿里云物联网团队从几十人到数百人的迅速扩张, 其物联网平台所承载的内容也急速膨胀, 物联网开发套件基础版, 飞凤, Link Develop 一站式开发平台, 物联网开发平台高级版, 飞燕, 飞象, 城市大脑, 农业大脑和工业互联平台不一而足......, 很难有精力真正熟悉和了解阿里云的每一款物联网产品.
这次有幸成为物联网平台的阿里云 MVP 体验官, 可以从另外一个角度来体验阿里云物联网平台了. 最早我们都是基于 MCU 单片 +.NET MF 平台, 直接采用 MQTT 协议实现相关的代码对接阿里云平台, 虽然也可以基于组态配置很灵活地接入物联网平台, 但是对一些 web,AI 和云端开发的人来说还是有些陌生. 正是因为这些需求, JS,Java,Python 这些高级语言已经走入了硬件开发, 可以直接在 MCU 芯片上运行, 大大提速了物联网云和端的连接工作.
本篇文章就是采用高级语言 Python 基于树莓派进行物联网云端对接的(后续篇幅会介绍 Node.JS 的云端对接).
下面是阿里云团队快递过来的相关测试硬件:
1, 树莓派 3B+ 自带 Wi-Fi 和蓝牙
2, DHT11 温湿度模块
3, LED 灯模块
第一步: 我们需要为树莓派安装操作系统
我们安装的是 Raspbian 固件, 可以按如下链接介绍的步骤进行安装: https://www.yuque.com/cloud-dev/iot-tech/ig269q
第二步: 安装阿里云平台的 Python SDK
执行如下指令:$ pip install aliyun-python-sdk-iot-client
第三步: 代码编写
在阿里云平台的说明文档: https://www.yuque.com/cloud-dev/iot-tech/rz6fpl 中已经提供了一个示例代码, 不过功能相对简单, 就是把两个随机数送到云端.
我们设计一个相对复杂的场景, 我们首先要实现双向通信, 不仅仅把传感器数据送到云端, 我们还要让云端下发一个指令, 控制相关的设备.
上传数据我们选择一个真实的传感器 DHT11, 可以获取温度和湿度值. 另外还有一个 LED 灯模块, 通过云端下达的指令, 控制灯亮和灯灭.
树莓派的管脚定义图如下:
DHT11 模块共 3 根线, 属于单总线通信, 电源线我们接入 5V-4pin, 地线我们接入 GND-6pin, 通信 pin 我们接入 GPIO16-36pin.LED 模块也是 3 根线, 我们电源线接入 3V3-1pin, 地线接入 GND-9pin, 控制线接入 GPIO4-7pin.
LED 的控制相对容易, 就是控制管脚的高低电平即可.
- led_pin = 4 //GPIO 为 4
- GPIO.setmode(GPIO.BCM) //BCM 的 GPIO 定义
- GPIO.setup(led_pin, GPIO.OUT) // 设置为输出模式
点亮灯:
GPIO.output(led_pin, GPIO.HIGH)
关闭灯:
GPIO.output(led_pin, GPIO.LOW)
DHT11 相对比较复杂, 我 2010 年曾经写过一篇博文, 想了解比较深入的可以参考一下(相关链接:).
由于代码比较多, 所以我们封装为一个函数, 并且可以同时返回两个值, 一个是温度 T, 一个是湿度 H.
网上大部分 Python 的实例都是读一次温湿度的, 如果要连续读, 必须间隔 3 秒左右, 否则很容易失败. 由于 Linux 不是实时系统, 我们发现即使间隔 3 秒, 无法正确获取温湿度值的现象也时有发生, 并且有时候居然也有通过校验的错误值出现.
DHT11 的数据 Pin 接入的是 GPIO16, 所以我们定义 pin 的代码如下:
dht_pin =16
封装函数的代码如下:
- def GetDTH():
- data = []
- j = 0
- GPIO.setup(dht_pin, GPIO.OUT)
- GPIO.output(dht_pin, GPIO.LOW)
- time.sleep(0.02)
- GPIO.output(dht_pin, GPIO.HIGH)
- GPIO.setup(dht_pin, GPIO.IN)
- while GPIO.input(dht_pin) == GPIO.LOW:
- continue
- while GPIO.input(dht_pin) == GPIO.HIGH:
- continue
- while j <40:
- k = 0
- while GPIO.input(dht_pin) == GPIO.LOW:
- continue
- while GPIO.input(dht_pin) == GPIO.HIGH:
- k += 1
- if k> 100:
- break
- if k < 8:
- data.append(0)
- else:
- data.append(1)
- j += 1
- humidity_bit = data[0:8]
- humidity_point_bit = data[8:16]
- temperature_bit = data[16:24]
- temperature_point_bit = data[24:32]
- check_bit = data[32:40]
- humidity = 0
- humidity_point = 0
- temperature = 0
- temperature_point = 0
- check = 0
- for i in range(8):
- humidity += humidity_bit[i] * 2 ** (7-i)
- humidity_point += humidity_point_bit[i] * 2 ** (7-i)
- temperature += temperature_bit[i] * 2 ** (7-i)
- temperature_point += temperature_point_bit[i] * 2 ** (7-i)
- check += check_bit[i] * 2 ** (7-i)
- tmp = humidity + humidity_point + temperature + temperature_point
- if check == tmp:
- return temperature,humidity
- else:
- print "wrong"
- return 0,0
这些准备工作做好后, 我们要在云端定义相关产品和设备了. 和阿里云官方示例不一样的是, 我们额外增加了一个属性 LED, 具备读写能力, 枚举型变量, 0 - 表示关灯, 1 - 表示开灯
这个定义好后, 我们创建设备, 并且获取设备的三元组. 由于官方提供的示例仅仅是模拟数据, 并且是单向上传, 我们需要改造一下.
在 main 函数里, 增加这句代码:
client.on_message = on_message
表示我们可以获取云端推送的信息.
我们云端推送的信息内容如下:
{"method":"thing.service.property.set","id":"169885527","params":{"LED":1},"version":"1.0.0"}
我们需要获取 LED 的值, 所以 on_message 函数我们要增加一些内容:
- setjson = JSON.loads(msg.payload)
- led = setjson['params']['LED']
- GPIO.output(led_pin,(GPIO.HIGH if led==1 else GPIO.LOW ))
根据 led 的值, 我们开灯或者关灯.
相关代码修改好后, 我们就可以上传到树莓派设备, 开始运行了, 如下图所示:
这个时候我们查看云端设备的状态, 会发现数据已经正常上传到云端了.
我们在云端产品的在线调试面板进行数据下发测试
我们发送 0 或 1, 会发现 LED 灭或亮了.
以上, 我们会发现通过我们所熟悉的 Python 语言, 就可以轻松编写物联网代码了.
本文相关的代码文件: alios_ht_all.py
来源: https://www.cnblogs.com/yefanqiu/p/10063296.html