IoT SaaS加速器——助力阿爾茨海默病人護理

場景介紹

阿爾茨海默病,是致使中老年人認知功能障礙的最多見疾病之一,是發生在老年期及老年前期的一種原發性退行性腦病。據估計,全世界癡呆症患者數量爲4700萬,到2030年將達到7500萬人。癡呆症患者數量到2050年預計將是如今的近三倍。疾病的高昂費用給衛生系統應對將來預計不斷增長的病例構成挑戰。據估計,目前每一年的支出爲8180億美圓,而支出的增加速度預計會比疾病流行率上升還要快。照料癡呆症患者給照護者帶來巨大壓力,包括身體上、情感上和經濟上的壓力。(by世界衛生組織)html

用技術解決阿爾茨海默病護理的問題,讓老人和其護理者有更好的生活質量,是咱們能夠解決的方法。基於物聯網技術,已經有一些設備實現了阿爾茨海默病老人走失定位。可是咱們要作更高一層,除了單獨分發的硬件以外,咱們要使用開發工具IoT Studio幫助醫療機構作一個硬件SaaS管理系統,讓他們能夠隨時監控旗下全部阿爾茲海默護理設備的數據以及定位,對老人的狀況實現實時監控。同時也有能力對掌控的設備進行增刪改查,方便他們本身管理設備。經過IoT Studio賦能開發者,讓他們幫助包括醫療在內的各個行業用上物聯網技術,惠及百姓。node

咱們首先構建一個能夠拍照,檢測心跳的手環設備,而後基於這個設備幫助護理機構開發一個集合管理監控告警的SaaS系統。設備由一個能夠檢測心跳的光學模塊,一個能夠檢測老人所在地場景的攝像頭,一個GPS定位模塊,一個物聯網通信模塊(通常爲GPRS),MCU和電源組成。雲端由物聯網平臺爲基礎創建設備與雲端通信,配合RDS存儲心跳&GPS數據,OSS存儲圖片數據,最後用IoT Studio的服務開發與Web可視化開發功能完成功能頁面搭建。整個雲端開發過程只須要2小時之內便可。python

最終效果如圖。mysql

硬件部分

在demo階段,咱們採用樹莓派3B+攝像頭+心跳模塊+GPS+電池的方法,驗證不一樣數據的上報方法以及數據存儲鏈路。考慮簡單化,聯網暫時採用WIFI方法。若是以爲使用電路比較麻煩,也可使用服務開發+虛擬設備上報的方式,具體查看這篇文檔ios

雖然帶手環的老人不同,可是每一個手環上報的屬性類別是同樣的,咱們能夠相似編程開發裏把它們歸結爲同一個類(class)。咱們首先須要在物聯網平臺上爲咱們的demo手環創建一個設備類(即產品),這樣咱們才能在之後不斷的往這個產品下實例化新的設備。
進入阿里雲物聯網平臺,在產品頁面新建一個產品,選擇自定義品類便可,命名爲「阿爾茨海默氏症老人監控手環」。git

進入產品的功能定義頁,定義5個自定義功能——剩餘電量,地理位置,心跳,圖片地址(存放攝像機上傳圖片的URL)。github

地理位置只須要在「添加功能」裏用標準的功能便可,如圖,其餘所有配置項默認便可。web

心跳爲一個整型數據,剩餘電量爲浮點型數據,圖片地址爲字符型數據,如圖。sql

在設備面板點擊「添加設備」,選擇剛纔建立的手環產品,而後輸入隨意的設備名稱便可。數據庫

IoT Studio爲交付型業務作了項目維度的隔離,所以須要將用到的設備導入到對應的項目中。
首先打開物聯網平臺的「開發服務」選項進入IoT Studio。點擊某個項目名稱的「查看」進入項目詳情頁。而後點擊右上角的「導入產品」。選擇剛纔的手環產品,而後導入,能夠在設備管理頁看到產品以及下屬的設備已經導入項目裏。

這樣就完成了產品的定義,實例化與項目維度的隔離了。

上雲部分

