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

简介: 本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景

场景

在公司大门入口处布点树莓派和红外感应,实现出入口人员出入时,自动拍照并上送钉钉群机器人

准备

物料准备

  • 树莓派
  • HC-SR501 人体红外感应器
  • 树莓派摄像头
  • 母对母杜邦线三根

阿里云环境准备

  • 物联网平台
  • 对象存储OSS
  • 函数计算
  • 日志服务(可选)

操作步骤

1 云端开发

1.1 物联网平台

登录阿里云控制台,进入物联网平台控制面板

1.1.1 新建产品

进入设备管理,创建产品,选择基础版或高级版都可以,本实例使用基础版就可以满足基本要求。
绅士手
系统会自动创建3个Topic,我们需要使用 /ProductName/${deviceName}/update,作为设备告警消息的上送的Topic。

1.1.2 设备管理

在产品中新增设备,并获得设备的3元组,在2.3节的设备代码的编写时需要使用此3元组。设备三元组是设备的唯一标示
设备3元组

1.1.3 新建规则引擎

设置规则引擎的意义在于,可以将设备上送的消息数据,通过配置转发规则将处理后的数据转发到阿里云其他服务,例如RDS、TBS和函数计算等等。我们需要注意的是从设备端到规则引擎处理后的JSON数据格式的变化,下图中是基础版的演变过程:

我们在设备端消息上送定义的JSON的格式是:

{
    'photo': 'xxxxxxx.jpg'
}

新创建一个规则,数据格式选择JSON。编写处理数据的SQL

SELECT deviceName() deviceName, photo FROM "/a1O4b4XcICc/+/user/test"

配置完成后,我们可以模拟调试一下,检查规则是否正确:
调试
接着,配置数据转发,把数据转发到FC函数计算中。分别选择在1.3步骤中创建好的服务和函数。
![数据转发配置](
https://iot-demo-hs.oss-cn-hangzhou.aliyuncs.com/article/20181114092559.png)

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

def post_makedown(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_makedown('告警','![screenshot](https://${bucket}.oss-cn-hangzhou.aliyuncs.com/photo/%s)' % evt.get('photo',''))
    logger.info('photo name is %s', evt.get('photo',''))
    return 'OK'

2 设备端开发

HC-SR501模块感应到有人移动时,会输出高电平,则触发摄像头拍照,并将照片文件存储到OSS,同时发送消息到IOT的/update消息队列中

2.1 硬件安装

  1. 连接好摄像头
  2. 将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 钉钉群机器人结果

当有人出入门口的时候,钉钉群就可以收到机器人的消息推送

总结

通过阿里云物联网平台,结合阿里云提供的其他产品和服务,使用者可以快速地构建一套基于云边端一体的IOT产品,开发者只需关注业务层面的开发,而不用再花太多的精力在底层和通讯上,大大减少了开发周期,实现了产品的快速研发和迭代,节约了开发成本。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
7月前
|
消息中间件 DataWorks 物联网
MQTT问题之接入阿里云物联网平台如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
430 1
|
2月前
|
存储 边缘计算 物联网
阿里云物联网平台:推动万物互联的智能化解决方案
随着物联网技术的快速发展,阿里云物联网平台为企业提供了一体化的解决方案,包括设备接入、数据管理和智能应用等核心功能。平台支持海量设备接入、实时数据采集与存储、边缘计算,并具备大规模设备管理、高安全性和开放生态等优势。广泛应用于智能制造、智慧城市和智能家居等领域,助力企业实现数字化转型。
202 5
|
5月前
|
存储 运维 监控
阿里云物联网平台的优势
【7月更文挑战第19天】阿里云物联网平台的优势
78 1
|
5月前
|
存储 传感器 监控
物联网设备的远程监控与管理:技术与实践
【7月更文挑战第5天】物联网设备的远程监控与管理技术正逐步成熟,为企业和个人带来了前所未有的便利性和洞察力。通过实现设备的实时监控、远程操作、数据分析等功能,可以显著提高设备的运行效率和安全性。然而,面对系统集成、隐私安全、用户体验等挑战,我们仍需不断探索和创新,以推动物联网技术的持续发展和应用。
|
7月前
|
消息中间件 存储 JavaScript
阿里云IOC物联网异步处理基础概念
该内容介绍了异步处理基础和消息队列的相关概念。首先,同步处理指任务完成后才能执行其他操作,而异步则允许任务并行执行,不阻塞程序。异步能提高系统并发性和响应性,但也增加复杂性和资源消耗。接着,提到了消息队列,包括生产者、消费者、队列、broker和topic等概念,并指出在IoT中,设备作为生产者发送消息到特定topic,消费者从队列获取数据。最后,简要介绍了AMQP协议,它是用于应用程序间消息传递的开放标准,常用于分布式系统和物联网,如RabbitMQ和Apache Qpid。课程将以Apache Qpid为例接收IoT数据。
229 6
阿里云IOC物联网异步处理基础概念
|
7月前
|
Cloud Native 安全 物联网
【阿里云云原生专栏】云边端一体化:阿里云如何利用云原生技术赋能物联网
【5月更文挑战第22天】阿里云借助云原生技术赋能物联网,实现云边端一体化,提升系统弹性与敏捷性。通过容器化部署,保证高可用性与可靠性。在智能交通等领域,阿里云提供高效解决方案,实现实时数据分析与决策。代码示例展示如何使用阿里云服务处理物联网数据。同时,阿里云重视数据安全,采用加密和访问控制保障数据隐私。丰富的工具和服务支持开发者构建物联网应用,推动技术广泛应用与发展。
380 1
|
6月前
|
传感器 监控 安全
物联网技术在智能家居安全监控中的应用
物联网技术在智能家居安全监控中的应用
|
7月前
|
存储 安全 物联网
安防摄像头IPC如何快速接入阿里云Link Visual视频服务(阿里云生活物联网)
Link Visual是生活物联网平台针对视频产品推出的增值服务,提供视频数据上云、存储、转发、AI计算等能力。 大白话就是:通过阿里云的Link Visual视频服务,可以让你的IPC摄像头设备完成上云功能,并快速实现如下功能介绍中的功能。其中可以享受阿里云P2P协议支持,帮助企业节省流量服务器流量带宽。
709 7
|
7月前
|
消息中间件 网络协议 物联网
MQTT协议问题之阿里云物联网服务器断开如何解决
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
495 1
|
7月前
|
Prometheus 监控 Cloud Native
助力工业物联网,工业大数据之服务域:服务器性能监控Prometheus及项目总结【三十五】
助力工业物联网,工业大数据之服务域:服务器性能监控Prometheus及项目总结【三十五】
72 1

相关产品

  • 物联网平台