Webhook
如果开发者不能对接 MQTT 服务,可以使用 Webhook 推送的方式接收实时数据的推送。Webhook 的功能是将传感器数据和事件消息通过 HTTP POST 命令实时发送到指定的 URL(服务器),为保护您的数据安全,请使用 HTTPS URL。
SENSORO 服务器在 5 秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空字符串,SENSORO 服务器不会对此作任何处理,并且不会发起重试。
一、填写服务器配置
登陆 IoT 云平台官网后,在平台官网的 开发者- 消息推送设置,填写开发者 Webhook 地址, 其中 URL 必须支持 POST 请求方法,因为数据是通过 POST 的方式推送。
在平台官网 高级功能 - 开发者, 得到对应的 AppID, AppKey 和 AppSecret。
- AppID 作为应用唯一标示符
 
- AppKey 作为消息加密解密秘钥
 
- AppSecret 作为消息签名密钥
 
同时,开发者可选择消息加解密方式:
模式的选择与服务器配置在提交后都会立即生效,开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择安全模式需要提前配置好相关加解密代码。
注: 推送数据包括三种内容: 传感器上报的实时数据、传感器状态改变相关数据、传感器下行任务的结果
二、传感器数据推送(传感器上报的实时数据)
当 终端 向云平台上传数据包时,SENSORO 服务器将 JSON 数据包 POST 请求到开发者填写的 Webhook 地址。
标准设备上只有一个传感器,所以推送的数据包中只有一种传感器数据,以下请求示例枚举所有传感器类型的数据.
注意:
1. α 开发者套件或者 α 传输模块推送的传感器数据只有 `customer` 字段, 需要对 customer 做数据解析。
2. α 开发者套件默认解析规则如下:
    第 0 个字节: 前缀,解析时跳过
    第 1~4 个字节: 温度数据,float型小端模式
    第 5~8 个字节: 湿度数据,float型小端模式
    第 9~12 个字节: 光线数据,float型小端模式
