通讯协议 - NMS消息推送服务
连接服务器
websocket方式 (适合网页、小程序、服务端)
wss://nms-aaa.nowapi.com/?instanceId=ins-10003
socket方式 (适合桌面、服务端)
host : 联系客服
port : 联系客服
ssl :
EOF边界 : \r\n
授权认证(登录)
客户端连接成功后需向服务端请求授权认证(登录),认证成功后才能进行订阅、推送等操作。
- 客户端向服务端发送认证请求:
# 默认 ["authorize",{"accessKey":"8512547106565e12544125007942565e","userId":"user-001"}] # 指定通道 ["authorize",{"accessKey":"8512547106565e12544125007942565e","userId":"user-001","subscribeChannels":["myChannel"]}]
- accessKey : (必须) 用户中心查看,该key有权限区分。
- 订阅Key 能接收消息,不能发送消息。
- 客户端Key 可接收和发送消息,测试accessKey: 8512547106565e12544125007942565e
- 安全密钥Key 签名认证相关Key。
- userId: (必须) 指定的客户端ID,不需要创建,可随用随弃。
- subscribeChannels: (非必须) 认证成功后自动订阅通道,最多10个,单个通道最长支持32个字符。若此处指定了通道,后续不必再次发送通道订阅请求。
- safeCode: (非必须) accessKey的安全保护措施,可以为每个连接生成一个,每个safeKey只能用一次,即使他人从页面代码中获得了accessKey,也无法推送或接收消息。
//safeKey生成方法 $keySecret = '106565e1254412...';//安全密钥 $text = round(microtime(true)*1000).'___'; $safeCode = openssl_encrypt($text,'AES-128-ECB', $keySecret, 2, ''); echo $safeCode;
- accessKey : (必须) 用户中心查看,该key有权限区分。
- 服务端响应:
//成功 ["authorize",{"resultCode":200,"resultMessage":"OK","resultContent":{"sid":"76103023be07f96b6877b788e776ec67","pingInterval":5000}}] //失败 ["authorize",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]
字段:
- resultContent.sid : 连接唯一ID
- resultContent.pingInterval : 心跳间隔毫秒,根据该值设置心跳间隔
心跳保持
客户端连接到服务端后需主动发送心跳包 sendMessage('1'),服务端收到心跳包响应'2'。
- 客户端主动发送(数字): 1
- 服务端响应(数字): 2
消息通道订阅
通道(channels)是客户端监听的管道,每个客户端可以订阅多个通道,通道不需要创建,可随用随弃,可以是任意组合的字符(支持字母、数字、下划线、横杠)。
- 客户端发送订阅请求:
["subscribe",{"channels":["myChannel"]}]
字段:
- channels : 通道,最多10个,单个通道最长支持32个字符。
- 服务端响应:
//成功 ["subscribe",{"resultCode":200,"resultMessage":"OK","resultContent":[]}] //失败 ["subscribe",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]
取消订阅
通道订阅的逆操作
- 客户端发送取消订阅请求 :
//取消通道 myChannel ["unsubscribe",{"channels":["myChannel"]}] //取消所有通道 ["unsubscribe",{"channels":[]}]
字段:
- channels : 通道,最多10个,单个通道最长支持32个字符;为空时取消该用户ID下所有通道;
- 服务端响应:
//成功 ["unsubscribe",{"resultCode":200,"resultMessage":"OK","resultContent":[]}] //失败 ["unsubscribe",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]
消息推送
向订阅通道推送消息。
- 客户端发送消息推送请求 :
# Qos: 0 ["publish",{"channels":["myChannel"],"qos":0,"content":"这是一个测试的消息"}] # Qos: 1 ["publish",{"channels":["myChannel"],"qos":1,"content":"这是一个测试的消息"}]
字段 :
- channels : 指定推送通道,可多个。
- qos : 0:离线不补发(默认),1:离线补发、消息确认。 因网络不稳定,进程销毁,进入电梯或地下停车场导致的断线后重新连接,一旦网络恢复,系统将自动补发断网期间的消息。
- content : 消息实体,长度7168 bit (7kb)
- qos=0 时服务端无响应。
- qos=1 服务端响应:
//成功 1.resultContent.i : 消息唯一ID,向多个通道推送会产生多个消息ID ["publish",{"resultCode":200,"resultMessage":"OK","resultContent":{"i":"17317453498970a374337e4fa3a128,17317453498970a374337e4fa3a128"}}] //失败 ["publish",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]
消息接收及确认
-
客户端接收到推送消息 :
["message",{"i":"17317453498970a374337e4fa3a128","t":"1710469579441","q":"0","n":"myChannel","c":"这是一个测试的消息"}]
字段 :
- i : 消息ID 17317453498970a374337e4fa3a128
- t : 时间戳 1710469579441
- q : 消息Qos级别 0/1
- n : 消息来自通道
- c : 数据实体
-
客户端收到消息后且消息 Qos=1 时应向服务端发送消息确认 : (服务端根据确认信息来处理后续消息推送状态)
["messageack",{"i":"17317453498970a374337e4fa3a128"}]
字段 :
- i : 消息ID
-
客户端发送消息确认服务端响应:
//成功 1.resultContent.i : 消息唯一ID ["messageack",{"resultCode":200,"resultMessage":"OK","resultContent":{"i":"17317453498970a374337e4fa3a128"}}] //失败 ["messageack",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]
响应(附)
[MESSAGE_TYPE,{"resultCode":"200","resultMessage":"OK","resultContent":""}]
- MESSAGE_TYPE : 消息类型包含值 connect,authorize,subscribe,unsubscribe,publish,messageack
- resultCode : 响应代码 200+:成功 400+:客户端指令异常 500+:服务端处理异常
- resultMessage : 响应消息 OK:成功 ERR...:失败消息
- resultContent : 数据集 [数组格式]