通讯协议 - NMS消息推送服务
连接服务器
websocket方式 (适合网页、小程序、服务端)
wss://nms-aaa.nowapi.com/?instanceId=ins-10003
socket方式 (适合桌面、服务端)
host : 联系客服
port : 联系客服
ssl :
EOF边界 : \r\n
授权认证(登录)
客户端连接成功后需向服务端请求授权认证(登录),认证成功后才能进行订阅、推送等操作。
- 客户端向服务端发送认证请求:
["authorize",{"accessKey":"8512547106565e12544125007942565e","userId":"user-001"}]
- accessKey : (必须) 用户中心查看,该key有权限区分。
- 订阅Key 能接收消息,不能发送消息。
- 客户端Key 可接收和发送消息,测试accessKey: 8512547106565e12544125007942565e
- 安全密钥Key 签名认证相关Key。
- userId: (必须) 指定的客户端ID,不需要创建,可随用随弃。
- 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":[]}]
消息推送
向订阅通道推送消息。
- 客户端发送消息推送请求 :
["publish",{"channels":["myChannel"],"qos":1,"content":"这是一个测试的消息"}]
字段 :
- channels : 指定推送通道,可多个。
- qos : 0:离线不补发,1:离线补发,默认不补发。
因网络不稳定,进程销毁,进入电梯或地下停车场导致的断线后重新连接,一旦网络恢复,系统将自动补发断网期间的消息。 - content : 消息实体
- 服务端响应:
//成功 ["publish",{"resultCode":200,"resultMessage":"OK","resultContent":[]}] //失败 ["publish",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]
消息接收及确认
-
客户端接收到推送消息 :
["message",{"i":"MGf17cc9b781565c61b6b07a2992e05c67","t":"1710469579441","n":"myChannel","c":"这是一个测试的消息"}]
字段 :
- i : 消息ID MGf17cc9b781565c61b6b07a2992e05c67
- t : 时间戳 1710469579441
- n : 消息来自通道
- c : 数据实体
-
客户端收到消息后应向服务端发送消息确认 : (服务端根据确认信息来处理后续消息推送状态)
["messageack",{"i":"MGf17cc9b781565c61b6b07a2992e05c67"}]
字段 :
- i : 消息ID
-
客户端发送消息确认服务端响应:
//成功 ["messageack",{"resultCode":200,"resultMessage":"OK","resultContent":[]}] //失败 ["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 : 数据集 [数组格式]