Отправка данных датчика Arduino на сервер с помощью GPRS-щита и AT-команд

Я пытаюсь отправить данные датчика Arduino на сервер с помощью экрана GPRS (щит sim900 от geeetech http://www.geeetech.com/wiki/index.php/Arduino_GPRS_Shield). У меня есть эта конкретная настройка, потому что данные будут обновляться на веб-сайте, и устройство будет находиться в роуминге. Я не могу использовать 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();
}

Серверная часть выглядит следующим образом (написано на питоне):

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-соединение, но я не знаю, как это сделать...


person ecki    schedule 16.05.2013    source источник


Ответы (1)


Прежде всего: никогда, никогда не используйте задержку вместо правильного ожидания, анализируя фактический ответ, данный модемом. См. этот ответ для получения более подробной информации, включая пункт об ожидании "\r\n> " перед отправкой данных, который AT+CIPSEND очевидно, такое же поведение, как и у AT+CMGS.

Затем, когда вы исправили обработку AT-команд (подсказки см. в этом ответе), измените SERVER IP и SERVER PORT на то, что открыто/не защищено брандмауэром на вашем ПК (проверьте на ShieldsUP). Запустите Wireshark при выполнении AT-команд и убедитесь, что вы получаете соответствующий трафик. Если до этого момента все работает как положено, проблема, похоже, связана с сервером.

person hlovdal    schedule 21.05.2013
comment
Ответ stackoverflow.com/a/16446523/23118, на который я ссылался выше, показывает структуру того, как должен выглядеть ваш код. Может быть, вы могли бы использовать функцию mySerial.readln? В противном случае напишите свою собственную функцию readln на основе mySerial.read (которая, я уверен, должна выйти). - person hlovdal; 04.06.2013