場景介紹
阿爾茨海默病,是導緻中老年人認知功能障礙的最常見疾病之一,是發生在老年期及老年前期的一種原發性退行性腦病。據估計,全世界癡呆症患者數量為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 适合存放任意類型的檔案,适合各種網站、開發企業及開發者使用。
首先點選“立即開通”進入開通頁面并點選同意協定。
然後進入控制台,建立一個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資料庫。
3)
登入之後首先建立一個資料庫,命名為test,然後重新整理一下,可以看到建立的test資料庫,然後進入資料庫建立一張表。
插入如下的幾列,注意time可能需要改為timestamp類型,最後儲存即可完成。這樣就完成了表結構的配置。
資料對接RDS
首先在物聯網平台首頁,開發服務下的IoT Studio的快速入口進入服務開發工作台。然後建立一個服務,命名為“手環心跳轉儲RDS”。
然後在節點清單裡選擇“裝置觸發”節點,在右側欄選擇之前建立的産品“阿爾茨海默氏症監控手環”,監聽所有裝置的屬性上報,如圖。
接下來選擇一個雲資料庫mySQL節點,将裝置觸發節點與雲資料庫節點連接配接起來。
參數如下,分别對應之前的列名,record不填,因為record會自動增長:
{
"table": "test",
"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可視化工作台的設定菜單,點選域名管理。按照引導流程處理進行域名解析。
然後點選右上角的釋出,點選确定即可。
然後就可以看到釋出成功了。直接前往自己購買的域名檢視即可。
這樣就完成一套全鍊路的阿爾茨海默病人護理物聯網解決方案的釋出了。
如何開始?
為了實作技術普惠,讓大家更好的落地物聯網業務,上述教程中用到的物聯網相關雲資源,套餐包目前正在1折促銷!點選圖檔進入購買!