用户提供一个公网WebAPI接口,并在CTWing平台上进行配置(设置“订阅”),CTWing将消息以POST的方式推送到指定的url
我们接收到消息后
- 返回HTTP 200,表示接收到
- 其他返回码,平台会认为推送失败
推送失败(超时、HTTP返回码不等于200等)
- 平台最多会重试3次
- 如果消息接收服务连续失败次数超过100次或者最近10s推送失败率超过10%,平台会认为该服务暂时不可用,标记该消息接收服务处于失败冷却状态,1分钟内不再向该消息接收服务推送消息(这1分钟内的相关消息将不会被推送,但Saas的”设备增加删除”类型的消息会继续推送)
为了提高消息推送效率,平台会对接收方处理消息的响应时间进行考核,并以此为主要依据来确定消息推送的优先级,因此接收方收到消息后应对消息进行异步处理,立即返回HTTP响应
订阅级别分为:设备级、产品级、分组级,本文以“产品级”订阅举例。
开发
环境准备
- 订阅需要外网地址,所以要准备一个有外网地址的服务器
- 如果没有外网地址的服务器,可以使用内网穿透,比如Sunny-Ngrok
- 安装Python:https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe
- 安装flask:
pip install flask
编写代码
index.py
from flask import Flask
from flask import request
import json
import time
import os
outdir = "./datachange"
app = Flask(__name__)
def mkdir(dir):
if not os.path.exists(dir):
os.makedirs(dir)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/datachange/<string:productname>', methods=['POST', 'GET'])
def subscript(productname):
print("==============================")
print(f"[product name] {productname}")
mkdir(f"{outdir}/{productname}")
# t = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())
t = time.time()
fp = f"{outdir}/{productname}/{t}.json"
data = request.get_data()
if data:
json_data = json.loads(data.decode("utf-8"))
json.dump(
json_data,
open(fp, "w", encoding="utf-8"),
ensure_ascii=False,
indent=4
)
return 'success'
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000)
上线
- 运行Python代码
在index.py同目录下运行python index.py
- 双击
Sunny-Ngrok启动工具.bat
,输入你的隧道ID即可
- 本地测试
- 配置订阅
- 地址:
geodoer.gz2vip.91tunnel.com/datachange/15101461
上报一个数据
查看CTWing返回的结果
只上报一个数据
{
"upPacketSN": -1,
"upDataSN": -1,
"topic": "v1/up/ad19",
"timestamp": 1636440291152,
"tenantId": "2000****826",
"serviceId": 2,
"protocol": "lwm2m",
"productId": "1*****1",
"payload": {
"humidity_data": 8.0
},
"messageType": "dataReport",
"deviceType": "",
"deviceId": "86868e*********40a9323c",
"assocAssetId": "",
"IMSI": "undefined",
"IMEI": "123*********432"
}
同时上报两个数据
{
"upPacketSN": -1,
"upDataSN": -1,
"topic": "v1/up/ad19",
"timestamp": 1636440363344,
"tenantId": "2000****826",
"serviceId": 4,
"protocol": "lwm2m",
"productId": "1*****1",
"payload": {
"temperature_data": 6.0,
"humidity_data": 32.0
},
"messageType": "dataReport",
"deviceType": "",
"deviceId": "86868e*********40a9323c",
"assocAssetId": "",
"IMSI": "undefined",
"IMEI": "123*********432"
}
附
经测试与询问工作人员:
- 订阅的方式: 重发4次 5s发一次 易丢
- 消息队列的方式: 缓存着 等你主动获取 不易丢
https://www.ctwing.cn/dyts/102#see
HTTP消息推送
目前支持设备数据变化通知、设备指令响应通知、设备事件上报通知、设备上下线通知等消息类型的订阅,各协议对应消息类型及格式参见订阅推送消息格式。
订阅级别分为:设备级、产品级、分组级
目前订阅生效时间为1分钟左右
支持HTTP和HTTPs两种推送方式
- HTTPs方式具备数字签名和通讯加密能力,具有较高的安全性
- HTTP推送方式采用明文传输,可能造成推送消息被窃听或篡改,具有安全风险,请慎重选择,建议用户采用HTTPs方式来接收推送消息