1. 程式人生 > >IoT SaaS加速器——助力阿爾茨海默病人護理

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

場景介紹

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

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

我們首先構建一個可以拍照,檢測心跳的手環裝置,然後基於這個裝置幫助護理機構開發一個集合管理監控告警的SaaS系統。裝置由一個可以檢測心跳的光學模組,一個可以檢測老人所在地場景的攝像頭,一個GPS定位模組,一個物聯網通訊模組(一般為GPRS),MCU和電源組成。雲端由物聯網平臺為基礎建立裝置與雲端通訊,配合RDS儲存心跳&GPS資料,OSS儲存圖片資料,最後用IoT Studio的服務開發與Web視覺化開發功能完成功能頁面搭建。整個雲端開發過程只需要2小時以內即可。

最終效果如圖。

硬體部分

在demo階段,我們採用樹莓派3B+攝像頭+心跳模組+GPS+電池的方法,驗證不同資料的上報方法以及資料儲存鏈路。考慮簡單化,聯網暫時採用WIFI方法。如果覺得使用電路比較麻煩,也可以使用服務開發+虛擬裝置上報的方式,具體檢視

這篇文件

雖然帶手環的老人不一樣,但是每個手環上報的屬性類別是一樣的,我們可以類似程式設計開發裡把它們歸結為同一個類(class)。我們首先需要在物聯網平臺上為我們的demo手環建立一個裝置類(即產品),這樣我們才能在以後不斷的往這個產品下例項化新的裝置。
進入阿里雲物聯網平臺,在產品頁面新建一個產品,選擇自定義品類即可,命名為“阿爾茨海默氏症老人監控手環”。

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

地理位置只需要在“新增功能”裡用標準的功能即可,如圖,其他全部配置項預設即可。

心跳為一個整型資料,剩餘電量為浮點型資料,圖片地址為字元型資料,如圖。

在裝置面板點選“新增裝置”,選擇剛才建立的手環產品,然後輸入隨意的裝置名稱即可。

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

原文連結

本文為雲棲社群原創內容,未經