关于有人物联网的Cat1模块串口AT指令控制模块的联网网址

1.有人物联网的AT指令注意事项

        注:指令的响应信息分为有回显和无回显两种。回显的含义是在输入指令的时候,模块会先把输入的内容返回来,然后再对该指令做出响应。无回显则是模块不会返回输入的内容,只对指令做出响应。在下面代码演示都是以有回显演示的。

在cat1模块中我们只需要注意这几个命令就行了:

AT+SOCKA  查询/设置 socket A 参数
AT+SOCKB 查询/设置 socket B 参数
AT+SOCKC 查询/设置 socket C 参数
AT+SOCKD 查询/设置 socket D 参数
AT+SOCKASL 设置连接的方式短连接还是长连接
AT+S   保存配置并重启

2.代码实现
 

#include "GmsConnectTask.h"

#include <rtthread.h>
#include <rtdbg.h>

#include "tim.h"
#include "SysAllCallBack.h"
#include "usart.h"

/* 网络的连接(TCP和UDP ,网址,端口号) */
#define    SOCKA_PROCOTOL       "TCP"
#define    SOCKA_URL            "120.26.164.214"
#define    SOCKA_PORT_NUMBER    "7080"
/* 设置网络的连接方式 (短链接和长连接) */
#define    AT_SOCKASL_SHORT     "SHORT"
#define    AT_SOCKASL_LONG      "LONG"

/* CAT_1模块AT指令流程 */
typedef enum{
	GMS_Start = 0,
	GMS_Ready,
	GMS_Exit,
	GMS_AT_NATEN,
	GMS_AT_UATEN,
	GMS_AT_CACHEN,   
	GMS_At_Socka,
	GMS_AT_SOCKASL,
	GMS_At_SockaEn,
	GMS_At_Sockboff,
	GMS_At_Sockcoff,
	GMS_At_Sockdoff,
	GMS_AT_HEARTEN,
	GMS_AT_REGEN,
	GMS_AT_REGTP,
	GMS_AT_REGDT,
	GMS_AT_REGSND,
	GMS_At_S,
}GMS_CONNECT_FLOW;


/*********************GMSConnect线程控制块***********************************/
#define GMSCont_THREAD_STACK_SIZE       512             //栈的大小
#define GMSCont_THREAD_PRIORITY         12            	//线程优先级
#define GMSCont_THREAD_TIMESLICE        5               //时间片的长度
static rt_thread_t GMSContTid  = RT_NULL;
static void GMSContTask_entry(void * p);


void GMSContTask_Start(void)
{
	GMSContTid = rt_thread_create("GMSContTask",GMSContTask_entry,0,
								GMSCont_THREAD_STACK_SIZE,
								GMSCont_THREAD_PRIORITY,
								GMSCont_THREAD_TIMESLICE);
	if(GMSContTid != RT_NULL)
	{
		rt_thread_startup(GMSContTid);
		rt_kprintf("GMSConnect_TASK_success\r\n");
	}
	else
	{	
		rt_kprintf("GMSConnect_TASK_Fail\r\n");
	}
}



