Browsed by
分类:Android

测试markdown笔记

测试markdown笔记

标题

在单行代码,情况如hello world这样

在多行代码时,如下:

代码块
第二行
如果使用markdown渲染会怎么
BLE-1-GATT

BLE-1-GATT

参考:《GATT Profile 简介

1,Overview

从《BLE-0-Get Starting》了解到,GATT是基于ATT协议定义的一种通信规范(Profile);
GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。

2,GAP与GATT

两个BLE设备进行数据通信,必须经过“发现与连接”阶段和“数据传输”阶段的两个阶段
“发现与连接”阶段: 使用GAP(Generic Access Profile)这个规范
“数据传输”阶段:使用GATT(Generic Attibute)这个规范

3,GAP

3.1,角色
GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。
外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等。
3.2,广播过程
一般来说,外围设备发送Advertising Data Payload(广播数据)而中心设备发送 Scan Response Data Payload(扫描回复)
adv_proc

4,数据通信过程

GattMasterSlaveTransactions

5,几种说法

说法一:如果通信是单向(外围设备-》中心设备),可以不经过连接;双向通信必须要连接走GAPP
=》即使用GAP的广播即即可,苹果的iBeacon应用
BroadcastTopology
说法二:一个外围设备可以被多个中心设备连接吗?
不可以!
GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。
说法三:一个中心设备可以连接多个外围设备吗?
可以!
一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设
ConnectedTopology


BLE-0-基本概念

BLE-0-基本概念

控制器与主机

从整体结构上,蓝牙可分为控制器 (Controller) 和主机 (Host) 两部分。
控制器包括了PHY、 Baseband、 Link Controller、 Link Manager、 Device Manager、 HCI 等模块,用于硬件管理、链路管理等等;
主机则包括了 L2CAP、 SMP、 SDP、 ATT、 GATT、 GAP 以及各种规范,构建了向应用层提供接串口的基础。
主机 ——HCI——控制器

Bluedoid与BlueZ

都是属于蓝牙主机的框架,或者说协议栈;
ESP-IDF 默认蓝牙主机框架是BLUEDROID;
Android 4.2 之前,Google 一直应用的是 Linux 官方蓝牙协议栈BlueZ,之后,推出了它和博通公司一起开发的 BlueDroid 以替代 BlueZ。

ATT与GATT

属性(ATT),通用属性(GATT)
属性(ATT),通用属性(GATT) =》ATT是属性协议(Protocol)而GATT是规范(Profile)名称
 GATT 规范则定义了如何用特性值和描述符表示一个数据,如何把相似的数据聚合成服务 (Service),以及如何发现对端设备拥有哪些服务和数据。



服务端与客户端

这个是GATT中的概念,一般来说BLE设备是是服务器,而手机是客户端

属性(Attibute)

 BLE 中的最小数据存储单位:即属性(Attibute)

特性(Characteristics)

GATT协议的数据表示方式为:特性(Characteristics),特性也有UUID,实际上,和 BLE 外设打交道,主要是通过 Characteristic

服务(Service)

多个相类似的特性值(Characters)和描述符(Descriptor)=》服务(Service),服务也有UUID,
比如:把电池相关的特性定义成电池服务 (Battery Service),其中包括电池电量,电池的温度等等。

规范(Profile)

蓝牙的规范有:A2DP、SPP、GATT。主要分为传统的和4.0的。
传统的规范有:A2DP、SPP、等
BLE以后的规范有:GATT

关系

一个profile有很多的服务,一个服务又有很多的特性,一个特性中又有几种属性条目组成。属性是由属性句柄,属性类型(UUID),属性值和属性许可组成

BLE蓝牙与传统蓝牙

兼容性

之间相互不兼容,BLE只能与BLE连接,传统只能和传统连接,但双模可以和BLE也可谓和传统蓝牙。
一般来说,所有手机的模块都是双模蓝牙,Android4.3和苹果4S以上才能支持BLE。

功率与传输距离

传统蓝牙有3个功率级别,Class1,Class2,Class3,分别支持100m,10m,1m的传输距离,
而低功耗蓝牙无功率级别,一般发送功率在7dBm,一般在空旷距离,达到20m

蓝牙4.0标准包含两个蓝牙标准,但部署支持单模和双模两种。

经典蓝牙支持音频(HFP/HSP, A2DP)和数据(SPP, HID, OPP, PBAP等)两大类协议;
而BLE蓝牙不支持音频协议及受数据传输速度限制。

传统的一般通过socket方式,而低功耗蓝牙是通过Gatt协议来实现。

AndroidStudio 3.0 NDK开发2-AAR模块封装

AndroidStudio 3.0 NDK开发2-AAR模块封装

完成了对JNI的编译,有时候是使用aar包提供给其他同学使用;或者说在共同开发的一个项目中,并不是每个人都需要开发C、C++功能。所以没必须每台电脑都配置好NDK的编译环境,所以大多数还是以AAR包的方式放在项目中。我们接下来就是完成这个事件;

JNI部分抽象成Module

第一步,file->new->new module

Read More Read More

AndroidStudio 3.0 NDK开发1-环境搭建与编译

AndroidStudio 3.0 NDK开发1-环境搭建与编译