请求参数举例
Request: {
    appId: '123456789ABC',
    sn: '0117C9XXXX',
    type: 'text', // 消息类型, text 普通消息
    deviceType: 'node',
    createdTime: '',
    msgId: '', //消息 id
    band: 'SE433', // 频段
    rssi: -50, // 信号强度
    snr: 11.5, // 信噪比
    data: { // 明文
        battery: Int, //电池电量
        temperature: float,
        light: float,
        humidity: float
    },
    encryptData: '' // 安全模式开启后的加密密文
}
参数说明
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| appId | 
是 | 
String | 
123456789ABC | 
系统分配给应用的唯一标示符, 可在云平台 开发者 -基本设置获取 | 
| sn | 
是 | 
String | 
1122334455667788 | 
终端设备标示符, 即升哲传感器或者传输模块的唯一序列号 | 
| type | 
是 | 
String | 
text | 
表明此数据包是传感器数据推送消息 | 
| deviceType | 
是 | 
String | 
chip | 
设备类型 | 
| createdTime | 
是 | 
Number | 
1490611396441 | 
云平台接收到消息的时间 | 
| msgId | 
是 | 
Number | 
587c90931755e87f7fb41361 | 
消息 Id,为避免重复, 传感器或传输模块上传的每条数据 id 不同 | 
| band | 
是 | 
String | 
SE433 | 
设备所属频段取值范围: ['SE433', 'US915', 'SE915', 'SE470', 'SE780', 'EU868', 'EU433', 'AS923'] | 
| rssi | 
是 | 
Number | 
-50 | 
信号强度, 取值范围:[-127,127] | 
| snr | 
是 | 
Number | 
11.2 | 
信噪比,取值范围:[-20, 20] | 
| data | 
是 | 
Object | 
{ co2: 20, interval:60 } | 
包含各设备类型特有字段 | 
| hardwareVersion | 
是 | 
String | 
C2 | 
表明此数据包是传感器数据推送消息 | 
| firmwareVersion | 
是 | 
String | 
1.2 | 
表明此数据包是传感器数据推送消息 | 
注: 以下各表中 . 表明包含层级。
- 1.设备类型: α 芯片 和 α 模块, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
chip | 
取值范围: module or chip | 
| data.customer | 
是 | 
String | 
'10080018003202100538c601' | 
用户自定义传感器数据 | 
- 2.设备类型: α 传感器, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
node | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.temperature | 
是 | 
Number | 
20 | 
温度值 (°C) | 
| data.humidity | 
是 | 
Number | 
20 | 
湿度值 (%) | 
| data.light | 
是 | 
Number | 
20 | 
光线值 (Lux) | 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
co | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.co | 
是 | 
Number | 
20 | 
一氧化碳浓度(ppm) | 
| threshold.co.alarmHigh | 
是 | 
Number | 
20 | 
一氧化碳浓度紧急报警阈值(ppm) | 
- 4.设备类型: α 二氧化碳, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
co2 | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.co2 | 
是 | 
Number | 
20 | 
二氧化碳浓度 (ppm) | 
| threshold.co2.alarmHigh | 
是 | 
Number | 
20 | 
二化碳浓度紧急报警阈值(ppm) | 
- 5.设备类型: α 二氧化氮, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
no2 | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.no2 | 
是 | 
Number | 
20 | 
二氧化氮浓度(ppm) | 
| threshold.no2.alarmHigh | 
是 | 
Number | 
20 | 
二化氮浓度紧急报警阈值(ppm) | 
- 6.设备类型: α 二氧化硫, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
so2 | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.so2 | 
是 | 
Number | 
20 | 
二氧化硫浓度(ppm) | 
| threshold.so2.alarmHigh | 
是 | 
Number | 
20 | 
二化硫浓度紧急报警阈值(ppm) | 
- 7.设备类型: α 天然气, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
ch4 | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.ch4 | 
是 | 
Number | 
20 | 
甲烷浓度(ppm) | 
| threshold.ch4.alarmHigh | 
是 | 
Number | 
20 | 
甲烷浓度紧急报警阈值(ppm) | 
- 8.设备类型: α 臭氧, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
o3 | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.o3 | 
是 | 
Number | 
20 | 
臭氧浓度(ppm) | 
| threshold.o3.alarmHigh | 
是 | 
Number | 
20 | 
臭氧浓度紧急报警阈值(ppm) | 
- 9.设备类型: α 氨气, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
nh3 | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.nh3 | 
是 | 
Number | 
20 | 
氨气浓度(ppm) | 
| threshold.nh3.alarmHigh | 
是 | 
Number | 
20 | 
氨气浓度紧急报警阈值(ppm) | 
- 10.设备类型: α TVOC, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
tvoc | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.ch2o | 
是 | 
Number | 
20 | 
甲醛浓度 | 
| threshold.ch2o.alarmHigh | 
是 | 
Number | 
20 | 
甲醛浓度紧急报警阈值(ppm) | 
- 11.设备类型: α PM, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
pm | 
设备类型取值固定为示例值 | 
| interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.pm1 | 
是 | 
Number | 
20 | 
空气质量 pm1 (ug/m3) | 
| data.pm2_5 | 
是 | 
Number | 
20 | 
空气质量 pm2.5(ug/m3) | 
| data.pm10 | 
是 | 
Number | 
20 | 
空气质量 pm10(ug/m3) | 
| threshold.pm1.alarmHigh | 
是 | 
Number | 
20 | 
pm1 紧急报警阈值(ug/m3) | 
| threshold.pm2_5.alarmHigh | 
是 | 
Number | 
20 | 
pm2.5 紧急报警阈值(ug/m3) | 
| threshold.pm10.alarmHigh | 
是 | 
Number | 
20 | 
pm10 紧急报警阈值(ug/m3) | 
- 12.设备类型: α 液化石油气, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
lpg | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.lpg | 
是 | 
Number | 
20 | 
液化石油气浓度(ppm) | 
| threshold.lpg.alarmHigh | 
是 | 
Number | 
20 | 
液化石油气浓度紧急报警阈值(ppm) | 
- 13.设备类型: α 烟雾, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
smoke | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.smoke | 
是 | 
Number | 
1 | 
传感器是否报警(1:报警,0:正常) | 
- 14.设备类型: α 倾角, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
angle | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.angle | 
是 | 
Number | 
20 | 
温度值 | 
- 15.设备类型: α 温湿度, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
humi_temp | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.temperature | 
是 | 
Number | 
20 | 
温度值 (°C) | 
| data.humidity | 
是 | 
Number | 
20 | 
湿度值 (%) | 
| threshold.temperature.alarmHigh | 
是 | 
Number | 
200 | 
温度紧急报警阈值(°C) | 
| threshold.temperature.alarmLow | 
是 | 
Number | 
20 | 
温度紧急报警阈值(°C) | 
| threshold.humidity.alarmHigh | 
是 | 
Number | 
200 | 
湿度紧急报警阈值(%) | 
| threshold.humidity.alarmLow | 
是 | 
Number | 
20 | 
湿度紧急报警阈值(%) | 
- 16.设备类型: α 跑冒滴漏, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
leak | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.leak | 
是 | 
Bool | 
false | 
是否跑冒滴漏 | 
- 17.设备类型: α 灯井, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
cover | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.cover | 
是 | 
Bool | 
true | 
井盖是否存在 | 
| data.level | 
是 | 
Bool | 
true | 
液位是否到达标定位置 | 
- 18.设备类型: α 温湿光, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
op_node | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.temperature | 
是 | 
Number | 
20 | 
温度值 (°C) | 
| data.humidity | 
是 | 
Number | 
20 | 
湿度值 (%) | 
| data.light | 
是 | 
Number | 
20 | 
光线值 (Lux) | 
| threshold.temperature.alarmHigh | 
是 | 
Number | 
200 | 
温度紧急报警阈值(°C) | 
| threshold.temperature.alarmLow | 
是 | 
Number | 
20 | 
温度紧急报警阈值(°C) | 
| threshold.humidity.alarmHigh | 
是 | 
Number | 
200 | 
湿度紧急报警阈值(%) | 
| threshold.humidity.alarmLow | 
是 | 
Number | 
20 | 
湿度紧急报警阈值(%) | 
| threshold.light.alarmHigh | 
是 | 
Number | 
200 | 
光线紧急报警阈值(Lux) | 
| threshold.light.alarmLow | 
是 | 
Number | 
20 | 
光线紧急报警阈值(Lux) | 
- 19.设备类型: α 追踪器, 特有字段及
deviceType取值说明 
| 参数说明 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| deviceType | 
是 | 
String | 
tracker | 
设备类型取值固定为示例值 | 
| data.interval | 
是 | 
Number | 
60 | 
设备传输周期 | 
| data.battery | 
否 | 
Number | 
90 | 
剩余电量百分比 | 
| data.customer | 
是 | 
Number | 
10080018003202100538c601 | 
原始数据 | 
| data.gps.latitude | 
否 | 
Number | 
20 | 
纬度值 | 
| data.gps.longitude | 
否 | 
Number | 
20 | 
经度值 | 
| data.gps.altitude | 
否 | 
Number | 
20 | 
高度值 | 
返回参数说明
| 参数 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| messages | 
× | 
String | 
'success' | 
返回参数,可返回空字符串 | 
三、任务事件推送(传感器下行任务的结果)
  任务下发修改 终端 上传数据周期时,任务完成时的事件推送。
