1.有人物联网的AT指令注意事项
注:指令的响应信息分为有回显和无回显两种。回显的含义是在输入指令的时候,模块会先把输入的内容返回来,然后再对该指令做出响应。无回显则是模块不会返回输入的内容,只对指令做出响应。在下面代码演示都是以有回显演示的。
在cat1模块中我们只需要注意这几个命令就行了:
AT+SOCKA 查询/设置 socket A 参数 |
AT+SOCKB 查询/设置 socket B 参数 |
AT+SOCKC 查询/设置 socket C 参数 |
AT+SOCKD 查询/设置 socket D 参数 |
AT+SOCKASL 设置连接的方式短连接还是长连接 |
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;
}