通讯协议 - NMS消息推送服务

 

连接服务器

    websocket方式 (适合网页、小程序、服务端)
         wss://nms-aaa.nowapi.com/?instanceId=ins-10003

    socket方式 (适合桌面、服务端)
         host    : 联系客服
         port    : 联系客服
         ssl     : 
     EOF边界     : \r\n

 

授权认证(登录)

客户端连接成功后需向服务端请求授权认证(登录),认证成功后才能进行订阅、推送等操作。

  1. 客户端向服务端发送认证请求:
    ["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;
  2. 服务端响应:
    //成功
    ["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)是客户端监听的管道,每个客户端可以订阅多个通道,通道不需要创建,可随用随弃,可以是任意组合的字符(支持字母、数字、下划线、横杠)。

  1. 客户端发送订阅请求:
    ["subscribe",{"channels":["myChannel"]}]

    字段:

    • channels : 通道,最多10个,单个通道最长支持32个字符。
  2. 服务端响应:
    //成功
    ["subscribe",{"resultCode":200,"resultMessage":"OK","resultContent":[]}]
    //失败
    ["subscribe",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]

 

取消订阅

通道订阅的逆操作

  1. 客户端发送取消订阅请求 :
    //取消通道 myChannel
    ["unsubscribe",{"channels":["myChannel"]}]
    //取消所有通道
    ["unsubscribe",{"channels":[]}]

    字段:

    • channels : 通道,最多10个,单个通道最长支持32个字符;为空时取消该用户ID下所有通道;
  2. 服务端响应:
    //成功
    ["unsubscribe",{"resultCode":200,"resultMessage":"OK","resultContent":[]}]
    //失败
    ["unsubscribe",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]

 

消息推送

向订阅通道推送消息。

  1. 客户端发送消息推送请求 :
    ["publish",{"channels":["myChannel"],"qos":1,"content":"这是一个测试的消息"}]

    字段 :

    • channels : 指定推送通道,可多个。
    • qos :   0:离线不补发,1:离线补发,默认不补发。
      因网络不稳定,进程销毁,进入电梯或地下停车场导致的断线后重新连接,一旦网络恢复,系统将自动补发断网期间的消息。
    • content : 消息实体
  2. 服务端响应:
    //成功
    ["publish",{"resultCode":200,"resultMessage":"OK","resultContent":[]}]
    //失败
    ["publish",{"resultCode":400,"resultMessage":"ERR_...","resultContent":[]}]

 

消息接收及确认

  1. 客户端接收到推送消息 :

    ["message",{"i":"MGf17cc9b781565c61b6b07a2992e05c67","t":"1710469579441","n":"myChannel","c":"这是一个测试的消息"}]

    字段 :

    • i : 消息ID MGf17cc9b781565c61b6b07a2992e05c67
    • t : 时间戳 1710469579441
    • n : 消息来自通道
    • c : 数据实体
  2. 客户端收到消息后应向服务端发送消息确认 : (服务端根据确认信息来处理后续消息推送状态)

    ["messageack",{"i":"MGf17cc9b781565c61b6b07a2992e05c67"}]

    字段 :

    • i : 消息ID
  3. 客户端发送消息确认服务端响应:

    //成功
    ["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 : 数据集 [数组格式]