请求参数举例
Request: {
    appId: '123456789ABC',
    sn: '0117C9XXXX',
    taskId: 123,
    type: 'event', //event: 事件消息
    createdTime: timestamp,
    msgId: '', //消息 id
    resultCode: 0, //0 成功,1,失败
    resultData: {}
}
参数说明
| 参数 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| appId | 
√ | 
String | 
 | 
系统分配给应用的唯一标示符,可在云平台 开发者 -基本设置获取 | 
| sn | 
√ | 
String | 
1122334455667788 | 
终端设备标示符, 即升哲传感器或者传输模块的唯一序列号 | 
| taskId | 
√ | 
String | 
 | 
下行任务的唯一 Id | 
| type | 
√ | 
String | 
event | 
当为终端执行云端下发任务的返回值时, type值为'event' | 
| createdTime | 
√ | 
Timestamp | 
 | 
云平台接收到消息的时间 | 
| msgId | 
√ | 
Number | 
 | 
消息 Id, 为避免重复, 传感器或传输模块上传的每条数据 id 不同 | 
| resultCode | 
√ | 
Number | 
0 | 
任务执行结果, 0 表示成功, 1 表示失败 | 
| resultData | 
× | 
Object | 
 | 
任务回执消息详情 | 
返回参数说明
| 参数 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| messages | 
× | 
String | 
'success' | 
返回参数,可返回空字符串 | 
四、传感器状态改变相关数据推送
  根据设备何时上报数据及上报数据的内容,使得设备具有多种状态,当设备状态改变时,推送此种消息。
