北京好的网站设计机构,天津移动网站设计,国内永久crm,公司网站开发费用怎么做账一、存储模式
两种存储模式#xff1a;
大端存储#xff1a;低地址存高字节#xff0c;如将0x1234存成[0x12,0x34]。小端存储#xff1a;低地址存低字节#xff0c;如将0x1234存成[0x34,0x12]。
一般来说#xff0c;我们看到的一些字符串形式的数字都是大端存储形式
大端存储低地址存高字节如将0x1234存成[0x12,0x34]。小端存储低地址存低字节如将0x1234存成[0x34,0x12]。
一般来说我们看到的一些字符串形式的数字都是大端存储形式
UUID4A98-xxxx-1CC4-E7C1-C757-F1267DD021E8其中0x4A是高位设备地址aa:bb:bb:dd:ee:ff其中0xaa是高位
但是以上的写法只是方便人们看存到机器里面还得是字节的形式怎么存也得根据芯片和软件的规定来看。
在ESP32的sdk里面UUID都是以小端模式的16个字节去存储的。对于设备地址在ESP-IDF的Bluedriod协议栈下是以大端存储的即[0xaa,0xbb,0xcc,0xdd,0xee,0xff]如果使用NimBLE协议栈则得反过来用小端存成[0xff,0xee,0xdd,0xcc,0xbb,0xaa]。
有关数据发送ESP32的变量是小端存储的假如要发送一个16位变量即uint16_t data 0x0001(就是订阅通知时要写到特征描述符里的数据)实际上等同于发送了[0x01,0x00]两个字节。
有关数据接收假如收到了一个4个字节的数据存在buf数组里要将它合成为一个为整形可以逐个取出来进行运算合成如果明确知道buf的低地址存的是低字节而机器又是小端模式存储变量的就也可以直接 int data *(int *)buf就是将字节指针转换成int类型的指针然后取值。 二、BLE设备地址
BLE 设备地址长度为 6 字节外加 1 个比特表示地址类型。
BLE 规范定义了若干种地址类型
公共地址地址类型为 0是从 IEEE 获得的全球唯一的48位地址高24位与厂家有关同一厂家的芯片设备地址的高24位是一样的。随机地址地址类型为 1包括静态设备地址最高 2 个比特为 0b11、 可解析私有地址最高 2 个比特为 0b01、不可解析私有地址最高 2 个比特为 0b00三种。其中静态地址每次上电后重新随机生成整个上电周期内不发生改变而私有地址则是用在安全方面的是可选的。
在另外一个角度来说用于识别设备身份的只有公共地址和随机静态地址两种设备必须设置这两种中的一种来对外表明自己的身份。
乐鑫是有在IEEE注册的因而可以使用公共地址。当然也可以不使用公共地址通过调用SDK中的相关的API设置就可以对外显示随机静态地址。随机静态地址其实更加常见因为一些厂商会觉得IEEE注册费用过高此时便只能使用静态设备地址了。这也是随机静态地址提出来的目的就是为了替代公共地址。 三、DLE、MTU、PDU等与数据长度有关的名词 PDU: 协议数据单元 Protocol Data Unit。由上图可见PDU在2-257字节之间具体又分为LL Header、Payload和MIC三个部分。其中Payload最大为251字节包含L2CAP Header、ATT Header 和 ATT Payload 三部分而ATT Payload 才是我们真正发送的数据ATT Data最大为244字节如下图所示。 DLE数据长度扩展 (Data Length Extensions)。该功能在蓝牙核心规范 4.2 版本中引入允许Payload容纳更多数据最多 251 字节默认为 27 字节。即在不开启DLE的情况下一个数据帧的payload部分最多为27字节除去两个Header共7个字节有效数据仅有20个字节。而在开启DLE的情况下单个数据包可以发送244个字节的有效数据。
MTU: 最大传输单元Maximum Transmission Unit。这是一个跟所使用协议栈有关的参数描述的是一次 GATT 操作例如写、读等操作中可以发送的数据量。由于MTU已经包含了ATT Header的3个字节因而调用一次相关函数api时可以传入的有效数据量最大为MTU-3。当MTU的设置大于单个数据包最大长度时协议栈就会分包发送。以下是几种情况。
MTU默认为23最多发送20字节有效数据加上两个Header后为27字节在不开启DLE情况下刚好能够一个数据包就发送完。MTU设置大于23加上Header后将大于27字节。如果不开启DLEPayload最多为27字节那么数据将被分割成27字节的块进行发送。MTU设置为247最多发送244字节有效数据加上两个Header后为251字节如果开启DLE刚好能够一次发完。247是开启DLE情况下单个数据包能够发送完整的最大MTU。MTU设置大于247即便开启DLE也必然会分成多个数据包进行发送。
总的来说MTU更多的是一个应用层编程时的概念芯片厂商在根据自己芯片的性能和资源去订制协议栈时一般会限定MTU的最大值目前最大MTU一般在500到1000之间。至于单个数据包的最大长度则是由蓝牙规范严格规定的开启DLE时最多为251字节当需要发送的有效数据大于244即MTU大于247时就会发生分包。因此编程时需要合理选择MTU以减少分包导致的资源浪费。
另外由于主从机协议栈处理数据的能力不同因而需要主从机对MTU进行协商。比如A协议栈的MTU设置为555即调用一个write函数就可以最多发送552个字节的有效数据然而接收端B协议栈的处理能力可能较弱或者内存不足接收不了那么多数据也就无法从接收到的多个数据包中提取出这552个字节。为此刚连接时主从机都必须使用23字节的默认MTU进行通信之后双方进行协商使用两者提出的MTU之中较小的MTU进行后续的通信。