用户提供一个公网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 Flaskfrom flask import requestimport jsonimport timeimport osoutdir = "./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方式来接收推送消息
