STM32通过NB(BC35-G)连接华为云IOT

Posted Super—Zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32通过NB(BC35-G)连接华为云IOT相关的知识,希望对你有一定的参考价值。

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

以上是关于STM32通过NB(BC35-G)连接华为云IOT的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)

基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)

STM32F103学习笔记——NB-IoT模块BC26使用

STM32F103学习笔记——NB-IoT模块BC26使用

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

BC26通过LWM2M协议连接ONENET,AT流程,STM32代码