M 26モジュールTCP透過データフローノート


M 26 TCP透過

  • 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; }
  • 初期化SIMステータス照会:SIMステータスが正常でない場合、モジュール再初期化
  • を再起動する必要がある
    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; }
  • GSMネットワークは、成功しなければモジュールを再起動し、
  • を再構成すると判断する.
    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; }
  • GPRSネットワーク判定:クエリが失敗しても次のプロセス
  • を強制的に実行する.
    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; }
  • PDPコンテキストの構成:この中のプロセスはパッケージング順序で実行しなければならない.エラーがあれば、シーンを閉じてから再構成しなければならない.閉じに失敗したら、モジュールを再起動してから
  • を再構成しなければならない.
    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(); }
  • 初期化関数の総フロー、パラメータsは初期化失敗後のジャンプを容易にするために必要な初期化ステップ
  • である.
    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,"
  • の送信に成功すると、データを送信するM 26のプロトコルスタックのみで、真の送信ではなく、ここで真のデータ転送完了
  • を検出する必要がある.
    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コマンドを送信し、手に持っているシングルチップマシンのドキュメントパッケージを受け入れるだけでよい.