1、指令彙總
1.先弄清楚四種AT指令的格式html
AT+<cmd>= ? 測試命令,用於向模塊詢問支持的設置項目。 AT+<cmd>? 讀取命令,用於讓模塊上報某個命令表明的設置項當前的值。 AT+<cmd>=p1 設置命令,用於向模塊設置某個項目的值 AT+<cmd> 執行命令,用於向模塊執行某個操做
2.能夠用AT+CLAC
查看全部支持的指令服務器
[09:18:38.230]發→◇AT+CLAC □ [09:18:38.242]收←◆AT+CLAC AT+COPS AT+CGATT AT+NEARFCN AT+NCSEARFCN ……………//太長了,就不復制了
//*************************************************// 具體指令: 1.ATI 返回模塊廠商和型號等基本信息 2.ATE<0/1> 0:指令碼不回顯 1:指令碼回顯 3.AT+CGMI 返回製造商名字 4.AT+CGMM/AT+CGMM=? 返回製造商模塊的型號編碼 5.AT+CGMR/AT+CGMR=? 返回製造商模塊的版本號 6.AT+CGSN=1 ***返回製造商模塊的IMEI*** 7.AT+CEREG 用於設置模塊 網絡 註冊狀態(協議方面) 8.AT+CSCON ***模塊與基站 網絡 的射頻網絡是否鏈接(檢測是否進入PSM狀態)*** 9.AT+CLAC 列出全部支持的指令 10.AT+CSQ ***用來測試信號強度(信號強度取決於:基站、位置、NB模塊天線設計匹配)*** 11.AT+CGPADDR ***取核心網和基站分配給NB模塊的本次通訊的臨時IP地址*** 12.AT+COPS 用來設置運營商 13.AT+CGATT=<0關/1開> ***用來設置或檢測模塊是否鏈接上核心網*** 14.AT+CGACT 用來使能或禁止PDP上下文 15.AT+CIMI 用來獲取IMSI(國際用戶識別碼) 16.AT+CGDCONT Define a PDP Context 17.AT+CFUN ***用來設置NB模塊內部的射頻單元,與自動聯網/手動聯網有關*** 18.AT+CMEE ***用來打印NB模塊錯誤信息*** 19.AT+CCLK 返回當前時間 20.AT+CPSMS 設置PSM模式相關參數 21.AT+CEDRXS 設置eDRX模式相關參數 22.AT+CEER 用來打印NB設備端出錯的擴展信息 23.AT+CEDRXRDP eDRX模式相關的動態參數設置 24.AT+CTZR 用來設置或獲取時區信息 25.AT+CIPCA PDP上下文初始化 26.AT+CGAPNRC APN速率控制 //*************************************************// 1.AT+CSMS 短信服務相關 2.AT+CNMA 與新接收消息相關 3.AT+CSCA Service Centre Address 4.AT+CMGS NB設備主動向雲平臺發送消息 5.AT+CMGC Send SMS Command 6.AT+CSODCP Send Originating Data via the Control Plane 7.AT+CRTDCP Report Terminating Data via Control Plane //************************************************// 1.AT+NRB ***軟件復位模塊*** 2.AT+NUESTATS ***返回UE(user equipment,用戶設備,NB模塊)的狀態信息*** 3.AT+NEARFCN 設置搜索頻率850MHZ(電信的) 4.AT+NSOCR 至關於socket函數 ,讓模塊內部建立一個socket接口 5.AT+NSOST SendTo函數 (UDP Only) 6.AT+NSOSTF 至關於帶flag的sendto函數,在UDP中進行消息發送 7.AT+NSORF 至關於recv函數,在UDP中進行消息接收 8.AT+NSOCL 至關於close函數,用於關閉socket 9.AT+NSONMI 指示socket收到消息 10.AT+NPING 至關於ping命令,用來測試當前模塊和遠端網絡地址是否接通 11.AT+NBAND 用於設置當前模塊的Band,BC95-B 5 12.AT+NLOGLEVEL 設置debug log信息的輸出level 13.AT+NCONFIG ***用於對UE進行配置*** 14.AT+NATSPEED ***配置波特率9600*** 15.AT+NCCID 用於獲取NB卡的惟一編碼(ICCID) 16.AT+NFWUPD 用於經過UART來升級模塊內部固件 17.AT+NPOWERCLASS Set the Mapping for Band and Power Class 18.AT+NPSMR Power Saving Mode Status Report 19.AT+NPTWEDRXS Paging Time Window Value and eDRX Setting 20.AT+NPIN PIN Operation 21.AT+NCSEARFCN Clear Stored EARFCN //***********************************************// 1.AT+NCDP ***用於設置CDP(電信雲的IP地址)*** 2.AT+QSECSWT 設置加密模式(開發中) 3.AT+QSETPSK 設置調製(開發中) 4.AT+NMGS ***用於向電信雲服務器發送消息*** 5.AT+NMGR ***接收消息Get Messages*** 6.AT+NNMI ***模塊收到電信雲下行的數據後會自動接收提示*** 7.AT+NSMI ***模塊向電信雲上行數據後提示*** 8.AT+NQMGR 向模塊查詢有無收到電信雲下行的數據 9.AT+NQMGS 向模塊查詢消息有無發送成功 10.AT+NMSTATUS 查詢模塊在消息發送階段的狀態 11.AT+QLWULDATAEX 發送鏈接和不鏈接Send CON/NON Messages 12.AT+QLWULDATASTATUS Query CON Messages Sending Status //**********************************//
2、串口助手單條AT指令測試
- 注意發送加回車換行,在程序里加
「\r\n」
,不然模塊識別不了
- 模組須要相應指令,發送需加延時
1.驗證AT指令可用網絡
[17:06:27.301]發→◇AT □ [17:06:27.310]收←◆ OK
2.讀信號質量app
[17:14:53.397]發→◇AT+CSQ □ [17:14:53.409]收←◆ +CSQ:28,99 OK
3.獲取IMEI號socket
[17:37:41.343]發→◇AT+CGSN=1 □ [17:37:41.358]收←◆AT+CGSN=1 +CGSN:865823049053753 OK
4.模塊註冊到NB網絡函數
[17:44:05.006]發→◇AT+CEREG=1 □ [17:44:05.023]收←◆AT+CEREG=1 OK [17:46:31.083]發→◇AT+CEREG? □ [17:46:31.098]收←◆AT+CEREG? +CEREG:1,1 OK
5.查看模塊物理地址測試
[09:28:14.281]發→◇AT+CGPADDR □ [09:28:14.296]收←◆AT+CGPADDR +CGPADDR:0,10.24.31.22 OK
6.設置運營商ui
[09:36:26.509]發→◇AT+COPS=0 □ [09:36:26.524]收←◆AT+COPS=0 OK [09:36:03.288]發→◇AT+COPS? □ [09:36:03.300]收←◆AT+COPS? +COPS:0,2,"46000" OK
7.設置或檢測模塊是否鏈接上核心網編碼
[09:42:46.151]發→◇AT+CGATT=1 □ [09:42:46.170]收←◆AT+CGATT=1 OK [09:42:40.348]發→◇AT+CGATT=? □ [09:42:40.363]收←◆AT+CGATT=? +CGATT:(0,1) OK
8.返回當前時間加密
[09:48:12.326]發→◇AT+CCLK? □ [09:48:12.339]收←◆AT+CCLK? +CCLK:20/09/11,01:48:15+32 OK
和我電腦差了八個小時,沒找到設置時區的,在程序里加上吧……
9.軟復位模塊,時間會更新,偏差歸零,能夠定時來複位,去除累積偏差
[10:07:37.746]發→◇AT+NRB □ [10:07:37.758]收←◆REBOOTING [10:07:38.619]收←◆Boot: Unsigned Security B.. Verified Protocol A.. [10:07:41.753]收←◆Verified Apps A...... [10:07:42.685]收←◆Verified [10:07:43.001]收←◆ REBOOT_CAUSE_APPLICATION_AT Neul OK [10:07:52.599]收←◆ +QLWEVTIND:0 +QLWEVTIND:3
10.功能選項AT+CFUN<0/1>
參數0表明基本功能,1表明基本功能+附加功能,附加功能每一個廠商定義不同。
[11:39:10.580]發→◇AT+CFUN=1 □ [11:39:10.595]收←◆AT+CFUN=1 OK [11:39:18.994]發→◇AT+CFUN? □ [11:39:19.008]收←◆AT+CFUN? +CFUN:1 OK
3、在Stm32中的組合使用
1.Stm32準備工做
(1)初始化一個串口,並打開接收中斷
void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } Usart2RecIT(); }
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { //BC35-G NB-iot通訊模塊 HAL_UART_Receive_IT(&huart2, &uart1Data, 1); uart2WriteByte(uart1Data); uart2DataFlg = 1; //HAL_UART_Transmit(&huart2,&uart2Data,1,0xFFFF); } }
(2)將當前發送的指令保存在棧中
typedef struct { uint8_t* ATSendbuf; uint8_t* ATRecvbuf; int16_t ATSendlen; int16_t ATRecvlen; int8_t* ATack; int8_t* ATNack; }NBIOT_ATCmdTypeDef; static void NBIOT_ATCmd_SetCmdStack(NBIOT_ATCmdTypeDef* ATCmdStack, int8_t* Sendbuf, uint16_t Sendlen, int8_t* ATack, int8_t* ATNack) { ATCmdStack->ATSendbuf = (uint8_t *)Sendbuf; ATCmdStack->ATSendlen = Sendlen; ATCmdStack->ATack = ATack; ATCmdStack->ATNack = ATNack; } typedef struct { uint8_t sdata[MaxUartBC95]; uint16_t slen; }sensordataType_Def; sensordataType_Def nbdata; sensordataType_Def rlynbdata;
(3)發送AT指令
void NB_SEND(uint8_t *buf,uint16_t len) { HAL_UART_Transmit_IT (&huart2,buf,len); } int8_t NBIOT_ATCMD_SEND(NBIOT_ATCmdTypeDef* ATCmdStack, int8_t* Sendbuf, uint16_t Sendlen, int8_t* ATack, int8_t* ATNack,int32_t tm) { NBIOT_ATCmdTypeDef ATCmd; NBIOT_ATCmd_SetCmdStack(&ATCmd,Sendbuf,Sendlen,ATack,ATNack); Uart2BufClear(); NB_SEND(ATCMD->ATSendbuf,ATCMD->ATSendlen);//發送 ReceiveNBIOT(tm);//延時用於串口接收模組返回數據 return (analysisNBData(ATCMD->ATack,ATCMD->ATNack));//返回設置是否成功 }
(4)接收模組返回數據函數
void ReceiveNBIOT(uint16_t waittime)//發送AT後的等待時間 { HAL_Delay(waittime); nbdata.slen = uartReadByte(&huart2,&nbdata.sdata[0],MaxUartBC95); if (nbdata.slen > MaxUartBC95) { nbdata.slen = MaxUartBC95; } memset (&rlynbdata.sdata[0],0,MaxUartBC95); memcpy (&rlynbdata.sdata[0],&nbdata.sdata[0],nbdata.slen); rlynbdata.slen = nbdata.slen; }
(5)分析指令是否設置成功
int8_t analysisNBData(int8_t* RLY,int8_t* NRLY) { int8_t flg = NACK; if (rlynbdata.slen) { if(strstr_my((int8_t *)&rlynbdata.sdata[0],RLY) == NULL) { if(strstr_my((int8_t *)&rlynbdata.sdata[0],NRLY) == NULL) { flg = NACK; } else { flg = ACKERROR; } } else { flg = ACKOK; } } return flg; }
2.在Stm32中使用AT指令的組合
如今咱們用NBIOT_ATCMD_SEND
函數反覆操做AT指令就能夠啦
(1)重啓
從第二部分看,彷佛重啓只須要一條AT指令,可是官方推薦在關機以前,使用AT+CFUN保存頻點、去網絡附着。開機後咱們再打開附着。
void NBIOT_reCON(void) { int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; int8_t ATOK[] = "AT\r\n"; int8_t ATCFUN0[] = "AT+CFUN=0\r\n"; int8_t ATNRB[] = "AT+NRB\r\n"; int8_t ATCFUN1[] = "AT+CFUN=1\r\n"; int8_t ATCGATT[] = "AT+CGATT=1\r\n"; NBIOT_ATCmdTypeDef ATCmd; NBIOT_ATCMD_SEND(&ATCmd,ATOK,strlen((char *)ATOK),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATNRB,strlen((char *)ATNRB),OK,ERROR,5000); NBIOT_ATCMD_SEND(&ATCmd,ATCFUN0,strlen((char *)ATCFUN0),OK,ERROR,3000); NBIOT_ATCMD_SEND(&ATCmd,ATOK,strlen((char *)ATOK),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATCFUN1,strlen((char *)ATCFUN1),OK,ERROR,5000); NBIOT_ATCMD_SEND(&ATCmd,ATCGATT,strlen((char *)ATCGATT),OK,ERROR,3000); }
2.讀取IMEI並解析
int8_t Q_NBIOT_IMEI(int8_t *imei) { int8_t ATCGSN[] = "AT+CGSN=1\r\n"; //Request the IMEI number +CGSN:490154203237511 int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; NBIOT_ATCmdTypeDef ATCmd; NBIOT_ATCMD_SEND(&ATCmd,ATCGSN,strlen((char *)ATCGSN),OK,ERROR,1000); memset((void *)imei, 0x0, sizeof(imei)); if (sscanf((const char*)&rlynbdata.sdata[0], "%*[^+CGSN]%*[^:]:%[^\r]", imei) <= 0) { return -1; } return 0; }
3.讀取網絡時間並解析
int8_t Q_NBIOT_CCLK(int8_t *localtime, size_t localtime_len) { int8_t ATCCLK[] = "AT+CCLK?\r\n"; //+CCLK:19/12/01,02:05:38+32 int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; int rly,num = 0; NBIOT_ATCmdTypeDef ATCmd; while (num++ < 3) { NBIOT_ATCMD_SEND(&ATCmd,ATCCLK,strlen((char *)ATCCLK),OK,ERROR,2000); rly = net_gettime((char *)&rlynbdata.sdata[0],(char *)localtime,strlen((char *)&rlynbdata.sdata[0]));// if (0 == rly) break; } return 0; }
4.讀取溫度和電量
//+QCHIPINFO:TEMP,30 //+QCHIPINFO:VBAT,3316 int8_t Q_NBIOT_CHIPINFO(int8_t **var) { int8_t ATCCHIPINFO[] = "AT+QCHIPINFO=ALL\r\n"; int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; int rly,num = 0; NBIOT_ATCmdTypeDef ATCmd; int8_t temp[10]; int8_t vbat[10]; memset(temp,0,sizeof(temp)); memset(vbat,0,sizeof(vbat)); while (num++ < 3) { NBIOT_ATCMD_SEND(&ATCmd,ATCCHIPINFO,strlen((char *)ATCCHIPINFO),OK,ERROR,2000); rly = getinfo(&rlynbdata.sdata[0],strlen((char *)&rlynbdata.sdata[0]),(int8_t*)"TEMP",4,temp,sizeof(temp)); if (-1 == rly) continue; rly = getinfo(&rlynbdata.sdata[0],strlen((char *)&rlynbdata.sdata[0]),(int8_t*)"VBAT",4,vbat,sizeof(vbat)); if (0 == rly) break; } if (0 == rly) { memcpy(*var,temp,10); memcpy(*(var+1),vbat,10); return 0; } return -1; }
5.聯網上傳數據到電信雲平臺
(1)先看看官方給出的步驟
(2)聯網
這裏模組和平臺通訊的協議採用的是Coap協議,CoAP的默認端口號爲5683。
int8_t CenterConnect(void) { int8_t rly = -1; rly = Q_Link(); if (ACKOK == rly) { return 0; } NBIOT_reCON(); rly = Q_Link(); if (ACKOK == rly) { return 0; } rly = NBIOT_CONNECT(); return rly; }
int8_t NBIOT_CONNECT(void) { int8_t C1[] = "1"; int8_t C0[] = "0"; int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; int8_t ATOK[] = "AT\r\n"; int8_t ATNRB[] = "AT+NRB\r\n"; int8_t ATCFUN0[] = "AT+CFUN=0\r\n"; int8_t ATCPSMS[] = "AT+CPSMS=1\r\n"; int8_t ATNCSEARFCN[] = "AT+NCSEARFCN\r\n"; int8_t ATCFUN1[] = "AT+CFUN=1\r\n"; int8_t ATCGATT[] = "AT+CGATT=1\r\n"; int8_t ATCGATTq[] = "AT+CGATT?\r\n"; int8_t ATNCONFIG[] = "AT+NCONFIG=CELL_RESELECTION,TRUE\r\n"; int8_t ATNCDP[] = "AT+NCDP=180.101.147.115,5683\r\n"; int8_t ATNCONFIGTRUE[] = "AT+NCONFIG=AUTOCONNECT,TRUE\r\n"; int8_t ATCEDRXS[] = "AT+CEDRXS=0,5\r\n"; NBIOT_ATCmdTypeDef ATCmd; NBIOTReset(); NBIOT_ATCMD_SEND(&ATCmd,ATOK,strlen((char *)ATOK),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATNCDP,strlen((char *)ATNCDP),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATNRB,strlen((char *)ATNRB),OK,ERROR,5000); NBIOT_ATCMD_SEND(&ATCmd,ATCFUN0,strlen((char *)ATCFUN0),OK,ERROR,3000); NBIOT_ATCMD_SEND(&ATCmd,ATNCSEARFCN,strlen((char *)ATNCSEARFCN),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATCPSMS,strlen((char *)ATCPSMS),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATNCONFIG,strlen((char *)ATNCONFIG),OK,ERROR,1000); NBIOT_ATCMD_SEND(&ATCmd,ATCFUN1,strlen((char *)ATCFUN1),OK,ERROR,5000); NBIOT_ATCMD_SEND(&ATCmd,ATNCONFIGTRUE,strlen((char *)ATNCONFIGTRUE),OK,ERROR,2000); NBIOT_ATCMD_SEND(&ATCmd,ATCGATT,strlen((char *)ATCGATT),OK,ERROR,3000); NBIOT_ATCMD_SEND(&ATCmd,ATCEDRXS,strlen((char *)ATCEDRXS),OK,ERROR,3000); return (NBIOT_ATCMD_SEND(&ATCmd,ATCGATTq,strlen((char *)ATCGATTq),C1,C0,2000)); }
(3)上傳數據AT+QLWULDATAEX
/AT+NMGR
(發佈)
AT+QLWULDATAEX
有四種消息類型可選:
int8_t NBIOT_QLWULDATAEX(int8_t* Sendbuf, uint16_t Sendlen) { int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; int8_t CMEE[] = "AT+CMEE=1\r\n"; //int8_t ATCMEE[] = "AT+NMSTATUS?\r\n"; NBIOT_ATCmdTypeDef ATCmd; uint16_t buflen; buflen = sizeof(data_buf)/2; if (Sendlen > buflen) { Sendlen = buflen; } NBIOT_ATCMD_SEND(&ATCmd,CMEE,strlen((char *)CMEE),OK,ERROR,1000); memset (NMGScmd_buf,0,sizeof(NMGScmd_buf)); NBIOT_trans (Sendbuf,data_buf,Sendlen); sprintf((char *)NMGScmd_buf,"AT+QLWULDATAEX=%d,%s,0x0001\r\n",Sendlen,data_buf); //NBIOT_ATCMD_SEND(&ATCmd,ATCMEE,strlen((char *)ATCMEE),OK,ERROR,1000); return ( NBIOT_ATCMD_SEND(&ATCmd,NMGScmd_buf,strlen((char *)NMGScmd_buf),OK,ERROR,2000)); } uint8_t SData2NET(int8_t *sensordata,uint16_t slen) { uint8_t rly; //uint8_t r; rly = NBIOT_QLWULDATAEX(&sensordata[0],slen); //r = NBIOT_QLWULDATASTATUS(&sensordata[0],slen); if (ACKOK != rly) { rly = NBIOT_QLWULDATAEX(&sensordata[0],slen); printf("Try to send data again... \n\n"); } if(ACKOK == rly) { printf("Send data OK!\n\n"); } return rly; }
也能夠用AT+NMGS
來發布
int8_t NBIOT_NMGS(int8_t* Sendbuf, unsigned int Sendlen) { int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; NBIOT_ATCmdTypeDef ATCmd; unsigned int buflen; buflen = sizeof(data_buf)/2; if (Sendlen > buflen) { Sendlen = buflen; } memset (NMGScmd_buf,0,sizeof(NMGScmd_buf)); NBIOT_trans (Sendbuf,data_buf,Sendlen); sprintf((char *)NMGScmd_buf,"AT+NMGS=%d,%s\r\n",Sendlen,data_buf); return (NBIOT_ATCMD_SEND(&ATCmd,NMGScmd_buf,strlen((char *)NMGScmd_buf),OK,ERROR,3000)); }
6.接收平臺下發數據AT+NMGR
(訂閱)
int8_t NBIOT_NMGR(void) { int8_t OK[] = "OK"; int8_t ERROR[] = "ERROR"; NBIOT_ATCmdTypeDef ATCmd; int rly; memset (NMGRcmd_buf,0,sizeof(NMGRcmd_buf)); sprintf((char *)NMGRcmd_buf,"AT+NMGR\r\n"); rly = NBIOT_ATCMD_SEND(&ATCmd,NMGRcmd_buf,strlen((char *)NMGRcmd_buf),OK,ERROR,3000); if(-1 == rly) { return rly; } return 1; } int8_t analyistNetData() { int8_t rly = NBIOT_NMGR(); if(rly == -1) { return -1; } //讀rlynbdata中數據,而後按照約定解析 }