参考网址:http://blog.csdn.net/a369000753/article/details/51262261
1.目的
把官方的代码移植到sdk12.2.0版本
2.分析
由于官方的版本过低,移植到高版本
3.平台:
协议栈版本:SDK12.2.0
编译软件:keil 5.12
硬件平台:nrf52832最小系统
例子:SDK 12.2.0\examples\ble_peripheral\ble_app_uart\pca10028\s110\arm4
4.步骤
需要准备的资料,
一个是微信官方代码,一个是nrfSDK
微信下载地址:http://iot.weixin.qq.com/wiki/new/index.html?page=6-1
首先,添加几个文件夹:
products;
wechatapp;
wechatservices;
文件夹的内容分别实在微信的对应名字的文件copy出来的,把他们加到SDKnRF5_SDK_12.2.0_f012efa\examples\ble_peripheral\ble_app_uart_git\pca10040\s132\arm4工程里面,并添加对应的路径;
文件夹对应的内容为:
在main.c里面添加:
static ble_wechat_t m_ble_wechat; //¶¨Òå΢ÐÅ·þÎñ
uint8_t m_addl_adv_manuf_data[BLE_GAP_ADDR_LEN];
ble_evt_dispatch()函数变为如下:
/**@brief Function for dispatching a S110 SoftDevice event to all modules with a S110 SoftDevice
* event handler.
*
* @details This function is called from the S110 SoftDevice event interrupt handler after a S110
* SoftDevice event has been received.
*
* @param[in] p_ble_evt S110 SoftDevice event.
*/static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
ble_conn_params_on_ble_evt(p_ble_evt);
//ble_nus_on_ble_evt(&m_nus, p_ble_evt);
on_ble_evt(p_ble_evt);
ble_advertising_on_ble_evt(p_ble_evt);
bsp_btn_ble_on_ble_evt(p_ble_evt);
ble_wechat_on_ble_evt(&m_ble_wechat, p_ble_evt, m_mpbledemo2_handler); //Ìí¼ÓÍþÐÅ·þÎñʼþ
m_mpbledemo2_handler->m_data_on_ble_evt_func(&m_ble_wechat,p_ble_evt); //
services-init()函数变为:
/**@brief Function for initializing services that will be used by the application.
*/
static void services_init(void)
{
uint32_t err_code;
// ble_nus_init_t nus_init;
//
// memset(&nus_init, 0, sizeof(nus_init));
// nus_init.data_handler = nus_data_handler;
//
// err_code = ble_nus_init(&m_nus, &nus_init);
// APP_ERROR_CHECK(err_code);
err_code = ble_wechat_add_service(&m_ble_wechat);
APP_ERROR_CHECK(err_code);
err_code = ble_wechat_add_characteristics(&m_ble_wechat);
APP_ERROR_CHECK(err_code);
}
advertising_init()函数变为:
**@brief Function for initializing the Advertising functionality.
*/
static void advertising_init(void)
{
uint32_t err_code;
ble_advdata_t advdata;
//ble_advdata_t scanrsp;
// uint32_t err_code;
//ble_advdata_t advdata;
/**< LE General Discoverable Mode, BR/EDR not supported. */
uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
ble_uuid_t adv_uuids[] =
{
{BLE_UUID_WECHAT_SERVICE, BLE_UUID_TYPE_BLE}
};
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = false;
advdata.flags = flags;
advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
advdata.uuids_complete.p_uuids = adv_uuids;
ble_advdata_manuf_data_t manuf_data;
manuf_data.company_identifier = COMPANY_IDENTIFIER;
manuf_data.data.size = sizeof(m_addl_adv_manuf_data);
manuf_data.data.p_data = m_addl_adv_manuf_data;
advdata.p_manuf_specific_data = &manuf_data;
err_code = ble_advdata_set(&advdata, NULL);
APP_ERROR_CHECK(err_code);
// Initialize advertising parameters (used when starting advertising)
//memset(&m_adv_params, 0, sizeof(m_adv_params));
// Build and set advertising data
// Build advertising data struct to pass into @ref ble_advertising_init.
// memset(&advdata, 0, sizeof(advdata));
// advdata.name_type = BLE_ADVDATA_FULL_NAME;
// advdata.include_appearance = false;
// advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
// memset(&scanrsp, 0, sizeof(scanrsp));
// scanrsp.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
// scanrsp.uuids_complete.p_uuids = m_adv_uuids;
ble_adv_modes_config_t options = {0};
options.ble_adv_fast_enabled = true;
options.ble_adv_fast_interval = APP_ADV_INTERVAL;
options.ble_adv_fast_timeout = APP_ADV_TIMEOUT_IN_SECONDS;
err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);
APP_ERROR_CHECK(err_code);
}
添加如下代码:
/****************************************************************************
? ?: get_mac_addr()
? ?: »ñµÃÀ¶ÑÀµÄmacµØÖ·
????: void
????: ?
****************************************************************************/
void get_mac_addr(uint8_t *p_mac_addr)
{
uint32_t error_code;
ble_gap_addr_t *p_mac_addr_t = (ble_gap_addr_t*)malloc(sizeof(ble_gap_addr_t));
error_code = sd_ble_gap_address_get(p_mac_addr_t);
APP_ERROR_CHECK(error_code);
#ifdef CATCH_LOG
printf("\r\n error:%d",error_code);
printf("\r\n get mac addr");
#endif
uint8_t *d = p_mac_addr_t->addr; for ( uint8_t i = 6; i >0;)
{
i--;
p_mac_addr[5-i]= d[i];
#ifdef CATCH_LOG
printf ( ":%02x", d[i]);
#endif
}
#ifdef CATCH_LOG
putchar ( '\n' );
#endif
free(p_mac_addr_t);
p_mac_addr_t = NULL;
}
/****************************************************************************
? ?: data_handler_init()
? ?: »Øµ÷º¯Êý
????: void
????: ?
****************************************************************************/
void data_handler_init(data_handler** p_data_handler, uint8_t product_type)
{
if (*p_data_handler == NULL)
{
*p_data_handler = get_handler_by_type(product_type);
}
}
/****************************************************************************
? ?: register_all_products()
? ?: ×¢²á»Øµ÷º¯Êý
????: void
????: ?
****************************************************************************/
//function for register all products
void register_all_products(void) {
REGISTER(mpbledemo2);
}
主函数如下:
/**@brief Application main function.
*/
int main(void)
{
uint32_t err_code;
bool erase_bonds;
uint8_t start_string[] = START_STRING;
// Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
uart_init();
buttons_leds_init(&erase_bonds);
ble_stack_init();
//微信处理
get_mac_addr(m_addl_adv_manuf_data);
register_all_products();
data_handler_init(&m_mpbledemo2_handler, PRODUCT_TYPE_MPBLEDEMO2);
gap_params_init();
services_init();
advertising_init();
conn_params_init();
printf("%s",start_string);
//
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
// Enter main loop.
for (;;)
{
power_manage();
m_mpbledemo2_handler->m_data_main_process_func(&m_ble_wechat);
}
}
OK,移植完毕。。编译如下:(解决编译错误)
1、在main.c添加ble_wechat_service.h和mpbledemo.h头文件;
2、在main.c添加extern data_handler * m_mpbledemo2_handler;
3、屏蔽掉ble_stack_handler.h和consource.h;
4、修改ble_gap_address_get为ble_gap_addr_get;
至此,编译通过~按照上述步骤,实测IOS LightBlue可以收到数据~
下一篇调试,与AirSyncDebugger收发数据~~~