第一步:注册并绑定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()函数。
|