通过GPRS屏蔽和AT命令将arduino传感器数据发送到服务器



我正在尝试使用GPRS屏蔽(sim900屏蔽从geeetech http://www.geeetech.com/wiki/index.php/Arduino_GPRS_Shield)将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连接,但我不知道如何做到这一点…

首先:永远,永远不要使用延迟,而不是通过解析调制解调器给出的实际响应来正确等待。有关更多细节,请参阅此回答,包括在发送数据之前等待"rn>"的点,AT+CIPSEND显然与AT+CMGS共享行为。

然后,当你已经固定了你的AT命令处理(见这个答案的一些提示),改变SERVER IPSERVER PORT的东西是打开/不防火墙在你自己的PC上(通过检查在盾sup验证)。在执行AT命令的同时运行Wireshark,检查是否收到了相应的流量。如果到目前为止一切正常,那么问题似乎出在服务器上。

最新更新