阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病。据估计,全世界痴呆症患者数量为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类型,最后保存即可完成。这样就完成了表结构的配置。
首先在物联网平台首页,开发服务下的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”中第一个下拉框选择“设备触发”,在二级菜单选择“心跳”;判断条件选择“{value}}的格式,如“{{query.deviceContext.deviceName}}”,可以查看下图的完整配置方法:
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?