我是靠谱客的博主 冷艳电灯胆,这篇文章主要介绍基于阿里云物联网平台实现的简易出入监控,现在分享给大家,希望可以做个参考。

场景

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

准备

物料准备

  • 树莓派
  • 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的格式是:

复制代码
1
2
3
{ 'photo': 'xxxxxxx.jpg' }

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

复制代码
1
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 函数代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# -*- 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
2
3
4
5
6
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 内容如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# -*- 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文件夹下运行

复制代码
1
python monitor.py

3.2 云端查看上送消息

进入设备界面,观察设备状态

在设备的Topic列表中,也可以看到发布的消息个数

高级版的产品,还提供了消息日志,而本例中的产品是基础版,并无此功能。

3.3 钉钉群机器人结果

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

总结

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

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

最后

以上就是冷艳电灯胆最近收集整理的关于基于阿里云物联网平台实现的简易出入监控的全部内容,更多相关基于阿里云物联网平台实现内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部