基于阿里云物联网平台实现的简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云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。编写处理数据的SQL

SELECT 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.7

1.3.3 函数代码

-- coding: utf-8 --

import logging
import json
import requests

钉钉消息发送实现

def post(data):
webhook_url=‘https://oapi.dingtalk.com/robot/send?access_token=${Token}‘ #钉钉群机器人的webhook的URL
headers = {‘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))
raise
except requests.exceptions.ConnectionError:
logging.error("Send Error,HTTP connection error!")
raise
else:
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 result

发送钉钉markdown消息

def 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 url
post_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引脚接地pin6

2.2 环境准备
我们在树莓派上使用python2.7作为开发语言。

  1. pip install aliyun-python-sdk-iot-client
  2. pip install oss2
  3. mkdir py-demo (项目程序文件夹)
  4. cd py-demo
  5. mkdir photo (本地照片临时目录)
  6. vim monitor.py
    2.3 代码开发
    monitor.py 内容如下:

-- coding: utf-8 --

import json
import uuid
import logging
from time import sleep
from picamera import PiCamera
import RPi.GPIO as GPIO
import oss2
import aliyunsdkiotclient.AliyunIotMqttClient as iot

参数定义

options = {
‘productKey‘: ‘${productKey}‘, # 设备标识三元组
‘deviceName‘: ‘${deviceName}‘, # 设备标识三元组
‘deviceSecret‘: ‘${deviceSecret}‘, # 设备标识三元组
‘port‘: 1883, # iot mqtt port
‘host‘: ‘iot-as-mqtt.cn-shanghai.aliyuncs.com‘, # iot mqtt endpoint
‘endpoint‘: ‘http://oss-cn-hangzhou.aliyuncs.com‘, # oss endpoint
‘ak‘: ‘${ak}‘,
‘sk‘: ‘${sk}‘,
‘bucket‘: ‘${bucket}‘, # oss bucket
‘ir_pin‘: 24 # 人体红外感应器设置读取针脚标号
}

topic = ‘/‘ + options[‘productKey‘] + ‘/‘ + options[‘deviceName‘] + ‘/user/test‘

拍照存oss,并发送通知

def takephoto2oss(client):

#拍照
photo_filename = str(uuid.uuid1()) + ".jpg"
print(‘take photo :‘ + photo_filename)
camera.capture(‘photo/‘ + photo_filename)

