官方文档:https://www.ctwing.cn/dyts/103#see

用户提供一个公网WebAPI接口,并在CTWing平台上进行配置(设置“订阅”),CTWing将消息以POST的方式推送到指定的url

我们接收到消息后

  • 返回HTTP 200,表示接收到
  • 其他返回码,平台会认为推送失败

推送失败(超时、HTTP返回码不等于200等)

  • 平台最多会重试3次
  • 如果消息接收服务连续失败次数超过100次或者最近10s推送失败率超过10%,平台会认为该服务暂时不可用,标记该消息接收服务处于失败冷却状态,1分钟内不再向该消息接收服务推送消息(这1分钟内的相关消息将不会被推送,但Saas的”设备增加删除”类型的消息会继续推送)

为了提高消息推送效率,平台会对接收方处理消息的响应时间进行考核,并以此为主要依据来确定消息推送的优先级,因此接收方收到消息后应对消息进行异步处理,立即返回HTTP响应

订阅级别分为:设备级、产品级、分组级,本文以“产品级”订阅举例。

开发

环境准备

  1. 订阅需要外网地址,所以要准备一个有外网地址的服务器
    1. 如果没有外网地址的服务器,可以使用内网穿透,比如Sunny-Ngrok
  2. 安装Python:https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe
  3. 安装flask:pip install flask

编写代码

index.py

  1. from flask import Flask
  2. from flask import request
  3. import json
  4. import time
  5. import os
  6. outdir = "./datachange"
  7. app = Flask(__name__)
  8. def mkdir(dir):
  9. if not os.path.exists(dir):
  10. os.makedirs(dir)
  11. @app.route('/')
  12. def hello_world():
  13. return 'Hello World!'
  14. @app.route('/datachange/<string:productname>', methods=['POST', 'GET'])
  15. def subscript(productname):
  16. print("==============================")
  17. print(f"[product name] {productname}")
  18. mkdir(f"{outdir}/{productname}")
  19. # t = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())
  20. t = time.time()
  21. fp = f"{outdir}/{productname}/{t}.json"
  22. data = request.get_data()
  23. if data:
  24. json_data = json.loads(data.decode("utf-8"))
  25. json.dump(
  26. json_data,
  27. open(fp, "w", encoding="utf-8"),
  28. ensure_ascii=False,
  29. indent=4
  30. )
  31. return 'success'
  32. if __name__ == '__main__':
  33. app.run(host='127.0.0.1', port=5000)

上线

  1. 运行Python代码

在index.py同目录下运行python index.py
image.png

  1. 双击Sunny-Ngrok启动工具.bat,输入你的隧道ID即可

image.png

  1. 本地测试

image.pngimage.png

  1. 配置订阅
  • 地址:geodoer.gz2vip.91tunnel.com/datachange/15101461

image.png
image.png
image.png上报一个数据
image.png
查看CTWing返回的结果
image.png

  1. 只上报一个数据

    1. {
    2. "upPacketSN": -1,
    3. "upDataSN": -1,
    4. "topic": "v1/up/ad19",
    5. "timestamp": 1636440291152,
    6. "tenantId": "2000****826",
    7. "serviceId": 2,
    8. "protocol": "lwm2m",
    9. "productId": "1*****1",
    10. "payload": {
    11. "humidity_data": 8.0
    12. },
    13. "messageType": "dataReport",
    14. "deviceType": "",
    15. "deviceId": "86868e*********40a9323c",
    16. "assocAssetId": "",
    17. "IMSI": "undefined",
    18. "IMEI": "123*********432"
    19. }
  2. 同时上报两个数据

    1. {
    2. "upPacketSN": -1,
    3. "upDataSN": -1,
    4. "topic": "v1/up/ad19",
    5. "timestamp": 1636440363344,
    6. "tenantId": "2000****826",
    7. "serviceId": 4,
    8. "protocol": "lwm2m",
    9. "productId": "1*****1",
    10. "payload": {
    11. "temperature_data": 6.0,
    12. "humidity_data": 32.0
    13. },
    14. "messageType": "dataReport",
    15. "deviceType": "",
    16. "deviceId": "86868e*********40a9323c",
    17. "assocAssetId": "",
    18. "IMSI": "undefined",
    19. "IMEI": "123*********432"
    20. }

经测试与询问工作人员:

  1. 订阅的方式: 重发4次 5s发一次 易丢
  2. 消息队列的方式: 缓存着 等你主动获取 不易丢

https://www.ctwing.cn/dyts/102#see

HTTP消息推送

目前支持设备数据变化通知、设备指令响应通知、设备事件上报通知、设备上下线通知等消息类型的订阅,各协议对应消息类型及格式参见订阅推送消息格式。

订阅级别分为:设备级、产品级、分组级

目前订阅生效时间为1分钟左右

支持HTTP和HTTPs两种推送方式

  • HTTPs方式具备数字签名和通讯加密能力,具有较高的安全性
  • HTTP推送方式采用明文传输,可能造成推送消息被窃听或篡改,具有安全风险,请慎重选择,建议用户采用HTTPs方式来接收推送消息