樹莓派採用python編程,所以咱們須要參考物聯網平臺的python SDK,同時開發者社區也有不少相關文章。在這裏咱們直接跳過。
因爲物聯網平臺的屬性不支持直接存儲圖片,所以咱們暫時使用oss進行存儲。你也能夠選擇使用HTTP/2通道(已支持python SDK)將圖片上傳至物聯網平臺每一個設備單獨的存儲空間,不過從該存儲空間調用圖片的URL須要動態生成,能夠參考這篇文檔

OSS存儲空間準備

阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。您能夠經過調用 API,在任何應用、任什麼時候間、任何地點上傳和下載數據,也能夠經過 Web 控制檯對數據進行簡單的管理。OSS 適合存聽任意類型的文件,適合各類網站、開發企業及開發者使用。

首先點擊「當即開通」進入開通頁面並點擊贊成協議。

oss2

而後進入控制檯,新建一個Bucket,一個Bucket至關於一個文件夾,能夠經過API路徑訪問裏面的文件。在這裏咱們選擇公共讀寫。

而後能夠看到OSS控制檯新建了一個bucket,裏面是空的,咱們能夠嘗試上傳一些圖片。

而後點擊文件右方的操做項裏的「複製文件URL」,把複製的URL粘貼到瀏覽器,看看可否預覽。

能夠看到經過URL訪問咱們就能看到圖片了,這樣OSS的配置就完成了。

考慮到Bucket的公共讀寫特性,安全性會有必定的問題,能夠考慮將bucket私有化,而後圖片上傳的時候設置圖片爲公共讀寫,並採用時間戳加鹽等方式將圖片文件名隨機化的方式解決。固然安全性上HTTP/2通道爲更優方案。

樹莓派代碼

樹莓派的配置與鏈接在此再也不贅述,能夠在樹莓派新建py文件,直接將此份代碼複製過去,而且設置爲開機執行,也能夠參考這篇文檔
代碼以下(基於python 3.6),須要根據備註填入本身的帳號信息,產品信息等:

##注意,本demo代碼忽略了電池電量檢測模塊

import aliyunsdkiotclient.AliyunIotMqttClient as iot ##導入阿里雲的設備MQTT庫,若是import失敗須要先pip3 install 一下
import json
import multiprocessing
import time
import random
import oss2 ##導入阿里雲的OSS庫,若是import失敗須要先pip3 install oss2
from picamera import PiCamera ##樹莓派的攝像頭,系統自帶
import RPi.GPIO as GPIO ##GPIO口,接紅外PIR用
import serial
import pynmea2
from pulsesensor import Pulsesensor ##導入樹莓派的pulsesensor庫,https://github.com/tutRPi/Raspberry-Pi-Heartbeat-Pulse-Sensor/blob/master/example.py

auth = oss2.Auth('**AccessId*****','**AccessSecret*****') ##OSS的受權須要阿里雲帳號AccessId和AccessSecret,具體查看https://usercenter.console.aliyun.com/#/manage/ak
bucket = oss2.Bucket(auth,'http://oss-cn-beijing.aliyuncs.com','***你的bucket名稱***') ##須要根據服務器區域修改節點路徑,見文檔
global picURLtoIoT
camera = PiCamera()
camera.resolution = (800,600)  ##拍照分辨率,越高越容易分析,可是上次越慢
GlobalBpm = 0  ##記錄心跳數據
Latitude = 0    ##記錄GPS數據
Longtitude = 0

##初始化樹莓派
def init(): 
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(3, GPIO.IN)
    pass

def take_photo():
    ticks = int(time.time())
    fileName = 'test%s.jpg' % ticks  ##在文件名加入了時間戳做爲簡易加密手段
    filePath = '/home/pi/Pictures/%s' % fileName
    camera.capture(filePath)
    bucket.put_object_from_file('bucket_file_name/%s', fileName) ##在這裏改bucket名字
    global picURLtoIoT
    picURLtoIoT = 'http://***你的bucket名稱**.oss-cn-beijing.aliyuncs.com/bucket_file_name/%s' % fileName
    ##在這裏改bucket名字和bucket內文件夾的名字
    print(str(picURLtoIoT))

