本文共 5231 字,大约阅读时间需要 17 分钟。
本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景
场景
在公司大门入口处布点树莓派和红外感应,实现出入口人员出入时,自动拍照并上送钉钉群机器人准备
物料准备树莓派HC-SR501 人体红外感应器树莓派摄像头母对母杜邦线三根阿里云环境准备物联网平台对象存储OSS函数计算日志服务(可选)操作步骤1 云端开发1.1 物联网平台登录阿里云控制台,进入物联网平台控制面板1.1.1 新建产品
进入设备管理,创建产品,选择基础版或高级版都可以,本实例使用基础版就可以满足基本要求。系统会自动创建3个Topic,我们需要使用 /ProductName/${deviceName}/update,作为设备告警消息的上送的Topic。1.1.2 设备管理
在产品中新增设备,并获得设备的3元组,在2.3节的设备代码的编写时需要使用此3元组。设备三元组是设备的唯一标示1.1.3 新建规则引擎
设置规则引擎的意义在于,可以将设备上送的消息数据,通过配置转发规则将处理后的数据转发到阿里云其他服务,例如RDS、TBS和函数计算等等。我们需要注意的是从设备端到规则引擎处理后的JSON数据格式的变化,下图中是基础版的演变过程:我们在设备端消息上送定义的JSON的格式是:
{
'photo': 'xxxxxxx.jpg'}新创建一个规则,数据格式选择JSON。编写处理数据的SQLSELECT deviceName() deviceName, photo FROM "/a1O4b4XcICc/+/update"
配置完成后,我们可以模拟调试一下,检查规则是否正确:接着,配置数据转发,把数据转发到FC函数计算中。分别选择在1.3步骤中创建好的服务和函数。1.2 对象存储
由于设备端拍摄的照片需要在钉钉中展示,因此把照片存储在OSS上是一个解决方案。1.2.1 新建bucket
新建一个bucket用于存储设备上送的照片。读写权限选择公共读然后在bucket中创建photo目录。1.3 函数计算
经过物联网平台规则引擎转发过来的JSON数据,我们通过建立函数,把它转发到钉钉机器人接口上,实现钉钉群中的消息通知1.3.1 新建服务
新创建服务,如果需要记录和回溯函数执行的日志,则需要开通日志服务,配置日志仓库。1.3.2 新建函数
使用空白模版新建函数,不需要触发器,运行环境选择python2.71.3.3 函数代码
import logging
import jsonimport requestsdef post(data):
webhook_url='}' #钉钉群机器人的webhook的URLheaders = {'Content-Type': 'application/json; charset=utf-8'}post_data = json.dumps(data)try:response = requests.post(webhook_url, headers=headers, data=post_data)logging.info('Send success')except requests.exceptions.HTTPError as exc:logging.error("Send Error,HTTP error: %d, reason: %s" % (exc.response.status_code, exc.response.reason))raiseexcept requests.exceptions.ConnectionError:logging.error("Send Error,HTTP connection error!")raiseelse:result = response.json()logging.info('Send Error:%s' % result)if result['errcode']:error_data = {"msgtype": "text", "text": {"content": "Send Error, reason:%s" % result['errmsg']}, "at": {"isAtAll": True}}logging.error("Send Error:%s" % error_data)requests.post(webhook_url, headers=headers, data=json.dumps(error_data))return resultdef post_markdown(title,text):
data = { "msgtype": "markdown","markdown": { "title": title,"text": text},"at": { "atMobiles": [],"isAtAll": False}}post(data)def handler(event, context):
logger = logging.getLogger()evt = json.loads(event)#OSS endpoint urlpost_markdown('告警','' % evt.get('photo',''))logger.info('photo name is %s', evt.get('photo',''))return 'OK'2 设备端开发HC-SR501模块感应到有人移动时,会输出高电平,则触发摄像头拍照,并将照片文件存储到OSS,同时发送消息到IOT平台的/ProductName/${deviceName}/update消息队列中2.1 硬件安装
连接好摄像头将HC-SR501 人体红外感应器的vcc引脚接5v,也就是pin4,I/O引脚接pin18,GND引脚接地pin62.2 环境准备我们在树莓派上使用python2.7作为开发语言。import json
import uuidimport loggingfrom time import sleepfrom picamera import PiCameraimport RPi.GPIO as GPIOimport oss2import aliyunsdkiotclient.AliyunIotMqttClient as iotoptions = {
'productKey': '${productKey}', # 设备标识三元组'deviceName': '${deviceName}', # 设备标识三元组'deviceSecret': '${deviceSecret}', # 设备标识三元组'port': 1883, # iot mqtt port'host': 'iot-as-mqtt.cn-shanghai.aliyuncs.com', # iot mqtt endpoint'endpoint': '', # oss endpoint'ak': '${ak}','sk': '${sk}','bucket': '${bucket}', # oss bucket'ir_pin': 24 # 人体红外感应器设置读取针脚标号}topic = '/' + options['productKey'] + '/' + options['deviceName'] + '/user/test'
def takephoto2oss(client):
#拍照photo_filename = str(uuid.uuid1()) + ".jpg"print('take photo :' + photo_filename)camera.capture('photo/' + photo_filename)#存OSSprint('save photo to oss :' + photo_filename)bucket.put_object_from_file( 'photo/' + photo_filename, 'photo/' + photo_filename)#消息上送payload_json = { 'photo': photo_filename}print('send data to iot server: ' + str(payload_json))client.publish(topic, payload = str(payload_json))
def on_connect(client, userdata, flags_dict, rc):
print("Connected with result code " + str(rc))def on_disconnect(client, userdata, flags_dict, rc):
print("Disconnected.")if name == 'main':
GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)GPIO.setup(options['ir_pin'], GPIO.IN)# 摄像头 初始化camera = PiCamera()camera.resolution = (640, 480)camera.vflip = Truecamera.hflip = True# OSS 初始化auth = oss2.Auth(options['ak'], options['sk'])bucket = oss2.Bucket(auth, options['endpoint'], options['bucket'])# IOT Mqtt 初始化client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode = 3)client.on_connect = on_connectclient.connect(host=options['productKey'] + '.' + options['host'], port=options['port'], keepalive = 60)while True: # 当高电平信号输入时报警 if GPIO.input(options['ir_pin']) == True: print " Someone is coming!" takephoto2oss(client) else: continue sleep(3)
3 测试运行
3.1 设备端运行在py-demo文件夹下运行python monitor.py
3.2 云端查看上送消息进入设备界面,观察设备状态在设备的Topic列表中,也可以看到发布的消息个数高级版的产品,还提供了消息日志,而本例中的产品是基础版,并无此功能。3.3 钉钉群机器人结果
当有人出入门口的时候,钉钉群就可以收到机器人的消息推送3.4 后续完善
如果大家有兴趣,还可以进一步结合阿里云的人脸识别服务,再配合继电器,实现人员考勤和出入门禁的功能总结
通过阿里云物联网平台,结合阿里云提供的其他产品和服务,使用者可以快速地构建一套基于云边端一体的IOT产品,开发者只需关注业务层面的开发,而不用再花太多的精力在底层和通讯上,大大减少了开发周期,实现了产品的快速研发和迭代,节约了开发成本。转载于:https://blog.51cto.com/14031893/2329462