今天上午在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
}
|