M 26モジュールTCP透過データフローノート
7006 ワード
M 26 TCP透過
TCP接続フロー
初めてM 26を使って、とても疎かで、マニュアルから一歩一歩歩いて、透伝をして、幸いにも中国語のマニュアルで、見ていて苦労しないで、ここはAT指令開発を使って、フローノートに座って、後で使う時見て、ここはいくつかの機能の上のパッケージをして、フレームワークは直接使うことができて、具体的にどのように実際の情況によって実現して、STM 32 F 1シリーズの単片機を使ってシリアルポートを通じてM 26にデータを送ってサーバーに透伝します.
初期化
TCP接続の前にいくつかの初期化が必要です.たとえば、ATテスト命令、PDPコンテキストの反転と初期化を設定します.
パッケージの送信指令関数M 26_SendCmdは、実際には、シリアルポートにデータを送信し、シリアルポートがM 26の返信を受信するのを待っている間に、対応する返信成功メッセージを比較することである.1番目のパラメータはAT命令、2番目のパラメータは期待戻り値、3番目のパラメータは待機モジュール戻りタイムアウト時間
unsigned char m25_conf_base()
{
while(M26_SendCmd("AT\r
","OK",500))//
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
while(M26_SendCmd("ATE0\r
","OK",500))// ATE1 ATE0 2019-3-22
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
while(M26_SendCmd("AT+CSQ\r
","OK",500))//
{
Clear_Buffer2();
}
while(M26_SendCmd("AT+QREFUSECS=1,1\r
","OK",500))//
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
return 1;
}
2.APN構成の初期化:
unsigned char m26_conf_APN()
{
while(M26_SendCmd("AT+QIFGCNT=0\r
","OK",500)) //
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
while(M26_SendCmd("AT+QICSGP=1,\042CMNET\042\r
","OK",500)) //
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
return 1;
}
unsigned char m26_conf_SIM()
{
int i;
unsigned char res = 0;
for(i = 0; i < 20; i++)
{
//10S SIM
if(M26_SendCmd("AT+CPIN?\r
","+CPIN: READY",500))//SIM
{
res = 0;
Clear_Buffer2();
}
else
{
res = 1;
break;
}
}
delay_ms(500);
Clear_Buffer2();
M26_SendCmd("AT+QINISTAT\r
","OK",500);
delay_ms(500);
Clear_Buffer2();
return res;
}
unsigned char m26_conf_GSM()
{
unsigned char res = 0;
int i = 0;
//30s
for(i = 0; i < 60; i++)
{
if(M26_SendCmd("AT+CREG?\r
","+CREG: 0,1",500))//
{
res = 0;
Clear_Buffer2();
}
else
{
res = 1;
break;
}
}
delay_ms(500);
Clear_Buffer2();
return res;
}
unsigned char m26_conf_GPRS()
{
//30
int i = 0;
for(i = 0; i < 60; i++)
{
if(M26_SendCmd("AT+CGREG?\r
","+CGREG: 0,1",500))//GPRS
{
Clear_Buffer2();
}
else
{
break;
}
}
delay_ms(500);
Clear_Buffer2();
return 1;
}
unsigned char m26_conf_PDP()
{
unsigned char res = 0;
int i;
int j;
for(i = 0; i < 10; i++)
{
if(M26_SendCmd("AT+QIREGAPP\r
","OK",500) == 0) //
{
delay_ms(500);
Clear_Buffer2();
for(j = 0; j < 3; j++)
{
if(M26_SendCmd("AT+QIACT\r
","OK",500) == 0)// PDP
{
M26_SendCmd("AT+QILOCIP\r
","ERROR",500);// IP
res = 1;
break;
}
else
{
res = 0;
Clear_Buffer2();
}
}
return res;
}
else
{
res = 0;
Clear_Buffer2();
}
}
return res;
}
unsigned char m26_conf_other()
{
while(M26_SendCmd("ATV1\r
","OK",500)) // OK
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
while(M26_SendCmd("AT+QIDNSIP=0\r
","OK",500)) // IP 0IP 1
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
while(M26_SendCmd("AT+QIMODE?\r
","OK",500)) //
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
}
PDPシーンを閉じる必要がある場合は、ATコマンドを送信して閉じる必要があります.
unsigned char m26_close_PDP()
{
int i;
for(i = 0; i < 10; i++)
{
if(M26_SendCmd("AT+QIDEACT\r
","ERROR",1000))
return 1;
}
return 0;
}
シャットダウンが必要な場合は、M 26のシャットダウンが簡単ですATコマンドを送信すればいいです
void m26_powerDown()
{
while(M26_SendCmd("AT+QPOWD=1\r
","NORMAL POWER DOWN",500))
{
Clear_Buffer2();
}
delay_ms(500);
Clear_Buffer2();
}
void m26_init_new(int s)
{
//m26_poweron();
int i = s;
while(1)
{
switch(s)
{
case 0:// ,
m26_poweron();
case 1:// APN
m25_conf_base();
m26_conf_APN();
case 2:// SIM
if(m26_conf_SIM() == 0)
{
m26_powerDown();
i = 0;
continue;
}
case 3://GSM
if(m26_conf_GSM() == 0)
{
m26_powerDown();
i = 0;
continue;
}
case 4://GPRS
m26_conf_GPRS();
case 5://PDP
if(m26_conf_PDP() == 0)
{
if(m26_close_PDP() == 1)
{
i = 2;
continue;
}
else
{
m26_powerDown();
i = 0;
//m26_init_new(0);
continue;
}
}
default:
break;
}
break;
}
}
サーバーに接続して、私は今ドメイン名の接続です
unsigned char m26_connect_new()
{
while(M26_SendCmd("AT+QIOPEN=\042TCP\042,\042www.xxxx.com\042,\0421301\042\r
","OK",500));
while(1)
{
if(m26_CheckCmd("ALREADY CONNECT") == 0)
{
return 1;
}
else if(m26_CheckCmd("CONNECT OK") == 0)
{
return 1;
}
else if(m26_CheckCmd("CONNECT FAIL") == 0)
{
while(M26_SendCmd("AT+QISTAT\r
","OK",500));
return 0;
}
}
}
データの送信
1.指定された長さのデータの送信は推奨され、指定されていない長さの使用は推奨されません
unsigned char m26_tcp_send_len(uint8_t * msg,int len)
{
while(M26_SendCmd("AT+QISEND=?\r
","OK",500));
//Clear_Buffer2();
char ATbuff[50] = "";
memset(ATbuff,0,sizeof(ATbuff));
sprintf(ATbuff,"AT+QISEND=%d\r
",len);
while(M26_SendCmd(ATbuff,"
int m26_send_stat()
{
strx = NULL;
int length = -1;
int i;
//bixu duoqing jici 20190321
Clear_Buffer2();
Clear_Buffer2();
for(i = 0; (i < 30) && (length != 0); i++)
{
while(M26_SendCmd("AT+QISACK\r
","OK",500));
strx=strstr((const char*)RI_Set2_Buffer,(const char*)"+QISACK");
if(strx != NULL)
{
strx = strstr((const char*)RI_Set2_Buffer,(const char*)",");
strx = strstr(strx+1,(const char*)",");
// , , atoi,
length = str2int(strx+2);
}
else
{
Clear_Buffer2();
return -1;
}
Clear_Buffer2();
}
return length;
}
ここでは初期化、送信プロセス全体、具体的にはATコマンドを送信し、手に持っているシングルチップマシンのドキュメントパッケージを受け入れるだけでよい.