Dragino NB-IoT(NBSN95)向Azure Cosmos DB传输数据的方案咨询
Dragino NBSN95 NB-IoT节点上传数据至Azure Cosmos DB的方案探讨
设备支持的传输方式及AT配置命令
COAP
AT+SERVADDR=120.24.4.116,5683 // 设置CoAP服务器地址和端口 AT+URI=5,11,"mqtt",11,"coap",12,"0",15,"c=text1",23,"0" // 设置COAP资源路径
UDP
AT+SERVADDR=120.24.4.116,5601 // 设置UDP服务器地址和端口
MQTT
AT+SERVADDR=120.24.4.116,1883 // 设置MQTT服务器地址和端口 AT+CLIENT=CLIENT // 设置MQTT客户端标识 AT+UNAME=UNAME // 设置MQTT用户名 AT+PWD=PWD // 设置MQTT密码 AT+PUBTOPIC=T1_PUB // 设置MQTT发布主题 AT+SUBTOPIC=T1_SUB // 设置MQTT订阅主题
TCP
AT+SERVADDR=120.24.4.116,5600 // 设置TCP服务器地址和端口
当前遇到的限制
最初计划通过Azure IoT Hub使用MQTT协议,但设备对用户名和密码长度有限制(uint8_t uname[41]; uint8_t pwd[41]),Azure生成的SAS密码长度超出设备限制。虽可通过缩短IoT Hub名称、设备ID并省略API版本来压缩用户名,但SAS密码无法进一步缩短,且设备不支持X.509证书认证。
曾考虑使用HiveMD作为桥接,但该功能暂未上线,且Azure中使用HiveMD需要许可证及额外费用;也了解过Azure上部署Mosquitto的方案,但尚未推进,希望找到更简便的实现路径。目前已有非NB-IoT设备通过Azure Webhook函数接收、处理JSON数据并上传至Cosmos DB,该方案流程简便,可复用相关经验。
可行方案建议
1. 基于Azure Functions + 自定义传输端点
- 部署Azure Function,搭配轻量的UDP/TCP/CoAP端点(可在Azure VM上搭建开源服务如libcoap、socat,或借助IoT Edge模块),设备通过对应协议直接发送数据到该端点
- 端点将数据转发至Azure Function,Function解析数据后调用Cosmos DB SDK完成数据写入
- 适配设备所有支持的传输方式,配置仅需设置AT命令中的服务器IP和端口,无需复杂认证,和现有Webhook方案逻辑一致,可快速复用开发经验
2. 轻量MQTT中间桥接
- 在Azure上部署Mosquitto等轻量MQTT broker,设置符合设备长度限制的短用户名和密码
- 配置broker将收到的设备消息转发到Azure Function(通过MQTT触发器或HTTP回调),由Function写入Cosmos DB;也可直接配置broker转发到Azure IoT Hub(需处理认证转换)
- 沿用设备熟悉的MQTT协议,无需修改设备端逻辑,中间broker仅做认证适配和消息转发,部署成本低
3. 自定义IoT网关适配认证
- 搭建一个自定义网关服务(可部署在Azure VM或容器中),设备使用短认证信息连接网关
- 网关完成认证校验后,使用完整的SAS凭证连接Azure IoT Hub,转发设备消息
- 利用IoT Hub的路由功能将消息转发至Azure Function,最终写入Cosmos DB
- 保留IoT Hub的设备管理、监控能力,网关仅作为认证适配层,兼顾功能完整性和设备兼容性
内容的提问来源于stack exchange,提问作者plam
相关产品推荐
相关产品推荐

