动态修改nrf51822蓝牙名

工作中有使用到nrf51822,开始蓝牙名通过宏定义为固定的字符串,但是因为使用场景,不同的设备有不同的ID,所以就有通过蓝牙知道设备ID需求;通过多次实验,最终得以实现。

首先,应为id为16进制数,0x100000xx,但蓝牙名为字符串;所以需要有将16进制的ID转化成字符串的函数,

UCHAR8* hextochar(UINT32 num)
{
	UCHAR8 i;
	static UCHAR8 string[8]={0};//切记定义为static变量,否则后续蓝牙名获取会有问题。
	for(i=0;i<8;i++)
	{
		string[i]=(UCHAR8)((num >> (28-i*4))&0x0f);
		if((string[i]>=0) && (string[i] <= 9))
			string[i]=string[i]+0x30;
		else if((string[i]>=0xa) && (string[i]<=0xf))
			string[i]=string[i]+0x37;
	}	
	return string;
}

 

然后在51822自带代码中找到设置蓝牙名的函数:(红色为增加部分)

 

static void gap_static_params_init(void)
{
	uint32_t                err_code;
	ble_gap_conn_params_t   gap_conn_params;
	ble_gap_conn_sec_mode_t sec_mode;
	UCHAR8* p_str;
	BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);

	if((m_system_rom_data.device_hub_id > 0x10000000) && (m_system_rom_data.device_hub_id < 0x60000000))
	{
		p_str=hextochar(m_system_rom_data.device_hub_id);//(m_system_rom_data.device_hub_id);
			err_code = sd_ble_gap_device_name_set(&sec_mode,
	                                  (const unsigned char *)p_str,
	                                  8);
	}
	else
	{
		err_code = sd_ble_gap_device_name_set(&sec_mode,
		                                  (const unsigned char *) DEVICE_BLE_NAME,
		                                  strlen(DEVICE_BLE_NAME));
	}
	APP_ERROR_CHECK(err_code);
	//TRACE("err=%d",err_code);

	memset(&gap_conn_params, 0, sizeof(gap_conn_params));

	// 连接参数
	gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
	gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
	gap_conn_params.slave_latency     = SLAVE_LATENCY;
	gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;

	err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
	APP_ERROR_CHECK(err_code);
	//TRACE("err=%d",err_code);
	err_code = sd_ble_gap_tx_power_set(0);		//-40, -20, -16, -12, -8, -4, 0, and 4 dBm
	APP_ERROR_CHECK(err_code);
}

m_system_rom_data.device_hub_id 值需要在此函数运行前进行赋值,而且要是保存在闪存中的数据,这样重启不影响蓝牙名。

 

 

你可能感兴趣的:(nrf51822自学记录)