精华内容
下载资源
问答
  • 2 小时完成物联网养老 SaaS 平台搭建

    千次阅读 2019-08-14 23:30:43
    但是我们要做更高一层,除了单独分发的硬件之外,我们要使用开发工具IoT Studio帮助医疗机构做一个硬件SaaS管理系统,让他们可以随时监控旗下所有阿尔兹海默护理设备的数据以及定位,对老人的情况实现实时监控。...

    用技术解决阿尔茨海默病护理的问题,让老人和其护理者有更好的生活质量,是技术可以解决的。基于物联网技术,已经有一些设备实现了阿尔茨海默病老人走失定位。但是我们要做更高一层,除了单独分发的硬件之外,我们要使用开发工具IoT Studio帮助医疗机构做一个硬件SaaS管理系统,让他们可以随时监控旗下所有阿尔兹海默护理设备的数据以及定位,对老人的情况实现实时监控。

    @TOC

    简介用技术解决阿尔茨海默病护理的问题,让老人和其护理者有更好的生活质量,是技术可以解决的。基于物联网技术,已经有一些设备实现了阿尔茨海默病老人走失定位。但是我们要做更高一层,除了单独分发的硬件之外,我们要使用开发工具IoT Studio帮助医疗机构做一个硬件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 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。

    首先点击“立即开通”进入开通页面并点击同意协议。在这里插入图片描述然后进入控制台,新建一个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 jsonimport multiprocessingimport timeimport randomimport oss2 ##导入阿里云的OSS库,如果import失败需要先pip3 install oss2from picamera import PiCamera ##树莓派的摄像头,系统自带import RPi.GPIO as GPIO ##GPIO口,接红外PIR用import serialimport pynmea2from pulsesensor import Pulsesensor ##导入树莓派的pulsesensor库,https://github.com/tutRPi/Raspberry-Pi-Heartbeat-Pulse-Sensor/blob/master/example.pyauth = oss2.Auth('**AccessId*****','**AccessSecret*****') ##OSS的授权需要阿里云账号AccessId和AccessSecret,具体查看https://usercenter.console.aliyun.com/#/manage/akbucket = oss2.Bucket(auth,'http://oss-cn-beijing.aliyuncs.com','***你的bucket名称***') ##需要根据服务器区域修改节点路径,见文档global picURLtoIoTcamera = 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)    passdef 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应用的样式与众不同?可以自定义各种样式,也可以使用标准模板。

    使用标准模板可以在新建页面的时候点击。在这里插入图片描述也可以根据自己的喜好,用空白模板,然后自定义样式,比如修改菜单栏颜色。在这里插入图片描述修改背景颜色。在这里插入图片描述放入一些图片。在这里插入图片描述在这里插入图片描述在这里插入图片描述输入文字等装饰。最后变成这样的页面。在这里插入图片描述

    医院监控大屏页

    如同示例,我们需要一个指示设备GIS的地图以及一个展示设备状况的列表。在组件栏对应的是这两个组件。在这里插入图片描述设备地图

    设备地图需要用到物联网平台数据分析功能的空间数据可视化服务。过程如下图gif显示,首先在左侧栏拖入地图组件,然后点击添加场景,前往空间数据可视化页面,然后点击添加,选择“阿尔兹海默症手环”产品,点击确定。

    在这里插入图片描述可以修改地图主题色等。

    在这里插入图片描述选择后返回IoT Studio,重新点击地图组件选择刚才创建的场景,就可以看到在页面上出现了一份有设备位置的地图。在这里插入图片描述可以调节大小,放到合适的位置上,就完成了地图组件的配置了。在这里插入图片描述设备属性表格设备属性表单可以把当前产品下所有设备(手环)的在线状态,更新时间以及属性快照值的显示出来,并且在应用发布后可以调整显示的列内容。适合全局性的设备预览。

    首先拖入设备属性组件,在右侧栏配置要关联的产品。在这里插入图片描述可以看到关联了产品后,表单自动显示产品下的全部设备。接下来我们可以修改一下右侧的配置项,让他的样式更符合黑色的背景。

    在这里插入图片描述在这里插入图片描述然后我们可以点击右上角预览,查看一下页面效果。可以在预览时点击“列显示设置”按钮修改显示的列数,这个配置是本地存储的,不会同步到云端。在这里插入图片描述这样第一个医院监控大屏页面就完成了。

    医院设备管理页

    设备管理页允许运维人员(而不是开发者)直接添加新设备获取三元组,这样他们就可以不感知阿里云物联网平台而实现设备的添加。为了实现这个功能,需要设备管理这个表单组件,如图。在这里插入图片描述配置方法为:首先从左侧栏拖入设备属性组件,然后在右侧栏修改一些配置项——包括是否允许发布之后用户添加/编辑/删除设备,修改列显示排序,添加自定义标签,修改样式等等。具体功能说明可以查看文档。在这里插入图片描述然后可以通过圆形组件,矩形组件以及文字组件添加设备采买流程等,最后完成的效果如图。

    在这里插入图片描述我们可以预览,看看是否可以添加/删除设备。注意这里的添加/删除是会直接影响物联网平台上的设备的。在这里插入图片描述这样设备管理页就完成了,最后就是每个设备的详情页,也就是每个监控手环的信息展览页。

    设备监控页设备监控需要监控当前老人的心跳,剩余的电量,是否有告警信息,摄影设备的实时图像监控以及心跳的历史趋势图等。在这里插入图片描述仪表盘的配置首先从左侧栏拖入一个仪表盘,修改一下样式。在这里插入图片描述然后关联设备数据,这里关联的是老人001的Wrist001设备的剩余电量。选择产品,设备,属性,然后验证数据格式。注意如果设备没有上报过信息,数据格式验证是无法通过的,可以通过虚拟设备上报信息进行验证。在这里插入图片描述这样就完成了剩余电量的仪表盘了,同理心跳数据的仪表盘也一样操作。

    告警信息系统我们需要一段文字来接受来自设备的告警信息,同时需要一个按钮调用告警服务。首先拖入一段文字组件,然后关联对应设备的对应事件(如老人摔倒),验证格式之后文字会显示事件的快照值以及输出参数。当然可以通过服务开发工作台的HTTP请求接口修改文字内容,定制化等。

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述可以拖到最下方进行轮询,保证数据的实时性。在这里插入图片描述接下来是一个告警服务,比如短信通知家属,我们可以开通阿里云的短信服务或者钉钉机器人进行消息的输出,也可以用服务开发的“三方API”节点进行微信公众平台等三方输出。这里我们以钉钉机器人为例。

    新建一个服务,使用一个HTTP请求节点,中间接一个钉钉机器人节点,最后接一个HTTP返回节点即可。HTTP请求不需要入参,HTTP返回不需要额外配置,钉钉机器人节点的配置项如下。在这里插入图片描述在按钮那里选择交互-点击-调用服务,选择对应的服务,验证即可看到钉钉机器人推送。在这里插入图片描述在这里插入图片描述这就完成了告警模块的设置。

    实况监控图片的实况监控,如之前说的我们获取了设备图片的url作为属性上报,我们可以使用“变量”机制,帮助iframe组件获取设备上报的属性。

    首先拖入一个iframe组件,然后直接把之前步骤里获得的oss图片链接粘贴上去即可。在这里插入图片描述心跳曲线心跳曲线需要用到设备曲线图组件,可以直接关联具体的设备获取数据,无需额外的配置。

    首先拖入一个曲线图组件,在数据源侧选择设备Wrist001,点击验证数据,即可读取最近上报的数据。在这里插入图片描述然后调节样式即可,最后样式如下:在这里插入图片描述这样就完成了整个设备监控页。其他页面按此流程绑定不同设备即可,目前组件也已经支持跨页面复制。

    发布应用

    我们需要先在阿里云上申请一个域名,打开域名购买,购买一个域名。

    然后前往IoT Studio的Web可视化工作台的设置菜单,点击域名管理。按照引导流程处理进行域名解析。在这里插入图片描述然后点击右上角的发布,点击确定即可。在这里插入图片描述在这里插入图片描述然后就可以看到发布成功了。直接前往自己购买的域名查看即可。

    在这里插入图片描述这样就完成一套全链路的阿尔茨海默病人护理物联网解决方案的发布了。

    阅读全文: http://gitbook.cn/gitchat/activity/5d539f993934a517d7943506

    您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

    FtooAtPSkEJwnW-9xkCLqSTRpBKX

    展开全文
  • odoo10(13)saas平台搭建

    千次阅读 2019-05-21 23:23:34
    下载地址:https://github.com/it-projects-llc/odoo-saas-tools 首先配置文件不使用dbfilter = ^%h$来创建...安装saas_server,修改auth.oauth.provider中saas的auth_endpoint和validation_endpoint,最终在平台...

    下载地址:https://github.com/it-projects-llc/odoo-saas-tools
    首先配置文件不使用dbfilter = ^%h$来创建平台和服务器两个数据库
    1、平台
    安装saas_portal
    2、服务器
    安装saas_server,修改auth.oauth.provider中saas的auth_endpoint和validation_endpoint,最终在平台中找到服务器点击打开服务后可以通过平台授权登录成功即可
    3、方案
    在平台中创建方案记录,安装saas_client
    4、客户端
    根据方案复制数据库

    展开全文
  • SaaS平台部署.doc》由会员分享,可在线阅读,更多相关《SaaS平台部署.doc(6页珍藏版)》请在人人文库网上搜索。1、文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.SaaS平台设计方案引言云计算作为一种...

    《SaaS平台部署.doc》由会员分享,可在线阅读,更多相关《SaaS平台部署.doc(6页珍藏版)》请在人人文库网上搜索。

    1、文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.SaaS平台设计方案引言云计算作为一种基于互联网的、大众参与的、 以服务方式提供的新型计算模式,其计算资源是动态、可伸缩、且被虚拟化的。SAAS 作为云计算的一种重要模式,通过互联网为用户提供所需的服务,在这种模式下用户无须在购买软件,而是想服务提供商按需租赁,根据使用时间或使用量付费。著名的 SAAS 应用提供商Salesforce ,将多租户( multi-tenancy)技术应用于其客户关系管理等服务,大获成功。简单而言,多租户是指一个单独的软件实例可以为多个用户/ 组织服务的模式。多租户技术作为SaaS 应用区别于传统。

    2、软件的重要标志,主要是探讨与实现如何在大量用户的环境下共用相同的软件或组件,并仍可确保不同组织/ 用户数据的隔离性和安全性。SAAS 的成熟度模型分级可配置高性能可伸缩Level1定制开发Level21文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.可配置Level3Level4Level1 定制开发 :有一个客户项目,就按客户需求定制一个版本,每个客户的软件都有一份独立的代码,不同客户软件之间可以共享和重用的只有少量的可重用组件、库以及开发人员的经验Level2 可配置 :客户可以通过简单的配置,让通用型的软件能够满足自己的一些个性经需求。为每个客户独立部署一个运行实例,。

    3、只不过每个运行实例运行的是同一份代码。Level3 高性能的多租户架构:多租户单实例的应用架构才是通常真正意义上的 SAAS 应用架构,也就是我们通常所说的Multi-Tenant架构。Level4可伸缩性的多租户架构:在用户数大量增长情况下,无须更改架构,而仅通过硬件设备的增加,支撑应用规模的增长。SAAS 多租户模式下数据隔离方案模式隔离级别共享级别安全级别成本2文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.独立数据库高低高高共享数据库、隔离中中中中表架构共享数据库、共低高低低享表、隔离数据架构独立数据库:主要是为不同的租户提供独立的不同的数据库,租户与租户之间从数据。

    4、库层面完全隔离,互不影响。能够简化数据模型设计,且后续专有特殊需求也比较容易实现;故障修复、数据处理也相对简单。这种方式数据安全级别最高、安全性最好,但是成本太高,维护工作量太大,会导致较高的设备维护和数据备份开销,因为通常数据服务器所支持的数据库数量是有限的;共享数据库但隔离表架构:是多个租户可以共享一个数据库,但不同的租户使用不同的Schema ,从一定程度上隔离了用户数据,每个数据库可以支持多个租户应用。这种方式相对前面大大降低了成本,但后续如果数据库出现故障、数据恢复等操作将增加复杂度;共享数据库且共享表:是多个租户共享一个数据库同一个Schema ,通过数据库表字段来进行区分不同的租。

    5、户。这种方式成本最低,允许每个数据库支持的租户数量最多,但安全性最差,后续数据库故障也更复杂;3文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.Log360多租户设计方案数据隔离方案( 1 )系统资源隔离( MySQL )系统资源包括:系统功能菜单、系统配置数据等。此部分数据数据量小、安全级别要求不高,另外建设初期设备有限,所以我们采用第三种共享数据库、共享表、隔离数据架构方案。具体设计如下:人员:一个租户可以拥有多个角色,人员表和角色表是多对多的关系;角色:包括默认角色(系统默认提供两个角色超级管理员和日志管理员,这两个角色不可编辑)和自定义角色(功能可以自定义)两种,一。

    6、个角色对应多个功能菜单,角色表和菜单表是多对多的关系;系统功能菜单:包括系统所有菜单功能,初始化数据库表中;系统配置数据:包括告警数据、日志分组数据、提取规则数据等,此类数据表中都带有租户身份信息(如租户ID )。( 2 )数据资源隔离( Elasticsearch )数据资源主要指原始日志数据。此部分数据数据量大且安全要求相对较高,所以我们采用第二种4文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.共享数据库、隔离表架构的方案。具体设计如下:每个租户的数据都要新建一个Type进行存储,即index由appname+tag+时间戳组成, type由 tag+TenantID组成;所以用户上传文件时要将租户ID 传给解析入库组件。( 3 )缓存资源隔离(Redis )缓存资源主要包括分析任务的中间结果。此类数据通过TenantID进行区分,即每一个key 值都需要带上TenantID数据安全方案( 1)系统资源: MySQL需要配置成主备,以防止数据丢失,难以恢复,至少两台服务器;( 2)数据资源: Elasticsearch 需要配置成集群, 至少需要三台服务器;平台部署方案一:购买云服务器和域名方案二:使用家里的服务器,购买域名5。

    展开全文
  • 最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得、体会逐渐分享出来,和大家一起探讨。这是本系列的第一篇文章。 大家知道,要做一个全自助服务的SAAS平台是比较复杂的,稍微...

        最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得、体会逐渐分享出来,和大家一起探讨。这是本系列的第一篇文章。

        大家知道,要做一个全自助服务的SAAS云平台是比较复杂的,稍微有些漏洞,就会被不法分子钻漏洞,牵涉到一些金钱上的纠纷。因此,一开始的设计就比较重要了。说到云自助服务平台,可能和网上购物、在线商城有些类似,但里面提供的是相关服务,还是有些区别的,我在这里先讲几个概念:

    • 产品:产品即服务,即是提供给用户的服务。产品有单价,有些产品是基础产品,用户购买正式产品必须免费提供的,产品可以提供给用户进行试用。
    • 模块:产品包括很多模块,有些模块是必然会提供给用户的,比如 操作人员管理、操作日志 等,还有些模块是可选的,用户针对自己的情况进行购买,类似增值服务,比如移动端、企业主页等。另外还有些一次性的服务,比如系统数据对接硬件设备购买等;
    • 服务:用户所能享受到的服务,有一定的使用期限;
    • 订单:用户根据所拥有的 服务 所下的订单(而不是产品哦,为什么?);
    • 购物车:在用户订单生成前先把产品放在购物车里,购物车有很多类别,有的购物车是对目前服务进行的延期,有些是把试用的产品转为正式,有些是对现有服务模块的增删,牵涉到追加购买等。购物车操作频繁、需要做非常多的校验,要和已经购买的服务做无缝的对接,这也是云SAAS产品和普通电商很大不同的地方。到了订单阶段,就相对比较简单了,生成订单后将购物车清空、可以生成多张订单,支付的时候再做一遍校验。

         总体的概念流程是 服务->产品->购物车->订单->服务

        上一张购物车验证规则的流程图

     

        一些类(还没有全部完成):

        对实体类的操作大都采用工厂方式:

        购物车类代码:

        public class UserCart
        {
            public string UserId { get; set; }
            /// <summary>
            /// 设置域名
            /// </summary>
            public string ServiceIndentify { get; set; }
            public OrderType OrderType { get; set; }
            public IList<UserCartProduct> UserCartProducts { get; set; }
            public float TotalPrice
            {
                get
                {
                    if (OrderType == OrderType.Experience)
                    {
                        return 0;
                    }
                    else
                    {
                        return UserCartProducts.Sum(p => p.Price);
                    }
                }
            }
            public virtual IList<UserCartProduct> UserCartProduct { get; set; }
        }
    
        public class UserCartProduct
        {
            public string ProductId { get; set; }
            public int ProductBasePrice { get; set; }
            public Period Period { get; set; }
            public DateTime StartDate { get; set; }
            public DateTime EndDate { get; set; }
            public IList<string> UserCartProductBasicModules { get; set; }
            public IList<UserCartAddtionalModule> UserCartProductAddtionalModules { get; set; }
            public IList<UserCartAddtionalService> UserCartAddtionalServices { get; set; }
            public IList<UserCartOption> UserCartOptions { get; set; }
            public float Price
            {
                get
                {
                    return ProductBasePrice
                        + UserCartProductAddtionalModules.Sum(m => m.UintPrice.GetPriceByPeriod(Period))
                        + UserCartAddtionalServices.Sum(m => m.UintPrice.GetPriceByPeriod(new Period(PeriodType.Times, m.Quantity)))
                        + UserCartOptions.Sum(m => m.UintPrice.GetPriceByPeriod(Period));
                }
            }
            public virtual UserCart UserCart { get; set; }
        }
    
        public class ModuleBase
        {
            public string ModuleId { get; set; }
            
            public PeriodPrice UintPrice { get; set; }
    
        }
    
        public class UserCartAddtionalModule: ModuleBase
        {
        }
    
        public class UserCartAddtionalService : ModuleBase
        {
            public int Quantity { get; set; }
        }
    
        public class UserCartOption: ModuleBase
        {
            public string CheckId { get; set; }
            public string OriginCheckedId { get; set; }
            public PeriodPrice OriginPeriodPrice { get; set; }
        }

        其他类类似。

        大家对这块有什么好的意见和建议,希望能够提出来。

     

       SAAS云平台搭建札记系列文章:

       SAAS云平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单

       SAAS云平台搭建札记: (二)Linux Unbutu下.Net Core整套运行环境的搭建

    展开全文
  • 最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得、体会逐渐分享出来,和大家一起探讨。这是本系列的第一篇文章。 大家知道,要做一个全自助服务的SAAS平台是比较复杂的,稍微...
  • 软件企业向服务型企业转型的大趋势“我们预计, 2008 年几大主要软件厂商及其合作伙伴生态系统都会更加积极地参与和拓展软件即服务 (SaaS) 市场。” 权威市场研究机构 IDC 在对 2008 年 IT 市场的发展趋势进行预测时...
  • 在大部分软件都向着saas服务转换的同时,积分商城也开始提供积分商城saas服务。那么,积分商城saas服务是什么?相比传统积分商城有什么优势? 首先,saas是Software as a service的简写,意思是软件即服务。saas...
  • 最近做的项目,由于预算有限,公司决定不采购Windows服务器... SAAS平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单  SAAS平台搭建札记: (二)Linux Unbutu下.Net Core整套运行环境的搭建
  • SAAS平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单  SAAS平台搭建札记: (二)Linux Unbutu下.Net Core整套运行环境的搭建   转载于:...
  • SaaS-工程搭建

    2019-12-27 11:46:37
    4 工程搭建 4.1 前置知识点的说明 Saas-HRM系统后端采用 SpringBoot+SpringCloud+SpringMVC+SpringData Saas-HRM系统前端采用 基于nodejs的vue框架完成编写使用element-ui组件库快速开发前端界面 学员应对以上前后端...
  • saas平台相关内容

    千次阅读 2018-08-30 11:32:32
    一,saas平台是什么 saas的定义 SaaS即Software-as-a-service(软件即服务)是一种基于互联网提供软件服务的应用模式。所有网络基础设施及软件、硬件运作平台的所有前期实施、后期维护都由SaaS平台...
  • SaaS-多租户SaaS平台的数据库方案

    千次阅读 2019-12-27 15:29:30
    1 多租户SaaS平台的数据库方案 1.1 多租户是什么 多租户技术(Multi-TenancyTechnology) 又称多重租赁技术:是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序...
  • SaaS平台是运营saas软件的平台。SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过...
  • 到此我们的平台已经搭建完成,不这只是Saas的基础层(你可以在虚机内添加Exchange、Lync、SharePoint服务器等等) 后续将为大家进行更深一步的介绍 敬请期待…………………… 感谢您的关注 转载于:...
  • saas平台架构分为哪几部分

    万次阅读 2018-05-23 18:18:15
    saas平台架构需要完成从用户申请链接saas到用户对自己购买的功能模块的应用整个过程,用户用起saas看似简单快捷,但这个过程却需要saas平台架构默默完成的非常复杂的处理过程。通过对saas平台架构的了解,可以清晰的...
  • 众所周知当前SaaS很热门,SasS是什么?请参见百度百科:...  作为一个IT界的潮人,于是就有了搭建SaaS平台的想法,而第一个SaaS产品就是企业资源预约系统,下面来介绍一下这个企业资源
  • 多租户应用程序擅长使用一套代码为多个租户提供服务。该体系结构可以使用单个代码源为许多不同的客户端或租户提供服务。构建多租户系统一般都是哪些构建思路呢? 1、什么是租户 在多租户体系结构中,应用程序的一个...
  • “Bwsaas多端SAAS平台运营系统”接入微信开放平台(第三方服务商),微信公众号管理及微信小程序一键授权发布,具备多租户管理、多应用上架购买、多终端(公众号,H5,小程序,PC,APP)可接入、强大的权限节点控制...
  • 我自己不是做研发这块,想请教下这两种在性能、安全以及后期维护等方面上有什么优劣势呢?
  • 构建SaaS平台产品的建议

    千次阅读 2020-05-02 18:17:08
    构建SaaS化产品相对于定制、普通产品而言肯定要难很多,但以往的产品研发经验还是有用的。毕竟发展路径还是遵循系统的定制化、产品化和SaaS化这个进发路径。我觉得构建SaaS产品需要有以下注意点: 1)无论是做定制...
  • 2 数据库设计与建模 2.1 数据库设计的三范式 三范式: 第一范式(1NF):确保每一列的原子性(做到每列不可拆分) 第二范式(2NF):在第一范式的基础上,非主字段必须依赖于主字段(一个表只做一件事) ...
  • 典型的SaaS平台构建--Salesforce CRM介绍

    千次阅读 2017-09-11 14:51:19
    CRM是目前世界范围内最成功的收费Saas业务,Salesforce通过搭建平台运营云计算的CRM Saas服务,最大化的降低了自身的运营成本和产品的价格,取得了收入的井喷式增长。 Salesforce公司成立于1999年,公司自...
  • 【本章导读语】 “笑嘻嘻的小猫咪,”爱丽斯问道,“请您告诉我,我应该走哪条路 ...SaaS平台本身业务特殊,注册用户多,使用范围广等特点,对平台的技术框架选型也有许多要求,主要包括如下: l 运行稳定、安全可靠
  • 我这里的saas 就是 在正常的系统 上面加入公司 部门,我本来是希望 我把我做过的项目 都能通过saas 模式保留下来。 目前进度: 后台 公司 部门开发完成 网关 整合swagger 实现统一swagger文档 整合oauth2 进行...
  • 现在大大小小的企业商家都想做自己的小程序微商城,有的用SaaS平台制作,有的选择传统的...通俗来讲就是,客户使用SaaS平台,不需要自己购买服务器、域名、搭建和维护,客户只需把精力放在运营上面即可。 SaaS平台
  • 目前,市面上的餐饮Saas平台很多,要想从中脱颖而出,独领风骚,还要从打造用户帮助中心、增强用户体验感做起,简而言之就是餐饮Saas平台引导得好,才有更多用户知道产品的好,并且使用起来,愿意为其付费。...
  • 技术栈简介及创建父工程-搭建工程-Saas多租户平台开发 目录 文章目录一、工程搭建1、前置知识说明2、开发环境要求3、构建父工程***后记*** : 内容 一、工程搭建 1、前置知识说明 Saas-HRM后端代码技术栈:...
  • 对于Saas业内在用户统一身份认证及授权管理领域,主要关注 4 个方面(4A管理)): 集中账号管理(Account)、集中认证管理(Authentication)、集中授权管理(Authorization)和集中审计管理(Audit), 简称 4A ...
  • 基于DDD领域模型并支持SaaS平台的开发脚手架 在线体验 flash_on 快速开发 xtoon-boot基于springboot2.4、shiro、mybatis-plus、vue等实现一套完善的web开源框架,提供了用户,角色,权限,租户,组织架构等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,080
精华内容 4,832
关键字:

saas平台搭建