|
今天上午在Mbus項(xiàng)目上加上GPRS,做了實(shí)驗(yàn), 經(jīng)測(cè)試數(shù)據(jù)可以上傳下達(dá),當(dāng)然是測(cè)試,工作在透?jìng)髂J剑页绦蚓芎?jiǎn)潔,有待完善,數(shù)據(jù)完整性和連接可靠性,均未處理。數(shù)據(jù)完整主要是Mbus上傳數(shù)據(jù)進(jìn)行的校驗(yàn),數(shù)據(jù)連接性主要是GPRS的可靠性
我們的流程是這樣的:
TCP 服務(wù)器------》》》》------SIM900A(CLINTE)------>>>TX0---MBUS設(shè)備 -----》》mcu 解碼------》tx1---sim900a(CLINTE)-----》》--TCP服務(wù)器---THE END
數(shù)據(jù)完整性處理:
數(shù)據(jù)流設(shè)備---》---采集---》TO buff ------>>take data ----->一定的算法計(jì)算差錯(cuò)----》完全正確上傳平臺(tái)
|》》》丟棄,報(bào)告錯(cuò)誤。
鏈接可靠性
重練機(jī)制,自身檢測(cè)診斷,(參照SIM900AAT集),心跳, 其他的還希望大家提供線索,力求可靠。
gprs部分測(cè)試:
對(duì)于串口流我采用了分時(shí)分批處理的方法,算法是環(huán)形隊(duì)列。只要BUF足夠大,就不大會(huì)發(fā)生丟數(shù)據(jù)的情況。(環(huán)形隊(duì)列慎用之)
IP :119.184.123.84
PORT:1000
void initsim900a(void)
{
uint8_t m;
POWER_ON;
DrvSYS_Delay(300000);
POWER_OFF;
DrvSYS_Delay(300000); //開機(jī)
for(m=5;m;m--)
{
DrvSYS_Delay(100000);
}
if(GET_START)
{
DrvUART_Write(UART_PORT1,"AT\r\n",4);//發(fā)送AT命令
DrvUART_Write(UART_PORT0,"AT\r\n",4);//發(fā)送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 ("模塊掉電請(qǐng)重新上電\r\n");
}
if(memcmp(SIM900A_DATA,ati,strlen(ati))==0)
{
// pa->AT_REC_ATI=1;
// printf_usart0 ("收到設(shè)備號(hào)\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);//支持包交換和數(shù)據(jù)交換
timeout(8000);//1s
Wait_Gprs_Sure("ok!!");
Gprs_Send_String(" AT+CGCLASS=\"B\"\r\n\r\n");//支持包交換和數(shù)據(jù)交換
timeout(8000);//1s
Wait_Gprs_Sure("AT+CGCLASS=\"B\"\r\n\r\n");
// {pa->AT_REC_OK=0;printf_usart0 ("支持包交換和數(shù)據(jù)交換配置成功\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和接入點(diǎn)設(shè)置成功\r\n");}
Gprs_Send_String ("AT+CGATT=1\r\n\r\n"); //附著GPRS業(yè)務(wù)
timeout(8000);//1s
Wait_Gprs_Sure("AT+CGATT=1\r\n\r\n");
//CoTickDelay(60);
//{pa->AT_REC_OK=0;printf_usart0 ("附著GPRS業(yè)務(wù)成功\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 (">嘿!伙計(jì),我是單片機(jī)!\r\n");
DrvUART_Write(UART_PORT1,&g,1);
timeout(8000);//1s
}
|
|