def detect_Heartbeat():
    p = Pulsesensor()
    p.startAsyncBPM()
    try:
    while True:
        bpm = p.BPM
        if bpm > 0:
            print("BPM: %d" % bpm)
            GlobalBpm = bpm;
        else:
            print("No Heartbeat found")
        time.sleep(1)
    except:
        p.stopAsyncBPM()

def get_GPS():
    ser = serial.Serial("/dev/ttyAMA0",9600)
    while True:
        line = ser.readline()
        if line.startswith('$GNRMC'):
            rmc = pynmea2.parse(line)
            print "Latitude:  ", float(rmc.lat)/100
            print "Longitude: ", float(rmc.lon)/100
            Latitude = float(rmc.lat)/100
            Longtitude = float(rmc.lon)/100
            break 

options = {
    'productKey':'**你的ProductKey**',
    'deviceName':'**你的deviceName**',
    'deviceSecret':'**你的deviceSecret**',
    'port':1883,
    'host':'iot-as-mqtt.cn-shanghai.aliyuncs.com' ##注意阿里雲IoT國內都是華東2,不必定跟OSS的節點一致
}
host = options['productKey'] + '.' + options['host']

def on_message(client, userdata, msg):
    topic = '/' + productKey + '/' + deviceName + '/update'
    print(msg.payload)

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.")

##設備上報的定義
def upload_device(client):
    topic = '/sys/'+options['productKey']+'/'+options['deviceName']+'/thing/event/property/post'
    while True:
        payload_json = {
            'id': int(time.time()),
            'params': {
                'BPM': GlobalBpm,
                'picURL': picURLtoIoT,
                'Geo': 
                    {
                     'CoordinateSystem":1,
                     'Latitude':Latitdue,
                     'Longitude':Longtitude,
                     'Altitude':0
                    },
            },
           'method': "thing.event.property.post"
            }
        print('send data to iot server: ' + str(payload_json))        
        client.publish(topic, payload=str(payload_json))

if __name__ == '__main__':
    client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode=3)
    client.on_connect = on_connect
    client.connect(host=host, port=options['port'], keepalive=60)
    p = multiprocessing.Process(target=upload_device, args=(client,))
    p.start()
    get_GPS()
    detect_Heartbeat()
    take_photo()
    GPIO.cleanup()
    client.loop_forever()

結束,把這個python文件設置爲開機運行便可。

調試

能夠看到數據已經上報到物聯網平臺了,同時oss的連接也能夠用。

數據部分

接下來將演示如何經過IoT Studio服務開發工做臺完成設備上報數據的轉儲以及根據規則進行告警(如心跳太低告警)。IoT Studio 服務開發是一個物聯網業務邏輯的開發工具。經過編排服務節點的方式快速完成簡單的物聯網業務邏輯的設計。適用於如下場景:設備聯動、設備數據處理、設備與服務聯動、生成API 、生成App的後端服務等。

開通RDS

阿里雲關係型數據庫RDS(Relational Database Service)是一種穩定可靠、可彈性伸縮的在線數據庫服務,提供容災、備份、恢復、遷移等方面的全套解決方案,完全解決數據庫運維的煩惱。目前六月份有10塊錢試用半年的折扣,能夠嘗試購買。

開通之後進入管理控制檯,會看到本身已經付費的實例出現,進入管理。

因爲咱們須要用外部的服務調用RDS數據錄入,所以須要容許外網訪問,須要首先設置白名單。而後把默認的127.0.0.1改成0.0.0.0/0

而後返回管理頁,能夠看到外網地址出現了。

接下來須要設置登陸數據庫的帳號,進入帳號管理頁點擊建立帳號,輸入帳號密碼等信息,而且選擇要受權的數據庫。

完成後返回實例控制頁,點擊登陸數據庫,輸入剛纔設置的帳號密碼,便可登入RDS數據庫。

登陸以後首先建立一個數據庫,命名爲test,而後刷新一下,能夠看到新建的test數據庫,而後進入數據庫創建一張表。

插入以下的幾列,注意time可能須要改成timestamp類型,最後保存便可完成。這樣就完成了表結構的配置。

數據對接RDS

首先在物聯網平臺首頁,開發服務下的IoT Studio的快速入口進入服務開發工做臺。而後新建一個服務,命名爲「手環心跳轉儲RDS」。

