2013-05-16 37 views
2

我試圖使用GPRS屏蔽(來自geeetech的sim900屏蔽)向服務器發送arduino傳感器數據。我有這個特殊的設置,因爲數據將被更新到一個網站和設備將漫遊。我不能使用http://www.cosm.org,因爲據我所知,每15分鐘更新一次,我需要每5-10秒更新一次。使用GPRS屏蔽和AT命令將arduino傳感器數據發送到服務器

爲了連接,我嘗試了下面的代碼來形成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連接,但我不知道該怎麼這樣做...

回答

4

首先:永遠不會使用延遲而不是通過解析調制解調器給出的實際響應正確等待。有關詳細信息,請參閱this answer,包括在發送數據之前等待「\ r \ n>」的幾點,其中AT+CIPSEND顯然與AT+CMGS共享行爲。

然後,當你有固定的AT命令處理(見this answer獲得一些提示),改變SERVER IPSERVER PORT的東西,是開/防火牆不是你自己的電腦上(通過ShieldsUP檢查驗證)。運行AT命令時運行Wireshark,並驗證您是否收到相應的流量。如果在此之前一切正常,那麼問題就出現在服務器上。

+0

我可以使用哪些代碼來解析來自調制解調器的響應? –

+0

上面鏈接的答案http://stackoverflow.com/a/16446523/23118顯示了你的代碼的結構。也許有一個你可以使用的mySerial.readln函數?否則,根據mySerial.read(我確信必須退出)編寫自己的readln函數。 – hlovdal

相關問題