#存OSS
print(‘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 初始化

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(options[‘ir_pin‘], GPIO.IN)

# 摄像头 初始化
camera = PiCamera()
camera.resolution = (640, 480)
camera.vflip = True
camera.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_connect
client.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产品,开发者只需关注业务层面的开发,而不用再花太多的精力在底层和通讯上,大大减少了开发周期,实现了产品的快速研发和迭代,节约了开发成本。

原文地址:http://blog.51cto.com/14031893/2329462

时间: 2024-10-11 15:11:36

基于阿里云物联网平台实现的简易出入监控的相关文章

10.1 阿里云物联网平台介绍

阿里云物联网平台是阿里巴巴公司推出的专业物联网服务平台,其提供的详尽的文档和清晰的管理界面非常适合刚刚接触物联网平台的初学者,对物联网系统架构.管理等有一个整体上的把握. 阿里云物联网平台文档 阿里云物联网管理平台可视化界面 (需要注册阿里云账户后才能使用) 基于阿里云物联网平台的物联网系统架构 基于阿里云物联网平台的物联网系统架构图如上图所示,整个系统可大致分为4层架构: 边缘设备:物联网系统中的数据生产者,通常为传感器,一般认为没有计算能力. 边缘节点:边缘节点对下收集边缘设备产生的数据,对

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

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

树莓派3B+实践(2)- 阿里云物联网平台接入(设备端C语言SDK编译)解决undefined reference to `IOT_CMP_Init'错误

本想实践亚马逊aws的接入方案,由于亚马逊aws个人账户需要VISA信用卡,所以先用阿里云实践学习,以后有机会再接入aws. 1. 申请一个阿里云账户,需要绑定支付宝账户,阿里云个人账户可以申请部分业务免费,而且基础版每个月前100w条消息传输免费,个人用来学习实践绰绰有余. 2.根据阿里云物联网平台的帮助文档进行服务器端配置,这里不再赘述,帮助文档网址. 3. 重点说一下遇到的坑,由于阿里云的设备端sdk一直在更新功能,然而官网和github上的帮助文档没有随之更新,所以直接按照文档编译sdk

手机秒变IoT设备?——巧妙利用阿里云物联网平台

作者序 什么?嵌入五行代码可以实现用户定位,用户在线数量统计,还能和云端消息交互! 没错得益于阿里云物联网套件创建设备免费,消息收费也只有百万消息三块六(先使用后付费,不满不要钱),尤其对于学生党来说,基本是用不了这么多,也就意味着免费!(学生党福音[手动滑稽]) Talk is cheap,show me the code public static void main(String[] args) { //去阿里云官网上创建一个产品,设置好地理位置属性.可以变相用做分组 String pro

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 云平台显示单片机采集的温湿度数据,控制设备继电器(基于ESP8266,AT指令TCP_MQTT通信)(V1.0)

实现的功能 把单片机采集的温湿度显示在云平台 实现步骤1 1.在云平台再弄一个自定义功能 实现步骤2 我就是修改的这一节的单片机程序 https://www.cnblogs.com/yangfengwu/p/12539421.html 1.为了方便大家使用,我修改成了下面 用户直接根据自己的修改就可以 2.我设置的发布主题 3.我设置的订阅主题 下载单片机程序然后测试 一,调整波动开关位置,STM32和Wi-Fi通信 二,短接STM32的PB2和Wi-Fi模块的RST引脚(为了做项目稳定可靠,请

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台

前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 其实我很长时间都没有出怎么连接现成的物联网平台的教程, 一直写的是教给大家自己搭建服务器,主要原因是因为我感觉连接现有的学不到东西. 现在出这种教程,是因为发现确实很多人喜欢用. 但是大家看看吧!连接现有的十分的简单 其实我不明白的是:网上到处都是这种的教程!!!!而且价格定的高,就好像多么的高大上一样...... 搜索物联网平台(如果没有开通自行开通) 创建产品 注意:看看自己的这里是那个区域的,后面会用到 现在我就需要知道设备怎么连接

ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程

前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 https://help.aliyun.com/document_detail/85700.html?spm=a2c4g.11186623.6.699.6292740d5hzKl6 首先控制升级获取当前程序的版本号等走的还是MQTT 设备端首先通过MQTT获取云端的版本信息,还有程序固件的http

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT客户端接收云平台的数据

前言 有时候想想可能直接连接现成的感觉比较方便吧! 但是实际上如果你做多了会发现,限制住了很多. 当然,适合个人玩家. 所以很多人去连接现成的.不愿意自己去搭建, 测这节会感觉:这是啥呀...下一节更精彩,但是必须看这节 测这节会感觉:这是啥呀...下一节更精彩,但是必须看这节 测这节会感觉:这是啥呀...下一节更精彩,但是必须看这节 测试1 1.选择设备 ---- 查看 2.Topic ---- 查看 下面是说咱可以订阅那几个主题 咱先看订阅:  /a1m7er1nJbQ/Mqtt/user/

国内物联网平台初探(二) ——阿里云物联网套件

架构 数据通道 为设备和物联网应用程序提供发布和接收消息的安全通道.数据通道目前支持CCP协议和MQTT协议. 用户可以基于CCP协议实现Pub/Sub异步通信,也可以使用远程调用(RPC)的通信模式实现设备端与云端的通信. 用户也可以基于开源协议MQTT协议连接阿里云IoT,实现Pub/Sub异步通信. 安全认证&权限策略 为每个设备颁发阿里云IoT的凭证,依赖凭证才能连接阿里云IoT. 提供设备级的授权粒度,任何设备必须经过授权才能对某个Topic发布订阅消息 服务端也需要经过授权才能操作其