【发布时间】:2016-02-16 23:21:50
【问题描述】:
我正在尝试使用 PubNub 向频道发布一条消息,但我总是收到“连接失败!”。
我知道 发布 URL 的结构如下:
http://pubsub.pubnub.com/publish/<PUB-KEY>/<SUB-KEY>/0/<CHANNEL>/0/%22<MESSAGE>%22
我已经在谷歌浏览器上测试过这个网址,它工作得很好。
以下是在 Arduino UNO + Adafruit HUZZAH CC3000 WIFI Breakout 上运行的 C 风格代码。这本身不是 Arduino 硬件问题,因为我相信我的电路没有问题。我的问题是使用 Adafruit CC3000 Library 创建的 HTTP GET 请求的结构。
我不得不发送 GET 而不是使用PubNub Arduino Library,因为它似乎不支持 CC3000 WIFI 模块。他们有一个 JSON WIFI 和以太网示例,但两者都不与 CC3000 WIFI 模块通信。
char PUBKEY[] = "XXXXXXX";
char SUBKEY[] = "XXXXXXX";
Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80);
if (client.connected())
{
client.print("GET /publish/");
client.print(PUBKEY);
client.print("/");
client.print(SUBKEY);
client.print("/0/");
client.print("MyPubChannel"); // Channel Name
client.print("/0/%22");
client.print("Hello World from Arduino!"); // Msg to publish
client.print("%22");
client.println(" HTTP/1.1");
client.print("Host: ");
client.println("pubsub.pubnub.com");
client.println();
}
else
{
Serial.println(F("Connection failed"));
}
我已阅读 this 页面并了解正确的 GET 请求应采用以下形式:
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
我很确定我的 GET 请求有问题。任何人都可以看看这个并提供任何关于可能出错的提示吗?
【问题讨论】:
-
您的 GET 请求很好,除了一个小细节。您的短信是通过 URL 传递的,因此您必须对保留字符(包括空格)进行 url 编码,例如:
client.print("Hello%20World%20from%20Arduino!");但这不是您的问题,因为您的代码在connectTCP()上失败。您是否事先将pubsub.pubnub.com解析为正确的 IP 地址? -
您是否尝试过直接调用
Adafruit_CC3000_Client::connect(const char *host, uint16_t port)而不是使用Adafruit_CC3000::connectTCP(uint32_t destIP, uint16_t destPort)? -
@CraigConover:我从来没有说过它是 PubNub,实际上我主要指的是硬件和我的代码。谢谢。
-
PubNub 确实支持使用 ESP8266 发布订阅 - 你可以在这里查看 - pubnub.com/blog/…。我们没有针对 CC3000 的特定库。
-
@CraigConover:正确,但它是为 ESP8266 列出的。我正在寻找一种适用于 Adafruit HUZZAH CC3000 WIFI 的订阅方法
标签: http-headers arduino wifi pubnub