我对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 其余代码工作正常。唯一的问题是推文。
我现在尝试了一些不同的事情:
检查服务器响应
有效并且很有帮助。结果是:
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
我认为内容长度可能是问题? 但是我不知道如何在此代码中进行更改。
检查连接是否成功
我在我的代码中实现了它,它从不显示在监视器上。因此,我认为不连接没有问题。
使用主机名代替IP地址
我尝试过,但从未遇到过不好的要求。另一方面,Twitter上什么也没有显示。
答案 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");
根据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端点看起来是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
响应,完整的消息很可能包含有关请求失败的确切原因的更多信息。
最后,您确定该API支持(普通的,未加密的)HTTP以及HTTP吗?如果没有,那可能是您的问题。