我正在尝试使用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连接,但我不知道该怎么做......
答案 0 :(得分:4)
首先:从不,永远不会使用延迟而不是通过解析调制解调器给出的实际响应来正确等待。有关详细信息,请参阅this answer,包括在发送数据之前等待“\ r \ n&gt;”的要点,AT+CIPSEND
显然与AT+CMGS
共享行为。
然后,当您修复了AT命令处理时(请参阅this answer了解某些提示),将SERVER IP
和SERVER PORT
更改为您自己的PC上打开/未防火墙的内容(验证通过ShieldsUP)查看。运行AT命令时运行Wireshark并验证是否收到相应的流量。如果到目前为止一切都按预期工作,则问题似乎与服务器有关。