static void GMSContTask_entry(void * p)
{
	GmsRecvData GMS_Pro;
	GMS_CONNECT_FLOW  GmsContFlow = GMS_Start;
	uint8_t GmsTxBuf[40];
	uint8_t GmsTxCnt = 0;
	rt_memset(GMS_Pro.RecvBuf,0,sizeof(GMS_Pro.RecvBuf));
	HAL_UARTEx_ReceiveToIdle_DMA(&huart6,HwRecvData.RecvBuf,sizeof(HwRecvData.RecvBuf));//开启uart6的接收空闲中断DMA
	//HAL_UART_Receive_IT(&huart6,&HWDATATEMP,1);
	while(1)
	{
		rt_mq_recv(HW_DATA_Mq,         //接收来自BLE消息队列的数据
					&GMS_Pro,sizeof(GMS_Pro),
					RT_WAITING_FOREVER);  //一直等
		rt_kprintf("%s",GMS_Pro.RecvBuf);
		//rt_kprintf("%d\r\n",GMS_Pro.RecvCnt);
		switch(GmsContFlow)
		{
			case GMS_Start:
			{
				if((GMS_Pro.RecvCnt == 6)&&(rt_memcmp(GMS_Pro.RecvBuf,"WH-GM5",6) == 0))
				{
					rt_kprintf("GMS_Init_Success,Exit_Unvarnished_Transmission\r\n");
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"+++");
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_Ready;
				}
			}break;
			case GMS_Ready:
			{
				if((GMS_Pro.RecvCnt == 1)&&(rt_memcmp(GMS_Pro.RecvBuf,"a",1) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"a");
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_Exit;
				}
			}break;
			case GMS_Exit:      //退出透传模式,进入AT指令模式
			{
				if((GMS_Pro.RecvCnt == 5)&&(rt_memcmp(GMS_Pro.RecvBuf,"+ok\r\n",5) == 0))
				{
					rt_kprintf("Exit_Unvarnished_Transmission_Success\r\n");
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+NATEN=OFF\r\n");
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_NATEN;
				}
			}break;
			case GMS_AT_NATEN:   //网络AT指令
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+NATEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 20)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,20) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+UATEN=OFF\r\n");
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_UATEN;
				}
			}break;
			case GMS_AT_UATEN:   //串口AT指令
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+UATEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 20)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,20) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+CACHEN=OFF\r\n");
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_CACHEN;
				}
			}break;
			case GMS_AT_CACHEN:  //串口数据缓存
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+CACHEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 21)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,21) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKA=%s,%s,%s\r",
									SOCKA_PROCOTOL,SOCKA_URL,SOCKA_PORT_NUMBER);
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_At_Socka;
				}
			}break;
			case GMS_At_Socka:   //连接网址
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKA=%s,%s,%s\r\r\nOK\r\n",
									SOCKA_PROCOTOL,SOCKA_URL,SOCKA_PORT_NUMBER);
				if((GMS_Pro.RecvCnt == 39)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,39) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKASL=%s\r\n",AT_SOCKASL_SHORT);
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_SOCKASL;
				}
			}break;
			case GMS_AT_SOCKASL:  //设置连接方式
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKASL=%s\r\n\r\nOK\r\n",AT_SOCKASL_SHORT);
				if((GMS_Pro.RecvCnt == 24)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,24) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKAEN=ON\r\n");
					HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_At_SockaEn;
				}	
			}break;
			case GMS_At_SockaEn:  //打开A服务器
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKAEN=ON\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 21)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,21) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKBEN=OFF\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_At_Sockboff;
				}
			}break;
			case GMS_At_Sockboff: //关闭B服务器
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKBEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 22)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,22) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKCEN=OFF\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_At_Sockcoff;
				}
			}break;
			case GMS_At_Sockcoff:  //关闭C服务器
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKCEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 22)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,22) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKDEN=OFF\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_At_Sockdoff;
				}
			}break;
			case GMS_At_Sockdoff:    //关闭D服务器
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+SOCKDEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 22)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,22) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+HEARTEN=OFF\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_HEARTEN;
				}
			}break;
			case GMS_AT_HEARTEN:  //心跳包设置
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+HEARTEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 22)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,22) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGEN=OFF\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_REGEN;
				}
			}break;
			case GMS_AT_REGEN:   //注册包使能
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGEN=OFF\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 20)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,20) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGTP=USER\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_REGTP;
				}
			}break;
			case GMS_AT_REGTP:  //注册包数据类型,5C725C6E是\r\n的hex格式
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGTP=USER\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 21)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,21) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGDT=5C725C6E\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_REGDT;
				}
			}break;
			case GMS_AT_REGDT:  //注册包内容
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGDT=5C725C6E\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 25)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,25) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGSND=LINK\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_AT_REGSND;
				}
			}break;
			case GMS_AT_REGSND: //注册包的发送方式(LINK ,DATA ,LINK&DATA)
			{
				GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+REGSND=LINK\r\n\r\nOK\r\n");
				if((GMS_Pro.RecvCnt == 22)&&(rt_memcmp(GMS_Pro.RecvBuf,GmsTxBuf,22) == 0))
				{
					GmsTxCnt = rt_snprintf((char *)&GmsTxBuf,sizeof(GmsTxBuf),"AT+S\r\n");
				    HAL_UART_Transmit_IT(&huart6,GmsTxBuf,GmsTxCnt);
					GmsContFlow = GMS_At_S;
				}
			}break;
			case GMS_At_S:      //提交并保存设置
			{
				if((GMS_Pro.RecvCnt == 6)&&(rt_memcmp(GMS_Pro.RecvBuf,"\r\nOK\r\n",6) == 0))
				{
					rt_kprintf("GMS_Change_Url_success\r\n");
					HAL_TIM_Base_Start_IT(&htim3); //启动通用定时器3(10s上报)
					rt_thread_delete(GMSContTid);  //删除线程
					goto ThreadEnd;               //删除线程
				}
			}break;
		}
		rt_memset(GMS_Pro.RecvBuf,0,sizeof(GMS_Pro.RecvBuf));
		rt_thread_mdelay(10);
	}
	ThreadEnd:
		return;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值