兼容型API(Legacy API)

DawnMedical的IoT设计正处于反复迭代的过程中。API的IP、端口、形式都会发生各种变化。为了在一段时间内保证第三方合作伙伴的要求,旧版API会暂时继续运行,但是会根据需要逐渐迁移到新版API。

背景介绍

DawnMedical的IoT应用设计初期并没有确立以RESTFul Web API作为整合第三方应用和移动APP的设计策略。

为了回应第三方合作伙伴的要求,DawnMedical IoT服务器产生了最初版本的Web API。此时,Web API并没有按照行业中通行的最佳实践进行设计,仅仅是简单的JSON Web API。

目前,DawnMedical IoT应用分解为两个云服务器:

  1. IoT Device Server,设备云,负责设备接入、数据采集、存储、转换、统计、分析和可视化;
  2. IoT Application Web Server,业务应用云、负责业务逻辑、授权和操作;

IoT Device Server 和 Application Server之间采用JSON格式的Web API整合。IoT Device Server与其他服务器、APP间也采用同样的Web API接口。

现有特性

  1. API支持呼吸机和血氧模块的物理量采集:数据采集含实时周期和呼吸周期数据流、日报表数据;
  2. 以TCP长连接接入呼吸机;
  3. 支持5秒钟实时数据快照;
  4. 支持呼吸周期数据保存;
  5. 支持XML格式数据导出;
  6. 支持设备登录情况导出;
  7. 数据可视化支持。

变更计划

  1. 转换API端口,从现有8888转换到80(HTTP)或443(HTTPS);
  2. 配合设备端升级,将系统架构从TCP长连接升级到MQTT,使用TLS和设备级Topic授权;
  3. 保留TCP长连接,升级安全算法;
  4. 设备抽象化,以支持更多种类设备接入,引入平台ID以取代设备串号;
  5. OAuth/OpenID provider/subscriber整合,以支持多种设备和使用者账号;
  6. 将MQTT作为主要数据分享手段,淡化API的数据分享使用;
  7. JSON数据结构变化,将realtime, period, daily等数据统一封装在data,并利用error给出错误信息。
  8. 其他变更。

以上进行中的变更,或多或少都会对第三方API接入产生影响。

在线设备列表

URI:

http://www.dawnmed.net/json/v1/devices

列出所有当前在线设备(呼吸机)的串号、IP地址和端口。

返回值:

{"devices": []}

或:

{
  "devices": [
    "A2H470014:180.175.138.44:4114",
    "None:180.175.138.44:28857",
    "None:180.175.138.44:28860",
    "A2H470031:180.175.138.44:5503",
    "A2H470027:180.175.138.44:4112",
    "A2F900012:180.175.138.44:4102",
    "A1H470031:180.175.138.44:4128",
    "A1H470029:180.175.138.44:4118"
  ]
}

呼吸实时数据

URI:

http://www.dawnmed.net/json/v1/realtime/<devSNR>
http://www.dawnmed.net/json/v1/realtime2/<devSNR>

列出当前设备号下所有实时数据,两者区别在于输出JSON格式不同。推荐使用realtime2格式。

返回值:

{"realtime": []}

或:

