مشکل در راه اندازی HTTPGET ماژول MC60

با سلام و احترام خدمت همه عزیزان و بزرگواران

بنده یک عدد ماژول MC60 رو تهیه کردم و با دستورات AT Command باید مختصات دستگاه رو با روش گت ارسال کنم و رسپانسش رو هم بخونم

الان قسمت GPS رو راه انداختم و به درستی مختصات رو میگیرم ولی برای ارسال گت مشکل دارم و انجام نمیشه

البته بصورت دستی و با ترمینال وقتی دستورات رو ارسال میکنم کار دقیق انجام میشه و دیتا بروی سرور میشینه ولی وقتی دستورات با برد به ماژول ارسال میشه در موقع گرفتن URL به مشکل برمیخوره و انجام نمیشه



CGATT result:OK
success:
QIFGCNT: result:OK
success:
QICSGP: result:OK
success:
|AT+CGACT=1,1: result:OK
success:
QIREGAPP: result:OK
success:
QIACT: result:OK
success:
QHTTPURL:
result:CONNECT
success:
URL:
result:
success:
QHTTPGET:
result:
success:

این هم کد برد


//-----------------------------------------------------------------
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart->Instance == USART1)
		{
				HAL_UART_Receive_IT(&huart1,&rx,1);

				rx_buff[count++] = rx;

				if(rx_buff[count - 1] == 0x0a && rx_buff[count - 2] == 0x0d && rx_buff[count - 3] == 'K' && rx_buff[count - 4] == 'O')
				{
						ok_flag = 1;

				} 
		}
}
//-----------------------------------------------------------------


uint8_t SIM_SENDCOMMAND(char* command)
{
		HAL_UART_Transmit(&huart1,(uint8_t*)command,strlen(command),Timeout);
		
		tickstart = HAL_GetTick();
		
		while(ok_flag == 0 && (HAL_GetTick() - tickstart) < Timeout );
		
		if(ok_flag)
		{
				ok_flag = 0; 
				memset(rx_buff,0,sizeof(rx_buff));
				return 0;
		}
		else if((HAL_GetTick() - tickstart) >= Timeout)
		{ 
				return 1;
		}

}

