BLE4.0之自定义服务(CC2541)

1.什么是服务

  蓝牙通信中,我们就是需要对各个服务中的特征值进行交流,现在尝试自定义一个服务。

2.创建TEMProfile.c、TEMProfile.h

  这是服务的主体文件。

  其里面大致无非是定义特征值,创建读写值的函数,注册函数,增添服务函数,以及包装一些回调函数。

  具体如下。

  (1)所有定义的变量其实都是和特征值相关的,具体详见上篇文章:http://www.cnblogs.com/asam/p/6535374.html

  (2)创建函数

     需要创建的函数如下:

全局函数:

      

extern  bStatus_t TEMProfile_GetParameter(  uint8 param,  void  *value);
extern  bStatus_t TEMProfile_SetParameter(  uint8 param, uint8 len,  void *value);
extern  bStatus_t TEMProfile_RegisterAppCBs(  TEMProfileCBs_t *appCallback);
extern  bStatus_t TEMProfile_AddService(  uint32  services  );

本地函数:

 

static  uint8 TEMProfile_ReadAttrCB(uint16 connHandle, gattAttribute_t *pAttr,uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen  );

static  bStatus_t TEMProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
                                    uint8 *pValue, uint8 len, uint16 offset );
static  void  TEMProfile_HandleConnStatusCB(  uint16  connHandle, uint8 changeType  );

==小注解===============================================================================

  其中读写的四个函数在此前已经见过。

  这两个回调函数 TEMProfile_ReadAttrCB(),TEMProfile_WriteAttrCB(),是封装在一起的。

  

  

  跟踪下去,发现其是在ADDService函数中被调用,这个函数是一开始任务初始化时,调用的。

  

  故猜想,大概是这个回调函数的指针在初始化增添服务的时候,已经被记录,当通信时其他设备请求读写这个服务时才调用到两个函数。

======================================================================================  

  除了四个认识的,还有两个服务初始化用的函数

  bStatus_t TEMProfile_RegisterAppCBs(  TEMProfileCBs_t *appCallback);
  bStatus_t TEMProfile_AddService(  uint32  services  ); 这两个在任务初始化时,被调用。 前者调用的是在应用层写的。具体后面再讲。

 3.应用层的相关代码    

    (1)添加头文件 #include "XXXprofile.h"

     (2)服务初始化

      在应用层simpleBLEPeripheral.c中的SimpleBLEPeripheral_Init()函数中,增添

 1   //Templete_Service
 2   TEMProfile_ADDService(GATT_ALL_SERVICES);
 3   // Set the TEMProfile Characteristic Values
 4
 5   uint8 TEMProfile_Char1Vaule=1;
 6   uint8 TEMProfile_Char2Value[TEMPROFILE_CHAR2_LEN]="2017.03.11\0";
 7   TEMProfile_SetParameter(  TEMPROFILE_CHAR1, sizeof(uint8),  &TEMProfile_Char1Vaule );
 8   TEMProfile_SetParameter(  TEMPROFILE_CHAR2, TEMPROFILE_CHAR2_LEN,  TEMProfile_Char2Value );
 9
10   //register
11   VOID TEMProfile_RegisterAppCBs(&simpleBLEPeripheral_TEMProfileCBs);

      这时就用到了上面说的两个函数。

      TEMProfile_RegisterAppCBs是注册回调函数。simpleBLEPeripheral_TEMProfileCBs()在WriteAtrr中被调用。被调用的那个函数的含义是当特征值变化时则做出相应动作。但具体依然不理解。

    (3)定义回调函数

 1 static void simpleProfileChangeCB( uint8 paramID )
 2 {
 3   uint8 newValue;
 4
 5   switch( paramID )
 6   {
 7     case SIMPLEPROFILE_CHAR1:
 8       SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, &newValue );
 9
10       #if (defined HAL_LCD) && (HAL_LCD == TRUE)
11         HalLcdWriteStringValue( "Char 1:", (uint16)(newValue), 10,  HAL_LCD_LINE_3 );
12       #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
13
14       break;
15
16     case SIMPLEPROFILE_CHAR3:
17       SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &newValue );
18
19       #if (defined HAL_LCD) && (HAL_LCD == TRUE)
20         HalLcdWriteStringValue( "Char 3:", (uint16)(newValue), 10,  HAL_LCD_LINE_3 );
21       #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
22
23       break;
24
25     default:
26       // should not reach here!
27       break;
28   }
29 }

 

