阿里云物联网平台体验(树莓派+Python篇)

栏目: Python · 发布时间: 5年前

阿里云物联网平台体验 ( 树莓派 +Python )

虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台( Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作。但是同时也见证了阿里云物联网团队从几十人到数百人的迅速扩张,其物联网平台所承载的内容也急速膨胀,物联网开发套件基础版、飞凤、 Link Develop 一站式开发平台、物联网开发平台高级版、飞燕、飞象、城市大脑、农业大脑和工业互联平台不一而足 …… ,很难有精力真正熟悉和了解阿里云的每一款物联网产品。

这次有幸成为物联网平台的阿里云 MVP 体验官,可以从另外一个角度来体验阿里云物联网平台了。最早我们都是基于 MCU 单片 +.NET MF 平台,直接采用 MQTT 协议实现相关的代码对接阿里云平台,虽然也可以基于组态配置很灵活地接入物联网平台,但是对一些 WEB AI 和云端开发的人来说还是有些陌生。正是因为这些需求, JS Java Python 这些高级语言已经走入了硬件开发,可以直接在 MCU 芯片上运行,大大提速了物联网云和端的连接工作。

本篇文章就是采用高级语言 Python 基于树莓派进行物联网云端对接的(后续篇幅会介绍 nodejs 的云端对接)。

下面是阿里云团队快递过来的相关测试硬件:

阿里云物联网平台体验(树莓派+Python篇)

1、 树莓派 3B+   自带 wifi 和蓝牙

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 灯模块,通过云端下达的指令,控制灯亮和灯灭。

树莓派的管脚定义图如下 :

阿里云物联网平台体验(树莓派+Python篇)

DHT11 模块共 3 根线,属于单总线通信,电源线我们接入 5V-4pin ,地线我们接入 GND-6pin ,通信 pin 我们接入 GPIO16-36pin LED 模块也是 3 根线,我们电源线接入 3V3-1pin ,地线接入 GND-9pin ,控制线接入 GPIO4-7pin

阿里云物联网平台体验(树莓派+Python篇)

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 年曾经写过一篇博文,想了解比较深入的可以参考一下(相关链接: https://blog.csdn.net/yfiot/article/details/5996524 )。

阿里云物联网平台体验(树莓派+Python篇)

由于代码比较多,所以我们封装为一个函数,并且可以同时返回两个值,一个是温度 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- 表示开灯

阿里云物联网平台体验(树莓派+Python篇)

这个定义好后,我们创建设备,并且获取设备的三元组。由于官方提供的示例仅仅是模拟数据,并且是单向上传,我们需要改造一下。

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 的值,我们开灯或者关灯。

相关代码修改好后,我们就可以上传到树莓派设备,开始运行了,如下图所示:

阿里云物联网平台体验(树莓派+Python篇)

这个时候我们查看云端设备的状态,会发现数据已经正常上传到云端了。

阿里云物联网平台体验(树莓派+Python篇)

我们在云端产品的在线调试面板进行数据下发测试

阿里云物联网平台体验(树莓派+Python篇)

我们发送 0 1 ,会发现 LED 灭或亮了。

以上,我们会发现通过我们所熟悉的 Python 语言,就可以轻松编写物联网代码了。

本文相关的代码文件: alios_ht_all.py


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂XML讲义

疯狂XML讲义

李刚 / 电子工业出版社 / 2009-11 / 65.00元

《疯狂XML讲义》主要以XML为核心,深入地介绍了XML的各种相关知识。《疯狂XML讲义》作为疯狂Java体系图书之一,依然保持该体系图书系统、全面的特点:不仅详细介绍了XML,文档的各种知识,还通过案例示范了实际开发中如何应用XML知识。 《疯狂XML讲义》主要分为五个部分。第一部分介绍了XML、DTD、XML Schema等基础知识,这些知识主要教读者如何定义有效的XML文档,这部分内容......一起来看看 《疯狂XML讲义》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码