基于阿里云物联网平台,我们这样实现简易出入监控
本文通過一個簡單實例,主要介紹了如何使用樹莓派快速接入阿里云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的格式是:
新創建一個規則,數據格式選擇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的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 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 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 硬件安裝
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.py2.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)#存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 初始化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:continuesleep(3)3 測試運行
3.1 設備端運行
在py-demo文件夾下運行
python monitor.py3.2 云端查看上送消息
進入設備界面,觀察設備狀態
在設備的Topic列表中,也可以看到發布的消息個數
高級版的產品,還提供了消息日志,而本例中的產品是基礎版,并無此功能。
3.3 釘釘群機器人結果
當有人出入門口的時候,釘釘群就可以收到機器人的消息推送
3.4 后續完善
如果大家有興趣,還可以進一步結合阿里云的人臉識別服務,再配合繼電器,實現人員考勤和出入門禁的功能
總結
通過阿里云物聯網平臺,結合阿里云提供的其他產品和服務,使用者可以快速地構建一套基于云邊端一體的IOT產品,開發者只需關注業務層面的開發,而不用再花太多的精力在底層和通訊上,大大減少了開發周期,實現了產品的快速研發和迭代,節約了開發成本。
?
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的基于阿里云物联网平台,我们这样实现简易出入监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云明确生态边界:不做SaaS、被集成
- 下一篇: 可应用于实际的14个NLP突破性研究成果