nRF51822芯片上的BLE蓝牙协议栈
- 格式:docx
- 大小:96.79 KB
- 文档页数:2
OHTCOMTechnology Ltd.nRF51822 Application KitnRF51822User Guide v1.3Copyright © 2013 Ohtcom Technology. All rights reserved.1 介绍nRF51822 Bluetooth® low energy/2.4 GHz Application Kit (AK II) 提供了一整套的测试和应用nRF51822的解决方案。
nRF51822是nRF51 系列中的一员,它是一个超低功耗(ultra-low power),单片系统 (SoC) 的2.4 GHz 无线通信解决方案.1.1 最小系统要求•nRFgo Studio v1.14 或更高版本•Windows XP or Windows 71.2 外部资源•Keil MDK-ARM Lite v4.54或更高版本https:///demo/eval/arm.htm•J-Link Software v4.52b或更高版本/jlink-software.html1.3 Writing conventions这篇用户指南遵从了一些排版规则,这样能够使文章更加连贯,更加易于阅读。
以下是使用到的协作约定::•命令使用Lucida Console.•芯片管脚使用Consolas.•文件名和用户接口使用bold.•内部关联采用斜体并使用semi-bold.1.4 Application kit 发布说明2 套件内容nRF51822 Application Kit 的硬件资料以及相关软件和文档。
可以从https:///overheat1984/nRF51822_STUDY处下载。
2.1 nRF51822 Application Kit硬件Figure 1 nRF51822 硬件2.2 可下载的资源nRF51822 Application Kit 包括固件程序,文档,硬件原理图等。
BLE静态秘钥在51822程序中的实现xAN1503006Application Note V1.00类别内容关键词nRF51822;静态秘钥;摘要介绍在SDK7.1下,如何实现添加静态秘钥。
版本日期更新内容V1.00 2015-03-15 创建文档目录1概述 (3)2实现步骤 (4)免责声明 (8)1概述在使用nrf51822开发BLE应用中,很多情况下,为了提高安全性,需要使用到秘钥配对。
而有时候要实现友好的用户界面,使得手机在与51822连接时,跳出秘钥输入框,就必须使用BLE中的静态秘钥功能。
本文以experimental_ble_app_uart这个例程为基础,介绍如何在程序中实现静态秘钥的功能。
如图1-1,使用nRF UART这个app连接的效果图。
图1-1 app连接效果图2实现步骤●首先修改配对信息安全参数的值。
#define SEC_PARAM_TIMEOUT 30 /**< Timeout for Pairing Request or Security Request (in seconds). */#define SEC_PARAM_BOND 0 /**< Perform bonding. */#define SEC_PARAM_MITM 1 /**< Man In The Middle protection not required. */#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_DISPLAY_YESNO /**< Display and Yes/No entry. */#define SEC_PARAM_OOB 0 /**< Out Of Band data not available. */#define SEC_PARAM_MIN_KEY_SIZE 7 /**< Minimum encryption key size. */#define SEC_PARAM_MAX_KEY_SIZE 16 /**< Maximum encryption key size. */●通过协议栈提供的API设置秘钥(为6位字符串)static void ble_stack_init(void){uint32_t err_code;static uint8_t passkey[] = "123456";ble_opt_t ble_opt;ble_opt.gap_opt.passkey.p_passkey = &passkey[0];// Initialize SoftDevice.SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false);// Enable BLE stackble_enable_params_t ble_enable_params;memset(&ble_enable_params, 0, sizeof(ble_enable_params));ble_enable_params.gatts_enable_params.service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT;err_code = sd_ble_enable(&ble_enable_params);APP_ERROR_CHECK(err_code);// Subscribe for BLE events.err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);APP_ERROR_CHECK(err_code);(void) sd_ble_opt_set(BLE_GAP_OPT_PASSKEY, &ble_opt);}设置需要属性的安全等级/**@brief Function for adding RX characteristic.** @param[in] p_nus Nordic UART Service structure.* @param[in] p_nus_init Information needed to initialize the service.** @return NRF_SUCCESS on success, otherwise an error code.*/static uint32_t rx_char_add(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init){/**@snippet [Adding proprietary characteristic to S110 SoftDevice] */ ble_gatts_char_md_t char_md;ble_gatts_attr_md_t cccd_md;ble_gatts_attr_t attr_char_value;ble_uuid_t ble_uuid;ble_gatts_attr_md_t attr_md;memset(&cccd_md, 0, sizeof(cccd_md));BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm);//BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm);BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(&cccd_md.write_perm);cccd_md.vloc = BLE_GATTS_VLOC_STACK;memset(&char_md, 0, sizeof(char_md));char_md.char_props.notify = 1;char_md.p_char_user_desc = NULL;char_md.p_char_pf = NULL;char_md.p_user_desc_md = NULL;char_md.p_cccd_md = &cccd_md;char_md.p_sccd_md = NULL;ble_uuid.type = p_nus->uuid_type;ble_uuid.uuid = BLE_UUID_NUS_RX_CHARACTERISTIC;memset(&attr_md, 0, sizeof(attr_md));//BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(&attr_md.read_perm); //BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(&attr_md.write_perm);attr_md.vloc = BLE_GATTS_VLOC_STACK;attr_md.rd_auth = 0;attr_md.wr_auth = 0;attr_md.vlen = 1;memset(&attr_char_value, 0, sizeof(attr_char_value));attr_char_value.p_uuid = &ble_uuid;attr_char_value.p_attr_md = &attr_md;attr_char_value.init_len = sizeof(uint8_t);attr_char_value.init_offs = 0;attr_char_value.max_len = BLE_NUS_MAX_RX_CHAR_LEN;return sd_ble_gatts_characteristic_add(p_nus->service_handle,&char_md,&attr_char_value,&p_nus->rx_handles);/**@snippet [Adding proprietary characteristic to S110 SoftDevice] */}/**@brief Function for adding TX characteristic.** @param[in] p_nus Nordic UART Service structure.* @param[in] p_nus_init Information needed to initialize the service.** @return NRF_SUCCESS on success, otherwise an error code.*/static uint32_t tx_char_add(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init){ble_gatts_char_md_t char_md;ble_gatts_attr_t attr_char_value;ble_uuid_t ble_uuid;ble_gatts_attr_md_t attr_md;memset(&char_md, 0, sizeof(char_md));char_md.char_props.write = 1;char_md.char_props.write_wo_resp = 1;char_md.p_char_user_desc = NULL;char_md.p_char_pf = NULL;char_md.p_user_desc_md = NULL;char_md.p_cccd_md = NULL;char_md.p_sccd_md = NULL;ble_uuid.type = p_nus->uuid_type;ble_uuid.uuid = BLE_UUID_NUS_TX_CHARACTERISTIC; memset(&attr_md, 0, sizeof(attr_md));BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(&attr_md.read_perm); //BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);//BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(&attr_md.write_perm);attr_md.vloc = BLE_GATTS_VLOC_STACK;attr_md.rd_auth = 0;attr_md.wr_auth = 0;attr_md.vlen = 1;memset(&attr_char_value, 0, sizeof(attr_char_value));attr_char_value.p_uuid = &ble_uuid;attr_char_value.p_attr_md = &attr_md;attr_char_value.init_len = 1;attr_char_value.init_offs = 0;attr_char_value.max_len = BLE_NUS_MAX_TX_CHAR_LEN;return sd_ble_gatts_characteristic_add(p_nus->service_handle,&char_md,&attr_char_value,&p_nus->tx_handles);}免责声明深圳市蓝科迅通科技有限公司随附提供的软件或文档资料旨在提供给您(本公司的客户)使用,仅限于且只能在本公司销售的产品上使用。
nRF51822库函数速查nrf_soc.h//初始化互斥锁uint32_t sd_mutex_new(nrf_mutex_t*p_mutex);//尝试获取互斥锁.uint32_t sd_mutex_acquire(nrf_mutex_t*p_mutex);//释放互斥锁.uint32_t sd_mutex_release(nrf_mutex_t*p_mutex);//使能外部中断.uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn);//禁止外部中断.uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn);//Get Pending Interrupt.uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn,uint32_t*p_pending_irq);//Set Pending Interrupt.uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn);//Clear Pending Interrupt.uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn);//设置中断优先级.uint32_t sd_nvic_SetPriority(IRQn_Type IRQn,nrf_app_irq_priority_t priority);//取得中断优先级.uint32_t sd_nvic_GetPriority(IRQn_Type IRQn,nrf_app_irq_priority_t*p_priority); //系统复位.uint32_t sd_nvic_SystemReset(void);//进入临界区.uint32_t sd_nvic_critical_region_enter(uint8_t*p_is_nested_critical_region);//退出临界区.uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region);//查询应用的随机数池容量.uint32_t sd_rand_application_pool_capacity_get(uint8_t*p_pool_capacity);//取得应用中有效地随机数字节数.uint32_t sd_rand_application_bytes_available_get(uint8_t*p_bytes_available);//从池中获取随机数字节.uint32_t sd_rand_application_vector_get(uint8_t*p_buff,uint8_t length);//取得复位原因寄存器的值.uint32_t sd_power_reset_reason_get(uint32_t*p_reset_reason);//清除复位原因寄存器的若干bit.uint32_t sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk);//设置CPU睡眠时的电源模式.uint32_t sd_power_mode_set(nrf_power_mode_t power_mode);//关闭系统.uint32_t sd_power_system_off(void);//开关电源失效比较器uint32_t sd_power_pof_enable(uint8_t pof_enable);//设置电源故障阈值.uint32_t sd_power_pof_threshold_set(nrf_power_failure_threshold_t threshold);//设置NRF_POWER->RAMON寄存器.uint32_t sd_power_ramon_set(uint32_t ramon);//清除NRF_POWER->RAMON寄存器.uint32_t sd_power_ramon_clr(uint32_t ramon);//Get contents of NRF_POWER->RAMON register,indicates power status of ram blocks. uint32_t sd_power_ramon_get(uint32_t*p_ramon);//Set bits in the NRF_POWER->GPREGRET register.uint32_t sd_power_gpregret_set(uint32_t gpregret_msk);//Clear bits in the NRF_POWER->GPREGRET register.uint32_t sd_power_gpregret_clr(uint32_t gpregret_msk);//Get contents of the NRF_POWER->GPREGRET register.uint32_t sd_power_gpregret_get(uint32_t*p_gpregret);//设置DCDC模式.uint32_t sd_power_dcdc_mode_set(nrf_power_dcdc_mode_t dcdc_mode);//请求使用高频晶体振荡器.uint32_t sd_clock_hfclk_request(void);//释放高频晶体振荡器.uint32_t sd_clock_hfclk_release(void);//检查高频晶体振荡器是否在运行.SVCALL(SD_CLOCK_HFCLK_IS_RUNNING,uint32_t,sd_clock_hfclk_is_running(uint32_t*p_is_running));//等待程序事件.uint32_t sd_app_evt_wait(void);//Get PPI channel enable register contents.uint32_t sd_ppi_channel_enable_get(uint32_t*p_channel_enable);//Set PPI channel enable register.uint32_t sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk);//Clear PPI channel enable register.uint32_t sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk);//Assign endpoints to a PPI channel.uint32_t sd_ppi_channel_assign(uint8_t channel_num,const volatile void*evt_endpoint, const volatile void*task_endpoint);//Task to enable a channel group.uint32_t sd_ppi_group_task_enable(uint8_t group_num);//Task to disable a channel group.uint32_t sd_ppi_group_task_disable(uint8_t group_num);//Assign PPI channels to a channel group.uint32_t sd_ppi_group_assign(uint8_t group_num,uint32_t channel_msk);//Gets the PPI channels of a channel group.uint32_t sd_ppi_group_get(uint8_t group_num,uint32_t*p_channel_msk);//配置无线通知信号.uint32_t sd_radio_notification_cfg_set(nrf_radio_notification_type_t type,nrf_radio_notification_distance_t distance);//AES-ECB加密.uint32_t sd_ecb_block_encrypt(nrf_ecb_hal_data_t*p_ecb_data);//Gets any pending events generated by the SoC API.uint32_t,sd_evt_get(uint32_t*p_evt_id);//取得芯片温度uint32_t sd_temp_get(int32_t*p_temp);//写数据到Flashsd_flash_write(uint32_t*const p_dst,uint32_t const*const p_src,uint32_t size); //擦除Flash页uint32_t sd_flash_page_erase(uint32_t page_number);//Flash Protection setuint32_t sd_flash_protect(uint32_t protenset0,uint32_t protenset1);ble.h//从队列中取得等待处理的事件uint32_t,sd_ble_evt_get(uint8_t*p_dest,uint16_t*p_len);//取得BLE协议栈中有效地传输缓冲区总数uint32_t sd_ble_tx_buffer_count_get(uint8_t*p_count);//添加一个厂商特定UUID.uint32_t sd_ble_uuid_vs_add(ble_uuid128_t const*const p_vs_uuid,uint8_t*const p_uuid_type);//解码原始小端UUID字节(16bit或128bit)到24bit的ble_uuid_t结构uint32_t sd_ble_uuid_decode(uint8_t uuid_le_len,uint8_t const*const p_uuid_le, ble_uuid_t*const p_uuid);//编码24bit的ble_uuid_t结构到原始小端UUID字节(16bit或128bit)uint32_t sd_ble_uuid_encode(ble_uuid_t const*const p_uuid,uint8_t*constp_uuid_le_len,uint8_t*const p_uuid_le));//取得版本信息uint32_t sd_ble_version_get(ble_version_t*p_version);//提供用户内存块uint32_t sd_ble_user_mem_reply(uint16_t conn_handle,ble_user_mem_block_t*p_block); ble_gap.h//设置本地蓝牙MAC地址uint32_t sd_ble_gap_address_set(ble_gap_addr_t const*const p_addr);//取得本地蓝牙MAC地址uint32_t sd_ble_gap_address_get(ble_gap_addr_t*const p_addr);//设置,清除,更新广播扫描响应数据uint32_t sd_ble_gap_adv_data_set(uint8_t const*const p_data,uint8_t dlen,uint8_t const*const p_sr_data,uint8_t srdlen);//开始广播(Start advertising(GAP Discoverable,Connectable modes,Broadcast Procedure) uint32_t sd_ble_gap_adv_start(ble_gap_adv_params_t const*const p_adv_params);//停止广播(Start advertising(GAP Discoverable,Connectable modes,Broadcast Procedure) uint32_t sd_ble_gap_adv_stop(void);//更新连接参数uint32_t sd_ble_gap_conn_param_update(uint16_t conn_handle,ble_gap_conn_params_t const*const p_conn_params);//断开连接(GAP Link Termination).uint32_t,sd_ble_gap_disconnect(uint16_t conn_handle,uint8_t hci_status_code);//设置无线发射功率dBm(accepted values are-40,-30,-20,-16,-12,-8,-4,0,and4dBm). SVCALL(SD_BLE_GAP_TX_POWER_SET,uint32_t,sd_ble_gap_tx_power_set(int8_t tx_power)) ;//Set GAP Appearance value.uint32_t sd_ble_gap_appearance_set(uint16_t appearance);//Get GAP Appearance value.uint32_t,sd_ble_gap_appearance_get(uint16_t*const p_appearance);//设置GAP外设优先连接参数uint32_t sd_ble_gap_ppcp_set(ble_gap_conn_params_t const*const p_conn_params);//取得GAP外设优先连接参数uint32_t sd_ble_gap_ppcp_get(ble_gap_conn_params_t*const p_conn_params);//设置GAP设备名uint32_t sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const*const p_write_perm, uint8_t const*const p_dev_name,uint16_t len);//取得GAP设备名uint32_t,sd_ble_gap_device_name_get(uint8_t*const p_dev_name,uint16_t*constp_len);//启动GAP认证流程uint32_t,sd_ble_gap_authenticate(uint16_t conn_handle,ble_gap_sec_params_t const* const p_sec_params);//Reply with GAP security parameters.uint32_t sd_ble_gap_sec_params_reply(uint16_t conn_handle,uint8_t sec_status,ble_gap_sec_params_t const*const p_sec_params);//Reply with an authentication keySVCALL(SD_BLE_GAP_AUTH_KEY_REPLY,uint32_t,sd_ble_gap_auth_key_reply(uint16_tconn_handle,uint8_t key_type,uint8_t const*const key);//Reply with GAP security information.uint32_t sd_ble_gap_sec_info_reply(uint16_t conn_handle,ble_gap_enc_info_t const* const p_enc_info,ble_gap_sign_info_t const*const p_sign_info);//Get the current connection security.uint32_t,sd_ble_gap_conn_sec_get(uint16_t conn_handle,ble_gap_conn_sec_t*const p_conn_sec);//开始接受RSSI值的变化通知uint32_t sd_ble_gap_rssi_start(uint16_t conn_handle);//停止接收RSSI值变化通知SVCALL(SD_BLE_GAP_RSSI_STOP,uint32_t,sd_ble_gap_rssi_stop(uint16_t conn_handle); ble_gattc.h//启动或继续GATT主要服务的发现过程uint32_t sd_ble_gattc_primary_services_discover(uint16_t conn_handle,uint16_tstart_handle,ble_uuid_t const*const p_srvc_uuid);//启动或继续GATT关系发现过程uint32_t sd_ble_gattc_relationships_discover(uint16_t conn_handle,ble_gattc_handle_range_t const*const p_handle_range);//启动或继续GATT特性发现过程uint32_t sd_ble_gattc_characteristics_discover(uint16_t conn_handle,ble_gattc_handle_range_t const*const p_handle_range);//启动或继续GATT特性描述发现过程uint32_t sd_ble_gattc_descriptors_discover(uint16_t conn_handle,ble_gattc_handle_range_t const*const p_handle_range);//启动或继续通过GATT特性的UUID的读操作uint32_t sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle,ble_uuid_t const *const p_uuid,ble_gattc_handle_range_t const*const p_handle_range);//启动或继续GATT读取长特性或描述的过程uint32_t sd_ble_gattc_read(uint16_t conn_handle,uint16_t handle,uint16_t offset); //启动GATT读取多个特性值的过程uint32_t sd_ble_gattc_char_values_read(uint16_t conn_handle,uint16_t const*const p_handles,uint16_t handle_count);//执行一个无报告的写操作uint32_t sd_ble_gattc_write(uint16_t conn_handle,ble_gattc_write_params_t const* const p_write_params);//发送配置到GATT服务器uint32_t sd_ble_gattc_hv_confirm(uint16_t conn_handle,uint16_t handle);ble_gatts.h//添加一个服务声明到本地服务的ATT表uint32_t sd_ble_gatts_service_add(uint8_t type,ble_uuid_t const*const p_uuid,uint16_t*const p_handle);//添加一个包含声明到本地服务的ATT表uint32_t sd_ble_gatts_include_add(uint16_t service_handle,uint16_t inc_srvc_handle, uint16_t*const p_include_handle);//添加特性声明,特性值声明,可选的特性描述声明到ATT表uint32_t sd_ble_gatts_characteristic_add(uint16_t service_handle,ble_gatts_char_md_t const*const p_char_md,ble_gatts_attr_t const*const p_attr_char_value,ble_gatts_char_handles_t*const p_handles);//添加描述到ATT表uint32_t sd_ble_gatts_descriptor_add(uint16_t char_handle,ble_gatts_attr_t const* const p_attr,uint16_t*const p_handle);//设置值到特性uint32_t sd_ble_gatts_value_set(uint16_t handle,uint16_t offset,uint16_t*const p_len, uint8_t const*const p_value);//取得属性值uint32_t sd_ble_gatts_value_get(uint16_t handle,uint16_t offset,uint16_t*const p_len, uint8_t*const p_data);//Notify或Indicate特性值.uint32_t,sd_ble_gatts_hvx(uint16_t conn_handle,ble_gatts_hvx_params_t const*constp_hvx_params);//Indicate属性值改变uint32_t sd_ble_gatts_service_changed(uint16_t conn_handle,uint16_t start_handle, uint16_t end_handle);//报告读写授权请求uint32_t sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle,ble_gatts_rw_authorize_reply_params_t const*const p_rw_authorize_reply_params);//Update persistent system attribute informationuint32_t sd_ble_gatts_sys_attr_set(uint16_t conn_handle,uint8_t const*constp_sys_attr_data,uint16_t len);//Retrieve persistent system attribute information from the stack.uint32_t sd_ble_gatts_sys_attr_get(uint16_t conn_handle,uint8_t*constp_sys_attr_data,uint16_t*const p_len);ble_l2cap.h//注册一个L2CAP的CIDuint32_t sd_ble_l2cap_cid_register(uint16_t cid);//注销CIDuint32_t sd_ble_l2cap_cid_unregister(uint16_t cid);//发送L2CAP包uint32_t sd_ble_l2cap_tx(uint16_t conn_handle,ble_l2cap_header_t const*const p_header,uint8_t const*const p_data);nrf_sdm.h//使能SoftDeviceuint32_t sd_softdevice_enable(nrf_clock_lfclksrc_t clock_source,softdevice_assertion_handler_t assertion_handler);//禁用SoftDeviceuint32_t sd_softdevice_disable(void);//检查SoftDevice是否已使能uint32_t sd_softdevice_is_enabled(uint8_t*p_softdevice_enabled);//开始转发中断到应用程序uint32_t sd_softdevice_forward_to_application(void);。
蓝牙nRF51822 应用(基于低功耗蓝牙技术的温湿度传感器节点的设计)关键字:低功耗蓝牙温湿度传感器nRF51822 SHT11随着兼容蓝牙4.0标准的智能手机逐步普及,低功耗蓝牙技术也面临着越来越广泛的应用。
本设计采用了nRF51822和SHT11设计了一种基于低功耗蓝牙技术的温湿度传感器节点,能够将节点位置的温度和湿度发送给主机用于显示,可广泛应用于家庭、车间、仓库的温湿度监控。
1.引言在智能家居和物联网飞速发展的背景下,基于蓝牙4.0标准的低功耗蓝牙(Bluetooth Low Energy,BLE)技术正被逐步地为人们重视。
随着兼容蓝牙4.0标准的智能手机逐步普及,低功耗蓝牙技术也面临着越来越广泛的应用。
本设计采用了基于BLE技术的nRF51822蓝牙SoC芯片和SHT11温湿度传感器设计了一种基于低功耗蓝牙技术的温湿度传感器节点,能够将节点位置的温度和湿度发送给主机用于显示,可广泛应用于家庭、车间、仓库的温湿度监控。
节点采用了低功耗设计,可用一枚纽扣电池供电,实际使用时间可达1年以上。
2.系统结构本设计的系统结构如图1所示,系统的处理器模块由nRF51822构成,温湿度传感器件采用SHT11,电源采用纽扣电池供电;由处理器模块、温湿度传感器模块、天线模块、电源模块构成的节点与主机通过2.4GHz的低功耗蓝牙信号通信,主机采用智能手机运行信息采集显示的APP。
多个节点可利用应用层协议与主机组成星形网络。
图1 系统结构图3.硬件电路温湿度传感器节点硬件的系统构成如图2所示。
图2 硬件系统结构图3.1 处理器模块处理器模块选用Nordic公司的nRF51822芯片。
nRF51822是具有CORTEX-M0低功耗内核,支持BLE、Gazell等多协议的低功耗高速率射频收发器的SoC。
其具有高集成度、低成本、处理能力强、低功耗、小体积等优势,非常适合低功耗蓝牙产品的应用。
该芯片具有以下特性:具有Cortex-M0内核,片上256KB FLASH,16KB RAM,片内包含支持BLE协议的2.4GHz射频收发器。
nrf5182-主机-串口代码讲解nrf5182 主机串口代码讲解,跟官方的串口代码配套使用工程文件nrf51822\Board\nrf6310\s120\experimental\ble_app_uart_c\arm 配套的uart的串口从机是nrf51822\Board\pca10001\s110\experimental\ble_app_uart1、首先添加16位的uuid号,重新宏定义如下点击(此处)折叠或打开1.#define BLE_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service.*/2.#define BLE_UUID_NUS_TX_C_CHARACTERISTIC 0x0003 /**< 主机的TX 特性对应于从机的RX特性*/3.#define BLE_UUID_NUS_RX_C_CHARACTERISTIC 0x0002 /**< 主机的RX 特性. */4.5.#define BLE_NUS_MAX_DATA_LEN (GATT_MTU_SIZE_DEFAULT - 3) /**< 最大20字节Maximum length of data (inbytes) that can be transmitted by the Nordic UARTservice module to the peer. */6.7.#define BLE_NUS_MAX_RX_CHAR_LEN BLE_NUS_MAX_DATA_LEN /**< 等价于接收长度Maximum length of the RX Characteristic (in bytes). */8.#define BLE_NUS_MAX_TX_CHAR_LEN BLE_NUS_MAX_DATA_LEN/**< Maximum length of the TX Characteristic (inbytes). */蓝牙ble是基于属性协议的属性协议:客户端通过它可以发现并获取属**器上的属性:6种基本操作1、请求:客户端发给请求给服务器,需要服务器回复一个响应2、响应:3、命令:客户端发给请求给服务器,不需要服务器回复一个响应4、指示:服务器发给指示给客户端,需要客户端发一个确认给服务器5、确认:6、通知:客户端发给请求给服务器,不需要服务器回复一个响应例子用到了请求,通知。
蓝牙ble系列nrf51822,nrf52810,nrf52832,nrf52840方案对比一、nRF51822简介:nRF51822是一款功能强大,高度灵活的多协议的SoC,非常适用于蓝牙低功耗和2.4GHz的无线应用。
该SoC是基于ARM Cortex M0为内核的微处理器,拥有256KB/128KB的片上FLASH存储空间,32KB/16KB的RAM空间。
2.4G无线射频支持蓝牙低功耗,同时兼容nRF24L系列的产品。
其应用领域:手机配件,穿戴式设备,无线充电监控,PC外设,消费电子遥控器,智能家居,智能射频标签,玩具和电子游戏等。
二、芯片特性:●单芯片,高度灵活的2.4GHz多协议设备●32位ARM Cortex M0 CPU内核●256KB/128KB闪存+32KB/16KB RAM●支持蓝牙低功耗协议栈●线程安全和运行时保护●事件驱动API支持●空中链路兼容nRF24L系列●三种速率:2Mbps/1Mbps/250Kbps●+4dBm输出功率●-93dBm灵敏度,蓝牙低功耗●灵活的电源管理系统●可配置的I/O●工作温度范围:-40℃至+105℃三、nRF52810简介:nRF52810是一款支持蓝牙5,ANT和2.4GHz的高性能多协议的SoC。
该SoC提供了对蓝牙5的支持,同时微处理器内核为ARM Cortex M4,具有192KB的FLASH和24KB的RAM空间,能够提供更多的高级应用的支持。
即使在低功耗的应用之中也是表现得非常出色的。
其应用领域:蓝牙5连接处理器,工业传感器和执行器,穿戴设备,智能家居传感器,电脑外设,体育和健身传感器,智能手表,互动游戏和楼宇自动化等。
四、芯片特性:●单芯片,高度灵活的2.4 GHz多协议SoC●32位ARM Cortex-M4处理器●电压范围:1.7V至3.6V●192kB闪存+ 24kB RAM●支持并发蓝牙低功耗/ ANT协议操作●+4dBm的输出功率●-96dBm灵敏度,蓝牙低功耗●线程安全和运行时保护●事件驱动API支持●空中链路兼容nRF24L和nRF24AP系列●两种速率:2Mbps/1Mbps●自动的电源管理系统●可配置的I/O●1个主/从SPI● 1 x双线接口(I²C)●UART(RTS / CTS)●1个PWM(4个通道)●AES HW加密●8通道10/12位ADC●正交解码器●64级模拟比较器●实时时钟(RTC)●数字麦克风接口(PDM)一、nRF52832简介:nRF52832是一款功能强大,高度灵活的超低功耗多协议的SoC,非常适合蓝牙低功耗(BLE,以前成为智能蓝牙),ANT和2.4GHz的无线应用。
nRF51822芯片上的BLE蓝牙协议栈
本文介绍了在nRF51822芯片上使用S110 SoftDevice协议栈构建一个最小的BLE应用的过程。
1初始化介绍
有一些初始化函数通常在执行一个BLE应用之前调用,下面的表格中列出了这些初始化调用函数,在后面将对它们进行详细的介绍。
大部分采用数据结构的形式作为输入参数,这些数据结构包含一系列的配置和选项信息,阅读代码中的注释能更好地理解它们。
在广播开始之后,你就进入了main函数中的for循环。
2 协议栈S110 SoftDevice
为了使用独特的射频特性,你必须使能S110 SoftDevice协议栈。
见《S110 nRF51822 SoftDevice Specification》(S110 nRF51822 SoftDevice协议栈说明书)中对硬件资源的详细需求。
3 广播
用于广播的数据结构如下:
ble_gap.h 中ble_gap_conn_sec_mode_t
ble_advdata.h 中ble_advdata_t
注意:传递给sd_ble_gap_device_name_set()的安全模式仅适于设备本身的名字。
广播参数(ble_gap_adv_params_t)必须通过sd_ble_gap_adv_start()来传递:
4 连接参数
SDK提供了一个名为ble_conn_params的模块用于管理连接参数更新,它通过SoftDevice API进行处理,包括请求的时间和第一次请求被拒绝再发送一个新的请求。
在初始化结构体ble_conn_params_init_t中,定义了更新过程的有关参数,例如,是否开始连接,什么开始写入一个特定的CCCD,是否使用连接参数,发送更新请求的延时等等。
在初始化函数ble_conn_params_init()中,使用封装了初始化连接参数(ble_gap_conn_params_t)的结构体ble_conn_params_init_t作为输入参数进行连接参数初始化。
ble_conn_params SDK模块确保与主机(集中器)的连接参数相适应,如果不适应,外围设备将要求更改连接参数,超过设定的更新次数都没有更新成功后,它就会断开连接或者根据设置返回一个事件到应用层。
5 服务
服务可以通过sd_ble_gatts_service_add()进行添加,最好不要在应用层代码中建立服务,而是在一个单独的文件中建立服务。
一个服务不是主服务就是次服务,但是在通常实际的应用中大部分使用主服务。
变量service_uuid就是你想用于服务的UUID。
变量service_handle是一个输出变量,当创建一个服务的时候将会返回一个唯一的句柄值,这个句柄可以在以后用于识别不同的服务。
6 特性
特性可以通过sd_ble_gatts_characteristic_add()函数进行添加,它有4个参数。
为了代码清晰,这个函数应该只能出现在服务文件中,而不能出现在应用层中。
第1个参数是特性要加入的服务的句柄,第2个参数是特性的结构体,它是一个全局变量,它包含了特性可能用到的性质(读,写,通知等)。
第3个参数是值属性的描述,它包含了它的UUID,长度和初始值。
第4个参数是返回的特性和描述符的唯一句柄,这个句柄可以在以后用于识别不同的特性。
例如,在写事件中用于识别哪一个特性被写入。