我将Telit LE910 4G LTE模块连接到Teensy板(Arduino会这样做)。虽然我能够使用HTTP请求(POST和GET)将数据发送到我的PHP服务器,但由于服务器必须延迟响应,我无法发送连续数据:
[...]
// SOCKET DIAL
LTESerial.print("AT#SD=1,0,80,\"SERVER IP\"\r\n");
delay(5000);
// POST
LTESerial.print("POST /server/index.php?data=");
LTESerial.print(random(1000));
LTESerial.print(" HTTP/1.1\r\n");
LTESerial.print("Host: SERVER IP\r\n\r\n");
delay(5000);
while (getResponse() > 0);
这只是一个例子(这里写的),但它有点说明了我在做什么。上面的代码应该放在while循环中,这样一旦数据上传到服务器上的.txt文件,模块就会重新连接到服务器并POST另一个数据点。
显然,我希望避免这些延迟,并尽快将数据解析到服务器(只要数据可用)。这就是我选择4G LTE版本的原因。
调整延迟可能会给我额外的一秒左右,但我的项目包括在"实时"中绘制大量数据点,因此它非常灵敏。
如何在4G上向服务器发送连续数据流?我正在考虑缓冲一些数据点并使用FTP来上传数据,但我认为将文件上传到服务器可能比现在花费更多时间。
非常感谢任何帮助!
答案 0 :(得分:0)
听起来您的用例可能更适合于特殊的IoT(物联网)协议,而不是更像客户端服务器连接的协议,如HTTP。
在物联网世界中有几种协议正在使用,但最常见的是:
这些不仅应解决您的延迟问题,而且通常还旨在最大限度地减少数据开销和处理/电池使用。
您应该能够找到这些示例的PHP示例 - 例如MQTT的一个示例:
答案 1 :(得分:0)
我有点使用上面的一些现有代码工作,但它仍然不是最佳的。这可能对其他人有用。
这就是我所做的:
1)I套接字仅拨号一次(初始化期间)
2)POST部分无限循环地运行。 5秒延迟现在减少到200毫秒,我添加了一些标题,如下所示:
//unsigned long data = random(1000000000000000, 9999999999999999);
LTESerial.print("POST /index.php?data=");
LTESerial.print(data);
LTESerial.print(" HTTP/1.1\r\n");
LTESerial.print("Host: ADDRESS\r\n");
LTESerial.print("Connection: keep-alive\r\n\r\n");
delay(200);
while (getResponse() > 0);
3)在最大HTTP请求,超时等方面,我的WAMP服务器(PHP)具有默认的限制。我必须在php.ini
内增加这些数字(我将它们更改为无限制)。
然而,虽然我能够"持续"发送数据到我的服务器,延迟200毫秒仍然是很多。如果可能的话,我希望看到接近串行通信的东西。
另外,在查看串行监视器时,我得到:
[...]
408295030
4238727231
3091191349
2815507344
----------->(THEN SUDDENLY)<------------
HTTP/1.1 200 OK
Date: Thu, 02 Jun 2
2900442411
016 19:29:41 GMT
Server: Apache/2.4.17 (Win32) PHP/5.6.15
X-P16
3817418772
Keep-Alive: timeout=5
Connection: Keep-Alive
Content-Type: te
86026031
HTTP/1.1 200 OK
Date: Thu, 02 Jun 2016 19:29:4
3139838298
75272508
[...]
----------->(After 330 iterations/POSTs, I get)<------------
NO CARRIER
NO CARRIER
NO CARRIER
NO CARRIER
所以我的问题是: 1)如何消除200 ms的延迟?
2)如果我的数据点大小不同,延迟也必须改变。如何动态地做到这一点?
3)为什么它停止在330-ish迭代?如果数据只有4位数,则不会发生这种情况。
4)为什么我突然收到服务器的回复?
我希望有人可以将它用于他们自己的项目,但这对我来说是不够的。有什么想法吗?