【问题标题】:Send arduino sensor data to server with GPRS shield and AT commands使用 GPRS shield 和 AT 命令将 arduino 传感器数据发送到服务器
【发布时间】:2013-05-16 13:53:07
【问题描述】:

我正在尝试使用 GPRS 屏蔽(来自 geeetech http://www.geeetech.com/wiki/index.php/Arduino_GPRS_Shield 的 sim900 屏蔽)将 arduino 传感器数据发送到服务器。我有这个特殊的设置,因为数据将更新到网站并且设备将漫游。我不能使用http://www.cosm.org,因为据我所知,每 15 分钟更新一次,我需要大约每 5-10 秒更新一次。

为了连接,我尝试了下面的代码来形成 UDP 连接,但它没有发送到接收 IP 和端口。我不知道为什么,arduino 端没有出现错误。

///connect
void connectUDP()
{
 mySerial.println("AT+CSTT=\"APN\"");
 delay(3000);
 ShowSerialData();
 mySerial.println("AT+CIICR");
 delay(3000);
 ShowSerialData();
 mySerial.println("AT+CIFSR");
 delay(3000);
 ShowSerialData();
 mySerial.println("AT+CIPSTART=\"UDP\",\"SERVER IP\",\"SERVER PORT\"");
 delay(3000);
 ShowSerialData();
 mySerial.println();

}


///send udp packet to server 
void sendUDP()
{
 for(int x = 0; x < 30; x++){
   mySerial.println("AT+CIPSEND"); 
   delay(100);
   ShowSerialData();
   mySerial.println("\"hello world\"");
   delay(100);
   ShowSerialData();
   mySerial.println((char)26);
   delay(1000);
   ShowSerialData();
 }
 mySerial.println();
 //ShowSerialData();
}

服务端如下(python写的):

import SocketServer

PORTNO = 14

class handler(SocketServer.DatagramRequestHandler):
    def handle(self):
        newmsg = self.rfile.readline().rstrip()
    print (newmsg)
        self.wfile.write(self.server.oldmsg)
        self.server.oldmsg = newmsg

s = SocketServer.UDPServer(('',PORTNO), handler)
print "Awaiting UDP messages on port %d" % PORTNO
s.oldmsg = "This is the starting message."
s.serve_forever()

我可以看到可能的解决方案是将其更改为 TCP 连接,但我不知道该怎么做...

【问题讨论】:

    标签: python arduino sensors at-command gprs


    【解决方案1】:

    首先:永远不要使用延迟,而不是通过解析调制解调器给出的实际响应来进行适当的等待。有关更多详细信息,请参阅this answer,包括关于在发送数据之前等待“\r\n>”的点,AT+CIPSEND 显然与AT+CMGS 共享行为。

    然后,当您修复了 AT 命令处理(请参阅 this answer 以获得一些提示)后,将 SERVER IPSERVER PORT 更改为在您自己的 PC 上打开/未设置防火墙的内容(通过检查 ShieldsUP 进行验证)。在运行 AT 命令的同时运行 Wireshark 并验证您是否收到了相应的流量。如果到目前为止一切都按预期工作,那么问题似乎出在服务器上。

    【讨论】:

    • 我上面链接的答案stackoverflow.com/a/16446523/23118 显示了您的代码应该是什么样子的结构。也许您可以使用 mySerial.readln 函数?否则根据 mySerial.read 编写你自己的 readln 函数(我确信它必须退出)。
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多