请求参数举例
Request: {
    appId: '123456789ABC',
    sn: '0117C9XXXX',
    type: 'statusChanged',
    createdTime: timestamp,
    msgId: '', //消息 id
    band: 'SE433',
    snType: 'device',
    normalStatus: 0
}
参数说明
| 参数 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| appId | 
√ | 
String | 
 | 
系统分配给应用的唯一标示符,可在云平台 开发者 -基本设置获取 | 
| sn | 
√ | 
String | 
1122334455667788 | 
终端设备标示符, 即升哲传感器或者传输模块的唯一序列号 | 
| taskId | 
√ | 
String | 
 | 
下行任务的唯一 Id | 
| type | 
√ | 
String | 
event | 
当为终端执行云端下发任务的返回值时, type值为'event' | 
| createdTime | 
√ | 
Timestamp | 
 | 
云平台接收到消息的时间 | 
| msgId | 
√ | 
Number | 
 | 
消息 Id, 为避免重复, 传感器或传输模块上传的每条数据 id 不同 | 
| snType | 
√ | 
String | 
device | 
基站(station)或终端设备(device) | 
| normalStatus | 
√ | 
Number | 
0 | 
设备当前状态 | 
normalStatus 取值及含义:
| normalStatus | 
名称 | 
说明 | 
| -1 | 
未激活 | 
从未上报过数据 | 
| 0 | 
正常 | 
设备正常上报数据并且上报数据未超出阈值 | 
| 1 | 
报警 | 
超过设备的报警阈值 | 
| 2 | 
紧急报警 | 
- | 
| 3 | 
超时未上报 | 
连续8倍周期未上报数据 | 
| 4 | 
离线 | 
超时超过两天 | 
返回参数说明
| 参数 | 
是否必有 | 
类型 | 
示例值 | 
说明 | 
| messages | 
× | 
String | 
'success' | 
返回参数,可返回空字符串 | 
五、接收响应
当开发者服务器接收到请求后,请响应 2xx 的 HTTP 状态码。如果接收到其他 HTTP 状态码,SENSORO 会尝试重新推送 3 次,失败 3 次后将不再推送此条数据。
六、验证消息是否来自 SENSORO
为了验证消息体的合法性,开发者可用以验证消息体是来自 SENSORO 请求真实性,并对验证通过的消息体进行解密。
消息签名具体在 API权限检验 - 消息体签名。
七  、推送消息加密
选择安全模式,开发者在接收消息需要进行消息加解密, 接收事件不需要加密。通过 API 主动调用接口(修改终端配置和下行终端数据)时,不需要进行加密。
消息加密具体在 API权限校验- 消息体加密。