{"realtime":
    [{"flow": [25, 21, 18, 16, 16, 16, 15, 15, 15, 15],
        "kpr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "press": [11.2, 7.6, 4.8, 4.6, 4.6, 4.4, 4.4, 4.4, 4.0, 4.2],
        "sao2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "time": "1467672007.772"},
    {"flow": [14, 14, 14, 13, 13, 13, 13, 13, 13, 13],
        "kpr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "press": [3.8, 3.8, 3.8, 3.6, 3.6, 3.4, 3.4, 3.4, 3.2, 3.2],
        "sao2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "time": "1467672008.273"},
    {"flow": [14, 14, 14, 14, 14, 14, 15, 14, 14, 14],
        "kpr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "press": [4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 3.8, 3.8],
        "sao2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "time": "1467672008.773"},
    {"flow": [14, 14, 14, 14, 14, 14, 14, 14, 14, 14],
        "kpr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "press": [3.8, 4.0, 4.0, 3.8, 4.0, 3.8, 3.8, 4.0, 4.0, 3.8],
        "sao2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "time": "1467672009.274"},
    {"flow": [14, 14, 14, 14, 15, 14, 15, 14, 14, 14],
        "kpr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "press": [4.0, 4.0, 4.0, 3.8, 3.8, 4.0, 4.0, 4.0, 4.0, 4.0],
        "sao2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "time": "1467672009.773"},
    {"flow": [14, 14, 14, 14, 14, 14, 14, 14, 14, 14],
        "kpr": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "press": [3.8, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 3.8, 4.0, 4.0],
        "sao2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "time": "1467672010.272"}]
}

其中APP或服务器可以通过此接口在UI上进行实时绘图。物理量参数说明:

物理量说明
英语 汉语 范围 单位 备注
flow 流量 0~51 l/min 呼吸空气流量
press 压力 0~255 cmH2O 呼吸压力
sao2 血氧 0~100 % 夹指式血氧模块血氧指数
kpr 脉率 0~255 /min 每分钟脉率

每个物理量数组中包含10个数值,代表在0.5秒内的10个采样点。拟增加采样周期参数。

呼吸周期数据

即用户睡眠时的呼吸周期数据。该数据不是定期采样的周期数据,采样时间/频率随着用户呼吸而变化。

URI:

http://www.dawnmed.net/json/v1/period/<devSNR>
http://www.dawnmed.net/json/v1/period2/<devSNR>/<count> (count<200,为数据库n个呼吸周期数据快照)
http://www.dawnmed.net/json/v1/period3/<devSNR>/<start>/<stop>  (start/stop时间格式:yyyy-mm-dd,HH:MM:SS)

列出当前设备号下所有周期数据,三者区别在于固定长度,可变长度和起始位置参数。推荐使用第三种。

返回值:

{"period": []}

或:

{"period":
    [{"alarm": 0, "cql": 0, "epap": 4, "fengy": 12, "hxpl": 10, "indient": 64, "ipap": 12, "lql": 14, "my": 4, "pjyl": 52, "ramp": 64, "recId": 15345510, "time": 1467604801.0},
    {"alarm": 0, "cql": 0, "epap": 4, "fengy": 12, "hxpl": 10, "indient": 64, "ipap": 12, "lql": 14, "my": 4, "pjyl": 52, "ramp": 64, "recId": 15345515, "time": 1467604807.0},
    {"alarm": 0, "cql": 0, "epap": 4, "fengy": 12, "hxpl": 10, "indient": 64, "ipap": 12, "lql": 14, "my": 3, "pjyl": 52, "ramp": 64, "recId": 15345520, "time": 1467604813.0},
    {"alarm": 0, "cql": 0, "epap": 4, "fengy": 12, "hxpl": 10, "indient": 64, "ipap": 12, "lql": 14, "my": 3, "pjyl": 52, "ramp": 64, "recId": 15345527, "time": 1467604819.0}]
}
物理量说明
英语 汉语 范围 单位 备注
cql 潮气量 0~2550 ml 用户使用中的监测潮气量,即吸气量
epap 呼气压力 2~20 cmH2O 呼气时提供较低的压力支持(EPAP),用于控制用户PEEP值
fengy 峰值压力 0~255 cmH2O 最高呼吸压力数值
hxpl 呼吸频率 3~255 bpm 每分钟呼吸次数
ipap 吸气压力 4~25 cmH2O 吸气时提供较高的压力支持(IPAP),用于控制用户的最大吸气压力
lql 漏气量 0~100 l/min 每分钟泄漏气量
my 呼气末压 2~20 cmH2O 控制呼吸或辅助呼吸时,于呼吸末期在呼吸道保持的正压,监测PEEP
pjyl 平均压力 0~25.5 cmH2O 单次呼吸周期压力平均值
indient 保留标志位 N/A N/A 暂无实际意义
ramp 保留标志位 N/A N/A 暂无实际意义
time 时间戳 N/A s UNIX时间戳,精确到ms

“alarm”报警数据为枚举数值,长度1个字节。枚举含义为:

  1. 0x00:无报警。
  2. 0x01:低呼吸频率
  3. 0x02: 高呼吸频率
  4. 0x03: 电量不足
  5. 0x04:低压报警
  6. 0x05:低漏气量
  7. 0x06:高漏气量
  8. 0x07:高压报警
  9. 0x08:电量过低
  10. 0x09:湿化器报警
  11. 其他值:保留

设备使用日报表

URI:

http://www.dawnmed.net/json/v1/usage2/<devSNR>/<date> (日期格式:yyyy-mm-dd)

返回值:

{
  "data": {},
  "errno": -1,
  "error": "not available"
}

或:

{
  "data": {
    "AHI": 0.0,
    "AI": 0.0,
    "HI": 0.0,
    "P95": 80,
    "duration": 437,
    "frequency": 17,
    "leak": 14,
    "press": 71,
    "recId": 11512,
    "tidal": 34
  },
  "errno": 0,
  "error": "succ"
}
物理量说明
英语 汉语 范围 单位 备注
duration 使用时长 12h60m h:m 病人于前日12:00PM到当日11:59AM间使用时长
frequency 呼吸频率 3~255 bpm 呼吸频率均值
press 呼吸压力 0~25.5 cmH2O 整晚CPAP治疗压力的平均值
leak 漏气量 0~100 l/min 从面具中泄漏的空气量均值,适当 数值可以提高用户依从度
tidal 潮气量 0~2550 ml 吸气量均值
AHI AI+HI 0~255 /h 呼吸暂停与低通量指数值之和
AI 呼吸暂停指数 0~255 /h 每小时睡眠过程中口鼻呼吸气流完全停止10秒以上
HI 低通气量指数 0~255 /h 呼吸气流强度(幅度)较基础水平降低50%以上,并伴有血氧饱和度较基础水平下降大于等于4%
P95 95%压力 0~25.5 cmH2O 95%的时间内呼吸机的工作压力低于某值,即合适的治疗压力

设备登录详情

URI:

http://www.dawnmed.net/json/v1/logbook/<date>/<devSNR>(日期格式:YYYYmmdd)

返回值:

{
  "snrCode": "A2H470049",
  "logbook": [
  {"durationSession": 2151, "host": "36.62.137.190", "login": 1475123758.0, "logout": 1475125909.0, "port": 43637, "recId": 51573},
  {"durationSession": 744, "host": "36.62.137.190", "login": 1475126416.0, "logout": 1475127160.0, "port": 45041, "recId": 51583},
  ],
}
属性说明
英语 汉语 范围 单位 备注
durationSession 使用时长 0~60x60x24 单次登录使用时间
host 设备IP地址 x.x.x.x N/A 登陆时IP地址
port 设备端口 0~65535 N/A 登陆时端口
login 登入时间 ? ts 主机登陆时间
logout 登出时间 ? ts 主机登出时间
recId 记录ID ? N/A 数据库记录ID

XML报表

URI:

http://www.dawnmed.net/xml/<devSNR>.rss
http://www.dawnmed.net/xml/<devSNR>.dw

更新

DM是DawnMedical定义的自有XML格式文档,用于桌面应用程序的数据提取。缺点是文件太大。所以在每日批处理中增加了对于压缩XML文档的支持,压缩比为1:10~1:50。

由于设备服务器开始支持呼吸机和血氧仪,原有的数据库结构不再适用。所以从2016/10/01开始,不再支持杜恩原有的呼吸机XML数据格式DW,改为压缩存储的CSV文档。开发者可以利用这些数据进行特定设备的分析,报表生成和后续处理。

设备归档汇总

用于返回指定日期的设备数据压缩文档:csv.zip。

URI:

http://www.dawnmed.net/json/v1/archives/<date>/<devSNR>

<date>格式为yyyy-mm-dd,例如2016-12-21。<devSNR>支持通配符。

更新

因为该URI过于宽泛,所以中间添加了日期作为限制。同时返回JSON中域名增加为全域名以方便应用开发者使用。

返回值:

{
  "device": "A1H47003*.csv",
  "error": 0,
  "error_code": "OK",
  "archives": [
    "http://www.dawnmed.net/static/archive/2016/10/02/A1H470038.csv.zip",
    "http://www.dawnmed.net/static/archive/2016/10/01/A1H470038.csv.zip",
    "http://www.dawnmed.net/static/archive/2016/10/01/A1H470031.csv.zip"
  ]
}
属性说明
英语 汉语 范围 单位 备注
device 设备串号 ? N/A 杜恩自定义设备串号,支持通配符查询

设备报告汇总

用于返回指定日期的设备使用报告文档:pdf。

URI:

http://www.dawnmed.net/json/v1/reports/<date>/<devSNR>

<date>格式为yyyy-mm-dd,例如2016-12-21。<devSNR>支持通配符。

更新

因为该URI过于宽泛,所以中间添加了日期作为限制。同时返回JSON中域名增加为全域名以方便应用开发者使用。

返回值:

{
  "archives": [
    "http://www.dawnmed.net/static/pdf/2016/12/20/A2H470016_2016-12-20_Night.pdf",
    "http://www.dawnmed.net/static/pdf/2016/12/20/A2H470016_2016-12-20_Day.pdf",
    "http://www.dawnmed.net/static/pdf/2016/12/20/A2H470016_2016-12-20_AllDay.pdf"
  ],
  "device": "A2H47001*",
  "error": 0,
  "error_code": "OK"
}
属性说明
英语 汉语 范围 单位 备注
device 设备串号 ? N/A 杜恩自定义设备串号,支持通配符查询

杜恩医疗设备云及API说明