前提

JNI开发主要有两种方式,一种是在Android源码中编译,另外一种是使用AndroidStuido工具开发。主要是看自己的业务场景。
如果你们公司是平台型开发方式,很容易或者当前就是在Android源码中做项目,推荐使用第一种方式,有Swig工具的加持也是效率很高;
如果公司是偏APP开发,得要适配不同平台,建议使用AndroidStudio工具来开发。本文讲这种方式。
使用AndroidStudio编译C/C++主要有两种方式:CMake和ndk-build
CMake:需要自己编写cmake.txt规则,使用CMake工具来编译;
ndk-build:需要自己编译Android.mk文件,使用ndk-build工具来编译。
因为Android源码是使用Android.mk来编译,所以我更习惯使用ndk-build这种方式。西方是讲这种方式。

Prepare

源码Android SDK快速迭代,JNI在AndroidStudio不同版本上使用有较大的区别,我这贴出我使用AndroidStudio相关版本的情况
OS Windows 10 10.0
NDK 17.2
JDK JRE: 1.8.0_152-release-915-b01 amd64
AndroidStudio IDE Android Studio 3.0
Build #AI-171.4408382, built on October 21, 2017
gradlewrap 版本 gradle-4.4-all.zip
AS gradle插件 com.android.tools.build:gradle:3.0.0

Starting

1,安装NDK,CMake,LLDB
2,编写并编译JAVA代码
第一步,在自己的项目中新建Java Class: MyJniTest.java
package com.aispeech.aistools.jni;

/**
 * @Author: Gangfeng Xu(gangfeng.xu@aispeech.com)
 * @Date: 9/14/2018
 */

public class MyJniTest {
    static {
        System.loadLibrary("hello-jni");
    }
    public native String getJniVersionName();

}
第二步,Ctrl + F9 make项目
第三步,在app/build目录找到这个类的class文件
第四步,生成头文件
第一种:进到debug目录,执行命令生成头文件
C:\Users\koffuxu\02-sulab\aispeech-tools\app\build\intermediates\classes\debug>javah -jni com.aispeech.aistools.jni.MyJniTest

C:\Users\koffuxu\02-sulab\aispeech-tools\app\build\intermediates\classes\debug>dir
 Volume in drive C has no label.
 Volume Serial Number is 09C1-B27D

 Directory of C:\Users\koffuxu\02-sulab\aispeech-tools\app\build\intermediates\classes\debug

09/14/2018  05:05 PM    <DIR>          .
09/14/2018  05:05 PM    <DIR>          ..
09/14/2018  04:58 PM    <DIR>          android
09/14/2018  04:58 PM    <DIR>          androidx
09/14/2018  04:58 PM    <DIR>          com
09/14/2018  05:05 PM               567 com_aispeech_aistools_jni_MyJniTest.h
               1 File(s)            567 bytes
               5 Dir(s)  173,480,382,464 bytes free
第二种方法:进入需要创建的模块main下面,其实是一样的,只是这种方法看起来更合规,并且省掉了第五步
C:\Users\koffuxu\02-sulab\aispeech-tools\usbrcvoicelib\src\main>javah -d jni -classpath C:\Users\koffuxu\02-sulab\aispeech-tools\usbrcvoicelib\build\intermediates\classes\debug com.aispeech.usbrcvoicelib.nativeutils.UsbVoiceManager
第五步,创建JNI文件夹,位于java的同级目录
第六步,把第四步生成的.h文件copy到这个文件夹,同时创建my_jni_test.c文件和Android文件
内容如下:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni   #指定了生成的动态链接库的名字
LOCAL_SRC_FILES := my_jni_test.c #指定了C的源文件叫什么名字

include $(BUILD_SHARED_LIBRARY)  # 制定要生成动态链接库
my_jni_test.c
#include "com_aispeech_aistools_jni_MyJniTest.h"
JNIEXPORT jstring JNICALL Java_com_aispeech_aistools_jni_MyJniTest_getJniVersionName
  (JNIEnv * env, jobject obj) {
        return (*env)->NewStringUTF(env, "Hello , I'm from JNI");
  }
第七步,添加编译项目
在app下面的build.gradule添加
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
或者通过IDE添加
第八步,编译完成,将看到不同平台的so文件
第九步,验证
在MainActivity.java里面调MyJniTest的方法,编译,安装验证
Log.e(TAG, "initDate: Jni version="+new MyJniTest().getJniVersionName());
打印查看

多平台支持

如果需要支持更多平台,比如Mips,需要在jni的目录添加Application.mk添加相差参数
APP_ABI := armeabi-v7a arm64-v8a
CPU 和架构 设置
ARMv5TE armeabi
ARMv7 armeabi-v7a
ARMv8 AArch64 arm64-v8a
i686 x86
x86-64 x86_64
mips32 (r1) mips
mips64 (r6) mips64
全部 all
还可以使用ndk-build命令
获得头文件:javah -d jni -classpath C:\Users\koffuxu\02-sulab\aispeech-tools\usbrcvoicelib\build\intermediates\classes\debug com.aispeech.usbrcvoicelib.nativeutils.UsbVoiceManager
获取签名:javap -s 包名.方法所在的Java类名
参考
TOP