(4)包装一下回调函数

1 static TEMProfileCBs_t simpleBLEPeripheral_TEMProfileCBs =
2 {
3 TEMProfileChangeCB
4 };

 

至此,完成一个服务的建立

时间: 2024-08-25 11:39:58

BLE4.0之自定义服务(CC2541)的相关文章

BLE4.0之新增特征值(CC2541)

注:(本文基于我自己定义的一个服务TEMProfile,但适用其他服务) 1.特征值是什么 一个蓝牙协议栈中,包含了多个服务,一个服务里又包含了多个特征值,每个特征值都有其相关的一些信息. 我们与蓝牙进行通信的时候,就是通过读写这些特征值,来获得数据. 2.特征值的属性 一个特征值里面基本需要的变量是-- 1.UUID码   2.权限属性 :基本就是 可读.可写.可通知这些了.(通知是表示允许数据主动发送) 3.内容 4.描述:这个特征值的名称 3.属性表 一个服务里,所有的特征值中的每个变量都

【Android】16.0 第16章 自定义服务和系统服务—本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 本章主要演示Started Service.带Intent过滤器的Started Service.IntentService的基本用法,并简单介绍Android提供的系统服务. 二.本章示例主界面 1.运行截图 2.MainActivity.cs文件中对应的代码 chItems.Add(new Chapter() { ChapterName = "第16章 自定义服务和系统服务", ChapterIt

IOS BLE4.0蓝牙和外设连接和收发数据的流程

前言: 苹果在IOS 6系统之后开始支持BLE 4.0,iPhone4s,iPod 5,iPad 3等之后的机型开始内嵌BLE4.0硬件,因此在开发前请先确认你的开发环境符合上述要求,并且苹果在BLE4.0之后,对外部的连接设备已经不在需要MFI认证了,当然你的外设肯定得要有蓝牙4.0模块了 综述: 开发BLE4.0的App,你需要在你的项目里面导入框架: CoreBluetooth.framework 在需要使用到蓝牙的文件里面你需要导入头文件: #import <CoreBluetooth/

Android BLE与终端通信(五)——Google API BLE4.0低功耗蓝牙文档解读之案例初探

Android BLE与终端通信(五)--Google API BLE4.0低功耗蓝牙文档解读之案例初探 算下来很久没有写BLE的博文了,上家的技术都快忘记了,所以赶紧读了一遍Google的API顺便写下这篇博客心得 Google API:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html#terms 其实大家要学习Android的技术,Google的API就是最详细的指导书了,而且通俗易懂,就算看不懂

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接,可以看到什么样的效果 package com.lgl.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; publ

angularJs 自定义服务 provide 与 factory 的区别

<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8" /> <title>Document</title> <script src="angular.min.js" ></script> <script type="t

angularJs自定义服务(实现签名和加密)

写在前面: angularJS是google公司主推的js开发优秀框架... 页面展示: 在应用中进行加密是普遍存在的,个人建议在前端实现加密签名(前端加密是否必要来自知乎:http://www.zhihu.com/question/25539382) 对base64.md5.sha1加密算法简单解释: 1.base64是可逆的.对称的加密算法:base64具有64个基本字符组成的基本字符集 base64加密原理: a.base64以3个字节为一组,而一个字节占8个位(bit) b.再把24bi

深究AngularJS——自定义服务详解(factory、service、provider)

前言 3种创建自定义服务的方式. Factory Service Provider 大家应该知道,AngularJS是后台人员在工作之余发明的,他主要应用了后台早就存在的分层思想.所以我们得了解下分层的作用,如果你是前端人员不了解什么是分层,那么你最好问问你后台的小伙伴. dao层:就是Model层,在后台时,这一层的作用,就要是写与数据库交互数据的一层,在angularJS里就主要是写ajax的. service层:主查写逻辑代码的,但在angularJS里也可以持久化数据(充当数据容器),以

Android系统在新进程中启动自定义服务过程(startService)的原理分析

在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务.在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的. 在主进程调用startService函数时,会通过Binder进程间通信机制来