通过Thingspeak在ESP8266发推文时遇到问题

时间:2019-06-19 13:40:51

标签: twitter arduino esp8266

我对ESP8266进行了编程,以读取土壤湿度。根据湿度,水泵会启动。现在,我希望ESP根据情况调整不同的句子。 因此,我将自己的Twitter帐户连接到Thingspeak.com,并遵循了code 连接到互联网可以正常工作。

问题: 它不会每次都鸣叫,如果鸣叫,则只有一个句子中的第一个单词出现在Twitter上。

在找到代码的论坛上,我已经尝试用“%20”替换单词之间的所有空格。但是,Twitter上什么也没有出现。同样,单个单词并不总是发布到Twitter。

这是我遇到的代码:

// if connection to thingspeak.com is successful, send your tweet!
if (client.connect("184.106.153.149", 80))
{
  client.print("GET /apps/thingtweet/1/statuses/update?key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");
    client.print("Host: api.thingspeak.com\r\n");
    client.print("Accept: */*\r\n");
    client.print("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n");
    client.print("\r\n");
  Serial.println("tweeted " + tweet);
}

我没有收到任何错误消息。 也许您可以帮助我将其显示出来(如果确实发送了该推文)以及我如何设法推整个句子。 我正在使用Arduino IDE版本1.8.9,并且正在上传到此board 其余代码工作正常。唯一的问题是推文。

更新

我现在尝试了一些不同的事情:

  1. 检查服务器响应

    有效并且很有帮助。结果是:

    • 单字作为String根本没有任何反应
    • 与“ Test%20Tweet”之类的字符串相同
    • 具有多个单词(例如“ Test Tweet”)的字符串将得到以下响应,并且字符串的第一个单词显示为一条推特
  

HTTP / 1.1 200确定

     

服务器:nginx / 1.7.5

     

日期:2019年6月19日星期三18:44:22 GMT

     

Content-Type:文本/ html; charset = utf-8

     

内容长度:1

     

连接:保持活动状态

     

状态:200 OK

     

X-Frame-Options:SAMEORIGIN

     

访问控制允许来源:*

     

允许访问控制的方法:GET,POST,PUT,OPTIONS,DELETE,PATCH

     

Access-Control-Allow-Header:来源,内容类型,X-Requested-With

     

访问控制最大年龄:1800

     

ETag:W /“ RANDOM_CHARS”

     

缓存控制:max-age = 0,私有,必须重新验证

     

X-Request-Id:THE_ID

     

1

我认为内容长度可能是问题? 但是我不知道如何在此代码中进行更改。

  1. 检查连接是否成功

    我在我的代码中实现了它,它从不显示在监视器上。因此,我认为不连接没有问题。

  2. 使用主机名代替IP地址

    我尝试过,但从未遇到过不好的要求。另一方面,Twitter上什么也没有显示。

1 个答案:

答案 0 :(得分:1)

检查您的tweet变量是否包含任何换行符(回车符或换行符)。例如,以下变量会引起问题

String tweet = "Tweet no. 1\r\n";

由于末尾换行符。这些字符将导致HTTP请求的第一行被缩短。即,而不是

  

获取/ apps / thingtweet / 1 / statuses / update?key = api_key&status = Tweet编号。 1个HTTP / 1.1 \ r \ n

它将变成

  

获取/ apps / thingtweet / 1 / statuses / update?key = api_key&status = Tweet编号。 1 \ r \ n

,服务器将拒绝它,并显示400(错误请求)错误。

另一方面

String tweet = "Tweet no. 1";

会没事的。

如果您的推文中可能包含此类字符,请尝试对它们进行编码,然后再将其传递给client.print()

  tweet.replace("\r", "%0D");
  tweet.replace("\n", "%0A");

使用主机名代替IP地址

根据https://uk.mathworks.com/help/thingspeak/writedata.html,您使用的API的相关主机名是api.thingspeak.com。使用该地址代替IP地址。这是可取的,因为主机名指向的IP地址可以定期更改。 (您使用的IP地址似乎甚至不正确-可能已经过时。)

即,变化

if (client.connect("184.106.153.149", 80)) {

if (client.connect("api.thingspeak.com", 80)) {

API端点

确定您使用的API端点正确吗?根据上面的链接,您所需的API端点看起来是https://api.thingspeak.com/update.json-因此您可能需要更改

client.print("GET /apps/thingtweet/1/statuses/update?key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");

client.print("GET /update.json?api_key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");

检查连接是否成功

当前,如果设备成功连接到服务器,则您的设备会发送HTTP请求-但如果连接失败,则不会给出任何指示!因此,添加一个else块来处理这种情况并通过串行控制台通知用户。

if (client.connect("api.thingspeak.com", 80)) {
  client.print("GET /apps/thingtweet/1/statuses/update?key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");
  // etc.
}
else {
  Serial.println("Connection to the server failed!");
}

检查服务器响应

要检查服务器的响应,请在主循环中添加以下块-这将通过串行控制台打印服务器响应。

delay(50);
while (client.available()) {
  String response_line = client.readString();
  Serial.println(response_line);
}

要澄清一下:该代码应该放在您的loop()函数内部。

响应应包括状态行-如果请求成功,则为HTTP/1.1 200 OK,如果存在问题,则为HTTP/1.1 400 Bad Request

对于Bad request响应,完整的消息很可能包含有关请求失败的确切原因的更多信息。

HTTP与HTTPs

最后,您确定该API支持(普通的,未加密的)HTTP以及HTTP吗?如果没有,那可能是您的问题。