最近在写一个开发板定位的小系统,用到了SIM868模块向服务器发送定位数据。简单记录一下(只展示了发送数据相关的重要部分,假设已经初始化过sim868板子及获取到了要发送的数据)。完整代码见GitHub。
函数来自购买sim868板子的商家,我只对参数做了简单的注释
/*
* Command【in】: 发送给sim868板子的命令
* Response【in】: 执行正确时能得到的回复
* Timeout【in】: 没有成功读到返回值的时间限制
* Retry【in】: 没有成功读到返回值时的循环次数(重新计时)
*/
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
clrGprsRxBuffer();
for (unsigned char n = 0; n < Retry; n++)
{
DebugSerial.print("\r\n---------send AT Command:---------\r\n");
DebugSerial.write(Command);
GprsSerail.write(Command);
Time_Cont = 0;
while (Time_Cont < Timeout)
{
gprsReadBuffer();
if (strstr(gprsRxBuffer, Response) != NULL)
{
DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
DebugSerial.print(gprsRxBuffer); //输出接收到的信息
clrGprsRxBuffer();
return Success;
}
}
Time_Cont = 0;
}
DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
DebugSerial.print(gprsRxBuffer);//输出接收到的信息
clrGprsRxBuffer();
return Failure;
}
/*
* function 【in】: 服务器端相应函数,即http中除ip、端口之外的部分
* text 【in】: 想要发送的数据
* serviceIP 【in】: 服务器的ip地址
* port 【in】: 端口号
*/
void postGpsDataToService(char* function, char* text, char* serviceIP, char* port)
{
char send_buf[400] = {0}; //发送给sim868的内容
char tmp[25] = {0};
//连接服务器
memset(send_buf, 0, 400); //清空
strcpy(send_buf, "AT+CIPSTART=\"TCP\",\"");
strcat(send_buf, serviceIP);
strcat(send_buf, "\",");
strcat(send_buf, port);
strcat(send_buf, "\r\n");
if (sendCommand(send_buf, "CONNECT", 10000, 5) == Success);//"CONNECT"表明链接服务器成功
else errorLog(7);
//发送数据
if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
else errorLog(8);
memset(send_buf, 0, 400); //清空
/*准备JSON串*/
//ARDUINO平台不支持sprintf的double的打印,只能转换到字符串然后打印
/*准备HTTP报头*/
send_buf[0] = 0;
strcat(send_buf, "POST /");
strcat(send_buf, function);
strcat(send_buf, " HTTP/1.1\r\n"); //注意后面必须加上\r\n
strcat(send_buf, "Host:");
strcat(send_buf, serviceIP);
strcat(send_buf, "\r\n");
strcat(send_buf, "Content-Type: application/x-www-form-urlencoded\r\n");
sprintf(tmp, "Content-Length:%d\r\n\r\n", strlen(text)); //计算JSON串长度
strcat(send_buf, tmp);
strcat(send_buf, text);
if (sendCommand(send_buf, send_buf, 3000, 1) == Success);
else errorLog(9);
/*
在下面这里卡了很久,卖家的代码能跑起来,但是我修改了发送地址和数据内容后,程序就总是停在下面这里。
后来反复观察代码运行后的输出才意识到,卖家的代码sendCommand函数的第二个参数是"succ}",这是他服务器返回值的一部分,他这里判断是否成功发送数据的依据是有没有成功拿到服务器的返回值,而我的服务器的返回并不一样,所以这里卡住了。所以第二个参数应该设置成你服务器返回值的一部分,或者改成"SEND OK"即可。
*/
char sendCom[2] = {0x1A};
if (sendCommand(sendCom, "SEND OK", 3000, 1) == Success);//\"succ\"}
else errorLog(10);
if (sendCommand("AT+CIPCLOSE\r\n", "CLOSE OK\r\n", 3000, 1) == Success);
else errorLog(11);
if (sendCommand("AT+CIPSHUT\r\n", "SHUT OK\r\n", 3000, 1) == Success);
else errorLog(11);
}
这篇博客主要记录的是我遇到的困难,如果想看源代码的话可以去GitHub看一下完整代码。