動態修改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 值需要在此函數前電子雜誌到數據,而且要是保存在閃存中的數據,這樣重啓不影響藍牙名。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章