而後在節點列表裏選擇「設備觸發」節點,在右側欄選擇以前建立的產品「阿爾茨海默氏症監控手環」,監聽全部設備的屬性上報,如圖。

接下來選擇一個雲數據庫mySQL節點,將設備觸發節點與雲數據庫節點鏈接起來。

參數以下,分別對應以前的列名,record不填,由於record會自動增加:

{
    "table": "test",![_rds5](https://yqfile.alicdn.com/d0979c17aa88ac03cd75ae1752c0b85e6b47fc23.png)

    "rows": [
        {
            "BPM": "{{query.props.BPM.value}}",
            "Latitude": "{{query.GeoLocation.value.Latitude}}",
            "Longtitude": "{{query.GeoLocation.value.Longtitude}}",
            "time": "{{query.deviceContext.gmtCreate}}"
        }
    ]
}

數據格式說明

咱們能夠看到,設備上報的數據格式設這樣的:

{
            "deviceContext": {
                "productKey": "a1OhdcX0B8B",
                "deviceName": "Wrist003",
                "gmtCreate": 1560497545957
            },
            "props": {
                "GeoLocation": {
                    "time": 1560497545957,
                    "value": {
                        "CoordinateSystem": 1,
                        "Latitude": 25.26,
                        "Longitude": 111.45,
                        "Altitude": 0
                    }
                },
                "BPM": {
                    "time": 1560497545957,
                    "value": 21
                }
            }
        }

在服務開發中,若是須要在json參數裏調用外部動態的參數,須要採用{{xx.xx}}的方式調用。如在"BPM": "{{query.props.BPM.value}}"裏,第一個query表示參數來自於第一個節點,第二個props表示取設備上報上來的屬性數據,第三個BPM表示取props下的BPM對象,最後的value表示取BPM對象的值。同理其餘幾個能夠根據設備上報數據的結構進行填寫。
完成後點擊部署,調試(可使用虛擬設備上報),回到RDS的數據庫頁面,能夠看到數據更新了。這樣就完成設備數據上報轉RDS的操做。

數據即時告警規則

若是老人的心跳太低,咱們會經過釘釘機器人把消息通知到護士羣裏,讓他們即時知曉狀況。
首先仍然是新建一個服務,命名爲心跳太低告警。

而後一樣選擇一個設備觸發節點,偵聽全部手環設備上報的屬性。

添加一個「條件判斷」節點,條件節點至關於一個if-else判斷。而且把設備觸發節點與條件節點鏈接起來。

在條件判斷節點中,第一個選擇「同時知足全部條件」,在「條件1」中第一個下拉框選擇「設備觸發」,在二級菜單選擇「心跳」;判斷條件選擇「<=」,第二個框選擇「靜態值」「數值」。觸發報警的條件咱們設置爲老人心跳值小於50。

在以前的數據對接RDS裏,咱們使用代碼化的query.props.BPM.value定義設備數值。而在條件判斷等節點中,咱們封裝了數據源格式,可讓你直接選擇數據源進行規定格式的告警信息配置,而無需輸入query/payload等變量。

接下來在左側節點列表的「功能」類拖入一個「釘釘機器人」節點。並與條件判斷節點的上方出口(「知足條件」)進行連線。選擇模板爲「設備告警」模板,數據源選擇「設備觸發」「心跳」,能夠選擇@全部人。
釘釘機器人的Webhook填入你要推送的釘釘羣的釘釘機器人Webhook。

如何獲取Webhook?

釘釘機器人是釘釘羣內一個自動化的消息發送工具。在一個釘釘羣內打開右上角的「羣設置」,能夠發現如下彈窗。

點擊釘釘機器人,進入機器人配置頁面。

選擇添加自定義機器人。

而後在完成頁面能夠看到webhook。整個複製下來,粘貼到輸入框內。

若是是自定義模板,如何動態配置文本text?

因爲監聽了所有的煤氣檢測器,咱們收到警告的時候須要知道是哪一個煤氣檢測器報警了,所以須要接受上報的煤氣檢測器的DeviceName進行推送。

選擇text推送類型,參數框內爲一個json對象,所以調用方法要符合json的格式。咱們採用了{{value}}的格式,如「{{query.deviceContext.deviceName}}」,能夠查看下圖的完整配置方法:

{
  "msgtype": "text", 
  "text": {
    "content": "使用手環{{query.deviceContext.deviceName}}的老人心跳太低,數字爲{{query.props.BPM.value}},你們快去看看吧!"
  }, 
  "at": {
      "isAtAll": true
  }
}

對條件判斷節點的「不知足條件」,放置一個不作任何處理的nodejs腳本佔位便可。

完成後,一樣的進行部署啓動調試。在虛擬設備那邊上報一個小於50的BPM,看看是否成功響應。這樣就完成了一個即時響應的心跳告警功能。

應用部分

本次的應用部分包括設備管理的頁面,容許醫院維護人員查看各個設備的狀態,屬性並根據需求添加新的設備。另外有當前全部設備在地圖上的分佈狀況,方便監控老人動向。最後包含了一個監控手環上報圖片的實時查看功能,能夠查看老人有沒有遇到危險,迷路等。
最終的實現效果如圖:

手環管理SaaS建立

首先進入IoT  Studio頁,點擊Web可視化開發,進入Web可視化頁面。

而後新建一個空白模板,輸入應用的名字,如「阿爾茲海默症示例應用」。

進入空白的Web頁面,準備開始搭建咱們的應用。

左側欄的構建

首先把整個應用的架構搭建好,建立5個頁面,分別爲醫院監控大屏,醫院設備管理,老人1的詳情頁,老人2的詳情頁,老人3的詳情頁。

接下來咱們爲整個應用添加一個左側欄,點擊左下方的「導航菜單」。

因爲咱們已經建好了對應的空頁面,能夠選擇自動生成。

能夠看到生成的左側菜單欄,如今想把老人1,2,3三個頁面歸屬到一個「老人監控」的主分類下,所以須要修改配置菜單項。點擊左下角的「配置菜單」。此外這裏修改了分辨率爲1440x900。

點擊新增主菜單,輸入「老人監控」這個主分類名。這個主類目不會對應任何實際的頁面連接,只是一個分隔符。

出現二次確認彈窗確認便可。

最後改爲這樣的結果。能夠檢查一下里面的連接是否正確的配置。

能夠看到左側菜單出現了「老人監管」這個分類。

配置頁面基本元素&樣式

想要SaaS應用的樣式不同凡響?能夠自定義各類樣式,也可使用標準模板。

使用標準模板能夠在新建頁面的時候點擊。

也能夠根據本身的喜愛,用空白模板,而後自定義樣式,好比修改菜單欄顏色。

修改背景顏色。

放入一些圖片。

輸入文字等裝飾。最後變成這樣的頁面。

接下來咱們須要添加一些有功能的組件,讓整個SaaS應用運做起來。

醫院監控大屏頁

如同示例,咱們須要一個指示設備GIS的地圖以及一個展現設備情況的列表。在組件欄對應的是這兩個組件。

設備地圖

設備地圖須要用到物聯網平臺數據分析功能的空間數據可視化服務。過程以下圖gif顯示,首先在左側欄拖入地圖組件,而後點擊添加場景,前往空間數據可視化頁面,而後點擊添加,選擇「阿爾茲海默症手環」產品,點擊肯定。

能夠修改地圖主題色等。

選擇後返回IoT Studio,從新點擊地圖組件選擇剛纔建立的場景,就能夠看到在頁面上出現了一份有設備位置的地圖。

能夠調節大小,放到合適的位置上,就完成了地圖組件的配置了。

設備屬性表格

設備屬性表單能夠把當前產品下全部設備(手環)的在線狀態,更新時間以及屬性快照值的顯示出來,而且在應用發佈後能夠調整顯示的列內容。適合全局性的設備預覽。

首先拖入設備屬性組件,在右側欄配置要關聯的產品。

能夠看到關聯了產品後,表單自動顯示產品下的所有設備。接下來咱們能夠修改一下右側的配置項,讓他的樣式更符合黑色的背景。

而後咱們能夠點擊右上角預覽,查看一下頁面效果。能夠在預覽時點擊「列顯示設置」按鈕修改顯示的列數,這個配置是本地存儲的,不會同步到雲端。

這樣第一個醫院監控大屏頁面就完成了。

醫院設備管理頁

設備管理頁容許運維人員(而不是開發者)直接添加新設備獲取三元組,這樣他們就能夠不感知阿里雲物聯網平臺而實現設備的添加。爲了實現這個功能,須要設備管理這個表單組件,如圖。

配置方法爲:首先從左側欄拖入設備屬性組件,而後在右側欄修改一些配置項——包括是否容許發佈以後用戶添加/編輯/刪除設備,修改列顯示排序,添加自定義標籤,修改樣式等等。具體功能說明能夠查看文檔。

而後能夠經過圓形組件,矩形組件以及文字組件添加設備採買流程等,最後完成的效果如圖。

咱們能夠預覽,看看是否能夠添加/刪除設備。注意這裏的添加/刪除是會直接影響物聯網平臺上的設備的。

這樣設備管理頁就完成了,最後就是每一個設備的詳情頁,也就是每一個監控手環的信息展覽頁。

設備監控頁

設備監控須要監控當前老人的心跳,剩餘的電量,是否有告警信息,攝影設備的實時圖像監控以及心跳的歷史趨勢圖等。

儀表盤的配置

首先從左側欄拖入一個儀表盤,修改一下樣式。

而後關聯設備數據,這裏關聯的是老人001的Wrist001設備的剩餘電量。選擇產品,設備,屬性,而後驗證數據格式。注意若是設備沒有上報過信息,數據格式驗證是沒法經過的,能夠經過虛擬設備上報信息進行驗證。

這樣就完成了剩餘電量的儀表盤了,同理心跳數據的儀表盤也同樣操做。

告警信息系統

咱們須要一段文字來接受來自設備的告警信息,同時須要一個按鈕調用告警服務。
首先拖入一段文字組件,而後關聯對應設備的對應事件(如老人摔倒),驗證格式以後文字會顯示事件的快照值以及輸出參數。固然能夠經過服務開發工做臺的HTTP請求接口修改文字內容,定製化等。

能夠拖到最下方進行輪詢,保證數據的實時性。

接下來是一個告警服務,好比短信通知家眷,咱們能夠開通阿里雲的短信服務或者釘釘機器人進行消息的輸出,也能夠用服務開發的「三方API」節點進行微信公衆平臺等三方輸出。這裏咱們以釘釘機器人爲例。

新建一個服務,使用一個HTTP請求節點,中間接一個釘釘機器人節點,最後接一個HTTP返回節點便可。HTTP請求不須要入參,HTTP返回不須要額外配置,釘釘機器人節點的配置項以下。

在按鈕那裏選擇交互-點擊-調用服務,選擇對應的服務,驗證便可看到釘釘機器人推送。

這就完成了告警模塊的設置。

實況監控

圖片的實況監控,如以前說的咱們獲取了設備圖片的url做爲屬性上報,咱們可使用「變量」機制,幫助iframe組件獲取設備上報的屬性。

首先拖入一個iframe組件,而後直接把以前步驟裏得到的oss圖片連接粘貼上去便可。

心跳曲線

心跳曲線須要用到設備曲線圖組件,能夠直接關聯具體的設備獲取數據,無需額外的配置。

首先拖入一個曲線圖組件,在數據源側選擇設備Wrist001,點擊驗證數據,便可讀取最近上報的數據。

而後調節樣式便可,最後樣式以下:

這樣就完成了整個設備監控頁。其餘頁面按此流程綁定不一樣設備便可,目前組件也已經支持跨頁面複製。

發佈應用

咱們須要先在阿里雲上申請一個域名,打開域名購買,購買一個域名。

而後前往IoT Studio的Web可視化工做臺的設置菜單,點擊域名管理。按照引導流程處理進行域名解析。

而後點擊右上角的發佈,點擊肯定便可。

而後就能夠看到發佈成功了。直接前往本身購買的域名查看便可。

這樣就完成一套全鏈路的阿爾茨海默病人護理物聯網解決方案的發佈了。

 


本文做者 :dupig

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索