2017-05-29 89 views
1
#include <SoftwareSerial.h> 
SoftwareSerial GSM(9, 10); // RX, TX 
int sensor=5; 

enum _parseState { 
PS_DETECT_MSG_TYPE, 

PS_IGNORING_COMMAND_ECHO, 

PS_HTTPACTION_TYPE, 
PS_HTTPACTION_RESULT, 
PS_HTTPACTION_LENGTH, 

PS_HTTPREAD_LENGTH, 
PS_HTTPREAD_CONTENT 
}; 

byte parseState = PS_DETECT_MSG_TYPE; 
char buffer[80]; 
byte pos = 0; 

int contentLength = 0; 

void resetBuffer() { 
    memset(buffer, 0, sizeof(buffer)); 
    pos = 0; 
} 

    void sendGSM(const char* msg, int waitMs = 500) { 
    GSM.println(msg); 
delay(waitMs); 
while(GSM.available()) { 
    parseATText(GSM.read()); 
    } 
    } 

void setup() 
{ 
    GSM.begin(9600); 
    Serial.begin(9600); 

    sendGSM("AT+SAPBR=3,1,\"APN\",\"zongwap\""); 
sendGSM("AT+SAPBR=1,1",300); 
sendGSM("AT+HTTPINIT"); 
sendGSM("AT+HTTPPARA=\"CID\",1"); 
sendGSM("AT+HTTPPARA=\"URL\",\"http://afridiofkh.000webhostapp.com? 
sensor1="" + sensor + ""\""""); 
    sendGSM("AT+HTTPACTION=0"); 
    } 

void loop() 
    { 
    while(GSM.available()) { 
    parseATText(GSM.read()); 
    } 
    } 

    void parseATText(byte b) { 

buffer[pos++] = b; 

    if (pos >= sizeof(buffer)) 
    resetBuffer(); // just to be safe 

    /* 
    // Detailed debugging 
    Serial.println(); 
    Serial.print("state = "); 
    Serial.println(state); 
    Serial.print("b = "); 
    Serial.println(b); 
    Serial.print("pos = "); 
    Serial.println(pos); 
    Serial.print("buffer = "); 
    Serial.println(buffer);*/ 

    switch (parseState) { 
    case PS_DETECT_MSG_TYPE: 
    { 
    if (b == '\n') 
    resetBuffer(); 
    else {   
    if (pos == 3 && strcmp(buffer, "AT+") == 0) { 
     parseState = PS_IGNORING_COMMAND_ECHO; 
    } 
    else if (b == ':') { 
     //Serial.print("Checking message type: "); 
     //Serial.println(buffer); 

     if (strcmp(buffer, "+HTTPACTION:") == 0) { 
     Serial.println("Received HTTPACTION"); 
     parseState = PS_HTTPACTION_TYPE; 
     } 
     else if (strcmp(buffer, "+HTTPREAD:") == 0) { 
     Serial.println("Received HTTPREAD");    
     parseState = PS_HTTPREAD_LENGTH; 
     } 
     resetBuffer(); 
    } 
    } 
} 
break; 

    case PS_IGNORING_COMMAND_ECHO: 
    { 
    if (b == '\n') { 
    Serial.print("Ignoring echo: "); 
    Serial.println(buffer); 
    parseState = PS_DETECT_MSG_TYPE; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPACTION_TYPE: 
    { 
    if (b == ',') { 
    Serial.print("HTTPACTION type is "); 
    Serial.println(buffer); 
    parseState = PS_HTTPACTION_RESULT; 
    resetBuffer(); 
    } 
} 
break; 

case PS_HTTPACTION_RESULT: 
    { 
    if (b == ',') { 
    Serial.print("HTTPACTION result is "); 
    Serial.println(buffer); 
    parseState = PS_HTTPACTION_LENGTH; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPACTION_LENGTH: 
    { 
    if (b == '\n') { 
    Serial.print("HTTPACTION length is "); 
    Serial.println(buffer); 

    // now request content 
    GSM.print("AT+HTTPREAD=0,"); 
    GSM.println(buffer); 

    parseState = PS_DETECT_MSG_TYPE; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPREAD_LENGTH: 
    { 
    if (b == '\n') { 
    contentLength = atoi(buffer); 
    Serial.print("HTTPREAD length is "); 
    Serial.println(contentLength); 

    Serial.print("HTTPREAD content: "); 

    parseState = PS_HTTPREAD_CONTENT; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPREAD_CONTENT: 
    { 
    // for this demo I'm just showing the content bytes in the serial monitor 
    Serial.write(b); 

    contentLength--; 

    if (contentLength <= 0) { 

    // all content bytes have now been read 

    parseState = PS_DETECT_MSG_TYPE; 
    resetBuffer(); 
    } 
} 
break; 
} 
} 

我甚至不明白的代码,但我的想法,当我试图发布数据网络它不工作,我不知道什么是错发送使用Arduino的GSM模块的数据网络与它 我正在获取网络内容,但我不能发布数据到网络 我试过既得到和发布方法非他们给我带来好运使用GPRS

+0

我使用了相同的代码,它工作。我只是想要你输入相同的数据。你可以解释一下你在上面代码中使用的webhost的url。 – Billa

+0

你的http请求有一些错误 – Billa

回答

0

你在你的代码中提出的http请求有一些错误。你不能像你那样从arduino请求。

当使用000webhost数据库时,最好的办法就是利用PHP。你可以通过选择文件管理器上传PHP文件,然后选择“现在上传文件”。在那里有一个名为“public_html”的文件夹,它是PHP代码将被上传。

现在就在这里做你想做的事情。你想创建一个PHP代码,当php代码的URL被请求时,它将执行数据库的插入操作。然后你可以从arduino请求这个链接进行插入。

的PHP代码是(请在代码中所提供的地点提供您的用户名,密码,DBNAME,表名,字段名,并上传它,因为我上面说的):

<?php 
$servername = "localhost"; 
$username = "provide your username here"; 
$password = "password here"; 
$dbname = "database name here"; 

// Create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 
// Check connection 
if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 



$sql = "INSERT INTO table_name (column_name) VALUES ('".mysqli_real_escape_string($conn,$_GET['sensor1'])."')"; 

if (mysqli_query($conn, $sql)) { 
    echo "New record created successfully"; 
} else { 
    echo "Error: " . $sql . "<br>" . mysqli_error($conn); 
} 

mysqli_close($conn); 
?> 

获取的URL上传的PHP代码(右键单击上传的文件并单击查看,然后在浏览器中复制URL)。你可以在你的Arduino草图中使用它。

你的arduino代码应该看起来像(这个草图中的URL不完整,取而代之的是我上面说的[http://afridiofkh.000webhostapp.com/phpfilename.php这是一个要被替换的东西。从http开始直到标记被替换]):

#include <SoftwareSerial.h> 
SoftwareSerial GSM(9, 10); // RX, TX 
int sensor=5; 

enum _parseState { 
PS_DETECT_MSG_TYPE, 

PS_IGNORING_COMMAND_ECHO, 

PS_HTTPACTION_TYPE, 
PS_HTTPACTION_RESULT, 
PS_HTTPACTION_LENGTH, 

PS_HTTPREAD_LENGTH, 
PS_HTTPREAD_CONTENT 
}; 

byte parseState = PS_DETECT_MSG_TYPE; 
char buffer[130],url[130]; //adjust as your url length 
byte pos = 0; 

int contentLength = 0; 

void resetBuffer() { 
    memset(buffer, 0, sizeof(buffer)); 
    pos = 0; 
} 

    void sendGSM(const char* msg, int waitMs = 500) { 
    GSM.println(msg); 
delay(waitMs); 
while(GSM.available()) { 
    parseATText(GSM.read()); 
    } 
    } 

void setup() 
{ 
    GSM.begin(9600); 
    Serial.begin(9600); 

    sendGSM("AT+SAPBR=3,1,\"APN\",\"zongwap\""); 
sendGSM("AT+SAPBR=1,1",300); 
sendGSM("AT+HTTPINIT"); 
sendGSM("AT+HTTPPARA=\"CID\",1"); 
sprintf(url, "AT+HTTPPARA=\"URL\",\"http://afridiofkh.000webhostapp.com/phpfilename.php?sensor1=%d\"",sensor); 
    sendGSM(url); 
    sendGSM("AT+HTTPACTION=0"); 
    } 

void loop() 
    { 
    while(GSM.available()) { 
    parseATText(GSM.read()); 
    } 
    } 

    void parseATText(byte b) { 

buffer[pos++] = b; 

    if (pos >= sizeof(buffer)) 
    resetBuffer(); // just to be safe 

    /* 
    // Detailed debugging 
    Serial.println(); 
    Serial.print("state = "); 
    Serial.println(state); 
    Serial.print("b = "); 
    Serial.println(b); 
    Serial.print("pos = "); 
    Serial.println(pos); 
    Serial.print("buffer = "); 
    Serial.println(buffer);*/ 

    switch (parseState) { 
    case PS_DETECT_MSG_TYPE: 
    { 
    if (b == '\n') 
    resetBuffer(); 
    else {   
    if (pos == 3 && strcmp(buffer, "AT+") == 0) { 
     parseState = PS_IGNORING_COMMAND_ECHO; 
    } 
    else if (b == ':') { 
     //Serial.print("Checking message type: "); 
     //Serial.println(buffer); 

     if (strcmp(buffer, "+HTTPACTION:") == 0) { 
     Serial.println("Received HTTPACTION"); 
     parseState = PS_HTTPACTION_TYPE; 
     } 
     else if (strcmp(buffer, "+HTTPREAD:") == 0) { 
     Serial.println("Received HTTPREAD");    
     parseState = PS_HTTPREAD_LENGTH; 
     } 
     resetBuffer(); 
    } 
    } 
} 
break; 

    case PS_IGNORING_COMMAND_ECHO: 
    { 
    if (b == '\n') { 
    Serial.print("Ignoring echo: "); 
    Serial.println(buffer); 
    parseState = PS_DETECT_MSG_TYPE; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPACTION_TYPE: 
    { 
    if (b == ',') { 
    Serial.print("HTTPACTION type is "); 
    Serial.println(buffer); 
    parseState = PS_HTTPACTION_RESULT; 
    resetBuffer(); 
    } 
} 
break; 

case PS_HTTPACTION_RESULT: 
    { 
    if (b == ',') { 
    Serial.print("HTTPACTION result is "); 
    Serial.println(buffer); 
    parseState = PS_HTTPACTION_LENGTH; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPACTION_LENGTH: 
    { 
    if (b == '\n') { 
    Serial.print("HTTPACTION length is "); 
    Serial.println(buffer); 

    // now request content 
    GSM.print("AT+HTTPREAD=0,"); 
    GSM.println(buffer); 

    parseState = PS_DETECT_MSG_TYPE; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPREAD_LENGTH: 
    { 
    if (b == '\n') { 
    contentLength = atoi(buffer); 
    Serial.print("HTTPREAD length is "); 
    Serial.println(contentLength); 

    Serial.print("HTTPREAD content: "); 

    parseState = PS_HTTPREAD_CONTENT; 
    resetBuffer(); 
    } 
} 
break; 

    case PS_HTTPREAD_CONTENT: 
    { 
    // for this demo I'm just showing the content bytes in the serial monitor 
    Serial.write(b); 

    contentLength--; 

    if (contentLength <= 0) { 

    // all content bytes have now been read 

    parseState = PS_DETECT_MSG_TYPE; 
    resetBuffer(); 
    } 
} 
break; 
} 
} 

这将执行插入操作,因为您需要.PHP很容易,因为它可以用来扩展操作。

+0

试试这个。告诉我它是否有效,或者你是否面临任何问题。 – Billa

+0

今晚我会尝试这一个,当我得到免费的感谢您的回复 –

+0

@Hazrat Bilal你试过吗? – Billa