今天上午在Mbus项目上加上GPRS,做了实验, 经测试数据可以上传下达,当然是测试,工作在透传模式,而且程序均很简洁,有待完善,数据完整性和连接可靠性,均未处理。数据完整主要是Mbus上传数据进行的校验,数据连接性主要是GPRS的可靠性
我们的流程是这样的:
TCP 服务器------》》》》------SIM900A(CLINTE)------>>>TX0---MBUS设备 -----》》mcu 解码------》tx1---sim900a(CLINTE)-----》》--TCP服务器---THE END
数据完整性处理:
数据流设备---》---采集---》TO buff ------>>take data ----->一定的算法计算差错----》完全正确上传平台
|》》》丢弃,报告错误。
链接可靠性
重练机制,自身检测诊断,(参照SIM900AAT集),心跳, 其他的还希望大家提供线索,力求可靠。
gprs部分测试:
对于串口流我采用了分时分批处理的方法,算法是环形队列。只要BUF足够大,就不大会发生丢数据的情况。(环形队列慎用之)
IP :119.184.123.84
PORT:1000
void initsim900a(void)
{
uint8_t m;
POWER_ON;
DrvSYS_Delay(300000);
POWER_OFF;
DrvSYS_Delay(300000); //开机
for(m=5;m;m--)
{
DrvSYS_Delay(100000);
}
if(GET_START)
{
DrvUART_Write(UART_PORT1,"AT\r\n",4);//发送AT命令
DrvUART_Write(UART_PORT0,"AT\r\n",4);//发送AT命令
}
}
void timeout(uint32_t time)
{
uint32_t n;
for(n=0;n<time;n++)
{
DrvSYS_Delay(1000);//1ms
}
}
extern uint8_t *Gprs_Pong(void);
uint8_t Wait_Gprs_Sure(char *p)
{
p=p;
Gprs_Pong();
/*
if(memcmp(SIM900A_DATA,sk,strlen(sk))==0)
{
send_data();
}
if(memcmp(SIM900A_DATA,sendok,strlen(sendok))==0)
{
// pa->AT_REC_SEND_OK=1;
}
if(memcmp(SIM900A_DATA,connect_ok,strlen(connect_ok))==0)
{
// pa->AT_REC_CONNECT=1;
}
if(memcmp(SIM900A_DATA,err,strlen(err))==0)
{
// pa->AT_REC_ERR=1; //err
}
if(memcmp(SIM900A_DATA,atd,strlen(atd))==0)
{
// pa->AT_REC_ATD=1; //拨电话
}
if(memcmp(SIM900A_DATA,power_down,strlen(power_down))==0)
{
// pa->AT_REC_POWERDOWN=1;
// printf_usart0 ("模块掉电请重新上电\r\n");
}
if(memcmp(SIM900A_DATA,ati,strlen(ati))==0)
{
// pa->AT_REC_ATI=1;
// printf_usart0 ("收到设备号\r\n");
}
if(memcmp(SIM900A_DATA,ok,strlen(ok))==0)
{
// pa->AT_REC_OK=1;
// printf_usart0 ("收到OK\r\n");
}
*/
return 0;
}
uint8_t Connect_Sever(char *Url)
{
Url = Url;
timeout(1000);//1s
Gprs_Send_String(at_cmd);//支持包交换和数据交换
timeout(8000);//1s
Wait_Gprs_Sure("ok!!");
Gprs_Send_String(" AT+CGCLASS=\"B\"\r\n\r\n");//支持包交换和数据交换
timeout(8000);//1s
Wait_Gprs_Sure("AT+CGCLASS=\"B\"\r\n\r\n");
// {pa->AT_REC_OK=0;printf_usart0 ("支持包交换和数据交换配置成功\r\n");}
Gprs_Send_String ("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n\r\n");
timeout(8000);//1s
Wait_Gprs_Sure("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n\r\n");
// CoTickDelay(60);
// {pa->AT_REC_OK=0;printf_usart0 ("配置GPRS和接入点设置成功\r\n");}
Gprs_Send_String ("AT+CGATT=1\r\n\r\n"); //附着GPRS业务
timeout(8000);//1s
Wait_Gprs_Sure("AT+CGATT=1\r\n\r\n");
//CoTickDelay(60);
//{pa->AT_REC_OK=0;printf_usart0 ("附着GPRS业务成功\r\n");}
Gprs_Send_String ("AT+CIPCSGP=1,\"CMNET\"\r\n\r\n"); //选择GPRS连接
timeout(8000);//1s
Wait_Gprs_Sure("AT+CIPCSGP=1,\"CMNET\"\r\n\r\n");
// {pa->AT_REC_OK=0;printf_usart0 ("选择GPRS连接成功\r\n");}
Gprs_Send_String("AT+CIPSTART=\"TCP\",");
timeout(10);//1s
Gprs_Send_String ("\"119.184.123.84\","); //ip地址
timeout(10);//1s
Gprs_Send_String("1000\r\n"); //端口
timeout(10);//1s
timeout(8000);//1s
Wait_Gprs_Sure("AT+CIPSTART=\"TCP\",\"119.184.123.84\",""1000\r\n");
return 0;
}
void Send_Data_Gprs(uint8_t *data,uint8_t len)
{
static uint8_t g=0x1A;
timeout(8000);//1s
Gprs_Send_String ("AT+CIPSEND\r\n");
timeout(1000);//1s
Gprs_Send_Data(data,len);
// Gprs_Send_String (">嘿!伙计,我是单片机!\r\n");
DrvUART_Write(UART_PORT1,&g,1);
timeout(8000);//1s
}
|