tag 标签: ble4.0

相关博文
  • 热度 19
    2015-9-21 17:10
    4057 次阅读|
    0 个评论
    上一篇主要是研究了广播者( Broadcaster ),现在再研究跟其“针锋相对”的观测者( Observer ),我老觉得应该叫 Scanner ,扫描者,这样好像跟标准里的动词能对应上。 这里还是使用 CC2541 BLE4.0 协议栈( v1.4.0 )中的例程, SimpleBLEObserver. 因为原例程是使用的 TI 官方的开发板,带 LCD 屏的,很多信息是显示在屏上。而笔者手头只有自己的一块板(做 Observer )和 TI 的 keyfob (做 Broadcaster ),所以笔者在例程中加入了 UART 的一些代码,以使信息显示在 PC 屏幕上。另外,扫描的启动和停止在原例程是上通过板上的按键触发,在这里同样使用 UART ,在 PC 上通过串口工具向 CC2541 发送字符‘ S ’表示启动和停止扫描( StartStop )。这部分功能在 UART 的中断里实现,代码片断如下: #pragma vector = URX0_VECTOR __interrupt void UART0_Isr(void) {   uint8 temp;   temp = U0DBUF;     if(temp == 'S')   {            if ( !simpleBLEScanning )            {                    simpleBLEScanning = TRUE;                    simpleBLEScanRes = 0;                    GAPObserverRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,                                                DEFAULT_DISCOVERY_ACTIVE_SCAN,                                                DEFAULT_DISCOVERY_WHITE_LIST );            }            else            {                    GAPObserverRole_CancelDiscovery();            }   }     URX0IF = 0; }   对于 Observer ,要设置的主要参数有以下几个: // Maximum number of scan responses #define DEFAULT_MAX_SCAN_RES                   8 // Scan duration in ms #define DEFAULT_SCAN_DURATION                  4000 // Discovey mode (limited, general, all) #define DEFAULT_DISCOVERY_MODE                 DEVDISC_MODE_ALL 注释也写得非常清楚,主要是最多进行扫描响应的个数、扫描时长及扫描的模式。   对于 Observer , observer.h 和 gap.h 中的几个数据结构非常重要。 1 ) typedef union {   gapEventHdr_t              gap;                 //! GAP_MSG_EVENT and status.   gapDeviceInitDoneEvent_t   initDone;            //! GAP initialization done.   gapDeviceInfoEvent_t       deviceInfo;          //! Discovery device information event structure.   gapDevDiscEvent_t          discCmpl;            //! Discovery complete event structure. } gapObserverRoleEvent_t; 这是一个联合,其中的 gapDeviceInitDoneEvent_t 是针对 Observer 自身的, gapDeviceInfoEvent_t 是针对被扫描到的设备的, gapDevDiscEvent_t 是针对扫描结果的。 2 ) /**   * GAP_DEVICE_INIT_DONE_EVENT message format.   This message is sent to the   * app when the Device Initialization is done .   */ typedef struct {   osal_event_hdr_t   hdr;               //! GAP_MSG_EVENT and status   uint8 opcode;                         //! GAP_DEVICE_INIT_DONE_EVENT   uint8 devAddr ;           //! Device's BD_ADDR   uint16 dataPktLen;                   //! HC_LE_Data_Packet_Length   uint8 numDataPkts;                   //! HC_Total_Num_LE_Data_Packets } gapDeviceInitDoneEvent_t; 主要是 Observer 自身的信息,比如自身的 MAC 等,在初始化结束后或有用。 3 ) /**   * GAP_DEVICE_INFO_EVENT message format.   This message is sent to the   * app during a Device Discovery Request, when a new advertisement or scan   * response is received.   */ typedef struct {   osal_event_hdr_t   hdr;     //! GAP_MSG_EVENT and status   uint8 opcode;              //! GAP_DEVICE_INFO_EVENT   uint8 eventType;           //! Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES   uint8 addrType;            //! address type: @ref GAP_ADDR_TYPE_DEFINES   uint8 addr ;    //! Address of the advertisement or SCAN_RSP   int8 rssi;                 //! Advertisement or SCAN_RSP RSSI   uint8 dataLen;             //! Length (in bytes) of the data field (evtData)   uint8 *pEvtData;           //! Data field of advertisement or SCAN_RSP } gapDeviceInfoEvent_t; gapDeviceInfoEvent_t 是关于被扫描到的设备的信息,笔者认为这应该是最重要的一个结构了。 其中的 addr 或 advertData[] 的字节数和地址。可以编写函数将广播数据包及扫描应答数据包中的信息读出来。 这里笔者只把被扫描设备的 MAC 读了出来,转换成字符串显示在 PC 端。图中的 0xBC6A29AB6588 即为扫描到广播者的 MAC 地址。
  • 热度 20
    2015-9-21 16:02
    2683 次阅读|
    0 个评论
    蓝牙 BLE4.0 协议的 GAP 层规定了 BLE4.0 的四种角色——广播者( Broadcaster )、观测者( Observer )、主机( Central )和外设( Peripheral )。 TI CC2541 的协议栈( v1.4.0 )里有个例程 SimpleBLEBroadcaster ,是用来实现一个蓝牙广播者。苹果比较火的 iBeacons 就是一个广播者。 广播者就是只通过广播的形式发送信息,不与其他蓝牙设备配对、连接。信息的内容可以是位置信息,可以是温湿度或其他自定义的信息。 广播事件分为四种类型: • a connectable undirected event ——可连接非定向类型 • a connectable directed event ——可连接定向类型 • a non-connectable undirected event ——不可连接非定向类型 • a scannable undirected event ——可扫描非定向类型 在 CC2541 协议栈中是如此定义的: /** @defgroup GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES GAP Advertising Report Event Types   * for eventType field in gapDevRec_t and gapDeviceInfoEvent_t   * @{   */ #define GAP_ADRPT_ADV_IND                 0x00 //! Connectable undirected advertisement #define GAP_ADRPT_ADV_DIRECT_IND         0x01 //! Connectable directed advertisement #define GAP_ADRPT_ADV_SCAN_IND         0x02 //! Scannable undirected advertisement #define GAP_ADRPT_ADV_NONCONN_IND    0x03//! Non-Connectable undirected advertisement #define GAP_ADRPT_SCAN_RSP             0x04//! Scan Response 当然它还定义了扫描的响应事件( Scan response )。 上述四种类型的区别在: 主要是针对主机或者说其他设备的扫描和连接请求的回应不同。 蓝牙 BLE4.0 规范的 Vol.6 Part B Section 4.4.2.3~4.4.2.6 对上述四种广播类型有详细的表述,这里只来研究 GAP_ADRPT_ADV_SCAN_IND 类型,因为 CC2541 的 SimpleBLEBroacaster 例程是定义成的可扫描类型。如上图所示,只响应扫描请求不响应连接请求。 广播相关的参数有: 1 ) Advertising Interval 广播间隔( Advertising_Interval_Min Advertising_Interval_Max ) 所有非定向广播,两个广播事件的广播间隔( T_advEvent )为: T_advEvent = advInterval + advDelay advInterval 必须是 0.625ms 的整数倍,且 20ms ≤ advInterval ≤ 10.24s ,对于可扫描非定向广播类型和不可连接非定向广播类型, advInterval 要大于等于 100ms ( 160 个 0.625ms );对于可连接非定向广播类型,该值最小可以到 20ms. 而式中的 advDelay 值是一个 0~10ms 之间的伪随机数。 Advertising_Interval_Min Advertising_Interval_Max 两个参数用来调整广播间隔 Advertising Interval ,通常分别设置上下限,也可以设置为同一个值,值应为 0.625ms 的倍数。在 CC2541 的协议栈中是设置为了同一值。 #define DEFAULT_ADVERTISING_INTERVAL           160 uint16 advInt = DEFAULT_ADVERTISING_INTERVAL; GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt ); GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt ); GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt ); GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt ); 2 ) Advertising_Type 广播类型 就是前面所讲的四种广播类型,不再赘述。 3 ) Own_Address_Type 自身地址类型 指的是广播者本身的地址类型。 0 表示使用公共设备地址,就是在 IEEE 注册的地址,即全球唯一的 MAC ; 1 表示使用随机地址。默认状态下是 0 ,即公共地址。 另外,还有 Direct_Address_Type 、 Direct_Address 等参数,情况跟 Own_Address_Type 类似。 4 ) Advertising_Channel_Map 广播信道设置 广播信道在信道 37~39 中选择。 5 ) Advertising_Filter_Policy 广播过滤策略 主要是针对扫描的请求的。 6 )  Advertising Data 和 Scan Reponse Data 广播数据和扫描应答数据 这两种数据包的结构是一样的。 都是最长 31 个字节。不同的是,广播数据是在广播的时候主动发送的数据;扫描应答数据是在收到扫描请求的时候响应的数据。 这两个参数在例程中的设置如下: static uint8 scanRspData = {   // Flags; this sets the device to use limited discoverable   // mode (advertises for 30 seconds at a time) instead of general   // discoverable mode (advertises indefinitely)   0x02,    // length of this data   GAP_ADTYPE_FLAGS,   GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,     // three-byte broadcast of the data "1 2 3"   0x04,    // length of this data including the data type byte   GAP_ADTYPE_MANUFACTURER_SPECIFIC,       // manufacturer specific advertisement data type   1,   2,   3 }; 在 scanRspData[] 数组的最后面有一个发射功率设置的参数,这里设置为 0dbm. 在 Hci.h 文件中声明了这样的函数接口 extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower ); 对发射功率的设置,有 4 个等级: LL_EXT_TX_POWER_MINUS_23_DBM, LL_EXT_TX_POWER_MINUS_6_DBM, LL_EXT_TX_POWER_0_DBM, LL_EXT_TX_POWER_4_DBM 分别是 4dbm 、 0dbm 、 -6dbm 和 -23dbm ,如果要修改,可以调用这个 HCI 函数来设置。 上述参数在 CC2541 的 SimpleBLEBroadcaster 例程里面是这样设置的: uint8 advType = GAP_ADTYPE_ADV_SCAN_IND; // use scannable unidirected advertisements GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), initial_advertising_enable ); GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), gapRole_AdvertOffTime );     GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData ); GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData ); GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), advType ); 这个 SimpleBLEBroadcaster 例程在 DeviceMonitor 中竟然扫描不到其 MAC ,目前原因未知,可能跟 DeviceMonitor 软件有关。 通过 Sniffer 抓包,可以抓到:  
  • 热度 26
    2015-4-8 20:47
    1891 次阅读|
    0 个评论
        Odyssey Max 10 IOT Evaluation Kit 是来自世界著名分销商品牌 Macnica 的一款开发套件,我从同事手上拿到了这个开发套件,终于见识到传说中的 MAX 10 ,这是 Altera 公司最新的第十代 FPGA 产品, Max 10 具有非易失性,内部集成双配置闪存,模拟 ADC ,内部振荡器, NIOS II 软核, DSP 模块, PLL ,外部存储器接口等功能,现在的芯片集成度越来越高,也许未来都不需要设计 PCB ,只要芯片 +sensor 就可以完成设计。     Odyssey Max 10 IOT Evaluation Kit 抓住了一个很时髦的概念 IOT ( Internet of things )万物皆互联,的确我们身处工业 4.0 时代。 Odyssey Max 10构成 Odyssey Max 10 系统框图 Odyssey Max 10 刚拿到手的时候超乎我的想象,它是如此之小,果然如 Altera 宣传的那样,减小电路板面积(达到 50% )。 Odyssey Max 10 采用的部分电源芯片是 Altera 自家的 Enpirion , Enpirion 是业界第一款具有集成电感的电源芯片系统( PowerSOC ) DC-DC 转换器系列产品。 Enpirion 特性 功率密度最大,外形封装最小 高效和热性能 组件数量最少,可靠性更高 使用方便的设计,产品快速面试 采用 PowerPlay 早期功耗估算器工具,自动选择最优 Enpirion 产品 从特性来看, Enpirion 还是很有竞争力的。   PS :大概半年多没有 updata 自己的博客了,去年年底离开了上家从事北斗行业的公司,进入了一家分销商企业,开始了全新职业 FAE 。毕业做了两年 RD 一个偶然的契机得到了一份 FAE 的 offer ,目前工作了一个多月,这份工作让我对 FAE 有了一个全新的认识。