如何直接连接到Aply--第一部分

464 阅读10分钟

什么是Ably?

Ably是一个企业级的酒吧/俱乐部信息平台,拥有一套集成服务,提供实时体验,如互动学习、物流GPS跟踪和体育直播更新。

什么是Ably实时SDK?

How to connect to Ably directly (and why you probably shouldn't) – Part 1

连接到Ably的典型方式:通过Ably SDKs的 "公共API "接口

在Ably,我们一直建议使用Ably实时服务的应用程序开发人员应该使用Ably客户端库之一,也称为SDKs。当你使用SDK时,你会与所谓的 "公共API "互动,这只是一个技术术语,我们用来描述SDK的所有部分,我们已经公开了这些部分,以便你作为一个开发者与之互动。公共API有一些方法,可以让你连接到Ably的后台,发布或订阅实时频道的信息,并与频道的存在进行互动。

当你使用SDK的公共API时,SDK将使用Ably协议与Ably Realtime后端对话,这是Ably Realtime服务专用的定制协议。Ably协议需要一个底层实时协议来连接到后端。我们支持许多不同的实时协议,但目前实时网络的现代标准是WebSockets。这篇博文的重点是通过WebSockets使用Ably协议来尝试与Ably后端对话--但是是直接的,没有我们方便的SDK及其公共API的中介。

使用websocat(一个WebSocket客户端)连接到Ably

要使用WebSocket协议,您需要自己实现该协议或使用WebSocket客户端。为了开始探索Ably协议,我们将使用一个名为websocat的命令行WebSocket客户端。

如果你想在自己的系统上安装websocat,请参考GitHub上的安装说明,它可以在Homebrew等各种软件包库中找到,而且所有主要操作系统都有预建的可执行文件。

WebSocket模式

在我们继续使用websocat连接到Ably之前,我们需要了解WebSocket URL是什么样子。幸运的是,它们与HTTP URL几乎完全相同,唯一的区别在于URL模式;在HTTP中,URL将以http:// (如果你使用TLS,则以https:// )开始。对于WebSockets,URL以ws:// (如果你使用TLS,则以wss:// )开始。我建议你尽可能地使用TLS,以确保窃听者和黑客无法截获和阅读你的WebSocket消息的内容。

每条消息都有一个动作

现在我们可以去直接连接到Ably的第一次。连接到Ably Realtime的默认端点是realtime.ably.io。在安装了websocat之后,继续在shell中输入websocat wss://realtime.ably.io ,你应该看到类似下面的内容:

{"action":9,"error":{"message":"No authentication information provided. (See https://help.ably.io/error/40101 for help.)","code":40101,"statusCode":401,"href":"https://help.ably.io/error/40101"},"timestamp":1626880805277}

值得一提的是,如果你安装了jq,你可以通过运行websocat命令在命令行中获得更好的JSON输出:

websocat "wss://realtime.ably.io?key=<your_api_key>" | jq

注意:我们在WebSocket URL周围添加了双引号,因为大多数shell会将
=
作为一个特殊字符来解析
,所以我们需要确保shell将整个字符串作为一个URL来读取。

如果格式正确,上面从Ably返回的消息应该看起来像这样:

{
  "action": 9,
  "error": {
      "message": "No authentication information provided. (See https://help.ably.io/error/40101 for help.)",
      "code": 40101,
      "statusCode": 401,
      "href": "https://help.ably.io/error/40101"
  },
  "timestamp": 1626880805277
}

恭喜你,你刚刚收到了你的第一条协议信息 🎉。

注意:在本文中,为了便于阅读,我们将以这种方式正确显示它的格式。

这个协议消息的格式是JSON,实际上是一个错误信息,告诉我们没有提供任何认证信息。我们从Ably收到的每条协议消息中的第一个字段被称为action ,这是一个数字,表明消息的目的是什么。在我们的例子中,我们收到的消息是action 9,这表明该消息包含一个错误。你可以在我们的Ably协议的文档中看到完整的动作列表和它们的编号。

如果你的shell卡在websocat 会话中,你可以随时按Ctrl+C (Mac/Linux/Windows)来退出程序并返回shell提示符。

认证

几种不同的方法可以让你用Aply进行认证。 正如在链接的认证文档中提到的,我们强烈建议客户端应用程序使用令牌认证,但在这篇博文中为了方便,我们将使用API密钥的基本认证。要使用基本认证,你只需要一个API密钥。在你创建API密钥之前,你需要在Ably建立一个免费账户。 一旦你创建了Ably账户,你需要获得一个API密钥,如果你需要帮助找到一个API密钥,请看这篇帮助文章

现在我们有了API密钥,我们需要把它作为一个连接参数发送给Ably。最简单的方法是使用一个查询字符串。 一个查询字符串由任意数量的键值对组成,格式为?key1=value1&key2=value2... ,等等,附加在URL的末尾。对于向Ably发送API密钥,我们的密钥被简单地称为key ,所以我们可以像这样把它添加到我们的URL中。wss://realtime.ably.io?key=<your_api_key>.

这里还值得一提的是,这个URL只有在你使用wss:// 模式(而不是ws:// 模式)时才能工作。这是因为如果不使用TLS,攻击者可能会截获你的信息并看到你的API密钥。作为一项额外的安全措施,Ably会自动拒绝使用没有TLS的基本认证的连接。

现在,让我们使用所有这些来首次连接到Ably Realtime。在你的shell中输入以下命令:

注意:确保用你自己的Aply API密钥替换<your_api_key> 字符串(这只是一个占位符)。并记住整个地址周围的双引号,以逃避= 字符。

websocat "wss://realtime.ably.io?key=<your_api_key>"

如果一切顺利,你应该看到这样的响应:

{
   "action": 4,
   "connectionId": "X91UPcDNHq",
   "connectionKey": "108OdClCQB0giC!X91UPcDNHqHv641r-cd8ab108OdClCQB0giC",
   "connectionSerial": -1,
   "connectionDetails": {
       "clientId": "*",
       "connectionKey": "108OdClCQB0giC!X91UPcDNHqHv641r-cd8ab108OdClCQB0giC",
       "maxMessageSize": 16384,
       "maxInboundRate": 250,
       "maxOutboundRate": 250,
       "maxFrameSize": 262144,
       "serverId": "frontend.f21a.2.eu-west-1-A.i-0d94fdd00f27af921.108OdClCQB0giC",
       "connectionStateTtl": 120000,
       "maxIdleInterval": 15000
   }
}

这个消息中有很多信息,超出了本教程的范围,但简单地说:这次Ably给我们发送了一个带有action 4 的协议消息,这表明我们已经成功地连接到了Ably,我们可以开始附加到频道上并发布消息了:

*hacker voice*
 
“I'm in.”

现在我们已经连接到了Aply,你可以在终端上输入任何一串字母,然后点击回车键,将这些字母发送给Aply。来吧,试试!你可能会注意到,几乎所有你发送的东西都会从Ably那里得到一个错误的回应。这是因为Ably希望你能发送有效的协议信息。

心脏跳动

如果你使用websocat与Aply的连接时间超过15秒,你可能会收到一个类似这样的消息:

{"action":0}

这实际上是一种特殊的协议信息,叫做心跳,它被Ably用来检查客户端是否仍然在连接。默认情况下,Ably从你最初连接时起每15秒发送一次,但当你试图在shell提示符中输入信息发送给Ably时,这些心跳会让人感到厌烦。幸运的是,有一个叫做heartbeats 的连接参数,可以让我们关闭这些心跳。下面是一个关于如何在关闭心跳的情况下连接到Aply的演示:

websocat "wss://realtime.ably.io?key=<your_api_key>&heartbeats=false"

注意:你也可以手动向Ably发送心跳:一旦连接,只需
在终端
键入
{"action": 0} ,然后按Enter ,Ably就会以自己的心跳来回复。

附加到一个频道

现在我们已经连接上了,并且可以通过与Ably的WebSocket连接发送消息,让我们看看我们是否可以附加到一个通道。

附加到一个通道的动作编号是10。我们可以继续前进,天真地发送这样的协议消息:

{"action": 10}

然而,Ably会以一个错误来回应action 10 (action 9):

{
   "action": 9,
   "error": {
       "message": "Missing channel identifier. (See https://help.ably.io/error/40000 for help.)",
       "Code": 40000,
       "statusCode": 400,
       "href": "https://help.ably.io/error/40000"
   },
   "Timestamp": 1627392307742
}

这是因为你需要指定一个通道名称来告诉Ably你想附加到哪个通道上(当然了!)。

如果你想知道你可以在协议消息中发送哪些字段,请参见Aply协议指南的协议消息字段部分

在这种情况下,我们需要发送的字段被称为channel ,让我们再试一次:

{"action": 10, "channel": "my_channel"}

如果你发送上述协议消息,你应该收到像这样的响应:

{
   "action": 11,
   "flags": 983040,
   "channel": "my_channel",
   "channelSerial": "108WbDXYgB0n9X26439312:-1"
}

如果一切顺利,你现在已经成功地连接到一个通道。有几种情况下,你可能会收到一个错误。例如,你可能选择了一个无效的频道名称或达到了你的账户的频道创建限制。阅读错误信息应该告诉你出了什么问题。

更多信息请参见Ably错误代码页面的频道错误部分。

发布信息

一旦我们连接到一个频道,我们就可以发布我们的第一条信息。当你发布消息时,为了让你知道你的消息已经成功发布到Aply上,Aply会用一个确认函来回应,简称为ACK。如果你的消息发布有问题,Ably会用NACK来回应,这基本上与ACK相反。

ACK和NACK的一个问题是,如果你连续发布两条消息,并收到一个ACK和一个NACK的回应,那么你将不知道哪条消息被发布,哪条消息没有被发布。Ably使用消息序列的概念解决了这个问题。消息序列是你每次发布消息时发送的唯一号码(或者当你使用我们的SDK时为你发送)。当Ably对你的消息进行ACK或NACK时,它将向你发送消息序列,这样你就知道具体的确认是指哪条消息。

发布消息的动作编号是15,消息序列应该被发送到一个叫做 "msgSerial "的字段中。消息本身应该放在一个叫做 "messages "的字段中的数组中:你可以在一个协议消息中发送任意多的消息,而且消息本身可以是任何有效的JSON,最高可以达到maxMessageSize (免费账户为16KB)。

有了以上的知识,我们现在可以继续使用websocat在Ably通道上发送一个消息。你发送的协议消息应该如下所示(在你发送这个消息之前,请确保你已经连接到Ably并连接到通道):

{
   "action": 15,
   "channel": "my_channel",
   "msgSerial": 0,
   "messages": [
       {
           "hello": "world"
       }
   ]
}

当你发送这个消息时,你应该收到两条消息;一条是确认(动作编号1),另一条是同样的消息被送回给你。默认情况下,Ably会回传你发布的所有消息,但你可以使用 "echo "连接参数关闭这一功能(在你的查询字符串中添加 `&echo=false) 你甚至可以尝试在这一点上打开两个shell,并将两个shell附加到同一个通道上,然后发布一条消息。如果一切正常,你应该看到消息被没有发送消息的客户端所接收。

使用NodeJS来实现一个最小的 "SDK"

使用websocat发送协议消息是一个很好的简单方法,可以开始连接到Ably,但用手打出每个JSON消息会有点乏味。在这篇博文的第二部分(即将到来!),我们将转到NodeJS。在第二部分结束时,我们将在一个简单的命令行应用程序中实现Ably,这将让我们连接到Ably并发送消息。