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