[Nordic BLE]nRF51822 基于nRF5_SDK_11.0.0移植Airsync到ble_app_uart工程

针对Nordic BLE,基于nRF5_SDK_11.0.0移植Airsync到ble_app_uart工程

Platform:Keil5.14、nRF5_SDK_11.0.0_89a8197、Airsync官方V0.2源码包

【SPP】Content:

1、必要文件准备

      此次移植是基于nRF5_SDK_11.0.0,故需要Nordic官方nRF5_SDK_11.0.0与微信官方蓝牙demo开发板源代码v0.2                        BLE SDK_11.0.0下载地址: https://pan.baidu.com/s/1ua5Fk_zmmEuUohPXhdEFog                                                                    Airsync V0.2源码下载地址: https://iot.weixin.qq.com/wiki/new/index.html?page=6-1                                                                                       

 2、在文件根目录添加一个wechat文件夹,在wechat文件夹下分别新建common、products、service三个文件夹

         

        

3、在common、products、service三个文件夹中分别添加添加如下Airsync源码到文件夹下

               

               

               

4、在如下路径\nRF5_SDK_11.0.0_89a8197\examples\ble_peripheral\ble_app_uart\pca10028\s130\arm5_no_packs打开工程,按照文件夹分类新建文件夹,将对应的文件添加至该路径下

                    

5、在main.c里面添加如下代码

  • 文件顶部添加声名
#define DEAD_BEEF                       0xDEADBEEF                                  
#define	COMPANY_IDENTIFIER              0x0056

static ble_wechat_t                     m_ble_wechat;
static ble_lock_t                       m_lock;
static uint16_t                         m_conn_handle = BLE_CONN_HANDLE_INVALID;

static ble_uuid_t                       m_adv_uuids[] = {{BLE_UUID_LOCK_SERVICE,
                                                                      BLE_UUID_TYPE_BLE},
                                                         {BLE_UUID_WECHAT_SERVICE,
                                                                      BLE_UUID_TYPE_BLE}};
uint8_t                                 m_addl_adv_manuf_data[BLE_GAP_ADDR_LEN];
extern data_handler                     *m_mpbledemo2_handler;
  • ble_evt_dispatch()函数修改为如下
static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
    ble_conn_params_on_ble_evt(p_ble_evt);
    ble_lock_on_ble_evt(&m_lock, p_ble_evt);
    on_ble_evt(p_ble_evt);
    ble_advertising_on_ble_evt(p_ble_evt);
	
    /* m_ble_wechat dispatch */
    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()函数修改为如下
static void services_init(void)
{
    uint32_t       err_code;
    ble_lock_init_t lock_init;
    
    // Initialize Lock Service.
    memset(&lock_init, 0, sizeof(lock_init));

    lock_init.data_handler = lock_data_handler;
    
    err_code = ble_lock_init(&m_lock, &lock_init);
    APP_ERROR_CHECK(err_code);
	
    // Initialize WeChat Service.
    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()函数修改为如下
static void advertising_init(void)
{
	uint32_t      err_code;
    ble_advdata_t advdata;
	
	// Build and set advertising data
    memset(&advdata, 0, sizeof(advdata));
    advdata.name_type               = BLE_ADVDATA_FULL_NAME;
    advdata.include_appearance      = false;
	advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    advdata.uuids_complete.p_uuids  = m_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;
	
	ble_adv_modes_config_t options = {0};  
    options.ble_adv_fast_enabled  = BLE_ADV_FAST_ENABLED;  
    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);
}
  • 添加获取MAC地址函数
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;
}
  • 添加获取一个事件处理函数的函数
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);
	}
}
  • 添加一个注册一个产品函数
void register_all_products(void) 
{
	REGISTER(mpbledemo2);
}
  • 在main函数中添加如下代码
    ble_stack_init();	/* 协议栈初始化 */
	
	NRF_LOG_PRINTF("WeChat Funcation Init;\r\n");
	get_mac_addr(m_addl_adv_manuf_data);  
	register_all_products();  
	data_handler_init(&m_mpbledemo2_handler, PRODUCT_TYPE_MPBLEDEMO2);  
	APP_ERROR_CHECK(m_mpbledemo2_handler->m_data_init_func());
	NRF_LOG_PRINTF("\r\nWeChat Fun Init Complent;\r\n");
  • 在ble_wechat_service.h中屏蔽掉如下代
#define BLE_UUID_WECHAT_SERVICE						    0xFEE7
#define BLE_UUID_WECHAT_WRITE_CHARACTERISTICS 		    0xFEC7
#define BLE_UUID_WECHAT_INDICATE_CHARACTERISTICS 	    0xFEC8
#define BLE_UUID_WECHAT_READ_CHARACTERISTICS 			0xFEC9
//#define APP_ADV_INTERVAL                              40                                        
//#define APP_ADV_TIMEOUT_IN_SECONDS                    0                                       
#define BLE_WECHAT_MAX_DATA_LEN                         (GATT_MTU_SIZE_DEFAULT - 3) 							

       至此Airsync协议移植结束,编译没有错误,下载代码然后使用AirSyncDebugger测试可通过

       移植成功!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值