第一步:注冊并系結NB
注冊賬號之類的直接省略......直接從主題說起!
1.在自己已經建好的專案里面系結NB模組;


== *設備標識必須是NB模塊的IMEI號(IMEI在芯片的絲印上)==
第二步 寫代碼連接華為云平臺
說明:NB初始化,一定要等到STM32收到來自模塊的指令“+QLWEVTIND:3”之后,再發送有關指令,
nb.c
/**
*@brief NB初始化
*@param none
*@retval none
*@note none
*/
void NB101_inital(void)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+QLWEVTIND:3");
while(Strx==NULL)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+QLWEVTIND:3");
}
clear_buff();
Uart_SendStr("AT\r\n");
HAL_Delay(50);
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"OK");
while(Strx==NULL)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"OK");
}
clear_buff();
Uart_SendStr("AT+CFUN?\r\n");
HAL_Delay(50);
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+CFUN:1");
while(Strx==NULL)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+CFUN:1");
}
clear_buff();
Uart_SendStr("AT+CEREG?\r\n");
HAL_Delay(50);
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+CEREG:0,1");
while(Strx==NULL)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+CEREG:0,1");
}
clear_buff();
Uart_SendStr("AT+CGATT?\r\n");
HAL_Delay(50);
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+CGATT:1");
while(Strx==NULL)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"+CGATT:1");
}
clear_buff();
Uart_SendStr("AT+NCDP=xxxxxxxxxxxxx\r\n");//連接CoAP進行通信
HAL_Delay(50);
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"OK");
while(Strx==NULL)
{
Strx=strstr((const char*)Usart1_rx_buffer,(const char *)"OK");
}
clear_buff();
}
AT常用指令集
指令:AT
功能:測驗AT指令功能是否正常
示例
AT
OK
指令:AT+CSQ
功能:回傳從 UE 接收到的信號強度指示 和信道誤碼率 ,其中第一個值rssi應當在0-31之間,如果為99則表示信號無法檢測,第二個引數ber因為模組當前不支持,所以始終為99,
+CSQ:26,99
OK
指令:AT+CEREG?
功能:查詢當前 EPS 網路注冊狀態,該指令回傳的第一個引數為0則表示禁止網路注冊URC,第二個引數表示網路注冊狀態,1表示已注冊本地網,5表示已注冊漫游網路,其余值則表示注冊失敗,
示例:
+CEREG:0,1
指令:AT+CGATT?
功能:該命令用于查詢當前是否將 UE 附著于 PS 域,回傳值為1則表示已附著,即網路激活成功,
示例:
+CGATT:1
OK
指令:AT+CGPADDR
功能:該命令用于查詢模組當前的ip地址,
示例:
+CGPADDR:0,10.44.108.10
OK
,,,,,,
第三步 發送資料
說明:每個固定時間回圈發送(根據自己的實際情況而定)
/*
*@brief 發送資料
*@param none
*@retval none
*@note none
*/
void Send_maincontrol_Data(void)
{
char Send_data[75]={0};
Send_data[0]='A';
Send_data[1]='T';
Send_data[2]='+';
Send_data[3]='N';
Send_data[4]='M';
Send_data[5]='G';
Send_data[6]='S';
Send_data[7]='=';
Send_data[8]='3';
Send_data[9]='1';
Send_data[10]=',';
ASCII_To_Char(&Send_data[11],BoatStatus_Val.func=0,1); //標志位
ASCII_To_Char(&Send_data[13],(BoatStatus_Val.longitude_now*10000000),4); //經度
ASCII_To_Char(&Send_data[21],(BoatStatus_Val.latitude_now*10000000),4); //緯度
ASCII_To_Char(&Send_data[29],BoatStatus_Val.elect,1); //電量
#ifdef Stytle2
ASCII_To_Char(&Send_data[31],BoatStatus_Val.systle=2,1); //型別
ASCII_To_Char(&Send_data[33],(int)(WaterSensor_Val.data_1*10),2); //資料1--溫度
ASCII_To_Char(&Send_data[37],(int)(WaterSensor_Val.data_2*10),2); //資料2--深度
ASCII_To_Char(&Send_data[41],(int)(WaterSensor_Val.data_3*100),2); //資料3
ASCII_To_Char(&Send_data[45],(int)(WaterSensor_Val.data_4*100),2); //資料4
ASCII_To_Char(&Send_data[49],(int)(WaterSensor_Val.data_5*100),2); //資料5
ASCII_To_Char(&Send_data[53],(int)(WaterSensor_Val.data_6*100),2); //資料6
ASCII_To_Char(&Send_data[57],(int)(WaterSensor_Val.data_7*100),2); //資料7
ASCII_To_Char(&Send_data[61],(int)(WaterSensor_Val.data_8*100),2); //資料8
ASCII_To_Char(&Send_data[65],(int)(WaterSensor_Val.data_9*1000),2); //資料9
ASCII_To_Char(&Send_data[69],(int)(WaterSensor_Val.data_10*1),2); //資料10--電流
#endif
#ifdef Stytle3
ASCII_To_Char(&Send_data[31],BoatStatus_Val.systle=3,1); //型別
ASCII_To_Char(&Send_data[33],(int)(WaterSensor_Val.data_1*10),2); //資料1--水溫
ASCII_To_Char(&Send_data[37],(int)(WaterSensor_Val.data_2*10),2); //資料2--濁度
ASCII_To_Char(&Send_data[41],(int)(WaterSensor_Val.data_3*1),2); //資料3--PH
ASCII_To_Char(&Send_data[45],(int)(WaterSensor_Val.data_4*100),2); //資料4--船速
ASCII_To_Char(&Send_data[49],(int)(WaterSensor_Val.data_5*1),2); //資料5--氨氮
ASCII_To_Char(&Send_data[53],(int)(WaterSensor_Val.data_6*1),2); //資料6--溶解氧
ASCII_To_Char(&Send_data[57],(int)(WaterSensor_Val.data_7*100),2); //資料7--化學需氧量
ASCII_To_Char(&Send_data[61],(int)(WaterSensor_Val.data_8*1),2); //資料8--電導率
ASCII_To_Char(&Send_data[65],(int)(WaterSensor_Val.data_9*1000),2); //資料9--信號質量
ASCII_To_Char(&Send_data[69],(int)(WaterSensor_Val.data_10*1),2); //資料10--電流
#endif
Send_data[73]='\r';
Send_data[74]='\n';
//上傳到NB
HAL_UART_Transmit(&huart1,(uint8_t*)Send_data,sizeof(Send_data),0xffff);
}
完結
華為云平臺那邊只識別字符,所以這邊用了一個ASCII_To_Char()函式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339272.html
標籤:其他
上一篇:Renode應用:在RISC-V核上運行FreeRTOS
下一篇:網路協議-基礎知識(筆記)
