基於阿里雲物聯網平臺實現的簡易出入監控

本文經過一個簡單實例,主要介紹瞭如何使用樹莓派快速接入阿里雲iot platform,並實現了一個簡易的監控人員出入並拍照上送釘釘羣的場景python

場景
在公司大門入口處布點樹莓派和紅外感應,實現出入口人員出入時,自動拍照並上送釘釘羣機器人
圖片描述web

準備
物料準備
樹莓派
HC-SR501 人體紅外感應器
樹莓派攝像頭
母對母杜邦線三根
阿里雲環境準備
物聯網平臺
對象存儲OSS
函數計算
日誌服務(可選)
操做步驟
1 雲端開發
1.1 物聯網平臺
登陸阿里雲控制檯,進入物聯網平臺控制面板json

1.1.1 新建產品
進入設備管理,建立產品,選擇基礎版或高級版均可以,本實例使用基礎版就能夠知足基本要求。
圖片描述
系統會自動建立3個Topic,咱們須要使用 /ProductName/${deviceName}/update,做爲設備告警消息的上送的Topic。vim

圖片描述

1.1.2 設備管理
在產品中新增設備,並得到設備的3元組,在2.3節的設備代碼的編寫時須要使用此3元組。設備三元組是設備的惟一標示
圖片描述api

1.1.3 新建規則引擎
設置規則引擎的意義在於,能夠將設備上送的消息數據,經過配置轉發規則將處理後的數據轉發到阿里雲其餘服務,例如RDS、TBS和函數計算等等。咱們須要注意的是從設備端到規則引擎處理後的JSON數據格式的變化,下圖中是基礎版的演變過程:markdown

咱們在設備端消息上送定義的JSON的格式是:併發

{app

'photo': 'xxxxxxx.jpg'

}
新建立一個規則,數據格式選擇JSON。編寫處理數據的SQLpython2.7

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('告警','![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平臺的/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產品,開發者只需關注業務層面的開發,而不用再花太多的精力在底層和通信上,大大減小了開發週期,實現了產品的快速研發和迭代,節約了開發成本。

相關文章
相關標籤/搜索