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

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

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

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

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

904625c55030b9923fc58bd846b7477b548c4731

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

二、 DHT11温湿度模块app

三、 LED灯模块函数

第一步:咱们须要为树莓派安装操做系统测试

咱们安装的是Raspbian固件,能够按以下连接介绍的步骤进行安装:https://www.yuque.com/cloud-dev/iot-tech/ig269q阿里云

第二步:安装阿里云平台的Python SDKspa

执行以下指令:$ pip install aliyun-python-sdk-iot-client

第三步:代码编写

在阿里云平台的说明文档:https://www.yuque.com/cloud-dev/iot-tech/rz6fpl 中已经提供了一个示例代码,不过功能相对简单,就是把两个随机数送到云端。

咱们设计一个相对复杂的场景,咱们首先要实现双向通讯,不只仅把传感器数据送到云端,咱们还要让云端下发一个指令,控制相关的设备。

上传数据咱们选择一个真实的传感器 DHT11,能够获取温度和湿度值。另外还有一个LED灯模块,经过云端下达的指令,控制灯亮和灯灭。

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

682de0e98d5333dee50d66c1f79e833a77a05224

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

554c26e55946ca0354c108d90b8b5180bf86ec9e

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)。

5e4f6e5acb209b7a38c1fe6b66cac8a3ceba0c5e

 

因为代码比较多,因此咱们封装为一个函数,而且能够同时返回两个值,一个是温度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-表示开灯

9ff0273b9f4e6dbe2f869286c5ec28ecbb0cc389

这个定义好后,咱们建立设备,而且获取设备的三元组。因为官方提供的示例仅仅是模拟数据,而且是单向上传,咱们须要改造一下。

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

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

8e18c40abc796a30175a382b4fe48cb6aa3afebc

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

2b6143dc908d627c10ee5b94421e1577205c344b

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

3b97d1f9bc4a7702a653908b7612a3ff8710b33a

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

以上,咱们会发现经过咱们所熟悉的Python语言,就能够轻松编写物联网代码了。

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

 

做者:刘洪峰iot
原文连接 本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索