#include "at_command.h" #include "myUart.h" #include #include #include "stm32f10x_it.h" #include "myDisplayUnit.h" #define PROCCESS_STA_ESLE -127 // #define PROCCESS_STA_OVER -5 // #define PROCCESS_STA_JAMP -4 // #define PROCCESS_STA_START 0 // #define PROCCESS_STA_CMDFLAG_SEND 0 // #define PROCCESS_STA_CMDFLAG_WAIT 1 // static atCmdBuffer_ts atCmdRecvList[ATCMD_REC_BUFFER_LEVEL]; static uint8_t bufferIndex; static uint8_t bufferIndexCnt; static int8_t powerOpenProccessIndexTemp = PROCCESS_STA_ESLE; static int8_t powerOpenProccessIndex = PROCCESS_STA_START; static uint8_t powerOpenProccessCmdFlag; static ATCMD_CALLBACK pwrOn_cb; static int8_t mqttProccessIndex = PROCCESS_STA_OVER; static int8_t mqttProccessIndexTemp = PROCCESS_STA_ESLE; static uint8_t mqttProccessCmdFlag; static ATCMD_CALLBACK mqtt_cb; static char mqttBuffer[255]; static uint16_t mqttBufferLen; static int8_t tcpIpProccessIndex = -1; static int8_t tcpIpProccessIndexTemp = -127; static uint8_t tcpIpProccessCmdFlag; static uint32_t waitAckTimeOutCount_ms; static const char *hostName_tengxunyunLin = {"175.178.211.247"}; static uint32_t port_tengxunyunLin = 1884; static uint32_t tcpPort_tengxunyunLin = 8800; static bool uartRecevDone; //合宙AT指令集 atCommandStruct_ts atCommandStructList[] = { { .index = AC_CGMI, .readInfor = "AT+CGMI", .cmdInfor = "查询制造商名称", }, { .index = AC_CGMM, .readInfor = "AT+CGMM", .cmdInfor = "查询模块型号", }, { .index = AC_CGMR, .readInfor = "AT+CGMR", .cmdInfor = "查询模块版本信息", }, { .index = AC_CGSN, .readInfor = "AT+CGSN", .cmdInfor = "查询 IMEI 号", }, { .index = AC_CCID_ICCID, .readInfor = "AT+CCID", .cmdInfor = "查询 SIM 卡 ICCID 号码", }, { .index = AC_CIMI, .readInfor = "AT+CIMI", .cmdInfor = "查询 IMSI", }, { .index = AC_ATI, .readInfor = "ATI", .cmdInfor = "查询产品信息", }, { .index = AC_VER, .readInfor = "AT+VER", .cmdInfor = "查询模块 FIRMWARE 版本", }, { .index = AC_AT_HVER, .readInfor = "AT^HVER", .cmdInfor = "查询平台硬件版本", }, { .index = AC_AT_I, .readInfor = "AT*I", .cmdInfor = "查询各种信息", }, { .index = AC_WISN, .readInfor = "AT+WISN", .cmdInfor = "写 SN 号命令", }, { .index = AC_RESET, .readInfor = "AT+RESET", .cmdInfor = "重启模块", }, { .index = AC_RSTSET, .readInfor = "AT+RSTSET", .cmdInfor = "重启模块并恢复出厂设置", }, { .index = AC_CSCS, .readInfor = "AT+CSCS", .cmdInfor = "选择 TE 字符集", }, { .index = AC_AT_W, .readInfor = "AT&W", .cmdInfor = "保存用户当前的配置", }, { .index = AC_ATE, .readInfor = "ATE", .cmdInfor = "设置命令回显模式", }, { .index = AC_AT_F, .readInfor = "AT&F", .cmdInfor = "恢复所有参数为出厂配置", }, { .index = AC_ATQ, .readInfor = "ATQ", .cmdInfor = "设置结果码抑制模式", }, { .index = AC_ATV, .readInfor = "ATV", .cmdInfor = "设置 TA 响应内容的格式", }, { .index = AC_ATX, .readInfor = "ATX", .cmdInfor = "设置 CONNECT 结果码格式和监测呼叫进程", }, { .index = AC_ATS0, .readInfor = "ATS0", .cmdInfor = "设置自动应答前振铃次数", }, { .index = AC_UPGRADE, .readInfor = "AT+UPGRADE", .cmdInfor = "FOTA 空中升级", }, { .index = AC_ATS3, .readInfor = "ATS3", .cmdInfor = "设置指令行终止符", }, { .index = AC_ATS5, .readInfor = "ATS5", .cmdInfor = "设置命令行编辑字符", }, { .index = AC_AT_C, .readInfor = "AT&C", .cmdInfor = "设置 CDC 功能模式", }, { .index = AC_AT_D, .readInfor = "AT&D", .cmdInfor = "设置 DTR 功能模式", }, { .index = AC_CCLK, .readInfor = "AT+CCLK", .cmdInfor = "实时时钟", }, { .index = AC_SETUSB, .readInfor = "AT+SETUSB", .cmdInfor = "设置 USB 模式", }, { .index = AC_CMEE, .readInfor = "AT+CMEE", .cmdInfor = "设备错误", }, { .index = AC_CPAS, .readInfor = "AT+CPAS", .cmdInfor = "手机活动状态", }, { .index = AC_CFUN, .readInfor = "AT+CFUN", .cmdInfor = "模块功能模式", }, { .index = AC_CPOWD, .readInfor = "AT+CPOWD", .cmdInfor = "关机", }, { .index = AC_CPIN, .readInfor = "AT+CPIN", .cmdInfor = "输入 PIN 码", }, { .index = AC_CLCK, .readInfor = "AT+CLCK", .cmdInfor = "设备锁定", }, { .index = AC_CPWD, .readInfor = "AT+CPWD", .cmdInfor = "修改密码", }, { .index = AC_SLEDS, .readInfor = "AT+SLEDS", .cmdInfor = "网络灯闪烁的时间间隔", }, { .index = AC_IPR, .readInfor = "AT+IPR", .cmdInfor = "设置 TE-TA 波特率", }, { .index = AC_ICF, .readInfor = "AT+ICF", .cmdInfor = "设置 TE-TA 帧格式", }, { .index = AC_ATS4, .readInfor = "ATS4", .cmdInfor = "设置指令行换行字符", }, { .index = AC_IFC, .readInfor = "AT+IFC", .cmdInfor = "TE-TA 本地流量控制", }, { .index = AC_CMUX, .readInfor = "AT+CMUX", .cmdInfor = "多路复用", }, { .index = AC_CSDT, .readInfor = "AT+CSDT", .cmdInfor = "开启和关闭 SIM 卡在位硬件检测", }, { .index = AC_AT_SIMDETEC, .readInfor = "AT*SIMDETEC", .cmdInfor = "检测某个插槽的 SIM 卡是否在位", }, { .index = AC_AT_CARDMODE, .readInfor = "AT^CARDMODE", .cmdInfor = "控制 SIM 卡状态主动上报", }, { .index = AC_AT_EUICC, .readInfor = "AT*EUICC", .cmdInfor = "获取 SIM 类型", }, { .index = AC_CSCLK, .readInfor = "AT+CSCLK", .cmdInfor = "通过 UART 口设置睡眠唤醒", }, { .index = AC_WAKETIM, .readInfor = "AT+WAKETIM", .cmdInfor = "设置睡眠等待时间", }, { .index = AC_CFGRI, .readInfor = "AT+CFGRI", .cmdInfor = "设置 RI 指示功能", }, { .index = AC_AT_CMCRI, .readInfor = "AT*CMCRI", .cmdInfor = "短信特定字符触发 RI 功能", }, { .index = AC_MIFIMAC, .readInfor = "AT+MIFIMAC", .cmdInfor = "设置 MAC 地址", }, { .index = AC_CADC, .readInfor = "AT+CADC", .cmdInfor = "读取 ADC", }, { .index = AC_CBC, .readInfor = "AT+CBC", .cmdInfor = "读取 VBAT 电压", }, { .index = AC_CNETLIGHT, .readInfor = "AT+CNETLIGHT", .cmdInfor = "打开/关闭网络灯", }, { .index = AC_SIMCROSS, .readInfor = "AT+SIMCROSS", .cmdInfor = "SIM 卡切换", }, { .index = AC_RNDISCALL, .readInfor = "AT+RNDISCALL", .cmdInfor = "RNDIS/ECM 功能开关", }, { .index = AC_CSQ, .readInfor = "AT+CSQ", .cmdInfor = "查询信号质量", }, { .index = AC_CESQ, .readInfor = "AT+CESQ", .cmdInfor = "查询信号质量(扩展)", }, { .index = AC_AT_CSQ, .readInfor = "AT*CSQ", .cmdInfor = "打开 CSQ 主动上报", }, { .index = AC_CREG, .readInfor = "AT+CREG", .cmdInfor = "网络注册信息", }, { .index = AC_CEREG, .readInfor = "AT+CEREG", .cmdInfor = "E-UTRAN EPS 网络注册状态", }, { .index = AC_AT_SYSCONFIG, .readInfor = "AT^SYSCONFIG", .cmdInfor = "设置网络模式", }, { .index = AC_CGCONTRDP, .readInfor = "AT+CGCONTRDP", .cmdInfor = "查询 CID 相关的上下文定义", }, { .index = AC_COPS, .readInfor = "AT+COPS", .cmdInfor = "运营商查询和选择", }, { .index = AC_CTZU, .readInfor = "AT+CTZU", .cmdInfor = "自动时区更新", }, { .index = AC_CTZR, .readInfor = "AT+CTZR", .cmdInfor = "打开 NITZ 自动上报", }, { .index = AC_BGLTEPLMN, .readInfor = "AT+BGLTEPLMN", .cmdInfor = "设置小区背景搜寻", }, { .index = AC_AT_EHSDPA, .readInfor = "AT*EHSDPA", .cmdInfor = "使能 HSDPA 和 HSUPA", }, { .index = AC_AT_BAND, .readInfor = "AT*BAND", .cmdInfor = "GSM/UMTS/LTE 模式和频段设置", }, { .index = AC_AT_BANDIND, .readInfor = "AT*BANDIND", .cmdInfor = "查询当前工作频段", }, { .index = AC_AT_CACAP, .readInfor = "AT^CACAP", .cmdInfor = "查询接入机制(ACCESS TECHNOLOGY)", }, { .index = AC_AT_SYSINFO, .readInfor = "AT^SYSINFO", .cmdInfor = "查询当前的系统信息", }, { .index = AC_CTEC, .readInfor = "AT+CTEC", .cmdInfor = "设置无线接入方式", }, { .index = AC_AT_CELL, .readInfor = "AT*CELL", .cmdInfor = "小区/频率锁", }, { .index = AC_CIPGSMLOC, .readInfor = "AT+CIPGSMLOC", .cmdInfor = "读取基站定位(LBS)信息和时间", }, { .index = AC_WIFILOC, .readInfor = "AT+WIFILOC", .cmdInfor = "读取 WIFI 定位信息和时间", }, { .index = AC_WIFISCAN, .readInfor = "AT+WIFISCAN", .cmdInfor = "获取 WIFI 信息", }, { .index = AC_AT_DATAINFO, .readInfor = "AT^DATAINFO", .cmdInfor = "流量查询命令", }, { .index = AC_CCED, .readInfor = "AT+CCED", .cmdInfor = "小区信息查询", }, { .index = AC_EEMOPT, .readInfor = "AT+EEMOPT", .cmdInfor = "设置工程模式", }, { .index = AC_EEMGINFO, .readInfor = "AT+EEMGINFO", .cmdInfor = "在工程模式下查询 GSM/UMTS/LTE 信息", }, { .index = AC_SETVOLTE, .readInfor = "AT+SETVOLTE", .cmdInfor = "打开 VOLTE 功能", }, { .index = AC_ATD, .readInfor = "ATD", .cmdInfor = "发起呼叫", }, { .index = AC_ATA, .readInfor = "ATA", .cmdInfor = "接听来电", }, { .index = AC_ATH, .readInfor = "ATH", .cmdInfor = "挂断通话", }, { .index = AC_CHUP, .readInfor = "AT+CHUP", .cmdInfor = "挂断通话", }, { .index = AC_CLCC, .readInfor = "AT+CLCC", .cmdInfor = "列出所有当前的呼叫", }, { .index = AC_CLIP, .readInfor = "AT+CLIP", .cmdInfor = "设置主叫号码显示", }, { .index = AC_CHLD, .readInfor = "AT+CHLD", .cmdInfor = "呼叫保持和多方通话", }, { .index = AC_VTS, .readInfor = "AT+VTS", .cmdInfor = "产生 DTMF 音", }, { .index = AC_VTD, .readInfor = "AT+VTD", .cmdInfor = "DTMF TONE 周期", }, { .index = AC_CTTS, .readInfor = "AT+CTTS", .cmdInfor = "TTS(TEXT TO SPEECH)功能", }, { .index = AC_CTTSPARAM, .readInfor = "AT+CTTSPARAM", .cmdInfor = "设置 TTS 播放模式", }, { .index = AC_CAUDREC, .readInfor = "AT+CAUDREC", .cmdInfor = "音频录制", }, { .index = AC_CAUDPLAY, .readInfor = "AT+CAUDPLAY", .cmdInfor = "语音文件播放", }, { .index = AC_AUDCH, .readInfor = "AT+AUDCH", .cmdInfor = "语音通道切换", }, { .index = AC_CLVL, .readInfor = "AT+CLVL", .cmdInfor = "通话音量控制", }, { .index = AC_CRSL, .readInfor = "AT+CRSL", .cmdInfor = "本地音频播放音量控制", }, { .index = AC_SPKPA, .readInfor = "AT+SPKPA", .cmdInfor = "音频功放类型设置指令", }, { .index = AC_CACCP, .readInfor = "AT+CACCP", .cmdInfor = "音频 MIC 增益设置指令", }, { .index = AC_CPMS, .readInfor = "AT+CPMS", .cmdInfor = "短消息优先存储区选择", }, { .index = AC_CSCA, .readInfor = "AT+CSCA", .cmdInfor = "短消息中心地址", }, { .index = AC_CMGF, .readInfor = "AT+CMGF", .cmdInfor = "短消息格式", }, { .index = AC_CSMP, .readInfor = "AT+CSMP", .cmdInfor = "设置短信 TEXT 模式参数", }, { .index = AC_CSDH, .readInfor = "AT+CSDH", .cmdInfor = "控制 TEXT 模式下短信头信息显示", }, { .index = AC_CNMI, .readInfor = "AT+CNMI", .cmdInfor = "新消息指示", }, { .index = AC_CNMA, .readInfor = "AT+CNMA", .cmdInfor = "新短消息确认", }, { .index = AC_CMGS, .readInfor = "AT+CMGS", .cmdInfor = "发送短信", }, { .index = AC_CMGW, .readInfor = "AT+CMGW", .cmdInfor = "把消息写入存储器", }, { .index = AC_CMSS, .readInfor = "AT+CMSS", .cmdInfor = "从存储器发送短信", }, { .index = AC_CMMS, .readInfor = "AT+CMMS", .cmdInfor = "短信链路控制命令", }, { .index = AC_CMGR, .readInfor = "AT+CMGR", .cmdInfor = "读短信", }, { .index = AC_CMGL, .readInfor = "AT+CMGL", .cmdInfor = "列举短消息", }, { .index = AC_CMGD, .readInfor = "AT+CMGD", .cmdInfor = "删除短消息", }, { .index = AC_CSCB, .readInfor = "AT+CSCB", .cmdInfor = "小区广播短消息类型选择", }, { .index = AC_CPBS, .readInfor = "AT+CPBS", .cmdInfor = "选择电话本存储类型", }, { .index = AC_CPBR, .readInfor = "AT+CPBR", .cmdInfor = "读取电话本记录", }, { .index = AC_CPBF, .readInfor = "AT+CPBF", .cmdInfor = "查找电话本记录", }, { .index = AC_CPBW, .readInfor = "AT+CPBW", .cmdInfor = "写电话本记录", }, { .index = AC_CNUM, .readInfor = "AT+CNUM", .cmdInfor = "本机号码", }, { .index = AC_CGREG, .readInfor = "AT+CGREG", .cmdInfor = "GPRS 网络注册状态", }, { .index = AC_CGATT, .readInfor = "AT+CGATT", .cmdInfor = "GPRS 附着分离", }, { .index = AC_CGDCONT, .readInfor = "AT+CGDCONT", .cmdInfor = "PDP 上下文定义", }, { .index = AC_CGAUTH, .readInfor = "AT+CGAUTH", .cmdInfor = "PDP 上下文鉴权参数", }, { .index = AC_CGPADDR, .readInfor = "AT+CGPADDR", .cmdInfor = "显示 PDP 地址", }, { .index = AC_CGACT, .readInfor = "AT+CGACT", .cmdInfor = "PDP 上下文激活", }, { .index = AC_CGQMIN, .readInfor = "AT+CGQMIN", .cmdInfor = "可接受的最小服务质量简报", }, { .index = AC_CGQREQ, .readInfor = "AT+CGQREQ", .cmdInfor = "请求的服务质量简报", }, { .index = AC_CGEREP, .readInfor = "AT+CGEREP", .cmdInfor = "控制非请求 GPRS 事件上报", }, { .index = AC_AT_GETIP, .readInfor = "AT*GETIP", .cmdInfor = "通过 CID 查询本地 IP 地址", }, { .index = AC_AUTOAPN, .readInfor = "AT+AUTOAPN", .cmdInfor = "打开或关闭自动获取 APN", }, { .index = AC_AT_CGDFLT, .readInfor = "AT*CGDFLT", .cmdInfor = "设置 LTE 下缺省的 PDP 承载", }, { .index = AC_AT_CGDFAUTH, .readInfor = "AT*CGDFAUTH", .cmdInfor = "设置 LTE 缺省的 PDP 承载的鉴权参数", }, { .index = AC_CNTPCID, .readInfor = "AT+CNTPCID", .cmdInfor = "设置 GPRS 承载场景 ID", }, { .index = AC_CNTP, .readInfor = "AT+CNTP", .cmdInfor = "同步网络时间", }, { .index = AC_FSCREATE, .readInfor = "AT+FSCREATE", .cmdInfor = "创建一个文件", }, { .index = AC_FSREAD, .readInfor = "AT+FSREAD", .cmdInfor = "读文件", }, { .index = AC_FSWRITE, .readInfor = "AT+FSWRITE", .cmdInfor = "写文件", }, { .index = AC_FSDRIVE, .readInfor = "AT+FSDRIVE", .cmdInfor = "获取盘符", }, { .index = AC_FSLS, .readInfor = "AT+FSLS", .cmdInfor = "显示文件目录列表", }, { .index = AC_FSMEM, .readInfor = "AT+FSMEM", .cmdInfor = "获取可用空间大小", }, { .index = AC_FSMKDIR, .readInfor = "AT+FSMKDIR", .cmdInfor = "创建目录", }, { .index = AC_FSRMDIR, .readInfor = "AT+FSRMDIR", .cmdInfor = "删除目录", }, { .index = AC_FSDEL, .readInfor = "AT+FSDEL", .cmdInfor = "删除文件", }, { .index = AC_FSFLSIZE, .readInfor = "AT+FSFLSIZE", .cmdInfor = "获取文件大小", }, { .index = AC_CIPMUX, .readInfor = "AT+CIPMUX", .cmdInfor = "启动多 IP 连接", }, { .index = AC_CSTT, .readInfor = "AT+CSTT", .cmdInfor = "启动任务并设置接入点 APN、用户名、密码", }, { .index = AC_CPNETAPN, .readInfor = "AT+CPNETAPN", .cmdInfor = "专网卡设置 APN、用户名、密码和鉴权方式", }, { .index = AC_CIICR, .readInfor = "AT+CIICR", .cmdInfor = "激活移动场景(或发起 GPRS 或 CSD 无线连接)", }, { .index = AC_CIFSR, .readInfor = "AT+CIFSR", .cmdInfor = "查询本地 IP 地址", }, { .index = AC_CIPSSL, .readInfor = "AT+CIPSSL", .cmdInfor = "设置 TCP 使用 SSL 功能", }, { .index = AC_SSLCFG, .readInfor = "AT+SSLCFG", .cmdInfor = "配置 TCP SSL 参数", }, { .index = AC_CLPORT, .readInfor = "AT+CLPORT", .cmdInfor = "配置本地 TCP 端口", }, { .index = AC_CIPSTART, .readInfor = "AT+CIPSTART", .cmdInfor = "建立 TCP 连接或注册 UDP 端口号", }, { .index = AC_CIPMODE, .readInfor = "AT+CIPMODE", .cmdInfor = "选择 TCPIP 应用模式", }, { .index = AC_CIPQSEND, .readInfor = "AT+CIPQSEND", .cmdInfor = "选择非透传数据发送模式", }, { .index = AC_CIPRXF, .readInfor = "AT+CIPRXF", .cmdInfor = "设置接收的数据末尾是否自动添加回车换行", }, { .index = AC_CIPCCFG, .readInfor = "AT+CIPCCFG", .cmdInfor = "配置透明传输模式", }, { .index = AC_CIPSEND, .readInfor = "AT+CIPSEND", .cmdInfor = "发送数据", }, { .index = AC_CIPATS, .readInfor = "AT+CIPATS", .cmdInfor = "设置自动发送数据前的定时时间", }, { .index = AC_CIPSPRT, .readInfor = "AT+CIPSPRT", .cmdInfor = "设置发送数据时是否显示‘>’和发送情况提示", }, { .index = AC_CIPSTATUS, .readInfor = "AT+CIPSTATUS", .cmdInfor = "查询当前连接状态", }, { .index = AC_CIPACK, .readInfor = "AT+CIPACK", .cmdInfor = "查询已连接数据传输状态", }, { .index = AC_CIPCSGP, .readInfor = "AT+CIPCSGP", .cmdInfor = "设置为 CSD 或 GPRS 连接模式", }, { .index = AC_CDNSCFG, .readInfor = "AT+CDNSCFG", .cmdInfor = "配置域名服务器 DNS", }, { .index = AC_CDNSGIP, .readInfor = "AT+CDNSGIP", .cmdInfor = "域名解析", }, { .index = AC_CIPSRIP, .readInfor = "AT+CIPSRIP", .cmdInfor = "设置单链接接收数据时是否显示发送方的 IP 地址和端口号", }, { .index = AC_CIPHEAD, .readInfor = "AT+CIPHEAD", .cmdInfor = "设置单链接接收数据是否显示 IP 头", }, { .index = AC_CIPSHOWTP, .readInfor = "AT+CIPSHOWTP", .cmdInfor = "设置单链接接收数据是否在 IP 头显示传输协议", }, { .index = AC_TCPUSERPARAM, .readInfor = "AT+TCPUSERPARAM", .cmdInfor = "配置 TCP 协议的参数", }, { .index = AC_CIPSCONT, .readInfor = "AT+CIPSCONT", .cmdInfor = "保存 TCPIP 应用上下文", }, { .index = AC_CIPRXGET, .readInfor = "AT+CIPRXGET", .cmdInfor = "手动获得网络数据", }, { .index = AC_CIPCLOSE, .readInfor = "AT+CIPCLOSE", .cmdInfor = "关闭 TCP 或 UDP 连接", }, { .index = AC_CIPSHUT, .readInfor = "AT+CIPSHUT", .cmdInfor = "关闭移动场景", }, { .index = AC_ROUTEIP, .readInfor = "AT+ROUTEIP", .cmdInfor = "修改 RNDIS 网卡网关 IP 地址", }, { .index = AC_ATO, .readInfor = "ATO", .cmdInfor = "从命令模式切换至数据模式", }, { .index = AC_SAPBR, .readInfor = "AT+SAPBR", .cmdInfor = "IP 应用设置", }, { .index = AC_HTTPINIT, .readInfor = "AT+HTTPINIT", .cmdInfor = "初始化 HTTP 服务", }, { .index = AC_HTTPSSL, .readInfor = "AT+HTTPSSL", .cmdInfor = "启用 SSL", }, { .index = AC_HTTPPARA, .readInfor = "AT+HTTPPARA", .cmdInfor = "设置 HTTP 参数值", }, { .index = AC_HTTPDATA, .readInfor = "AT+HTTPDATA", .cmdInfor = "写数据", }, { .index = AC_HTTPACTION, .readInfor = "AT+HTTPACTION", .cmdInfor = "HTTP 方式激活", }, { .index = AC_HTTPREAD, .readInfor = "AT+HTTPREAD", .cmdInfor = "查询 HTTP 服务响应", }, { .index = AC_HTTPHEAD, .readInfor = "AT+HTTPHEAD", .cmdInfor = "查询 HTTP 头信息", }, { .index = AC_HTTPSCONT, .readInfor = "AT+HTTPSCONT", .cmdInfor = "保存 HTTP 应用上下文", }, { .index = AC_HTTPTERM, .readInfor = "AT+HTTPTERM", .cmdInfor = "终止 HTTP 任务", }, { .index = AC_FTPPORT, .readInfor = "AT+FTPPORT", .cmdInfor = "设置 FTP 控制端口", }, { .index = AC_FTPMODE, .readInfor = "AT+FTPMODE", .cmdInfor = "设置 FTP 主动或被动模式", }, { .index = AC_FTPTYPE, .readInfor = "AT+FTPTYPE", .cmdInfor = "设置 FTP 数据传输类型", }, { .index = AC_FTPPUTOPT, .readInfor = "AT+FTPPUTOPT", .cmdInfor = "设置 FTP 输入类型", }, { .index = AC_FTPCID, .readInfor = "AT+FTPCID", .cmdInfor = "设置 FTP 承载标识", }, { .index = AC_FTPREST, .readInfor = "AT+FTPREST", .cmdInfor = "设置 FTP 下载续传", }, { .index = AC_FTPSERV, .readInfor = "AT+FTPSERV", .cmdInfor = "设置 FTP 服务器地址", }, { .index = AC_FTPUN, .readInfor = "AT+FTPUN", .cmdInfor = "设置 FTP 用户名称", }, { .index = AC_FTPPW, .readInfor = "AT+FTPPW", .cmdInfor = "设置 FTP 密码", }, { .index = AC_FTPGETNAME, .readInfor = "AT+FTPGETNAME", .cmdInfor = "设置 FTP 下载文件名称", }, { .index = AC_FTPGETPATH, .readInfor = "AT+FTPGETPATH", .cmdInfor = "设置 FTP 下载文件路径", }, { .index = AC_FTPPUTNAME, .readInfor = "AT+FTPPUTNAME", .cmdInfor = "设置 FTP 上传文件名称", }, { .index = AC_FTPPUTPATH, .readInfor = "AT+FTPPUTPATH", .cmdInfor = "设置 FTP 上传文件路径", }, { .index = AC_FTPMKD, .readInfor = "AT+FTPMKD", .cmdInfor = "远程服务器上创建文件目录", }, { .index = AC_FTPRMD, .readInfor = "AT+FTPRMD", .cmdInfor = "远程服务器上删除文件目录", }, { .index = AC_FTPGET, .readInfor = "AT+FTPGET", .cmdInfor = "下载文件", }, { .index = AC_FTPPUT, .readInfor = "AT+FTPPUT", .cmdInfor = "上传文件", }, { .index = AC_FTPEXTGET, .readInfor = "AT+FTPEXTGET", .cmdInfor = "下载文件(扩展)", }, { .index = AC_FTPEXTPUT, .readInfor = "AT+FTPEXTPUT", .cmdInfor = "上传文件(扩展)", }, { .index = AC_FTPGETTOFS, .readInfor = "AT+FTPGETTOFS", .cmdInfor = "下载文件并保存到文件系统中", }, { .index = AC_FTPPUTFRMFS, .readInfor = "AT+FTPPUTFRMFS", .cmdInfor = "从文件系统上传文件到服务器", }, { .index = AC_FTPFILEPUT, .readInfor = "AT+FTPFILEPUT", .cmdInfor = "从文件系统加载到 RAM 中并用 FTPPUT 上传", }, { .index = AC_FTPLIST, .readInfor = "AT+FTPLIST", .cmdInfor = "获取远程服务器上文件目录", }, { .index = AC_FTPSIZE, .readInfor = "AT+FTPSIZE", .cmdInfor = "获取远程服务器上文件大小", }, { .index = AC_FTPSTATE, .readInfor = "AT+FTPSTATE", .cmdInfor = "获取 FTP 状态", }, { .index = AC_FTPSCONT, .readInfor = "AT+FTPSCONT", .cmdInfor = "保存 FTP 应用上下文", }, { .index = AC_FTPDELE, .readInfor = "AT+FTPDELE", .cmdInfor = "删除服务器上指定的文件", }, { .index = AC_FTPQUIT, .readInfor = "AT+FTPQUIT", .cmdInfor = "退出当前 FTP 会话", }, { .index = AC_MCONFIG, .readInfor = "AT+MCONFIG", .cmdInfor = "设置 MQTT 相关参数", }, { .index = AC_MIPSTART, .readInfor = "AT+MIPSTART", .cmdInfor = "建立 TCP 连接", }, { .index = AC_MCONNECT, .readInfor = "AT+MCONNECT", .cmdInfor = "客户端向服务器请求会话连接", }, { .index = AC_MPUB, .readInfor = "AT+MPUB", .cmdInfor = "发布消息", }, { .index = AC_MPUBEX, .readInfor = "AT+MPUBEX", .cmdInfor = "发布长消息", }, { .index = AC_MSUB, .readInfor = "AT+MSUB", .cmdInfor = "订阅主题", }, { .index = AC_MUNSUB, .readInfor = "AT+MUNSUB", .cmdInfor = "取消订阅主题", }, { .index = AC_MQTTMSGGET, .readInfor = "AT+MQTTMSGGET", .cmdInfor = "打印收到的所有的订阅消息", }, { .index = AC_MQTTMSGSET, .readInfor = "AT+MQTTMSGSET", .cmdInfor = "设置订阅消息的打印模式", }, { .index = AC_MQTTMODE, .readInfor = "AT+MQTTMODE", .cmdInfor = "MQTT 消息编码格式切换", }, { .index = AC_MIPCLOSE, .readInfor = "AT+MIPCLOSE", .cmdInfor = "关闭 TCP 连接", }, { .index = AC_MDISCONNECT, .readInfor = "AT+MDISCONNECT", .cmdInfor = "关闭 MQTT 连接", }, { .index = AC_MQTTSTATU, .readInfor = "AT+MQTTSTATU", .cmdInfor = "查询 MQTT 连接状态", }, { .index = AC_BTCOMM_ENABLE, .readInfor = "AT+BTCOMM=ENABLE", .cmdInfor = "蓝牙开关", }, { .index = AC_BLECOMM_NAME, .readInfor = "AT+BLECOMM=NAME", .cmdInfor = "设置名称", }, { .index = AC_BLEADV_ADVDATA, .readInfor = "AT+BLEADV=ADVDATA", .cmdInfor = "设置广播数据", }, { .index = AC_BLEADV_SCANRSPDATA, .readInfor = "AT+BLEADV=SCANRSPDATA", .cmdInfor = "设置响应数据", }, { .index = AC_BLEADV_ADVPARAM, .readInfor = "AT+BLEADV=ADVPARAM", .cmdInfor = "设置广播参数", }, { .index = AC_BLEADV_BEACONDATA, .readInfor = "AT+BLEADV=BEACONDATA", .cmdInfor = "设置 BEACON 数据", }, { .index = AC_BLEADV_ENABLE, .readInfor = "AT+BLEADV=ENABLE", .cmdInfor = "广播开关", }, { .index = AC_BLESCAN_SCANPARAM, .readInfor = "AT+BLESCAN=SCANPARAM", .cmdInfor = "设置扫描参数", }, { .index = AC_BLESCAN_ENABLE, .readInfor = "AT+BLESCAN=ENABLE", .cmdInfor = "扫描开关", }, { .index = AC_BLECOMM_CONNECT, .readInfor = "AT+BLECOMM=CONNECT", .cmdInfor = "连接从设备", }, { .index = AC_BLECOMM_DISCONNECT, .readInfor = "AT+BLECOMM=DISCONNECT", .cmdInfor = "断开从设备", }, { .index = AC_BLECOMM_FINDSERVICE, .readInfor = "AT+BLECOMM=FINDSERVICE", .cmdInfor = "发现服务 UUID", }, { .index = AC_BLECOMM_FINDCHARACTERISTIC, .readInfor = "AT+BLECOMM=FINDCHARACTERISTIC", .cmdInfor = "发现服务内的特征", }, { .index = AC_BLECOMM_NOTIFICATION, .readInfor = "AT+BLECOMM=NOTIFICATION", .cmdInfor = "通知开关", }, { .index = AC_BLECOMM_SENDDATA, .readInfor = "AT+BLECOMM=SENDDATA", .cmdInfor = "发送数据", }, { .index = AC_BTMAC, .readInfor = "AT+BTMAC", .cmdInfor = "蓝牙 MAC 地址", }, { .index = AC_CGNSPWR, .readInfor = "AT+CGNSPWR", .cmdInfor = "GPS 开关", }, { .index = AC_CGNSINF, .readInfor = "AT+CGNSINF", .cmdInfor = "读取 GNSS 信息", }, { .index = AC_CGNSURC, .readInfor = "AT+CGNSURC", .cmdInfor = "打开 GNSS URC 上报", }, { .index = AC_CGNSTST, .readInfor = "AT+CGNSTST", .cmdInfor = "将读取到的 GNSS 数据发送到 AT 口", }, { .index = AC_CGNSCMD, .readInfor = "AT+CGNSCMD", .cmdInfor = "给 GNSS 发送控制命令", }, { .index = AC_CGNSVER, .readInfor = "AT+CGNSVER", .cmdInfor = "读取 GNSS 版本", }, { .index = AC_CGNSAID, .readInfor = "AT+CGNSAID", .cmdInfor = "设置辅助定位", }, { .index = AC_CGNSDEL, .readInfor = "AT+CGNSDEL", .cmdInfor = "删除 EPO 文件", }, }; void atCmdExport(cmdType_te cmdType, uint16_t cmdIndex, char *fmt, ...) { switch(cmdType) { case CT_GET_LIMITVALUE://测试命令 AT+=? 该命令用于查询设置命令或内部程序设置的参数以及其取值范围 { myPrintf3("%s=?\r\n", atCommandStructList[cmdIndex].readInfor); mqttProccessCmdFlag = 1; tcpIpProccessCmdFlag = 1; waitAckTimeOutCount_ms = 0; memset((char *)atCmdRecvList, 0, sizeof(atCmdBuffer_ts) * ATCMD_REC_BUFFER_LEVEL); bufferIndex = 0; }break; case CT_SET_VALUE://设置命令 AT+=<…> 该命令用于设置用户自定义的参数值 { if (fmt) { va_list va; char tempTab[255]; va_start(va, fmt); memset(tempTab, 0, sizeof(tempTab)); vsnprintf(tempTab, (int)sizeof(tempTab), fmt, va); myPrintf3("%s=%s\r\n",atCommandStructList[cmdIndex].readInfor, tempTab); va_end(va); } else { myPrintf3("%s\r\n",atCommandStructList[cmdIndex].readInfor); } mqttProccessCmdFlag = 1; tcpIpProccessCmdFlag = 1; waitAckTimeOutCount_ms = 0; memset((char *)atCmdRecvList, 0, sizeof(atCmdBuffer_ts) * ATCMD_REC_BUFFER_LEVEL); bufferIndex = 0; }break; case CT_READ_VALUE://查询命令 AT+? 该命令用于返回参数的当前值 { myPrintf3("%s?\r\n", atCommandStructList[cmdIndex].readInfor); mqttProccessCmdFlag = 1; tcpIpProccessCmdFlag = 1; waitAckTimeOutCount_ms = 0; }break; case CT_READ_INFOR://执行命令 AT+ 该命令用于读取受GSM 模块内部程序控制的不可变参数 { myPrintf3("%s\r\n", atCommandStructList[cmdIndex].readInfor); mqttProccessCmdFlag = 1; tcpIpProccessCmdFlag = 1; waitAckTimeOutCount_ms = 0; memset((char *)atCmdRecvList, 0, sizeof(atCmdBuffer_ts) * ATCMD_REC_BUFFER_LEVEL); bufferIndex = 0; }break; case CT_GET_CMDINFOR://命令注释说明 { }break; case CT_PRINTF://直接调用打印 { va_list va; char tempTab[255]; va_start(va, fmt); memset(tempTab, 0, sizeof(tempTab)); vsnprintf(tempTab, (int)sizeof(tempTab), fmt, va); myPrintf3(tempTab); va_end(va); mqttProccessCmdFlag = 1; tcpIpProccessCmdFlag = 1; waitAckTimeOutCount_ms = 0; memset((char *)atCmdRecvList, 0, sizeof(atCmdBuffer_ts) * ATCMD_REC_BUFFER_LEVEL); bufferIndex = 0; }break; default: break; } } char *strDelteStr(char *src, char *str2) { char *str2Adrr; char strBuffer[255]; int i = 50; while(i --) { str2Adrr = strstr(src, str2); if(str2Adrr) { int offsetLen = strlen(src) - (str2Adrr - src) - strlen(str2); memset(strBuffer, 0, sizeof(strBuffer)); memcpy(strBuffer, str2Adrr + strlen(str2), offsetLen); memset(str2Adrr, 0, offsetLen + strlen(str2)); memcpy(str2Adrr, strBuffer, offsetLen); } else { break; } } return str2Adrr; } void atCmdTimer_callback(uint8_t status, uint32_t param) { static uint8_t timeCnt = 0; if (timeCnt ++ == 5) { // timeCnt = 5 为1ms timeCnt = 0; waitAckTimeOutCount_ms ++; } } void atCmdUart_callback(uint8_t status, uint32_t param) { uint8_t Res; switch (status) { case 0: { bufferIndex = 0; uartRecevDone = true; } break; case 1: { //读取接收到的数据 if(atCmdRecvList[bufferIndex].isValid == false) { atCmdRecvList[bufferIndex].packet[atCmdRecvList[bufferIndex].len] = param; if(atCmdRecvList[bufferIndex].len < (ATCMD_REC_LEN)) { atCmdRecvList[bufferIndex].len ++; } } if(atCmdRecvList[bufferIndex].len >= 3) { if(memcmp(&atCmdRecvList[bufferIndex].packet[atCmdRecvList[bufferIndex].len - 2], "\r\n", 2) == 0) { strDelteStr(atCmdRecvList[bufferIndex].packet, "\r"); strDelteStr(atCmdRecvList[bufferIndex].packet, "\n"); if(strlen(atCmdRecvList[bufferIndex].packet) >= 2) { atCmdRecvList[bufferIndex].isValid = true; atCmdRecvList[bufferIndex].len -= 2; bufferIndex ++; if(bufferIndex >= ATCMD_REC_BUFFER_LEVEL) { bufferIndex = 0; } } else { atCmdRecvList[bufferIndex].len = 0; } } } } break; default: break; } } static irqCallback_ts myIrqCallback_atCmdUart; static irqCallback_ts myIrqCallback_atCmdTimer; void atCmd_init(void) { myIrqCallback_atCmdUart.thisCb = atCmdUart_callback; USART3_callbackRegiste(&myIrqCallback_atCmdUart); myIrqCallback_atCmdTimer.thisCb = atCmdTimer_callback; TIM1_callbackRegiste(&myIrqCallback_atCmdTimer); } enum __AT_CMD_RETURN_STATUS { AT_RTA_ERROR = -1, //AT命令操作错误 AT_RTA_SUCCESS = 0, //AT命令操作成功 AT_RTA_TIMEOUT, //AT命令操作超时 AT_RTA_ELSE, //AT命令操作错误 }; int8_t atCmd_decodeCmdAck(char *condition1, char *condition2, bool overToClear, uint32_t timeout_ms) { int8_t ret = AT_RTA_ELSE; if (uartRecevDone) { uartRecevDone = false; for(int i = 0; i < ATCMD_REC_BUFFER_LEVEL; i ++) { if(atCmdRecvList[i].isValid) { myPrintf1(atCmdRecvList[i].packet); myPrintf1("\r\n"); uint16_t condition1Len = strlen(condition1); uint16_t condition2Len = strlen(condition2); if((memcmp(atCmdRecvList[i].packet, "ERROR", 5) == 0) && (strlen(atCmdRecvList[i].packet) == 5)) { waitAckTimeOutCount_ms = 0; bufferIndex = 0; mqttProccessCmdFlag = 0; tcpIpProccessCmdFlag = 0; ret = AT_RTA_ERROR; } else { if (condition1Len == 0 && condition2Len == 0) { if((memcmp(atCmdRecvList[i].packet, "OK", 2) == 0) && (strlen(atCmdRecvList[i].packet) == 2)) { ret = AT_RTA_SUCCESS; } } else { if(condition1Len) { if(memcmp(atCmdRecvList[i].packet, condition1, strlen(condition1)) == 0) { ret = AT_RTA_SUCCESS; } } if(condition2Len) { if(memcmp(atCmdRecvList[i].packet, condition2, strlen(condition2)) == 0) { ret = AT_RTA_SUCCESS; } } } if (ret == AT_RTA_SUCCESS) { waitAckTimeOutCount_ms = 0; bufferIndex = 0; mqttProccessCmdFlag = 0; tcpIpProccessCmdFlag = 0; } } } } if (overToClear) { memset((char *)atCmdRecvList, 0, sizeof(atCmdBuffer_ts) * ATCMD_REC_BUFFER_LEVEL); } } if (waitAckTimeOutCount_ms >= timeout_ms) { mqttProccessCmdFlag = 0; tcpIpProccessCmdFlag = 0; memset((char *)atCmdRecvList, 0, sizeof(atCmdBuffer_ts) * ATCMD_REC_BUFFER_LEVEL); ret = AT_RTA_TIMEOUT; } return ret; } enum __AT_CMD_PWRON_PROCCESS { PWRON_IDLE = -1, // PWRON_AT_WAIT_OPEN = 0, // PWRON_CMD_AC_CPIN, // PWRON_CMD_AC_GSN0, // PWRON_CMD_AC_GSN1, // PWRON_CMD_AC_QCCID, // PWRON_CMD_AC_CREG, // PWRON_CMD_AC_CGATT, // PWRON_CMD_AC_CSQ, // PWRON_CMD_AC_CCLK, // PWRON_CMD_WORK_OVER, // }; void atCmd_powerOpen(void) { static uint8_t cmdResendcnt = 0; if (powerOpenProccessIndexTemp != powerOpenProccessIndex) { cmdResendcnt = 0; } switch (powerOpenProccessIndex) { case PWRON_IDLE://显示MT的ID信息 { mqttProccessIndex = -1; int8_t ret = atCmd_decodeCmdAck("", "", true, 2000); if (ret == AT_RTA_TIMEOUT) { powerOpenProccessIndex = PWRON_AT_WAIT_OPEN; } } break; case PWRON_AT_WAIT_OPEN://显示MT的ID信息 { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_ATI, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 1000); if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_AC_CPIN; } if (ret == AT_RTA_TIMEOUT) { //如果在6 0 s内没有注册上PS业务,建议重启模块 if (cmdResendcnt >= 10) { powerOpenProccessIndex = PWRON_IDLE; } else { powerOpenProccessIndex = PWRON_AT_WAIT_OPEN; } } } } break; // 无引号的字符串类型。表示需要的密码类型。 // READY 无密码等待输入 MT // SIM PIN MT 正在等待(U)SIM PIN // SIM PUK MT 正在等待(U)SIM PUK // SIM PIN2 MT 正在等待(U)SIM PIN2 // SIM PUK2 MT 正在等待(U)SIM PUK2 // 字符串类型。密码。请求的密码类型为 PUK,例如(U)SIM PUK1 或者其他密码,则必须输入。 // 字符串类型。新密码。若请求的密码类型为 PUK,则需要重新输入新密码。 case PWRON_CMD_AC_CPIN://请求国际移动设备识别码 { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_VALUE, AC_CPIN, "%d", 0); cmdResendcnt ++; } else { int8_t ret = atCmd_decodeCmdAck("+CPIN: READY", "", true, 1000); if (ret == AT_RTA_TIMEOUT) { //如果2 0 s后命令"AT+CPIN"无法识别(U)SIM卡状态,建议重启模块 if (cmdResendcnt >= 10) { powerOpenProccessIndex = PWRON_IDLE; } else { powerOpenProccessIndex = PWRON_CMD_AC_CPIN; } } if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_AC_CSQ; } } } break; // 整型。接收信号强度指示。 // 0 小于等于-113 dBm // 1 -111 dBm // 2~30 -109 ~ -53 dBm // 31 大于等于-51 dBm // 99 未知或不可测 // 整型。信道误码率。百分比格式。 // 0~7 3GPP TS 45.008 subclause 8.2.4 表格中的 RxQual 值 // 99 未知或不可测 case PWRON_CMD_AC_CSQ://查询信号强度 { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_CSQ, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 300); if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_AC_CREG; } if (ret == AT_RTA_TIMEOUT) { powerOpenProccessIndex = PWRON_CMD_WORK_OVER; } } } break; // 整型。是否启用网络注册相关 URC。 // 0 禁用网络注册 URC // 1 启用网络注册 URC +CREG: // 2 启用带有位置信息的网络注册 URC +CREG: [,,[,]] // 整型。注册状态。 // 0 未注册;ME 当前未搜索要注册的运营商 // 1 已注册,归属地网络 // 2 未注册,ME 正在搜索要注册的运营商 // 3 注册被拒绝 // 4 未知状态 // 5 已注册,漫游网络 // 字符串类型。位置区编号。2 个字节(十六进制格式)。 // 字符串类型。16 位(GSM)或 28 位(LTE)小区 ID。十六进制格式。 // 整型。网络接入技术。 // 0 GSM // 7 E-UTRAN // 错误码。详情参考第 14.5 章 case PWRON_CMD_AC_CREG://CS域网络注册状态 { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_VALUE, AC_CREG, 0); } else { int8_t ret = atCmd_decodeCmdAck("+CREG: 0,1", "+CREG: 0,5", true, 2000); if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_AC_CGATT; } if (ret == AT_RTA_TIMEOUT) { //如果在9 0 s内没有注册上C S业务,建议重启模块 if (cmdResendcnt >= 300) { powerOpenProccessIndex = PWRON_IDLE; } else { powerOpenProccessIndex = PWRON_CMD_AC_CREG; } } } } break; case PWRON_CMD_AC_CGATT:// { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_VALUE, AC_CGATT, 0); } else { int8_t ret = atCmd_decodeCmdAck("+CGATT: 1", "", false, 1000); if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_AC_QCCID; } if (ret == AT_RTA_TIMEOUT) { // if (cmdResendcnt >= 120) { powerOpenProccessIndex = PWRON_CMD_AC_QCCID; } else { powerOpenProccessIndex = PWRON_CMD_AC_CGATT; } } } } break; case PWRON_CMD_AC_QCCID://查询ICCID { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_CCID_ICCID, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 300); if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_AC_CCLK; } if (ret == AT_RTA_TIMEOUT) { powerOpenProccessIndex = PWRON_IDLE; } } } break; case PWRON_CMD_AC_CCLK://获取通过网络同步的最新时间 { mqttProccessIndex = -1; if (mqttProccessCmdFlag == 0) { atCmdExport(CT_READ_VALUE, AC_CCLK, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 300); if (ret == AT_RTA_SUCCESS) { powerOpenProccessIndex = PWRON_CMD_WORK_OVER; // mqttProccessIndex = 0; tcpIpProccessIndex = 0; } if (ret == AT_RTA_TIMEOUT) { powerOpenProccessIndex = PWRON_CMD_WORK_OVER; } } } break; default: break; } powerOpenProccessIndexTemp = powerOpenProccessIndex; } typedef enum __AT_CMD_TCP_IP_PROCCESS { TCPIP_IDLE = -1, // TCPIP_AT_START = 0, // TCPIP_AT_CIPMUX, // TCPIP_AT_CIPQSEND, // TCPIP_AT_CSTT, // TCPIP_AT_CSTT_R, // TCPIP_AT_CGPADDR, // TCPIP_AT_CIICR, // TCPIP_AT_CIPSTATUS, // TCPIP_AT_CIPSHUT, // TCPIP_AT_CIPSTART, // TCPIP_AT_CIFSR, // TCPIP_AT_QURCCFG_S, // TCPIP_AT_QISEND, // TCPIP_AT_QISEND_USER_BUFFER, // TCPIP_AT_TCP_RECEV, // TCPIP_AT_QISTATE, // TCPIP_AT_WORK_OVER, // }atCmdTcpIp_te; void atCmd_TCP_IP_proccess(void) { static uint8_t cmdResendcnt = 0; if (tcpIpProccessIndexTemp != tcpIpProccessIndex) { cmdResendcnt = 0; } switch (tcpIpProccessIndex) { case TCPIP_AT_START://起始位置 { tcpIpProccessIndex = TCPIP_AT_CIPMUX; } break; case TCPIP_AT_CIPMUX://启动多 IP 连接 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_SET_VALUE, AC_CIPMUX, "%d",0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 40000); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CIPQSEND; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } break; // 参数定义: // 参数 定义 取值 对取值的说明 // 非透传数据发送模式 // 0 // 缺省值。快发模式0。 // 当服务器收到数据,模块返回: // SEND OK (单链接) 或 // , SEND OK (多链接) // 1 // 快发模式1。当数据发送到模块 , 终 端 返 回: // DATA ACCEPT: (单链接) // DATA ACCEPT:, (多链接) // 2 // 慢发模式 // 当服务器收到数据,模块返回: // SEND OK (单链接) 或 // , SEND OK (多链接) // 注: //  慢发模式每发送一笔数据需要服务器那边的确认,而快发则发送到模块就可以了,不需要服务器的确认。推荐使用 0 或 1, // 即快发模式; //  这两种快发模式实现机制没有区别,区别只在于发送完数据,模式 0 提示 SEDN OK,模式 1 提示 DATA ACCEPT; //  建议使用 CIPACK 命令查询每笔数据对端是否已经收到 case TCPIP_AT_CIPQSEND://选择非透传数据发送模式 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_SET_VALUE, AC_CIPQSEND, "%d",1); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 300); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CSTT; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } break; // 参数定义: // 参数 定义 取值 对取值的说明 // GPRS 接入点名称 - 字符串参数(双引号可加可不加),不超过 128 个字符 // GPRS 用户名 - 字符串参数(双引号可加可不加),不超过 32 个字符 // GPRS 密码 - 字符串参数(双引号可加可不加),不超过 32 个字符 case TCPIP_AT_CSTT://启动任务并设置接入点 APN、用户名、密码 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_CSTT, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 60000); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CSTT_R; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } break; // 参数定义: // 参数 定义 取值 对取值的说明 // GPRS 接入点名称 - 字符串参数(双引号可加可不加),不超过 128 个字符 // GPRS 用户名 - 字符串参数(双引号可加可不加),不超过 32 个字符 // GPRS 密码 - 字符串参数(双引号可加可不加),不超过 32 个字符 case TCPIP_AT_CSTT_R://启动任务并设置接入点 APN、用户名、密码 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_READ_VALUE, AC_CSTT, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 300); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CIICR; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } break; //  AT+CIICR 只有在IP START状态下才能激活移动场景,执行后状态变为IP CONFIG。 //  在模块接受激活场景操作后,如果移动场景激活成功,状态变为IPGPRSACT,返回OK,否则返回 // ERROR。 case TCPIP_AT_CIICR://激活移动场景(或发起 GPRS 或 CSD 无线连接) { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_CIICR, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 90000); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CIFSR; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } break; case TCPIP_AT_CIFSR://激活移动场景(或发起 GPRS 或 CSD 无线连接) { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_CIFSR, 0); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 300); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CIPSTATUS; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_CIPSTATUS; } } } break; case TCPIP_AT_CIPSHUT://关闭移动场景 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_SET_VALUE, AC_CIPSHUT, "%d", 1); } else { int8_t ret = atCmd_decodeCmdAck("", "", true, 2000); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CIPSTATUS; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_CSTT_R; } } } break; case TCPIP_AT_CIPSTATUS://查询当前连接状态 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_READ_INFOR, AC_CIPSTATUS, 0); } else { int8_t ret = atCmd_decodeCmdAck("STATE: IP STATUS", "", true, 3000); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_CIPSTART; } if (ret == AT_RTA_TIMEOUT) { // if (cmdResendcnt >= 300) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } else { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } } break; case TCPIP_AT_CIPSTART://打开Socket服务 { if (tcpIpProccessCmdFlag == 0) { atCmdExport(CT_SET_VALUE, AC_CIPSTART, "%s,%s,%d", "TCP", hostName_tengxunyunLin, tcpPort_tengxunyunLin ); } else { int8_t ret = atCmd_decodeCmdAck("CONNECT OK", "", true, 75000); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_QISEND; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } } break; case TCPIP_AT_QISEND://发送数据 { if (tcpIpProccessCmdFlag == 0) { // atCmdExport(CT_SET_VALUE, AC_QISEND, "%d,%d", 0, 10); //发送定长包 atCmdExport(CT_READ_INFOR, AC_CIPSEND, 0); //发送可变包 } else { int8_t ret = atCmd_decodeCmdAck(">", "", true, 100); if (ret == AT_RTA_SUCCESS) { tcpIpProccessIndex = TCPIP_AT_QISEND_USER_BUFFER; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_QISEND_USER_BUFFER; } } } break; case TCPIP_AT_QISEND_USER_BUFFER://发送数据 { if (tcpIpProccessCmdFlag == 0) { // atCmdExport(CT_PRINTF, 0, "1234567890"); atCmdExport(CT_PRINTF, 0, "\n1234567890\r\n"); myUart3_sendByte(26); //发送可变包时,必须发该字节 } else { int8_t ret = atCmd_decodeCmdAck("DATA ACCEPT", "", true, 2000); if (ret == AT_RTA_SUCCESS) { myPrintf1("recv\r\n"); tcpIpProccessIndex = TCPIP_AT_TCP_RECEV; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_QISEND; } } } break; case TCPIP_AT_TCP_RECEV:// { int8_t ret = atCmd_decodeCmdAck("+QIURC:", "", false, 100000); if (ret == AT_RTA_SUCCESS) { myPrintf1("recv\r\n"); tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } if (ret == AT_RTA_TIMEOUT) { tcpIpProccessIndex = TCPIP_AT_WORK_OVER; } } break; default: { } break; } tcpIpProccessIndexTemp = tcpIpProccessIndex; } void atCmd_proccess(void) { atCmd_powerOpen(); atCmd_TCP_IP_proccess(); // switch (mqttProccessIndex) // { // case 0: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_SET_VALUE, AC_QMTCFG, "\"%s\",%d,%d,%d", "recv/mode", 0 ,0 ,1); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 1; // } // } // } // break; // case 1: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_SET_VALUE, AC_QMTCFG, "\"%s\",%d,\"%s\",\"%s\",\"%s\"","aliauth",0,"oyjtmPl5a5j","MQTT_TEST","wN9Y6pZSIIy7Exa5qVzcmigEGO4kAazZ"); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 2; // } // } // } // break; // case 2: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_GET_LIMITVALUE, AC_QMTOPEN, 0); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 3; // } // } // } // break; // case 3: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_SET_VALUE, AC_QMTOPEN, "%d,\"%s\",%d", 0, hostName_tengxunyunLin, port_tengxunyunLin); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 4; // } // } // } // break; // case 4: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_READ_VALUE, AC_QMTOPEN, 0); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 5; // } // } // } // break; // case 5: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_SET_VALUE, AC_QMTCONN, "%d,\"%s\",\"%s\"", 0, "admin", "123456"); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 6; // } // } // } // break; // case 6: // { // if (mqttProccessCmdFlag == 0) // { // atCmdExport(CT_READ_VALUE, AC_QMTCONN, 0); // } // else // { // int8_t ret = atCmd_decodeCmdAck("", "", true, 300); // if (ret == AT_RTA_SUCCESS) // { // mqttProccessIndex = 7; // } // } // } // break; // default: // break; // } }