//-----------------------------------------------------------------

 
	sprintf(str,"AT\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200);
	
	sprintf(str,"AT+QIDEACT\r");  
	SIM_SENDCOMMAND(str);  		 		 
	HAL_Delay(200);
	
	sprintf(str,"AT+CGATT=1\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 
	
	sprintf(str,"AT+QIFGCNT=0\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200);
	
	sprintf(str,"AT+QICSGP=1,\"mtnirancell\"\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 
	
	sprintf(str,"AT+CGACT=1,1\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 
	
	sprintf(str,"AT+QIREGAPP\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 

	sprintf(str,"AT+QIACT\r");  
	SIM_SENDCOMMAND(str);  		 
	HAL_Delay(200);

	sprintf(str,"AT+QHTTPURL=154,30\n");  
	SIM_SENDCOMMAND(str);  		
  
char url_abh[] = "http://agmmap-testhjk.pdnkjm.ir/jhg/newBoxLog?device=C8AA&lat=71.22&lng=83.24&hum=95&lgt=36&prs=37.01&spd=28&tmp=13.5&gpstype=ABB&ddt=14021008&dtm=230511\n"; 
 
  	sprintf(str,"AT+QHTTPGET=154,30\n");  
	SIM_SENDCOMMAND(str);  		
 
 	sprintf(str,"AT+QHTTPREAD=30\n");  
	SIM_SENDCOMMAND(str);

سلام
داخل کدتون آدرس سایت در متغیر url_abh ریخته شده
در صورتی که هیچ کجای کد از این متغیر استفاده نشده !

ببخشید داشتم توی نوت پد کپی میکردم ندیدمش


//-----------------------------------------------------------------
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart->Instance == USART1)
		{
				HAL_UART_Receive_IT(&huart1,&rx,1);

				rx_buff[count++] = rx;

				if(rx_buff[count - 1] == 0x0a && rx_buff[count - 2] == 0x0d && rx_buff[count - 3] == 'K' && rx_buff[count - 4] == 'O')
				{
						ok_flag = 1;

				} 
		}
}
//-----------------------------------------------------------------


uint8_t SIM_SENDCOMMAND(char* command)
{
		HAL_UART_Transmit(&huart1,(uint8_t*)command,strlen(command),Timeout);
		
		tickstart = HAL_GetTick();
		
		while(ok_flag == 0 && (HAL_GetTick() - tickstart) < Timeout );
		
		if(ok_flag)
		{
				ok_flag = 0; 
				memset(rx_buff,0,sizeof(rx_buff));
				return 0;
		}
		else if((HAL_GetTick() - tickstart) >= Timeout)
		{ 
				return 1;
		}

}

//-----------------------------------------------------------------

 
	sprintf(str,"AT\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200);
	
	sprintf(str,"AT+QIDEACT\r");  
	SIM_SENDCOMMAND(str);  		 		 
	HAL_Delay(200);
	
	sprintf(str,"AT+CGATT=1\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 
	
	sprintf(str,"AT+QIFGCNT=0\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200);
	
	sprintf(str,"AT+QICSGP=1,\"mtnirancell\"\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 
	
	sprintf(str,"AT+CGACT=1,1\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 
	
	sprintf(str,"AT+QIREGAPP\r");  
	SIM_SENDCOMMAND(str);  				 
	HAL_Delay(200); 

	sprintf(str,"AT+QIACT\r");  
	SIM_SENDCOMMAND(str);  		 
	HAL_Delay(200);

	sprintf(str,"AT+QHTTPURL=154,30\n");  
	SIM_SENDCOMMAND(str);  		
  
char url_abh[] = "http://agmmap-testhjk.pdnkjm.ir/jhg/newBoxLog?device=C8AA&lat=71.22&lng=83.24&hum=95&lgt=36&prs=37.01&spd=28&tmp=13.5&gpstype=ABB&ddt=14021008&dtm=230511\n"; 
 

	sprintf(str,url_abh);  
	SIM_SENDCOMMAND(str);  		 
	HAL_Delay(200);
	
 
  	sprintf(str,"AT+QHTTPGET=154,30\n");  
	SIM_SENDCOMMAND(str);  		
 
 	sprintf(str,"AT+QHTTPREAD=30\n");  
	SIM_SENDCOMMAND(str);

کامندهایی که ارسال میکنید اشتباه هست
به طور مثال کامند AT+QHTTPGET فقط یک پارامتر میگیره ولی شما 2 تا پارامتر بهش دادید
نحوه ارسال کامند ها رو از توی داکیومنت Quectel_GSM_HTTP_AT_Commands_Manual_V1 بررسی کنید

در انتهای داکیومنت هم نمونه ارسال کامند ها رو گفته

یه نکته مهم دیگه هم این هست که شما دستورات رو با delay ارسال میکنید
در صورتی که ممکنه دستورات توی زمان های متفاوتی اجرا بشند
و ممکنه شما هنگامی که جواب دستور قبلی نیومده ، دستور بعدی رو ارسال کنید و کلا برنامه بهم بریزه
برای همین باید با چک کردن OK دستور بعدی رو ارسال کنید
یا حداقل زمان هر دستور رو بالاتر و متناسب با اون دستور قرار بدید

ممنون از جواب حضرتعالی

اون داکیومنت رو چندین بار خوندم
وقتی داشتم بصورت دستی با ترمینال دستور ارسال گت رو میزدم اونجا متوجه شدم باید علاوه بر تعداد url باید تایم اوت هم بدم تا دستورم ارسال بشه والا ارسال نمیشد

برای دیلی هم درست میفرمایید چندین بار بدون دیلی چک کردم نشده بود گفتم شاید دیلی بزارم فرقی بکند

الان من از ارسال صحیح url مطمئن نیستم و وقتی url ازسال میشه ok برنمیگرده یعنی قبل از ارسال دستور گت باید بهم ok بده که یعنی url رو بصورت صحیح از من گرفته ولی ok رو برنمیگردونه

شما در ابتدا گفتید که وقتی با ترمینال و به صورت دستی دستورات رو ارسال میکنید ، کامند ها به درستی ارسال میشه و دیتا میره روی سرور ؟؟!

اگر اینطور هست که پس دستورات ارسالی مشکل ندارند و شما همون دستورات رو بدون تغییر باید ارسال کنید
چرا که از اونها جواب گرفتید

وقتی این مرحله رو رد کردیم به اینجا میرسیم که آیا دستوراتی که شما با کمک میکروکنترلر ارسال میکنید را ماژول به درستی دریافت میکنه ؟؟!

برای این کار کامند ATE1 رو بزنید تا هر دستوری که براش ارسال شد رو برگردونه و توی سریال چک کنید که دستورات به درستی توسط ماژول دریافت میشه یا خیر

ضمنا من گفتم دستورات باید بعد از دریافت OK قبلی ارسال بشند . نه اینکه صرفا delay نداشته باشند
اگر کلا بدون تاخیر باشه که همینطور دستورات ارسال میشه و ماژول هم پاسخ مناسب نمیده !

همه دستورات رو دیگه رو مثلا GPS رو بصورت دقیق ارسال و دریافت نتیجه رو دارم اما برای GPRS به مشکل خوردم

نحوه آدرس دادن من برای url درست هست ؟ من url رو داخل یک آرایه گذاشتم و آخرش n\ میزنم و بعد ارسال میکنم صحیح هست ؟

راه اندازی http get خیلی سادست و چیز خاصی نداره.
قبلا توی انجمن فکر کنم شخص دیگه ای پرسیده بود و بجواب هم رسید اما برای https نتونست راش بندازه.
شما هم اگر از http استفاده میکنی کار خاصی نداره و طبق راهنمایی های دیتاشیت ها جلو بری مشکل حل میشه اما برای https کار کمی نیاز به دقت بیشتری داره.
خیلی وقته با http کار نکردم و فکر کنم به \n در آخرش نیاز نداشته باشه

مهندس باور کنید همین http یک هفته تمام درگیرم کرده و راه نیافتاده تمام حالت ها رو هم روش امتحان کردم

اون فایل راهنما رو هم چندبار خوندم

اگر از عزیزان کسی تجربه ارسال و دریافت دیتا به روش گت روی http توسط دستورات at commsnd رو داره ممنون میشم کمکم کنه

سلام دوست عزیز من هم گیج شدم
آیا کامندهایی که برای GPRS بصورت AT command و از طریق کامپیوتر ارسال میکنید کار میکنه و وقتی توسط میکرو ارسال میکنید اشتباه هست؟

سلام عزیزم

همه کامند های HTTP هم روی میکرو و هم روی ترمینال کامپیوتر کار میکنند فقط با کامپیوتر لحظه آخر ارسال موفق هست و دیتا بروی سرور نشسته میشه ولی با میکرو لحظه آخر ارور برمیگرده

البته همه دستورات GPS دقیق و بدن خطا روی میکرو اجرا میشه

مشکل شما احتمال زیاد روی زمان بندی هست
لطفا پیامی که از طریق میکرو میدید
و جوابی که میگیرید را کامل قرار بدید دقیقا بصورت خط به خط انچنان که از دیباگر شما میاد قرار بدید

در پیام اول عکسش رو گذاشتم خدمتتون

نیازه چیزی هم که ارسال میکنید با میکرو تو دیباگرتون بیاد دقیقا
میخام تقدم و تاخر را کاملا ببینم

خروجی دیباگرم همینه دیگه

URL....TEST

--------------1
AT+CGATT=1

result:
--------------2
AT+QIFGCNT=0

result:OK

--------------3
AT+QICSGP=1,"mtnirancell"

result:OK

--------------4
AT+CGACT=1,1

result:OK

--------------5
AT+QIREGAPP

result:OK

--------------6
AT+QIACT

result:OK

--------------7
AT+QHTTPURL=186,30

result:CONNECT

--------------8
http://map-test.pdnsoftware.ir/oil/newBoxLog?device=C8A4E7DB-5783-4CEB-8T0ECãCEC1BF0C5DA&lat=71.22&lng=83.24&hum=95&lgt=36&prs=37.01&spd=28&tmp=13.5&gpstype=ABB&ddt=14021010&dtm=230511
result:
--------------9
AT+QHTTPGET=186,30

result:

END------------- URL

من با دستورات زیر جواب گرفته بودم:

AT+QIFGCNT=0<CR><LF>
AT+QICSGP=1,"mcinet"<CR><LF>
AT+QIREGAPP<CR><LF>
AT+QIACT<CR><LF>
AT+QHTTPURL=39,10<CR><LF>
http://123456789012.ir/ym.php?x=yaAllah<CR><LF>
AT+QHTTPURL=29,10<CR><LF>
http://123456789012.ir/ym.php<CR><LF>
AT+QHTTPURL=37,10<CR><LF>
http://123456789012.ir/ym.php?x=clean<CR><LF>
AT+QHTTPGET=10<CR><LF>
AT+QHTTPREAD=10<CR><LF>


با دستور بالا دیتای yaAllah رو به سایت میفرستادم


با دستور بالا دیتایی که فرستاده بودم رو میدیدم


و با دستور بالا هم کل دیتا هایی که فرستاده بودم رو پاک میکردم


البته این دستورات باید در سایت تعریف شده باشن.

با دستور بالا GET میکردم و برای خوندن نتیجش هم باید قبل از اینکه زمانش تموم بشه دستور خط آخر رو میفرستادم.

تشکر از پاسخ های همه عزیزان