基於阿里雲物聯網平臺實現的簡易出入監控
本文通過一個簡單例項,主要介紹瞭如何使用樹莓派快速接入阿里雲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/+/user/test"
配置完成後,我們可以模擬除錯一下,檢查規則是否正確:

接著,配置資料轉發,把資料轉發到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 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('告警','' % evt.get('photo','')) logger.info('photo name is %s', evt.get('photo','')) return 'OK'
2 裝置端開發
HC-SR501模組感應到有人移動時,會輸出高電平,則觸發攝像頭拍照,並將照片檔案儲存到OSS,同時傳送訊息到IOT的/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 釘釘群機器人結果
當有人出入門口的時候,釘釘群就可以收到機器人的訊息推送

總結
通過阿里雲物聯網平臺,結合阿里雲提供的其他產品和服務,使用者可以快速地構建一套基於雲邊端一體的IOT產品,開發者只需關注業務層面的開發,而不用再花太多的精力在底層和通訊上,大大減少了開發週期,實現了產品的快速研發和迭代,節約了開發成本。