精华内容
下载资源
问答
  • SimpleSerial协议和ChipWhisperer 可以在找到有关SimpleSerial V2协议的更多信息。 有关ChipWhisperer框架的更多信息,请参见。 用法 可以根据自己的main.c调整main.c来实现自己的算法。 然后,可以通过在根目录...
  • 在0.7.0 版本基础上添加终端显示log 时间戳功能,并保存在文件里
  • Serial ATA 3.0 协议

    2016-08-12 10:10:05
    SATA3.0协议,适合初始接触SATA者使用。也可以作为参考资料。
  • SerialATA协议的详细说明文档,对于学习串行ATA有很大帮助
  • 主要介绍下蓝牙协议栈 串口协议(bluetooth SPP)Serial Port Profile 协议概念介绍。 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些...

    零. 概述

    主要介绍下蓝牙协议栈(bluetooth stack) 串口协议(bluetooth SPP)Serial Port Profile 协议概念介绍。

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

    第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

    第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

    第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二. 蓝牙串口SPP(Serial Port Profile)协议介绍

    2.1 概念介绍

    SPP是Serial Port Profile(串口协议)的缩写,其定义了使用蓝牙进行RS232(或类似)串行电缆仿真的设备应使用的协议和过程。简单来说就是在蓝牙设备之间建立虚拟的串口进行数据通信。说白了就是可以两个设备对端发送自定义数据,NOTED:苹果不支持SPP协议。

    目前SIG最新的版本是V1.2,之前更早的版本在官网只有V1.1可以下载到,但是这两份文档没有功能上的差别,所以不做介绍

    2.2 SPP协议在整个蓝牙中的架构图如下

    2.3 角色介绍

    Device A (DevA) – This is the device that takes initiative to form a connection to another device

    Device B (DevB) – This is the device that waits for another device to take initiative to connect.

    说白了就是就是两台设备连接,谁发起的连接角色就是Device A,被连接的就是Device B,但是这个和其他协议不同,两台设备之前的code基本都是一样,角色只是区分两台设备。

    2.4 SPP特性

    Device A是发起连接的主动房,所以Device A要至少支持Establish link and set up virtual serial connection.,Device B是被连接的乙方,所以要至少支持Accept link and establish virtual serial connection和Register Service record for application in local SDP database.以便Device A查询服务并且连接,但是此协议漏掉最主要的两个功能,发送数据,接收数据,或者SIG是觉得rfcomm做到了这个功能,所以不写在SPP协议中吧,但是我还是决定要在SPP介绍收发功能。

    2.4.1 Establish link and set up virtual serial connection.

    This procedure refers to performing the steps necessary to establish a connection to an emulated serial port (or equivalent) in a remote device. The steps in this procedure are:

    1)Submit a query using SDP to find out the RFCOMM Server channel number of the desired application in the remote device. This might include a browsing capability to let the user select among available ports (or services) in the peer device. Alternatively, if it is known exactly which service to contact, it is sufficient look up the necessary parameters using the Service Class ID associated with the desired service.

    2)Optionally, require authentication of the remote device to be performed. Also optionally, require encryption to be turned on.

    3)  Request a new L2CAP channel to the remote RFCOMM entity.

    4)  Initiate an RFCOMM session on the L2CAP channel.

    5)  Start a new data link connection on the RFCOMM session, using the aforementioned server channel number.After step 5, the virtual serial cable connection is ready to be used for communication between applications on both sides.

    2.4.2 Accept link and establish virtual serial connection.

    This procedure refers to taking part in the following steps:

    1)If requested by the remote device, take part in authentication  procedure and, upon

    further request, turn on encryption.

    2)  Accept a new channel establishment indication from L2CAP.

    3)  Accept an RFCOMM session establishment on that channel.

    4)  Accept a new data link connection on the RFCOMM session. This may trigger a local request to authenticate the remote device and turn on  encryption, if the user has required that for the emulated serial port being connected to (and authentication/encryption procedures have not already been carried out).

    2.4.3 Register Service record for application in local SDP database.

    This procedure refers to registration of a service record for an emulated serial port (or equivalent) in the SDP database. This implies the existence of a Service Database, and the ability to respond to SDP queries.

    NOTED:SPP只有安卓手机支持,并且部分安卓手机必须有SPP APP才可以连接,iphone手机不能直接SPP,但是又一个替代协议IAP,此协议需要买MFI chip才能用

    2.5 SDP相关的注册

    我看下我们的SDP注册:

    static const uint8_t spp_service_record[] =
    {
    	/* 1.ServiceClassIDList */
        SDP_DES_SIZE8, 0x8,
        SDP_UINT16, BT_ATTRIBUTE_SERVICE_CLASS_ID_LIST>>8&0xff, BT_ATTRIBUTE_SERVICE_CLASS_ID_LIST&0xff, /* Service class ID list attribute */
                SDP_DES_SIZE8, 3,
                SDP_UUID16, BT_SERVICE_CLASS_SERIAL_PORT>>8&0xff, BT_SERVICE_CLASS_SERIAL_PORT&0xff,
    
    	/* 2.ProtocolDescriptorList */
                SDP_DES_SIZE8, 0x11,
                SDP_UINT16, BT_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST>>8&0xff, BT_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST&0xff,/* Protocol descriptor list attribute */
                SDP_DES_SIZE8, 0xc,
                SDP_DES_SIZE8, 0x3,
                SDP_UUID16, BT_PROTOCOL_L2CAP>>8&0xff, BT_PROTOCOL_L2CAP&0xff, /*L2CAP*/
                SDP_DES_SIZE8, 0x5,
                SDP_UUID16, BT_PROTOCOL_RFCOMM>>8&0xff, BT_PROTOCOL_RFCOMM&0xff, /*RFCOMM*/
                SDP_UINT8, RFCOMM_SPP_SERVER_CHNL, /*RFCOMM channel*/
    
    	/* BluetoothProfileDescriptorList */
                SDP_DES_SIZE8, 0xd,
                SDP_UINT16, BT_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST>>8&0xff, BT_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST&0xff, /* profile descriptor List */
                SDP_DES_SIZE8, 0x8,
                SDP_DES_SIZE8,0x06,
                SDP_UUID16,BT_SERVICE_CLASS_SERIAL_PORT>>8&0xff, BT_SERVICE_CLASS_SERIAL_PORT&0xff,
                SDP_UINT16,0x01,0x02,		/* V1.2 */
    };

     

    展开全文
  • Serial synchronus Interface 协议
  • Python的Serial串口通讯协议

    千次阅读 2019-07-17 11:26:15
    Python的Serial串口通讯协议 一、概述 pyserial模块封装了对串口的访问。 二、特性 在支持的平台上有统一的接口。 通过python属性访问串口设置。 支持不同的字节大小、停止位、校验位和流控设置。 可以有或者没有...

    Python的Serial串口通讯协议

    一、概述
    pyserial模块封装了对串口的访问。

    二、特性
    在支持的平台上有统一的接口。
    通过python属性访问串口设置。
    支持不同的字节大小、停止位、校验位和流控设置。
    可以有或者没有接收超时。
    类似文件的API,例如read和write,也支持readline等。
    支持二进制传输,没有null消除,没有cr-lf转换。

    三、系统要求
    python 2.3及以上版本,包括py3k。

    四、使用方法和实例

    1、导入pyserial模块

    import serial
    

    2、打开串行口的范例

    // 打开串口0, 9600,8N1,连接超时0.5秒
    import serial
    ①选择设备
    ser=serial.Serial("/dev/ttyUSB0",9600,timeout=0.5) #使用USB连接串行口
    ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5) #使用树莓派的GPIO口连接串行口
    ser=serial.Serial(1,9600,timeout=0.5)#winsows系统使用com1口连接串行口
    ser=serial.Serial("com1",9600,timeout=0.5)#winsows系统使用com1口连接串行口
    ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系统使用com1口连接串行口
    print (ser.name)#打印设备名称
    print (ser.port)#打印设备名
    ser.open()
    #打开端口
    s = ser.read(10)#从端口读10个字节
    ser.write("hello")#向端口写数据
    ser.close()#关闭端口
    
    data = ser.read(20) #是读20个字符
     
    data = ser.readline() #是读一行,以/n结束,要是没有/n就一直读,阻塞。
    data = ser.readlines()和ser.xreadlines()#都需要设置超时时间
    ser.baudrate = 9600 #设置波特率
    ser.isOpen() #看看这个串口是否已经被打开
    

    3、获得串行口配置或属性

    串行口的属性:

    name:设备名字
    portstr:已废弃,用name代替
    port:读或者写端口
    baudrate:波特率
    bytesize:字节大小
    parity:校验位
    stopbits:停止位
    timeout:读超时设置
    writeTimeout:写超时
    xonxoff:软件流控
    rtscts:硬件流控
    dsrdtr:硬件流控
    interCharTimeout:字符间隔超时
    

    ①属性

    属性的使用方法:

    ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)
    
    
    
    ser.open()
    print (ser.name)
    print (ser.port)
    
    print (ser.baudrate)#波特率
    print (ser.bytesize)#字节大小
    print (ser.parity)#校验位N-无校验,E-偶校验,O-奇校验
    print (ser.stopbits)#停止位
    print (ser.timeout)#读超时设置
    print (ser.writeTimeout)#写超时
    print (ser.xonxoff)#软件流控
    print (ser.rtscts)#硬件流控
    print (ser.dsrdtr)#硬件流控
    print (ser.interCharTimeout)#字符间隔超时
    
    ser.close()
    

    4、设置串行口状态

    需要用的常量

    bytesize:FIVE BITS、SIXBITS、SEVENBITS、EIGHTBITS
    parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
    stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
    

    异常:

    ValueError:参数错误
    SerialException:找不到设备或不能配置
    ser.baudrate=9600#设置波特率
     
    ser.bytesize=8#字节大小
     
    ser.bytesize=serial.EiGHTBITS#8位数据位
     
    
    ser.parity=serial.PARITY_EVEN#偶校验
    ser.parity=serial.PARITY_NONE#无校验
    ser.parity=serial.PARITY_ODD#奇校验
     
    
    ser.stopbits=1#停止位
    ser.timeout=0.5#读超时设置
    ser.writeTimeout=0.5#写超时
    ser.xonxoff#软件流控
    ser.rtscts#硬件流控
    ser.dsrdtr#硬件流控
    ser.interCharTimeout#字符间隔超时
    

    5、Readline方法的使用
    是读一行,以/n结束,要是没有/n就一直读,阻塞。

       使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。如果没有超时,readline会报异常。
    

    6、serial.Serial类——原生端口

    class serial.Serial
    {
        __init__(port=None, baudrate=9600, bytesize=EIGHTBITS,parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
    }
        #其中:
        # bytesize:FIVEBITS、SIXBITS、SEVENBITS、EIGHTBITS
        # parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
        # stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
        #异常:
        #ValueError:参数错误
        #SerialException:找不到设备或不能配置
    
        open():打开串口
     
        close():立即关闭串口
     
        __del__():析构函数
     
        read(size=1):从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。
     
        write(data):发送data,并返回发送字节数。如果bytes和bytearray可用(python 2.6以上),则接受其作为参数;否则接受str作为参数。
        #异常:SerialTimeoutException——配置了写超时并发生超时时发生此异常。
     
        inWaiting():返回接收缓存中的字节数
     
        flush():等待所有数据写出。
     
        flushInput():丢弃接收缓存中的所有数据
     
        flushOutput():终止当前写操作,并丢弃发送缓存中的数据。
     
        sendBreadk(duration=0.25):发送BREAK条件,并于duration时间之后返回IDLE
     
        setBreak(level=True):根据level设置break条件。
     
        setRTS(level=True)
     
        setDTR(level=True)
     
        getCTS()
     
        getDSR()
     
        getRI()
     
        getCD()
     
        #只读属性:
        name:设备名字
        portstr:已废弃,用name代替
        port:读或者写端口
        baudrate:波特率
        bytesize:字节大小
        parity:校验位
        stopbits:停止位
        timeout:读超时设置
        writeTimeout:写超时
        xonxoff:软件流控
        rtscts:硬件流控
        dsrdtr:硬件流控
        interCharTimeout:字符间隔超时
     
        #端口设置可以被读入字典,也可从字典加载设置:
        getSettingDict():返回当前串口设置的字典
        applySettingDict(d):应用字典到串口设置
     
        #对提供io库的系统(python 2.6或以上),Serial从io.RawIOBase派生。对其它系统,从FileLike派生。
     
        #异常:
        exception serial.SerialException
        exception serial.SerialTimeoutException
     
        #常量:
        serial.VERSION:pyserial版本
     
        #模块函数和属性:
        serial.device(number)
     
        serial.serial_for_url(url, *args, **kwargs)
     
        serial.protocol_handler_packages()
     
        serial.to_bytes(sequence):接收一个字符串或整数列表sequence,返回bytes实例
    }
    

    感谢前辈:https://www.cnblogs.com/ScarecrowMark/p/10777235.html

    展开全文
  • Universal Serial Bus Specification:USB协议规范 .嵌入式开发
  • Serial-Ethernet通信协议

    2015-11-13 11:15:22
    不好意思,刚才被老板叫住叫别的了。文档简单涉及的命令也不多,但注意不要频繁广播,以免造成网络压力
  • 基于FPGA的Serial RapidIO协议的设计与实现.pdf
  • USB PD3.0+PPS协议标准 英文版《Universal Serial Bus Power Delivery Specification 》,详细介绍USB PD3.0充电协议,快充协议实现原理 。PDF带书签。
  •  GDB Remote Serial Protocol——GDB的标准远程通信协议。    当你已经熟悉你的处理器是如何处理断点和其他异常时,再了解一点基本的远程穿行通信协议的知识,你就可以在你的嵌入式平台上实现与主机GDB的通信。...

    简介

          GDB Remote Serial Protocol——GDB的标准远程通信协议。

     

           当你已经熟悉你的处理器是如何处理断点和其他异常时,再了解一点基本的远程穿行通信协议的知识,你就可以在你的嵌入式平台上实现与主机GDB的通信。(即远程调试)

       

    协议定义

            GDB RemoteSerial Protocol(RSP)是一种简单的,通过串口线、网络等至少支持半双工通信的媒介进行ASCII消息传输的协议。

            RSP包以$符号作为数据包的开始,后跟一个或多个用于组成要发送的消息的ASCII字节,并以#作为数据包的结束。再#后,还有两个16进制的ASCII字符作为要发送的消息的校验和。一个完整的RSP协议数据包如下:

     

    $m4015bc,2#5a

     

            消息的接收方会立即返回‘+’表示正确接收数据,或‘-’表示没有正确接收数据。当返回‘-’时,GDB会将错误码返回给用户,并无条件挂起GDB进程。

    目标机按接收到的指令次序,依次将信息输出在GDB的console中。除非GDB进程中有其他的命令正在执行,否则来自目标机的信息将会在任意时刻输出在console中。

     

    RSP必须实现的命令

           根据功能划分,可将GDB发送来的信息,分成三种命令:寄存器相关(register-)、内存相关(memory-based)和程序控制命令。

     

    寄存器相关

           主要是对寄存器进行读、写操作。

     

         读寄存器组:(“g”)

           eg:$g#67

     

           当GDB想获取当前目标机的寄存器信息时,就会像目标机发送(“g”)命令,目标机会返回如下信息:

     

           +$123456789abcdef0…#xx

           (Register 0 的值为0x12345678,1 的值为0xabcdef0….等等)

     

           目标机根据平台的大小端返回相应的字节流,关于大小端的定义,可以在目标平台的gdb宏文件中找到,eg:gdb/config/<arch>tm-<arch>.h (不同版本可能不一样,我就没找到)

     

         写寄存器组:(“G”)

           eg:$G123456789abcdef0…#xx

         (设置register0 的值为0x12345678,1 为 0xabcdef0…等等)

     

           使用这个命令,GDB会在程序恢复运行前,按照平台的字节序将数据存储在相应的寄存器中。同时目标平台也会回应给GDB反馈信息,如成功返回+$OK#9a。

     

         写寄存器:(“P”)

           eg:$p10=0040149c#b3

         (设置16号寄存器的值为0x40149c)

     

           当GDB仅仅想设置一个或二个寄存器时,GDB会发送这条指令(代替(“G”)命令)给目标机。寄存器的号与读写寄存器组的号是一样的。同时,若成功,目标机会返回+$OK#9a。

     

    内存相关

     

          读内存:(“m”)

            eg: $4015bc,2#5a

           (从0x4015bc这个地址开始读2个字节的数据)

     

            GDB发送的读命令会确定局部变量和全局变量的值,并用断点指令替代opcode,及其他用户需要的信息。GDB是知道目标平台的大小端的,因此目标机只需返回字符流即可,GDB会适当的对它们进行重组。

            目标机的调试桩根据目标机的数据宽度对读写内存指令进行了优化,例如日立SH-2处理器的外设配置寄存器只能通过16位/32位进行读写。因此,在任何时刻,调试桩都只用16位/32位进行访问。目标机会返回如下信息:

     

            +$2f86#-06

     

          写内存:(“M”)

            eg:M4015cc,2:c320#6d

          (向地址0x4015cc写入数据0xc320)

      

            如果正确,目标机返回+$OK#9a。

     

    程序控制命令

      

            程序控制命令是GDB用来控制被调试程序行为的命令。相对寄存器相关命令和内存相关命令,控制命令的实现难度大些。

     

          获取最后的信号(“?”)

            eg:$?#3f

     

            这个命令用来确定目标是如何达到当前的状态的。接收到的响应同最后的信号(“last signal”),后面会介绍。

     

     

          单步命令(“s”)

            eg:$s#73

     

            当GDB想让目标精确的执行一条汇编指令时,GDB会向目标机发送这条命令。(用户在GDB的console中输入step和stepi),接收到的响应见continue。

     

     

          继续命令(“c”)

            eg:$C#63

     

            当用户在console下执行continue命令时,GDB回向目标机发送此命令。目标机成功解析此命令后,GDB会释放控制权,使被调试目标机全速运行。

       

            调试桩除了返回“+”消息包,表示正确收到信息外,不会立即响应step和continue命令。相反,只有当下一个断点到达时,被请求的指令已经执行完(ste,p时的情况),一个异常发生,或者程序退出时,桩才进行响应。

     

            有两种方式响应这些命令:一种是简单的(“last signal”),另一种是多用途的(“expedited response”)。

     


          Last Signal 响应(“S”)

            eg:+$050#b8

     

            这是最简单的响应lastsignal(“?”)step和continue命令。“05”可以用作使用POSIX标准的signal函数的任意信号值的响应。“5”是断点异常,“10”是总线错误,等等。

     

     

          快速响应(Expeditedresponse (“T”))

            eg:$T0510:1238;F:FFE0…#xx

     

            这条信息将最后的信号响应(例子是“05”)和一些GDB可能立刻会读取的寄存器进行结合。为了在代码单步执行时,提高GDB调试性能,这条信息使GDB直接获取该寄存器的值(通常是PC和状态寄存器),避免发出读寄存器的命令。

            寄存器号的格式与读写寄存器命令相同。在这个例子中,寄存器16(hex 10)的值是0x1238,寄存器15(F hex)的值为0xffe0。

     

     

    其他命令:


          Console 输出(“O“)——可自定义的

            eg:$0x48656c6cf2c20776f726c64210a#55

           (在GDB console中输出“Hello, world!\n“)

     

            这个命令允许调试桩向GDBconsole发送文本信息。文本会被按照16进制显示在console中,并且GDB会一直输出信息,直到它遇到(‘\n’, 0xa)字符。

            这个信息通常是由目标机发起,GDB绝不会发送一个console output信息给目标机。


          空响应(““)

            当目标机调试桩遇见一个它不支持或不理解的命令时,它将返回空响应。这允许GDB选择一个替代命令如果另一个命令是有效的。

     

            eg:<an unrecognized command>

            目标机响应:+$#00

     

     

          错误响应(“E“)

            当目标机调试桩在执行命令时遇到一个错误时,它将会给GDB返回错误信息。例如总线错误或进行非法地址访问时,会生成这样的错误。

     

            eg:<a command that produces an error>

     

          目标机响应:+$E01##

            在GDB中没有任何预定义的错误码,因此当GDB接收到错误信息时,会将错误信息输出在console中,并且挂起当前进程。


    附gdb rsp通信日志开关:

    ser pagination off

    set logging on

    set logging overwrite on

    set remotedebug 1

    set remotelogfile  gdbproxy_logfile.org

    展开全文
  • 本文章主要讲下蓝牙串口协议SPP(Serial Port Profile)连接/接受数据/发送数据/断开连接的流程介绍,可能之前的写的底层文章你看的云里雾里,此小节就是开发从应用Profile层面来把整个地方串起来,让你们对协议栈有...

    零. 概述

    本文章主要讲下蓝牙串口协议SPP(Serial Port Profile)连接/接受数据/发送数据/断开连接的流程介绍,可能之前的写的底层文章你看的云里雾里,此小节就是开发从应用Profile层面来把整个地方串起来,让你们对协议栈有一个更深刻的认识。

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

    第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

    第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

    第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二. 蓝牙SPP协议连接/接受数据/发送数据/断开连接 流程介绍

    在上面章节我们铺垫了很多底层协议,可能你们看的可能会云里雾里,此章节就是开发从应用Profile层面来把整个地方串起来,让你们对协议栈有一个更深刻的认识。此小节我们每个协议只是会讲解到一次raw data分析,其他的封包你们要反复参照之前讲解的协议来分析,如果一旦搞清楚,会对蓝牙协议栈交互有一个深刻的认识

    本小节主要通过一个SPP的应用例程来测试开发板跟手机SPP交互的流程,其中流程包括:

    • 手机连接开发板
    • 手机往开发板发送SPP数据
    • 开发板往手机发送SPP数据
    • 手机主动断开连接

    分析工具:Ellisys(打开方式参照工具的使用)

    分析封包:spp连接_发送_接受_断开.log(在资料中STM32_UBUNTU_BLUETOOTH\2-蓝牙资料\蓝牙协议分析)

    设计到的工具:Android “蓝牙串口” apk(在资料中STM32_UBUNTU_BLUETOOTH\3-软件工具\bt_spp_apk)

    本分析为了简化流程,所以采用Base on pincode配对方式,如果想看SSP的配对方式,可以参照HCI章节的SSP配对

    整个流程如下(初始化部分不讲解,可以参照HCI章节的初始化流程,直接从手机连接开发板步骤说起):

    整个步骤比较复杂,我来一个个流程给你们拆解下,总结流程如下(备注:每个设备的交互流程稍有差别,但是总体框架一样,另外每个步骤含有几个子步骤,我们在后面介绍完整个流程再展开说明):

    步骤1)手机发送连接请求,开发板接受连接,然后收到连接完成事件

    步骤2)开发板主动问询手机支持的feature,手机回复开发板

    步骤3)开发板处理一些HCI command(Page scan reprtition Moide change/Max slot change/Link supervision timeout change)

    步骤4)手机发起L2CAP information request,开发板回复(Extened Feature/Fixed channel support)

    步骤5)手机主动连接SDP,然后L2CAP configure交互MTU参数

    步骤6)手机主动问询开发板SPP的SDP信息,开发板回复,问询完后手机断开SDP的连接

    步骤7)手机主动连接RFCOMM,然后L2CAP configure交互MTU参数。

    步骤8)手机主动连接RFCOMM signal通道,并且交互PN参数

    步骤9)手机发起配对请求,配对完成后芯片上报给协议栈Link Key

    步骤10)手机连接开发板SPP的RFCOMM server channel

    步骤11)开发板跟手机交互RFCOMM Modem status参数

    步骤12)开发板主动跟手机交互PnP SDP参数(此部分是DID协议部分,暂时略过)

    步骤13)手机主动发送SPP字符串(上层决定)

    步骤14)开发板主动发送SPP字符串(上层决定)

    步骤15)手机主动开发与开发板的连接

    下面我们就来一一分析下整个流程,

    备注:关于HCI command/event,l2cap,rfcomm,sdp封包格式我会做简短的介绍,详细的可以分别看下我之前的文章

    步骤1)手机发送连接请求,开发板接受连接,然后收到连接完成事件(HCI层面的范畴)

    整个步骤1分为以下几个小步骤组成

    用另外一种flow表示如下:

    ① 手机发起蓝牙连接,芯片收到后,发送给协议栈,相当于Remote chip -> Local Chip(Controller) -> Local BT stack(host)这个过程,在后面我们就直接说手机发起连接,协议栈收到来简化描述首先我们来看下这个event的格式。

    我们来分析下raw data

    04 0A 0A 7F 24 DF 0C 9C 0C 02 5A 01 (hex)

    04 -> HCI_Connection_Request event id

    0A -> para的长度,我们也可以看到参数部分蓝牙地址6个byte,cod 3个byte,link type 1byte

    0A 7F 24 DF 0C 9C -> 蓝牙地址(手机的)

    0C 02 5A -> cod (关于cod的分析参照我另外的一篇文章)

    01 -> link type,也就是acl

    我们来看下btsnoop工具帮我们分析的结果,可以看到跟我们一样

    ② 协议栈发送给芯片接受连接,Local芯片收到后,然后发送手机,相当于Local BT stack(host)->Local chip(Controller)->Remote chip这个过程,后续我们直接说协议栈发送给手机来简化描述。

    我们先看下这个HCI command的格式:

    我们来看下raw data

    09 04 07 0A 7F 24 DF 0C 9C 01

    09 04 -> HCI opcode ,也就是HCI_Accept_Connection_Request,我们之前也有写过怎么把OGF,OCF组装成opcode,我在这里再贴下那这个命令是OGF=1,OCF=9,

    Opcode[0] = OCF & 0xff = 0x09

    Opcode[1] = (OCF >> 8) | (OGF << 2) = 0x04,组装起来就是0x09,0x04

    07 -> para len,也就是蓝牙地址+link type的长度

    0A 7F 24 DF 0C 9C -> 蓝牙地址(手机的)

    01 -> 保持slave角色,如果是Master,那么Local stack要发送Role switch的command

    我们来看下btsnoop工具分析的结果:

    ③ 芯片发送给手机command status来表示收到的command,这个没什么好讲解的,直接就是我们发送的command的status,其他文章已经说过多次,我们不再重复

    ④ 芯片发送给手机connection complete

    我们来看下这个event的格式以及参数

    我们来分析下raw data:

    03 0B 00 4C 00 0A 7F 24 DF 0C 9C 01 00

    03 -> HCI event id

    0b -> 后续参数长度

    00 -> status success,在HCI core文档error code中有集中说明每个value代表什么意思

    4C 00 -> 连接句柄,注意,此部分重要,后续所以acl封包都会用到这个参数

    0A 7F 24 DF 0C 9C -> 蓝牙地址(手机的)

    01 -> link type ,1代表acl

    00 -> disable加密

    我们来看下btsnoop的视图分析:

    后续的HCI command/event封包我们不再一一对raw data做分析,可以举一反三,自己根据core文档分析下。

    步骤2)开发板主动问询手机支持的feature,手机回复开发板(HCI层面的范畴)

    整个步骤2分为以下几个小步骤组成

     

    ① 协议栈获取对方支持的Feature

    可以看到,此部分的HCI command的参数就是上面链接完成的连接句柄

    ② 协议栈收到芯片发送的command status

    ③ 手机发送给协议栈封包,告知协议栈手机支持的Feature

    步骤3)开发板处理一些HCI command(Page scan reprtition Moide change/Max slot change/Link supervision timeout change)(HCI协议层面范畴)

     

    Page scan等名词参照附录

    Slots可以先不用关注

    Link Supervison Timeout,大白话就是link lost的时间,在说这个timeout的时候,先来说下supervison time,比如两台设备连接,突然一台断电,可以看到另外一台并不是直接断开连接,而是过一段时间才会显示断开连接,而这个时间就是supervision time,这个supervison timeout后芯片就告知协议栈断线了·,其中检测原理我在附录中讲解

    步骤4)手机发起L2CAP information request,开发板回复(Extened Feature/Fixed channel support)(L2CAP协议层面范畴)

    整个步骤4分为以下几个小步骤组成

    ① 手机问询L2CAP information with Extened Feature Support

    我们来看下L2CAP information requese的格式(我们是用的basic mode)

    其中Information payload就是下面的

    那我们整个分析下raw data,包括L2CAP/HCI

    4C 20 0A 00 06 00 01 00 0A 02 02 00 02 00

    4C 20 -> HCl ACL header,格式如下

    Packet Boundary Flag First automatically-flushable packet(0b10)

    Broadcast Flag Point-to-point (0b00)

    然后Handle就是connection complete的0x004C,然后整个值就是4C 20

    0A 00 -> ACL数据的长度,也就是10byte

    从这里开始就是L2CAP的数据

    06 00 -> l2cap payload的长度,也就是6个byte

    01 00 -> channel id(CID)为1,也就是signal channel(L2CAP命令通道)

    0A -> L2CAP information requese code

    02 -> id,requese跟response一样

    02 00 -> 后续的长度

    后续是InfoType

    02 00 -> Extended feature supported

    下面我们来看下整个封包的btsnoop

    L2CAP的抛砖引玉到这里,后续的几个小步骤L2CAP封包自己举一反三下

    ② 给手机回复L2CAP information with Extened Feature Support的response

    ③ 手机问询L2CAP information with Fixed channel Support

    ④ 给手机回复L2CAP information with Fixed channel Support的response

    步骤5)手机主动连接SDP,然后L2CAP configure交互MTU参数(L2CAP协议层面范畴)

    ① 手机主动来连接SDP

    我们通过raw data来分析下整个连接PSM协议流程(HCI,L2CAP)

    4C 20 0C 00 08 00 01 00 02 04 04 00 01 00 52 00

    4C 20 ->

    Packet Boundary Flag First automatically-flushable packet(0b10)

    Broadcast Flag Point-to-point (0b00)

    然后Handle就是connection complete的0x004C,然后整个值就是4C 20

    0C 00 -> acl packet length

    08 00 -> l2cap basic packet length

    01 00 -> L2CAP signal通道

    下面的数据就是参照此部分格式

    02 -> l2cap connection request的code

    04 -> id,response必须跟这个一致

    04 00 -> 后续的length

    01 00 -> PSM,SDP是0x0001,后续还会有RFCOMM的PSM,所以我一起截图了

    52 00 -> source ID为0x0052,记住后面这个值,我们会用到

    我们来看下整个封包的btsnoop分析。

    ② 针对手机连接SDP回复response

    此分析流程参照其他L2CAP的分析,但是以上我们要记住一点,就是Destination cid是0x0040

    ③ 手机主动来配置MTU,我们回复

    ④ 我们主动去配置MTU,手机回复

    步骤6)手机主动问询开发板SPP的SDP信息,开发板回复,问询完后手机断开SDP的连接(SDP/L2CAP协议层面)

    分为以下几个小步骤:

    ① 手机发起SPP的相关SDP信息的问询

    我们先来看下raw data的分析(包含SDP/L2CAP/HCI)

    4C 20 18 00 14 00 40 00 06 00 00 00 0F 35 03 19 11 01 03 F0 35 05 0A 00 00 FF FF 00

    4C 20 ->

    Packet Boundary Flag First automatically-flushable packet(0b10)

    Broadcast Flag Point-to-point (0b00)

    然后Handle就是connection complete的0x004C,然后整个值就是4C 20

    18 00 -> acl packet length

    14 00 -> L2CAP basic mode的length

    40 00 -> Destination id,也就是上面L2CAP连线分配的

    后面就是SDP的数据了,SDP的数据格式是:

    06 -> SDP_SERVICE_SEARCH_ATTR_REQ

    00 00 -> TID

    00 0F -> Length

    35 03 19 11 01 -> ServiceSearchPattern,此部分是一个数据元,关于数据元的详解介绍参照我SDP相关章节的介绍

    此部分就是表示UUID 0x1101,也就是SPP

     03 F0 -> max count 1008

    35 05 0A 00 00 FF FF -> AttributeIDList:是个数据元,range是0x0000~0xffff

    00 -> ContinuationState,是0

    我们来看下btsnoop

    ② 手机回复

    此部分我们就不一一分析,可以按照前面的分析流程来做分析,btsnoop如下

    另外,为什么是这个样子呢,因为我们code中注册的是这个样子,code如图:

    注意啦:我们注册的RFCOMM server channel(scn)是8,这个值要记住,后面手机过来连接rfcomm channel的时候就是通过这个值

    ③ 手机断开SDP连接,我们回复response

    步骤7)手机主动连接RFCOMM,然后L2CAP configure交互MTU参数(L2CAP层面)

     

    此步骤L2CAP配置MTU我们在上面已经说明,所以不再重复说明,我们只来看下连接RFCOMM通道的步骤

    ① 手机过来连接RFCOMM

    ② 我们回复response

    步骤8)手机主动连接RFCOMM signal通道,并且交互PN参数(RFCOMM协议范畴)

    分为以下几个小步骤:

    ① 手机过来连接RFCOMM signal通道

    我们先来分析下raw data(RFCOMM/L2CAP/HCI):

    4C 20 08 00 04 00 40 00 03 3F 01 1C

    4C 20 ->

    Packet Boundary Flag First automatically-flushable packet(0b10)

    Broadcast Flag Point-to-point (0b00)

    然后Handle就是connection complete的0x004C,然后整个值就是4C 20

    08 00 -> acl packet length

    04 00 -> l2cap basic mode length 4 byte

    40 00 -> Destination id,就是上面l2cap rfcomm连线分配的

    下面就是RFCOMM数据了,格式如下:

    03 -> 这个是Address field,格式如下:

    0x03 = 00000011b,也就是EA=1,C/R=1,也就是command,server channel是0,也就是signal channel

    3F -> Control field,格式如下:

    0x3f = 00111111b,也就是 SABM帧,P/F=1

    01 -> length,格式如下:

    0x01 = 00000001b,也就是EA=1,7个byte表示后续的长度,也就是0,后续无长度

    1C -> FCS

    我们来看下btsnoop

    ② 我们回复

    ③ 手机过来配置PN参数,并且携带credit

    ④ 我们回复PN参数,并且携带credit

    步骤9)手机发起配对请求,配对完成后芯片上报给协议栈Link Key(HCI层面)

     

    分为以下几个小步骤:

    ① 芯片给协议栈发HCI pin code requese的event

    ② 协议栈回复pincode,芯片上报command complete event

    ③ 芯片上报给协议栈link key

    步骤10)手机连接开发板SPP的RFCOMM server channel(RFCOMM层面)

    ① 手机过来连接SPP server channel通道

    注意此部分手机过来连接的server channel就是我们SDP回复给手机的RFCOMM channel 8

    ② 我们回复

    步骤11)开发板跟手机交互RFCOMM Modem status参数(RFCOMM层面)

    此部分我们只列举一个Modem status response

    步骤12)开发板主动跟手机交互PnP SDP参数(此部分是DID协议部分,暂时略过)

    步骤13)手机主动发送SPP字符串(上层决定)(SPP层面)

    手机发送的字符串为:

    其中RFCOMM的payload就是SPP发送的数据

    我们来分析下raw data:

    4C 20 32 00 2E 00 40 00 43 FF 53 03 68 65 6C 6C 6F 2C 49 20 61 6D 20 77 69 72 65 6C 65 73 73 20 6C 69 6E 6B 20 69 6E 20 61 6E 64 72 6F 69 64 20 70 68 6F 6E 65 38

    4C 20 ->

    Packet Boundary Flag First automatically-flushable packet(0b10)

    Broadcast Flag Point-to-point (0b00)

    然后Handle就是connection complete的0x004C,然后整个值就是4C 20

    32 00 -> acl packet length,50byte

    2E 00 -> l2cap basic mode length = 46byte

    40 00 -> Destination id,也就是0x0040

    43 -> RFCOMM address

    FF -> RFCOMM control,此部分为UIH帧

    53 -> RFCOMM length

    03 -> give credit

    68 65 6C 6C 6F 2C 49 20 61 6D 20 77 69 72 65 6C 65 73 73 20 6C 69 6E 6B 20 69 6E 20 61 6E 64 72 6F 69 64 20 70 68 6F 6E 65

    -> 此部分就是我们发送的字符串

    38 -> FCS

    步骤14)开发板主动发送SPP字符串(上层决定)(SPP层面)

    我们发送的字符串为

    步骤15)手机主动开发与开发板的连接(RFCOMM/L2CAP/HCI层面)

    希望通过这篇文章能让你们熟悉蓝牙芯片跟蓝牙协议栈整个流程的交互方式!

    展开全文
  • USB转串口,USB to serial,CDC协议

    千次阅读 2013-06-17 09:44:30
    【整理】USB转串口,USB to serial,CDC协议 2013 年 3 月 6 日 下午 5:53crifan已有445人围观我来说几句 参考: Create a USB Virtual COM Port 得知很多关于CDC协议的基础知识。   其中就有,USB的CDC...
  • Serial Attached SCSI - 1.1 (SAS-1.1) 协议。较早的一个版本。可用于参考。
  • ble-serial-service BLE(Bluetooth Low Energy)串行协议服务 安装依赖 npm install 运行 ble-serial-service node main.js 连接建立后,您可以将文本数据从标准输入发送到 ble 中央设备。
  • bs2-串行协议 节点串行端口的bs2协议抽象
  • usb-serial

    2014-02-22 15:27:36
    详细介绍usb2serial协议和代码解析。
  • 工控协议数据包.zip

    2020-04-28 14:17:32
    包含多种工控协议的pcap数据包,S7和...Modbus协议最初是通过串行数据进行通信的,也就是Modbus Serial协议。随着工业现代化的发展,产生了Modbus TCP协议,即通过与TCP协议相结合来发送和接收Modbus Serial数据。
  • 串行WebSocket服务器,允许使用基于JSON-RPC 2.0的协议跨平台访问串行端口 是使用NW.js和chrome.serial API 导出的API与chrome.serial API相似。 它允许列出可用的串行端口,连接它们并发送/读取二进制数据。 这...
  • serial oscilation

    2015-09-18 12:42:13
    RLC serial oscilation,tranfer curve.
  • KNX Serial Data Transmission

    2016-03-11 11:06:26
    Serial Data Transmission and KNX Protocol
  • 串行框架协议 类似于HDLC的帧协议,适用于串行传输,以rust方式实现。 这个箱子的灵感来自 此板条箱使用与libsfp相同的有线格式,但已在rust中重新实现。
  • MIPI Specification for Display Serial Interface

    热门讨论 2011-09-06 14:26:03
    MIPI Alliance Specification for Display Serial Interface MIPI协议
  • 串口Serial连接方式

    千次阅读 2020-06-16 10:34:09
    串口Serial连接方式 1. 协议终端选择Serial 2. 会话选项,选择“串行” 3. 进入电脑“设备管理器”,查看USB Serial Port以及端口设置。 串行选项根据端口设置配置。确定并连接即可
  • Modebus TCP UDP Serial

    2016-08-24 11:00:24
    最全的 Modebus TCP UDP Serial 包括源码文件,可以借助MODBUS client测试。
  • serial.zip

    2019-09-08 20:21:17
    mavlink1.0协议的无线电透传协议,可以结合linux版本电台做无人机mavlink透传,完美替代3dr这些单片机透传模块,集成到串口电台,网口推流可以结合硬件压缩模块,
  • Serial Peripheral Interface

    2014-08-07 05:46:12
    SPI interface material that addresses timing diagram for the VHDL or other program languages
  • Serial Nand Flash

    千次阅读 2018-07-11 10:38:19
    本文以旺宏 MX35LF2GE4AB 芯片为例加以说明,该芯片为2Gb serial nand flash。理解本文时可能需要对照其datasheet,一、名词解释Serial: 相对parallel而言,只有#CE、SCLK、DI、DO、#WP、#HOLD等信号线。Nand: ...
  • Serial Nor Flash

    千次阅读 2018-07-11 14:37:02
    本文以旺宏 MX25L6433F 芯片为例加以说明,该芯片为64Mb serial Nor flash。理解本文时可能需要对照其datasheet,一、名词解释Serial: 相对parallel而言,只有#CE、SCLK、DI、DO、#WP、#HOLD等信号线。Nor: Not ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,464
精华内容 20,985
关键字:

serial协议