深入理解蓝牙BLE之“扩展广播”
目录
前言:
4.2版本广播:
5.0版本广播:
实现原理:
格式定义:
广播事件类型:
扩展广播:
周期广播:
广播集:
HCI接口定义:
4.2版本:
5.0版本:
周期广播:
疑问与解答:
前言:
BLE 5.0的扩展广播特性,网上的资料很少,我觉得写一点关于扩展广播的内容是有意义的。蓝牙BLE的4.2版本及其之前版本,有一个很大的限制,就是广播数据的payload太小了,只有31个字节。原因是广播物理信道(37,38,39)只有三个,并且大家都在使用,因此无法像数据信道那样,修改信道上传输的数据包的大小来解决问题(数据信道有一个好处,就是有37个信道,可以跳频,大家彼此冲突的几率小,但是广播信道没有这个条件)。
为了解决广播数据payload小的这个问题,蓝牙BLE在5.0版本中,新增了扩展广播的特性,包含了广播集,周期广播等概念,了解扩展广播实现机制后,我们可以明显的感受到一个信息:“5.0扩展广播的实现是在模仿GATT连接的实现”。
4.2版本广播:
我们首先回顾一下4.2版本的广播定义,4.2的蓝牙广播根据PDU Type来区分,一共有7种类型,这7种类型的广播都是在37,38,39三个无线信道上收发的。
图1
将4.2的蓝牙广播分为2组,这样更方便记忆:
1组:ADV_IND,ADV_DIRECT_IND,ADV_NONCONN_IND,ADV_SCAN_IND
这四个广播从名字上来区分,它们更容易理解为的广播概念(ADV),它们根据是否可以处理连接请求和扫描请求两个维度分为四种,如图2。
图2
2组:CONNECT_REQ,SCAN_REQ,SCAN_RSP,这三个类型的广播,是带有一定功能性的,之所以将它们也划分到广播类型中,是因为它们也是在广播信道上收发的,蓝牙4.2版本的BLE将在BLE广播信道上发送的PDU,都分类为广播数据。蓝牙BLE4.2版本的链路层的广播PDU的格式汇总如图3,本文主要介绍扩展广播,因此此部分内容一张图带过。
图3
其中需要说明的2点:
1.广播PDU的access address是固定的,它的值为0x8E89BED6。
2.Link Layer packet format中的PDU最大值是39(2字节header,37字节Payload)。
5.0版本广播:
5.0版本协议发布之后,新增广播类型的叫做extend adv,而将4.2以及之前版本的广播叫做legacy adv,5.0版本协议中在4.2的7种广播类型基础上,又新增了8种广播类型的PDU,如图4。
图4
实现原理:
4.2版本的蓝牙规范中,提到过它的广播通道只有 37,38,39 这三个,剩余的37个信道都是数据信道,数据信道用于发送连接的数据,payload比广播信道的数据要长(从Link Layer packet format来看,可以发送257个字节PDU)。在5.0的广播信道定义中,将37,38,39三个信道定义为Primary Advertising,可以叫做主广播信道,将剩余37个信道叫做Secondary Advertising,Secondary Advertising也可以用来发送广播数据,可以叫做辅助广播信道或者第二广播信道,说白了就是使用4.2的数据信道作为辅助广播信道,用来发送广播数据,将单包广播数据的payload提升到和“连接ACL数据payload”一样,辅助广播信道上发送和接收的包,也叫做辅助包(auxiliary packet)。这就是5.0扩展广播的核心思想,“将广播数据用数据信道来传输”。
将广播数据用数据信道来传输,确实可以提升单包数据的payload,但是也需要解决一个核心问题,对端设备无法同时在40个信道上扫描广播包,扫描端设备必须要确定广播设备在什么时候使用了哪个数据信道来传输广播数据,这个核心问题在BLE的GATT连接通信上也是存在的(它的解决方式是跳频,跳频的策略是在“建立连接时由两端设备同步Channel Map和hop”的基础上来实现,然后就可以按照双方已知的规则进行跳频通信)。另外一个核心问题是如何向下兼容4.2版本的广播实现。
5.0新增的8个广播类型,7个是工作在Secondary Advertising上的,都是AUX_***命名的广播,AUX是Auxiliary(辅助)的缩写,只有一个ADV_EXT_IND是工作在Primary Advertising上。
格式定义:
图4的表格中,PDU Type为0011b的SCAN_REQ和AUX_SCAN_REQ,这两个广播消息的PDU Type是相同的,并且PDU的Payload格式也是相同的,那么蓝牙BLE是如何区分这两个消息的不同呢,后来一想它们是工作在不同的信道上的,SCAN_REQ工作在37,38,39三个信道,AUX_SCAN_REQ工作在0~36信道,如果一个PDU Type为0011b的广播消息出现在Primary Advertising上,那么他就是SCAN_REQ,如果出现在Secondary Advertising上,那么他就是AUX_SCAN_REQ消息。CONNECT_IND和AUX_CONNECT_REQ消息也是靠着同样的逻辑进行区分的。
剩下6种广播类型,其中5个工作在Secondary Advertising上,是AUX_SCAN_RESP,AUX_ADV_IND,AUX_SYNC_IND,AUX_CHAIN_IND和AUX_CONNECT_RSP,另外1个工作在Primary Advertising上,叫做ADV_EXT_IND,这6种广播的payload格式均符合Common Extended Advertising Payload Format格式,如图5所示,该图中的Payload部分只列出了扩展广播相关的新增的数据格式,兼容4.2版本的legacy部分没有列出(可以参考图3中的Payload)。
图5
Common Extended Advertising Payload Format格式详解:
- Extended Header Length:表示Extended Header字段的长度,取值范围是0~63个字节。
- AdvMode:广播模式,因为这5个广播消息的PDU TYPE是0111b或者1000b,无法充分表示可连接,可扫描的特性类型,因此额外增加了这个AdvMode字段来实现legacy adv中的PDU TYPE的功能。并且从图5中可以了解到,扩展广播的“PDU TYPE”中,没有Connectable + Scannable的广播类型。
- Extended Header:由Extended Header Length字段的内容是可变长的特性可知,Extended Header的几个字段不是全部必须存在的。
- Extended Header Flags:共占用一个字节,共8bit,每一位表示对应的AdvA~ACAD字段是否存在,AdvA到ACAD正好是8个字段。
- AdvA:6字节,表示发起广播设备的mac地址。
- TargetA:6字节,是该广播的目的地址。
- RFU:预留字段,5.0的协议中尚未使用。
- AdvDataInfo:共2个字节。SID占用4个bit,表示广播集合的ID。DID占用12个字节,表示的是该集合中,该广播数据的ID。
- AuxPtr:共占用3字节,AuxPtr字段的存在的话,表示一些或所有广播数据存在后续的辅助广播包中。Channel Index表示下一个辅助包出现在哪个Secondary Advertising上,Aux Offset表示时间偏移的值,Offset Units表示Aux Offset的计算单位,这两个值表示下一个辅助包什么时间出现在Secondary Advertising上,AUX PHY字段表示是工作在2M PHY,还是1M PHY,还是coded PHY。CA表示的是晶震时钟精度。发送广播设备在发送该包之后,下一包需要在Aux Offset * Offset Units ~ (Aux Offset + 1)*Offet Units之间发送在指定的Secondary Advertising上。如果这个字段存在,则说明后面还有数据可以接收,如果不存在,则表示本包广播的数据已经发送结束了。
- SyncInfo:共占用了18个字节,这个字段是给周期广播用的,AUX_SYNC_IND和AUX_ADV_IND会涉及这个字段。除了Event Counter之外,其他的几个字段与legacy的CONNECT_IND字段基本相同,有一个跳频的ChannelMap,Interval,offset等,周期广播和GATT的链接有着相同的实现逻辑,不过它相对于链接的优势是可以一对多,劣势是数据只能单向传输。Event Counter包含了paEventCounter的值,在AUX_SYNC_IND会用到(虽然不存在于AUX_SYNC_IND PDU中),我们后面再说。
- TXPower:一个字节,表示发射功率。
- ACAD:Additional Controller Advertising Data的缩写,ACAD的内容和格式与AdvData相同,不同的是ACAD不允许被多个广播包分包传输,它必须是一包传输。
- AdvData:最终的广播数据,在扩展广播功能的8种新增的广播类型中,有的广播类型的AdvData字段是可以不存在的,这个后面会详细介绍各种扩展广播的格式和功能。Controller理论上单次发送的广播数据最多可以是1650个字节(实际上要看芯片能力),不过在链路层Controller会进行分包传输,单包的大小是根据蓝牙芯片的实际性能和资源来定的,好的方案是最大程度的增加单包的payload,进而减少分包数量。如果Host下发的广播数据已被链路层的Controller分包,但是随后无法传输所有分包,则controller会在最后一个分包中的Extended Header字段中的AuxPtr字段的AuxOffset设置为0,则对端的扫描设备会了解到分包已被截断了。
下面详细介绍一下这几种新增的广播包的格式:
- AUX_CONNECT_REQ和AUX_SCAN_REQ:这两个扩展广播的消息格式与对应的4.2版本的legacy广播一样,不同的点是legacy广播工作在Primary Advertising上,扩展广播的扩展扫描和连接工作在Secondary Advertising上。
- ADV_EXT_IND:这个广播是扩展广播特性中,唯一一个工作在Primary Advertising上的广播包,它符合Common Extended Advertising Payload Format的格式,扫描设备需要先在Primary信道扫描到该消息,然后才可以知道什么时候,去哪个辅助信道扫描,来获取想要的扩展广播数据。之前提到过Extended Header中的字段,并不是全部field都强制必须存在的,详细信息如图6所示。
图6
从图6可知,ADV_EXT_IND里面是不带AdvData和ACAD,说明它本身不包含最终的广播数据。另外with auxiliary packet的广播类型,一定要包含ADI和AuxPtr字段,ADI标识本广播属于哪个广播集合(SID),广播数据的ID(DID)是多少。AuxPtr会告诉扫描设备,它的辅助包的广播数据在什么时间点出现在哪个辅助信道上。他的第一个辅助包的格式是AUX_ADV_IND。
- AUX_ADV_IND:工作在Secondary Advertising上,符合Common Extended Advertising Payload Format的格式,fields的配置选项如图7。
图7
ADI是强制存在的字段,并且要求和指向它的ADV_EXT_IND中的ADI是相同的,这样子才可以表示这两个广播是关联的,它们协作起来发送同一个payload比较大的广播数据。如果数据广播的payload比较短,一个AUX_ADV_IND就可以发送完成,则它的AuxPtr可以没有,如果广播数据没有发完,则它的AuxPtr字段指向下一个辅助包,它可以是AUX_CHAIN_IND。如果是周期广播的话,那么它的SyncInfo字段指向下一个AUX_SYNC_IND(周期广播)。
- AUX_SYNC_IND:工作在Secondary Advertising上,符合Common Extended Advertising Payload Format的格式,fields的配置选项如图8。它的作用主要是发送周期广播,并且只可以发送不可连接不可扫描的广播,不存在ADI,也不存在SyncInfo,如果单包无法将所有的广播数据到AdvData和ACAD中,则可以通过AuxPtr来指向其辅助包来携带其他数据,它的辅助包是AUX_CHAIN_IND。从GATT的实现机制类比来看,AUX_SYNC_IND可以看作是GATT传输的ACL数据包。SyncInfo字段,只可能出现在AUX_ADV_IND中,在实现发送周期广播的机制中,AUX_ADV_IND可以类比于legacy的CONNECT_REQ,AUX_SYNC_IND可以类比于GATT的ACL数据包。
图8
- AUX_CHAIN_IND:工作在Secondary Advertising上,符合Common Extended Advertising Payload Format的格式,fields的配置选项如图9。它的上级的数据包,可以是 AUX_ADV_IND,AUX_SYNC_IND,AUX_SCAN_RSP或者是另外一个AUX_CHAIN_IND类型的广播。
图9
- AUX_SCAN_RESP:工作在Secondary Advertising上,符合Common Extended Advertising Payload Format的格式,fields的配置选项如图10。是AUX_SCAN_REQ的回复包,它的辅助包是AUX_CHAIN_IND。
图10
- AUX_CONNECT_RSP:工作在Secondary Advertising上,符合Common Extended Advertising Payload Format的格式,fields的配置选项如图11。
图11
扩展广播的spec中,经常会出现上级包(superior PDU),辅助包(auxiliary PDU)的概念,我们可以把扩展广播理解为一个单向链表,表头是工作在Primary Advertising上的ADV_EXT_IND PDU(其中AUX_SCAN*和AUX_CONNECT*除外),它里面的AuxPtr指向了下一个工作在Secondary Advretising上的AUX_ADV_IND PDU,如果有更多的数据的话,它里面的AuxPtr还会指向下一个AUX_CHAIN_IND PDU,依次向后,可能会存在n个AUX_CHAIN_IND PDU,直到数据结束,最后一个AUX_CHAIN_IND的AuxPtr字段为空,AuxPtr就像是链表里面的next节点指针。
扩展广播 PDU | 上级包 (superior PDU) | 辅助包 (auxiliary PDU) |
ADV_EXT_IND | - | AUX_ADV_IND |
AUX_ADV_IND | ADV_EXT_IND | AUX_CHAIN_IND PDU AUX_SYNC_IND PDU |
AUX_SYNC_IND | AUX_ADV_IND | AUX_CHAIN_IND |
AUX_CHAIN_IND | AUX_ADV_IND AUX_SYNC_IND AUX_CHAIN_IND | AUX_CHAIN_IND |
AUX_SCAN_REQ | - | - |
AUX_SCAN_RSP | - | AUX_CHAIN_IND |
AUX_CONNECT_REQ | - | - |
AUX_CONNECT_RSP | - | - |
表1
广播事件类型:
图12中,描述了5.0版本支持的广播事件类型,兼容4.2的legacy的PDU Type我用红色框标注了,从该图中我们可以看到扩展广播是无法发送Connectable and Scannable Undirected Event的,只有legacy的广播可以发送此类型的广播事件。而Scannable Undirected Event广播,legacy和扩展广播都可以发送。
图12
扩展广播:
这部分内容比较多,我们只选取其中几个广播事件类型:
- Non-Connectable and Non-Scannable Undirected Event:不可连接不可扫描的非定向广播,它不响应scan_req和connect_req消息,使用扩展广播发送时的时序图如图13。
#1 ADV_EXT_IND(Primary Advertising 37,38,39)
#2 AUX_ADV_IND(Secondary Advertising)
#3 AUX_CHAIN_IND(Secondary Advertising)
#4 AUX_CHAIN_IND(Secondary Advertising)
......
#n AUX_CHAIN_IND(Secondary Advertising)
其中#2~#n处于不同的Secondary信道,由上级包中的AuxPtr指定。
图13
- Scannable Undirected Event: 可扫描的非定向广播包,使用扩展广播发送时的时序图,如图14,它需要响应扫描请求,其中AUX_ADV_IND,AUX_SCAN_REQ,AUX_SCAN_RSP处于同一个Secondary Advertising。扫描设备在Primary信道监听到ADV_EXT_IND PDU之后,在它的AuxPtr指向的Secondary信道上找到AUX_ADV_IND,然后在该信道上发送AUX_SCAN_REQ,并在该信道上等待Advertising设备回复AUX_SCAN_RSP。AUX_SCAN_REQ和AUX_SCAN_RSP是不需要由ADV_EXT_IND通过AuxPtr指向来的,而是可以直接在Secondary信道上发送,这个和AUX_ADV_IND PDU不同。
图14
- Connectable Directed Event:可连接的定向广播,这个广播主要用来使用high duty进行快速回连,与扫描一样,AUX_ADV_IND,AUX_CONNECT_REQ,AUX_CONNECT_RSP是工作在同一个Secondary Advertising上。AUX_CONNECT_REQ虽然工作在Secondary上,但是它不需要ADV_EXT_IND PDU通过AuxPtr指向过来。扫描和连接还涉及了一个失败重试的问题,依赖两个参数backoffCount和upperLimit,退避重试的机制不在这里进行描述了。
图15
定向和非定向的区别,主要在于TargetA是否存在,关于时序部分相差无几,因此可扫描,可连接,不可扫描不可连接,分别找了1个例子来举例广播事件,其中的没有提到的内容还很多,
图16
限制:
- ADV_DIRECT_IND不能用在LE Coded PHY上,但Connectable Directed Event Type的扩展广播可以用在LE Coded PHY上。
- ADV_NONCONN_IND同样不能用在LE Coded PHY上,对应的扩展广播可以用在LE Codec PHY上。
- 还有其他限制待补充。
周期广播:
周期广播是5.0扩展广播的一个功能,他用来周期的发送广播数据,同时它的数据是可以变化的,为什么不用非周期广播来发送呢(非周期广播也可以更改数据,也可以一直处于广播状态),我的理解是为了低功耗和更好的同步性,因为非周期广播的最小间隔是Adv Interval(20ms)+ delay(0~10ms),因为delay的不确定性,扫描者需要打开更多的扫描窗口来接收到需要的广播数据,同时它的同步性没有那么好,但是周期广播没有0~10ms的delay,并且使用跳频技术,因此扫描者可以更小的打开scan窗口,从而降低功耗,获得更好的同步性,周期广播有点类似于单向GATT传输,一对多的GATT连接。当周期广播被启动后,the periodic advertising interval不能被更改。从图8中,我们可以获取到周期广播只能用来发送不可扫描不可连接的广播事件。同时AUX_SYNC_IND如果无法承载全部的AdvData,可以在他后面通过AuxPtr指向下一个AUX_CHAIN_IND PDU。周期广播的AdvInterval为7.5 ms ~ 81.91875 s。
周期广播事件的广播顺序应该是:
#1:ADV_EXT_IND(Primary Advertising)
#2:AUX_ADV_IND(Secondary Advertising,他的SyncInfo字段不为空,类似于legacy的CONNECT_IND,包含着跳频所需的ChannelMap)
#3:AUX_SYNC_IND(如果AdvData超过单包最大限制,需要跟着若干个AUX_CHAIN_IND PDU,这个PDU有点类似于GATT的ACL连接包,注意他的SyncInfo字段为空)
#4:AUX_SYNC_IND()
#5:AUX_SYNC_IND()
......
图17
AUX_ADV_IND PDU的SyncInfo field中的Event Counter字段,是这么定义的,每发一次AUX_SYNC_IND PDU,它就会+1,这个起初让我很疑惑它是干什么用的,因为Event Counter本身并不出现在AUX_SYNC_IND PDU中,但是它却会随着每次发送一次AUX_SYNC_IND PDU,它就+1。后来看到了下面这段定义才恍然大悟,原来这个值是用来计算跳频频谱的,发起AUX_ADV_IND的周期广播发起者,和扫描者,都需要实时计算这个Event Counter,为了可以获取下一次接收周期广播的跳频后的信道号。
图18
周期广播传输的AdvData是Host下发的,链路层使用AUX_SYNC_IND PDUs和他的辅助包来发送数据,如果Host不再更新数据的话,链路层会一直重复上次的数据,周期广播会一直发送,直到Host下发了停止周期广播的HCI Command。
图19
图19对我理解周期广播的概念造成了很大的困惑,困惑的点在于第二个AUX_SYNC_IND为什么是由ADV_EXT_IND和AUX_ADV_IND引过来的,周期广播嘛,按理说应该没有他们才对呀,想了很久才想明白,其实第二个ADV_EXT_IND和AUX_ADV_IND是不需要的,没有它,也可以继续发送周期广播,它存在的意义是为了让那些没有收到第一次ADV_EXT_IND和AUX_ADV_IND的扫描设备,也可以与当前的周期广播同步。但是对于第一次就收到了ADV_EXT_IND和AUX_ADV_IND的扫描设备来说,是没有什么意义的。扫描者不会尝试去同步一个已经同步的周期广播。
换个角度说,第一次的ADV_EXT_IND和AUX_ADV_IND确定了AUX_SYNC_IND的广播时序和跳频信道,第二次的ADV_EXT_IND和AUX_ADV_IND是为了让其他扫描设备也可以同步上AUX_SYNC_IND PDU,它不会更改AUX_SYNC_IND的广播时序和跳频信道。之前谈到过,周期广播的实现机制类似于GATT连接,但GATT的单次连接是一对一的,但是周期广播是希望可以很多扫描者都可以同步获取广播上的数据的,因此它会发送多次ADV_EXT_IND和AUX_ADV_IND来保证后面接入的扫描者,也可以同步得获取数据,因此也需要Event Counter这个东西,和前面的内容也严丝合缝的解释清楚了。这里面还涉及一个周期广播Interva和广播Interval的概念,第一次的ADV_EXT_IND,AUX_ADV_IND和第二次的ADV_EXT_IND,AUX_ADV_IND的间隔是广播Interval,AUX_SYNC_IND之间的间隔是周期广播的Interval。
- 广播interval > 周期广播interval:每个ADV_EXT_IND之间会有多个AUX_SYNC_IND出现。
- 广播interval < 周期广播interval:多个ADV_EXT_IND最终指向同一个AUX_SYNC_IND。
广播集:
广播集的是扩展广播中的一个概念,它通过设置SID和DID,使得蓝牙芯片可以插空的“同时”发送多个不同类型的广播,比如可以“同时”发送可连接广播和不可连接广播,这样的功能对于Host的协议栈代码实现和Controller的实现有很大的帮助,Controller受限于硬件资源,支持的广播集的数量有限,这个需要在实际使用时,询问芯片原厂。
在4.2版本的蓝牙协议中,如果想要发送两个不同类型的广播数据的话,只能在Host层排队发送,发送完第一个类型的广播之后,再发送第二个类型的广播。但是5.0的广播集的概念,Host可以不用排队发送,他们只要设置为不同的广播集,Controller会插空的同时发送两个类型的广播,“插空”的意思是在发送广播集1的空闲的AdvInterval之间发送广播集2。
HCI接口定义:
以上内容大致解释了蓝牙5.0的扩展广播的原理和内容,实际使用上还是通过HCI Command和HCI Event来实现的,因此我们下面介绍一下扩展广播的HCI。
4.2版本:
广播相关:
- LE Set Advertising Parameters Command:
- LE Set Random Address Command:
- LE Set Advertising Data Command:
- LE Set Scan Response Data Command:
- LE Set Advertise Enable Command:
扫描相关:
- LE Set Scan Parameters Command:
- LE Set Scan Enable Command:
广播上报:
- LE Advertising Report Event
5.0版本:
新增的5.0广播相关的HCI Command:
- LE Read Number of Supported Advertising Sets Command:读取controller支持的广播集数量。5.0协议定义的广播集的id范围是0x01~0xF0,共240个广播集合,但受限于Controller资源,通常这个值是个位数。我们实际使用时需要先读取Controller支持的广播集合的个数,广播集的索引总是从0x00开始。
- LE Read Maximum Advertising Data Length Command:读取controller支持的单次发送的广播数据的最大长度(不是单包,而是链式广播的单次)。5.0协议规定这个范围是31~1650,Controller根据自己的实际资源能力返回这个数值。
- LE Set Extended Advertising Parameters Command:设置广播参数,也是针对指定的广播集Advertising _Handle进行设置,换句话说,就是每个广播集可以设置单独的广播参数, Advertising_Event_Properties用来控制PDU TYPE,其中bit4=1表示是legacy adv,bit4=0,表示是extend adv,PDU TYPE的具体值在其他bit表示。Advertising_SID的值,就是填写在ADI field中的值,其他的字段不依次介绍了。如果该广播集已经处于enable的状态,调用次HCI Command,Controller会返回error code 0x0C。
- LE Set Advertising Set Random Address Command:设置广播PDU的随机地址,Advertising _Handle表示的是广播集对应的Handler。对比4.2的LE Set Random Address Command可以知道,这两个hci command就差了一个Advertising_Handle参数。
- LE Set Extended Advertising Data Command:设置广播数据,Advertising_Handler表示设置的广播集对应的Handle,无论该广播集的广播数据的发送是否已经enable,该命令都会执行成功,即使enable,也会在后面更新广播数据,也就是说更新广播数据时,可以不停止当前广播。Data_Length最大0~251个字节,表示Data的有效数据长度,我们之前提到过扩展广播单次最多可以发送1650个字节的数据(通过多个AUX_CHAIN_IND PDU来实现),因此如果Data数据量大于251时,这个hci command会被调用多次,一次最多设置251个字节给Controller,也就说1650字节的数据,在HCI层就已经开始分包传输了,并不是通过HCI Command一次传输1650个字节的数据,Operation就是用来帮助分包HCI数据传输的,0x00表示中间包,0x01表示第一个分包,0x02表示最后一个分包,0x03被用来表示分包结束或者用来表示legacy adv data,0x04表示没有数据更新,仅仅是告诉Controller去改变ADI field中的DID的值,Fragment_Preference是告诉Controller按照HCI Command下发的分包方式去分包,还是自行按照最小分包个数的方式去自行分包。
- LE Set Extended Scan Response Data Command:与LE Set Extended Advertising Data Command的参数基本一致,设置SCAN_RSP的Data,它的Operation没有0x04。
- LE Set Extended Advertising Enable Command:开启或者停止广播,Number_of_Sets表示打开/关闭的广播集个数,它支持同时打开/关闭多个广播集的广播数据,Advertising_Handle[i]表示的是具体操作的是哪几个广播集,Duration[i]和Max_Extended_Advertising_Event[i]对于发送Mesh广播来说是一个特别好的东西,把Host的任务交给了Controller来更精确的处理。4.2版本的实现Duration的方式是先Enable Adv,然后Host等待Duration这么久,然后再调用Disable Adv,并且具体发送了几个Event,完全是根据AdvInterval和Duration的值粗略的计算出来的,但是5.0很好的解决了这个问题,Host调用一次HCI Command就把Duration和Event的最大数量设置好了,其中如果Duraion期间内,如果Max_Extended_Advertising_Events还没有发完的话,则以Duration为准,停止广播。如果Duration为0x00,则会一直发送广播,直到调用disable adv。
- LE Remove Advertising Set Command:删除指定的广播集。
- LE Clear Advertising Sets Command:清空所有Controller的广播集。
扫描相关:
- LE Set Extended Scan Parameters Command:
- LE Set Extended Scan Enable Command:duplicates是过滤重复包的策略,Duration表示每次扫描任务执行的时间,Period表示扫描任务的执行周期。Period要大于Duration,如果这两个值配置为0,则会一直扫描直到上层调用disable。
广播上报:
- LE Extended Advertising Report Event:相对于4.2的广播上包相比,5.0的广播上包内容要多出来很多内容,首先它可以一次上报多个设备的广播数据,Num_Reports表示它上包的广播包个数,Event_Type表示每个上报的广播包的PDU TYPE,里面可以有legacy的广播包,也可以有extend的广播包,同时bit5~bit6用来帮助分包上报的,01表述后面还有数据,10表示数据没有收全,但是后面没有数据了,00表示广播数据已接收完成,如果接收的单次广播包很大,它也需要多次上传,Data_Length的最大值是229,Advertising_SID表示对应的广播集合ID,用来将分包的数据合成一个完整的数据,Periodic_Advertising_Interva用来上报接收到的周期广播的广播周期(如果Advertising_SID[i]的Data没有周期广播的数据,则Periodic_Advertising_Interval配置为0x0000,如果有数据,除了说明Periodic_Advertising_Interval的值之外,还说明了这个这个SID是周期广播),其他字段不做详细介绍。
周期广播:
周期广播的原理已经介绍过了,通过分析hci的调用方式,我们可以更加理解它的实现机制。我们分为两部分来解释,分为扫描部分和发送部分。扫描部分又分为获取周期广播SID,同步周期广播,获取周期广播的数据。
扫描部分:
- 获取周期广播SID:
LE Extended Advertising Report Event里面有一个字段叫做Periodic_Advertising_Interval[i],除了表示周期广播Interval之外,还可以表示这个广播集SID[i]代表着的是一个周期广播。
- 同步周期广播:
然后上层业务就可以根据需要,选择是否监听这个周期广播,如果需要监听的话,调用LE Periodic Advertising Create Sync Command,来通知Controller和这个周期广播建立同步关系。同步成功之后,会上报LE Periodic Advertising Sync Established Event事件,表示成功与对方的周期广播建立了同步关系,该Event中的Advertising_SID和Sync_Handle,表明了所同步的周期广播的SID和对应的handle,后面Host就可以通过Sync_Handle来操作这个同步接收的任务。
- 获取周期广播的数据:
扫描到的周期广播的数据是通过LE Periodic Advertising Report Event进行上报的(并不是通过LE Extended Advertising Report Event),该Event里面包括了Sync_Handle来表示数据来自哪个周期广播。LE Periodic Advertising Sync Lost Event用来通知Host,与对方的周期广播已经同步失败了(timeout的时间内没有收到任何AUX_SYNC_IND)。
我推测,如果Host不调用Periodic Advertising Create Sync Command的话,Controller虽然可以知道有周期广播存在,但是不会按照周期广播的ChannelMap去解析它的AUX_SYNC_IND的包,只解析道AUX_ADV_IND,知道它指向一个周期广播就可以了,这样子也节省了扫描的资源,如果每个周期广播,Controller都去跟随扫描的话,那么Controller的扫描效率会大打折扣。
创建周期广播(发送部分):
- LE Set Periodic Advertising Parameters Command:设置周期广播的广播参数,也就是AUX_SYNC_IND的广播参数,这里面有一个很关键的点是这个Advertising_Handle一定要是一个已经存在的,如果不存在会返回错误,也就说周期广播的发起,一定要依附于一个已经存在的广播集。假设之前已经存在一个广播集,它的广播数据发送是这样的,ADV_EXT_IND,接着是一包AUX_ADV_IND PDU,AUX_ADV_IND它里面包含的SyncInfo field是空的,也就说它不关联任何周期广播,当Host选择这个SID来关联周期广播,Host就调用LE Set Periodic Advertising Parameters Command来配置这个SID和本周期广播进行关联。
- LE Set Periodic Advertising Data Command:设置周期广播的数据,Operation字段与LE Set Extended Advertising Data Command中的Operation字段类似,也支持hci命令分包下分段的数据,其他字段也类似的功能。
- LE Set Periodic Advertising Enable Command:启动/停止由Advertising_Handle指定的周期广播,这个函数很有意思,如果当前周期广播依附的扩展广播已经开启了,那么这个Cmd可以触发启动周期广播,如果扩展广播尚未开启,它就被pending,直到扩展广播启动后(Host发送LE Set Extended Advertising Enable Command),它接着被启动。另外一点,如果当前周期广播已经启动了,然后host停止了扩展广播,没有停止周期广播,那么周期广播还是会一直发送的,直到Host调用了停止周期广播的HCI Command。这里面可以再回顾一下介绍周期广播的内容,第一个周期广播SYNC包需要扩展广播引用出来,但是一旦引用结束了,理论上就不再需要再次引用了,SYNC包可以一直发送,但是这种情况会引入两个问题,一个是后续打开扫描的设备,无法检测到这个SYNC包了,因为它扫描不到扩展广播,无法找到扩展广播指向的SYNC包了,另外一个问题是晶震的温漂随着时间的流逝积累的越来越大,会给同步性造成影响,所以理论上应该是可行的,但是实际上应该被配置为,几个AUX_SYNC_IND包,接着就是一个指向它的ADV_EXT_IND和AUX_ADV_IND包。
关于HCI的接口这里面要再重提一下兼容性的问题,5.0版本的蓝牙协议定义了2套HCI的接口,这两套接口是可以同时存在的,一套是4.2的HCI Command,一套是5.0的新增的HCI Command,但这两套接口,Host不应该搅合起来用,也就说要不你就都用4.2的旧HCI Command,要不你就都用5.0的新HCI Command,LE Set Extended Scan Parameters Command和LE Set Advertise Enable Command这样的搭配使用是不被允许的。
疑问与解答:
问题1:蓝牙5.0版本的Controller,是否可以与4.2版本的Host兼容。
回答:可以,5.0版本的Controller应该同时实现4.2版本和5.0版本的HCI Command。与4.2版本的Host一起使用时,使用4.2版本的HCI就可以了,但是这样就浪费了Controller的5.0的能力。
问题2 :蓝牙4.2版本的controller,是否可以与5.0版本的host兼容。
回答:理论上可以,但需要Host实现的很复杂,需要Host支持两套HCI Command,并且更难的是,要根据不同的Controller版本调整程序的实现架构,所以一般可以不用兼容,更好的方案是直接一个宏定义控制,或者有不同的分支版本来控制两套代码。Host可以使用发送Read Local Version Information Command来读取Controller的版本,从而选择不同的HCI Command和代码架构。
问题3:蓝牙5.0版本的controller + host芯片方案,是否可以与对端4.2版本的设备兼容。
回答:当然是可以的,5.0也可以收发4.2的广播包,并且比4.2更高效。
问题4:蓝牙5.0版本的controller + host芯片方案,是否可以指定发送legacy广播或者extend 广播。
回答:当然是可以的,可以配置发送legacy广播,还是extend广播,还是周期广播,可以设置PDU Type。
问题5:官方SIG Mesh Profile,是否支持通过蓝牙5.0版本协议,发送大payload的扩展广播。
回答:Mesh虽然在5.0协议发布之后,才发布,但是它为了更好的兼容性,加上本身就没有那么大的控制需求,所以从设计的角度,就没有考虑使用扩展广播发送大payload的数据包。
问题6:官方SIG Mesh Profile与蓝牙5.0版本协议的关系。
回答:这个问题可以从两个角度来看:从协议设计的角度来讲,可以说没有什么关系,mesh协议设计之初,就考虑到了要兼容4.2版本的蓝牙协议(广播消息有效的payload只有31个字节),因此我们现在看到的mesh协议才是现在这个样子,mesh协议为什么需要设计IV Update的过程,为什么不在每一包mesh消息数据都带着完整的4字节IV Index,一切的一切,都是为了兼容4.2版本的蓝牙协议。如果当时考虑到了使用5.0的扩展广播上实现SIG Mesh协议,就不应该设计IV Update的机制。因此可以得出一个结论,SIG Mesh到目前为止,就没有想过放弃4.2版本蓝牙,也没有考虑使用扩展广播来发送Mesh消息,也没有考虑过通过Mesh协议发送长包。如果有需求希望通过5.0的扩展广播发送长包,我建议在5.0的基础上,重新设计一套私有的Mesh协议,肯定会比SIG Mesh目前的协议要简单可依赖;从HOST的代码实现的角度来看,蓝牙5.0和Mesh协议还是有关系的,因为5.0不仅支持大payload的扩展广播,也支持多广播(也就是多广播集),多广播这个特性,可以很大程度的简化Host的mesh协议相关的实现,Host可以同发送SNB和Mesh控制消息,并且可以很方便的设置发包个数和发包的Duration。
问题7:zephyr的Mesh代码实现,用到了哪些5.0版本协议的特性。
待补充
问题8:Android系统如何指定发送legacy广播和extend广播。
待补充
问题9:IOS系统如何指定发送legacy广播和extend广播。
待补充
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-3824097.html
如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!
【MM小贴士】采购订单当中自动带出PO抬头文本
【日常吐槽】这个项目做的我真的是一言难尽,唉。 【他人所谓得重新思考,无非是重新整理自己的偏见罢了。】 【业务背景】今天练习一个下功能,就是做采购订单的时候,订单是由抬头的,抬头会有一些文本,可以…...

中国白帽黑客调查
黑客,可能大家们的第一印象是聪明,多金,在虚拟世界无所不能——电影里不都这么演嘛!但是现实中的黑客是什么样子的呢?近日,由智能生活安全社区GeekPwn主导,联合腾讯科技和FREEBUF两家媒体平台完成的中国首份…...

Siggraph2018
1,SIGGRAPH 2018 papers on the web...

uni-app在ios手机上如何关闭侧滑返回功能
单个窗口锁定 方法一 // #ifdef APP-PLUS var page this.$mp.page.$getAppWebview(); page.setStyle({ popGesture: none }); // #endif方法二 // #ifdef APP-PLUS plus.webview.currentWebview().setStyle({popGesture: none }); // #endif方法三 在pages.json该页面加入&qu…...

佘太地纯的前世今生
佘太地纯的前世今生 (一). 酒的诞生,被先祖视为对神明的供品 自古以来,我们的祖先就有“酒是天上酒星所造”的说法,据专家们考证,阴山岩刻中有凹型圆坑,这是古先人群用来盛酒祭天所为。这些约…...

SIGGRAPH 2022--岩鸽彩虹色羽毛渲染阅读笔记:Rendering Iridescent Rock Dove Neck Feathers
目录 介绍: 相关工作: 几何: 渲染: 度量: 背景 羽毛的几何形状: 鸟的羽毛的颜色: 岩鸽颈部羽毛羽小枝颜色 薄膜的物理学: 用成像散射计进行测量: 模型&#…...

Whois查询结果中不同域名状态的含义
通过WHOIS工具可以查看域名详细信息,其中不同的域名状态代表不同的含义,通过解读域名状态我们可以更清楚了解域名当前运行情况,帮助我们了解域名安全情况和域名无法正常使用的原因等,以便我们能够采取及时的应对措施。下面中科三方…...

gitHub不能用密码推送了,必须要使用令牌
有一段时间没使用github去push项目了,今天push之后,根据提示输入账号密码,但是失败了,报错如下: support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com…...

Python中常用的格式化字符串方法
下面写了下我所了解的三种格式化字符串方法,推荐第三种 第一种方式: 常用‘%s’、‘%f’、‘%d’。 符号描述%s格式化为字符串,采用 str() 显示%r格式化为字符串,采用 repr() 显示%d/%i格式化为十进制整数,仅适用于数…...

步入Screeps
1.开始创建一个工作的creep Game.spawns[Spawn1].spawnCreep( [WORK, CARRY, MOVE], Harvester1 ); 2.开始让工作的creep去进行采矿 module.exports.loop function () { var creep Game.creeps[Harvester1]; var sources creep.room.find(FIND_SOURCES); if(…...

Docker笔记
容器相关 查看在运行的容器 docker ps -a启动容器(运行交互式的容器) // 让docker运行的容器实现“对话”的能力 // t:在新容器内指定一个伪终端或终端 // i:允许你对容器内的标准输入(STDIN)进行交互。 docker run -i -t ubun…...
用PS制作旋转按钮图标,UI设计教程
每天一篇设计教程分享给你,与你一起成长。 所用软件为:PSCC2018版本,还没有这个软件的小伙伴们可以给我留言! 喜欢的小伙伴记得关注噢。...

彻底理解Java并发:乐观锁与CAS
本篇内容包括:悲观锁与乐观锁的概述、CAS(Compare And Swap)比较并交换的介绍、非阻塞算法与ABA问题,以及对 Java 中 CAS 的实现解读(AtomicInteger 对 CAS 的实现,Unsafe 类简介)。 一、悲观锁…...

关于原型设计的工具——AXURE
一、简介 Axure RP是一款专业的快速原型设计工具,作为专业的原型设计工具,它能快速、高效的创建原型,同时支持多人协作设计和版本控制管理。使用者主要包括商业分析师、信息架构师、产品经理、IT咨询师、用户体验设计师、交互设计师、UI设计师…...

关于Java架构,框架,各种相关类的整体整理
关于java架构,框架,各种类的整理1,Java应用有哪几种架构?1.1 B/S和C/S的区别1.1.1 C/S系统架构1.1.2 B/S系统架构1.2 B/S架构详细说明2,三层架构和MVC2.1 三层架构2.2 MVC2.3 三层架构和MVC的区别3,SSM&…...

C语言算法的特性
C语言算法有如下特性: 有穷性:一个算法应包含有限的操作步骤而不能是无限的。 确定性:算法中每一个步骤应当是确定的,而不能应当是含糊的、模棱两可的。 有零个或多个输入。 有一个或多个输出。 有效性:算法中每一个步…...

深入浅出学习CAN系列-了解CAPL编程语言
前言 上一篇文章介绍了如何创建CANoe工程,需要先阅读这篇文章,才能对整个工程有所了解,包括节点、报文、信号等关键信息。 本文的重点是分析该工程中各个节点CAPL语言是怎么编写的,主要目的在于理解整个工程的实现,具体…...

Android应用安全常见问题及解决方案灵魂拷问
导语 你想做安卓开发,怎么系统学习?你只需要看完这一篇就够了!!为什么只看这一篇就够了?现在CSDN、知乎、掘金、GitHub上各路大佬层出不穷,他们深耕Android开发多年,总结出满满的学习干货。但同…...

总结:软件评测师上午试题分析与解答
做个总结 总分75分,及格线45分 选择题一般涉及各个方面,题型如下 2014年软件评测师上午试题 1、计算机系统 2、程序语言 3、防火墙 4、拒绝服务攻击 5、计算机病毒 6、操作系统PV操作 7、操作系统页式存储管理 8、数据库系统 9、考察关系代数运算与SQ…...

2022年数维杯数学建模B题 大规模新型冠状病毒疫情最优应对策略研究求解全过程文档及程序
2022年数维杯数学建模 A题 大规模新型冠状病毒疫情最优应对策略研究 原题再现: 无论是 2022 年 3 月初在吉林省长春市大规模爆发的新型冠状病毒疫情(COVID-19),还是 4 月初在上海及 5 月初在北京大规模爆发的疫情,均…...

数字IC设计 -02- 使用VCS逻辑仿真工具
准备工作 新建一个文件夹,将需要编译仿真的代码放到该文件夹内,这里在linux环境下创建了相关文件夹,并将全加器代码编写导入。 全加器代码: module adder_full(dina,dinb,c,ci,dout);input dina;input dinb;input c;output reg …...

java 小波变换_小波变换教程(八)
连续小波变换的计算对上面公式的解释将在本节中进行详细说明。以x(t)作为被分析的信号。选用的小波作为信号处理中用到的所有窗函数的原型。应用的所有窗都是母小波的放大(或缩小)和平移版本。有很多函数可以满足这个条件。Morlet小波和墨西哥帽小波(Mexican hat)是其中最有代表…...
AI+医疗:使用神经网络进行医学影像识别分析 ⛵
U-Net是一种卷积网络架构,用于快速、精确地分割生物医学图像。本文讲解使用 U-Net 进行肺部影像分割的案例全过程:工具库&环境准备、数据读取、数据切分、TensorFlow IO准备、U-Net 网络构建、评估准则&损失函数、超参数设置&模型编译、回调函数&模型训练、模…...

NameAID-文档批量更名
工作中总会遇到一大批文件需要改名的情况,各种各样的规则限制下,手动操作是一个费事费力的活 比如说统一在原来的文件名前面或后面加字符,更改文件名大小写,替换或删除某个词等,这些都是令人头疼的工作 交给NameAID轻…...

LSTM+CNN模型厄尔尼诺事件预测
Background 一、什么是ENSO现象 ENSO(El Nio-Southern Oscillation)是发生于赤道东太平洋地区的风场和海面温度震荡。ENSO是低纬度的海-气相互作用现象,在海洋方面表现为厄尔尼诺-拉尼娜的转变,在大气方面表现为南方涛动。 二、…...

QT 窗口全屏与还原
1.顶级窗口 1)全屏 this->showFullScreen(); 2) 还原 this->showNormal(); 3)应用 void Widget::mouseDoubleClickEvent(QMouseEvent *mouseEvent) { //showFlag为标志位if(showFlag){this->showFullScreen();showFlagfalse;}else{this-&…...

【项目管理/PMP/PMBOK第六版/新考纲】纯干货!敏捷型/Stacey矩阵/vuca/敏捷宣言/冲刺/产品负责人/敏捷团队/敏捷教练/待办事项列表/迭代任务列表/可交付产品增量
系列文章目录 一篇文章看懂PMP的2021新考纲重点(建议收藏)项目发展史/项目定义/项目集/项目组合/十五至尊图商业论证/效益管理计划/项目运行环境/组织过程资产/环境事业因素/组织系统 项目生命周期-敏捷型 产品目标、范围、需求都是不明确的,只有通过持续不断的迭…...

34k*16 薪,3年自动化测试历经3轮面试成功拿下字节Offer....
前言 转眼过去,距离读书的时候已经这么久了吗?,从18年5月本科毕业入职了一家小公司,到现在快4年了,前段时间社招想着找一个新的工作,前前后后花了一个多月的时间复习以及面试,前几天拿到了字节…...

微信小程序 界面禁止下拉 左右滑动_微信 iOS 版更新,带来了这些新功能
果粉俱乐部让科技更好的服务生活点击上方「蓝字」加入我们iOS 13 正式版系统即将到来,第三方应用已经开始陆续更新适配,微信在 9 月 17 号也推出了新的 iOS 版 7.0.7 版本更新。微信新版本的更新说明只有简单几个字,「解决了一些已知问题」&a…...

黑马程序员MyBatis总结(二、配置文件完成增删改查以及参数传递)
本文为自我学习使用,如转载需本人同意 文章只记录用过的技术和插件等 目录MyBatisX插件单元测试unitunit依赖创建测试类解决实体封装不上,映射对应不上问题解决方法1:起别名解决方法2:resultMap条件查询说明条件查询参数条件查询实…...

excel透视
Excel–如何让数据透视表按数据源顺序排序?|数据透视表 https://jingyan.baidu.com/article/eb9f7b6dd77a1ec69364e880.html 更新透视 右键刷新即可 表头变了重新拉一下 【Excle数据透视表】如何让字段标题不显示“求和项” - OLIVER_QIN - 博客园 直接编辑&am…...

java代码在图片上画框
有时候对于一些截图需要通过画框重点显示,用java代码在图片上画框的代码如下: package imagetest; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; i…...

JavaWeb之Servlet
Servlet Servlet是Java编写的服务器端程序,可以交互式地浏览和生成数据,生成动态Web内容。一般来说,Servlet是指任何实现了这个Servlet接口的类。 Servlet可在web.xml中配置 <servlet><servlet-name>demo1</servlet-name&g…...

16 | 磁盘管理
1 常用命令 Linux 磁盘管理常用三个命令为 df、du 和 fdisk。 df(英文全称:disk free):列出文件系统的整体磁盘使用量du(英文全称:disk used):检查磁盘空间使用量fdisk:用…...

Mysql基础(上)
##本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ MySQL服务的登录和退出 ★ MySQL的常见命令和语法规范 五、DQL语言的学习 ★ 基础查询 ★ 条…...

网络延迟及故障分析与排查实战
一、Wireshark中的辅助工具 我们在安装完Wireshark时,会发现系统中还多了一些程序,例如Tshark等。这些程序都采用了命令行的工作方式,虽然体积都很小,但是功能却十分强大。 1、Wireshark命令行工具 开Wireshark的安装目录&…...

图片画框和标注案例
实例分享,真实可用 import os.pathimport cv2 def image_rectangle_putText(result_list, src_images_path, out_images_path, confidence_threshold=0.5, type=0):"""把识别结果result 标注到图片上:param result_list: 识别结果,格式为[{name: video, loca…...

原型设计工具Axure
关键词:Axure,原型设计 授课老师:张森鹏 一、什么是原型设计 产品原型可以概括的说是整个产品面市之前的一个框架设计。以网站注册作为例子,整个前期的交互设计流程图之后,就是原形开发的设计阶段,简单的来说是将页面的模块、元素、人机交互的形式&#…...

Python-OpenCV API
参考资料 视频 这些博客就是搭配上面那个视频使用的...

干货|史上最全HR必备招聘执行全流程 建议收藏
今天为大家带来的是HR必备招聘执行流程SOP 帮助HR快速梳理流程 提高招聘效率、节约培训成本、减少出错率 做HR,有它就够啦!下面我们就来一起看下吧 Step1. 需求对齐 需求对齐是用人部门和HR部门的必不可少的过程,事关是否能快速招到人和…...

centos 7 修改 limits.conf 导致 ssh 连接失败
问题描述 由于项目性能测试需要上百万 tcp 连接,程序报错: too many open files查阅资料发现是系统参数 最大文件打开数 file-max 限制 于是根据网上资料修改 /etc/security/limits.conf # 在文件末尾添加以下两行 * soft nofile 2000000 * …...

vue过滤动画
目录 1 自带过渡动画 2 animate.css实现过渡动画 1自带过渡动画 vue中给我们提供了一些类名,共有六个—— .v-enter、.v-enter-active、.v-enter-to .v-leave、.v-leave-active、.v-leave-to 这六个类名可以用来设置vue中元素进行切换的过渡动画 /*我们只需要在c…...

好资料链接
1,https://github.com/vpj/python_autocomplete...

计算(a+b)的n次方
#include<bits/stdc.h> using namespace std; int main(){ int n,a[10000]; printf("请输入一个数:\n"); scanf("%d",&n); if(n0){ printf("(ab)^01"); return 0; } if(n1){ printf(…...

计算机图标ps教程视频,PS制作腾讯视频标志 -电脑资料
的朋友们大家好,在也有一年多了,这一年多来一直在网和的QQ群里学习,收获挺大的,简单来说,现在也不算是一个菜鸟了,FEVTE编注:更多鼠绘教程学习和鼠绘技术讨论交流和鼠绘作业提交请进入论坛PS鼠绘…...

【苹果推iMessage源码】tils扩大软件安装大概通过Apple软件向您提供的某些服务
推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…...

2022华东杯数学建模B题投资组合论文+LaTeX源码+代码
论文LaTeX源码所有代码见文末 中证红利指数(000922.CSI)1 从沪深市场中选取现金股息率高、分红稳定、具有一定规模及流动性的100 只上市公司证券作为指数样本,以反映沪深市场高红利上市公司证券的整体表现。其编制、调整和指数加权方式见中证…...

flutter 增加 https 支持
iso 修改: iso>Runner>info.plist 文件 在根标签<dict> 的第一行增加以下代码 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/> </dict> android 系统: 修改文件 …...

数码相框(十六、LCD显示JPG格式图片)
注:本人已购买韦东山老师第三期项目视频,内容来源《数码相框项目视频》,只用于学习记录,如有侵权,请联系删除。 1. LCD 如何显示一张图片? 假如下图是是我们的 JZ2440 开发板,它有一个块显存、…...

MySQL 主从复制与读写分离
一 概念 什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) ,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要读写分离 因为数据库的“写…...

[刷题]队列
1.设计循环队列(LeetCode: https://leetcode.cn/problems/design-circular-queue) 题目要求: 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首…...

python图片处理大全_python图像处理:怎么给图片加框?
有没有想过可以用python做什么?小编最近就遇到了使用python解决自己的生活问题,给自己的图片加了个边框,感兴趣的一起来看下吧~Python是一门脚本语言,有着大量的第三方库,下面就利用pillow库给图片加边框。首先确保已经…...

VMware安装ubuntu连接互联网和主机
1.需求 ubuntu既需要连接互联网也需要和主机进行ssh操作 2.实现 2.1 VMware查看NAT IP 如下图,VMware随机生成的一个IP,无需手动修改 2.2 对虚拟机设置使用NAT模式 2.3 修改物理机网卡 修改物理机vMnet8网卡 IPv4IP地址,为上述子网地址…...

在 Apple TV 上如何自动安装应用程序?
您可以在 iPhone 或 iPad 上下载并安装 Apple TV 应用程序后自动安装该应用程序。从第四代 Apple TV 开始,您可以从App Store安装应用程序。虽然有专为 Apple TV 提供的应用程序,但通常也有适用于 iPhone、iPad 和 Apple TV 的通用应用程序。只要您在另一…...

ESP8266-Arduino网络编程实例-ESP-MESH传感器数据发送与接收
ESP-MESH传感器数据发送与接收 在前面的文章中,我们对ESP-MESH网络协议的使用有了一定的了解,本文将在这个基础上,进一步介绍如何在ESP-MESH网络中,不同设备(节点)交换传感器数据,即广播本节点传感器数据和接收其他节点的传感器数据。 1、硬件准备 ESP8266 NodeMCU开发…...

Go语言学习(六)切片
文章目录切片的引入切片的内存分析切片的定义切片的遍历切片的注意事项切片的引入 切片的语法: var 切片名 []类型 数组的一个片段引用 切片的内存分析 切片有3个字段的数据结构:一个是指向底层数组的指针,一个是切片的长度,一个…...

2022下半年系统集成项目管理工程师易混淆知识点:合同收尾、管理收尾
很多考生在备考2022下半年软考系统集成项目管理工程师考试,以下为2022下半年系统集成项目管理工程师易混淆知识点:合同收尾、管理收尾,相信对大家备考会有帮助。 概念辨析8:合同收尾、管理收尾 概念: (1…...

python多线程使用MySQL导致中断连接重写mysql操作类
最近有一个需求,有一张表里面记录视频上传状态,因为视频上传这个时间会非常长,所以这个时间就空闲下来了,这时候考虑到python多线程来解决,一开始通过pymysql直接连接导致了很多的报错,数据库中断连接,最后采用dbutils…...

mysql 三表联查_MySql的join(连接)查询 (三表 left join 写法)
1、内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集Select A.name,B.name from A inner join B on A.idB.id和Select A.name,B.name from A,B where A.idB.id结果是一样的(内连接的inner关键字可省略);2、外连接:分为左外连…...

React方向的前端面试题
1、React的生命周期? React中只有类组件有生命周期可言。 其中包含三个状态: Mounting:此时已经插入了真实的DOM; Updating:正在被重新渲染; Unmounting:已经移出真实的DOM。 生命周期的方…...

Pr 入门教程如何修改过渡效果设置?
欢迎观看 Premiere Pro 教程,小编带大家学习 Pr 的基本编辑技巧,了解如何修改过渡效果设置。 Premiere Pro 2021 for Mac(pr 2021 直装版) 和其他效果一样,过渡效果也可以根据你的项目进行更改,可以直接在时间轴面板中更改…...

c语言编程函数
C程序是由一组或是变量或是函数的外部对象酿成的.函数是一个自我包涵的 实现必然相关功能的实施代码段.咱们可以把函数看成一个"黑盒子",你只要将数 据送到里面去就能得到结论,而函数内部毕竟是似果何任务的的,外部程序是不懂得的.…...

cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端
cocos2dxJAVA手游《全民挂机》全套源码支持安卓IOS双端,客户端用cocos2dx 2.2.3实现,服务端用java,支持安卓IOS双端,一款很不错的挂机游戏源码! 源码下载链接 cocos2dxJAVA手游《全民挂机》全套源码支持安卓IOS双端-c…...

项目中发现 unity运行挂机放那大约半小时,运行项目变得越来越卡顿
bug描述:unity挂机半小时,会变得非常卡顿,查看了Profiler发现是GC.MaskDependence.占据了85%以上的CPU 解决:发现是有个同学在repeat 里面调用了 UnloadUnusedAssets,修正即可,代码就不贴了...

个人游戏技术支持
目前仅上架IOS商店 单机,放置挂机游戏 放置类角色扮演免费单机小游戏,经典再现,热血攻杀。激战BOSS,收集装备,操作简单,玩法丰富 无网络也可以玩 无网络条件下也能进行游戏。 轻松休闲# 自动战斗,自动释放技能,玩…...

IOS分享扩展使用JS脚本
实现一个分享扩展插件,功能是从Safari网页中截取当前网页的图片内容 基本的步骤总结在下面: 1.创建一个JS文件,命名为MyJavascriptFile.js,文件的功能是解析safari网页内容,获取到网页中的所有图片节点,解…...

ios比较字符串判断为空_IOS 开发中判断NSString是否为空字符
//当 请求网络 或者获取其他返回数据 首先 要做一次判断 数据是否为空防止程序崩溃程序崩溃 好比拿刀扎在程序员的心啊~if(为空){做提示对话框等操作}else{正常执行}- (BOOL) isBlankString:(NSString *)string {//判断字符串是否为空 方法if (string nil || strin…...

C语言刷题系列——6.(递归)实现顺序输出整数
递归实现顺序输出整数 ❄️一) 题目要求☃️1.函数接口定义:☃️2.裁判测试程序样例:❄️二) 非递归 解法☃️step1.统计位数☃️step2.循环,打印每一位☃️step3.实现❄️三) 递归 解法☃️step1.分析☃️step2.图解流程☃️step3.实现)❄️…...

ios沙箱模式开启_IOS沙盒基本机制(sandbox)
释放双眼,带上耳机,听听看~!iOS系统相对于Android(或Windows)系统来说比较安全的原因有很多,其中有一点就是苹果推出的沙盒机制,每个应用都有自己对应的沙盒,每个应用程序之间不能相互访问非本程序的沙盒&a…...

Vue使用阿里矢量图标库
加粗样式Vue使用阿里矢量图标库 第一步:首先在阿里巴巴矢量图官网上把需要的图标下载到本地.第二步:把下载好的图标放到public目录下的static中第三步:在public中的index.html中引入 //在public中的index.html中引入 <link rel"stylesheet" href"static//i…...

阿里矢量图标库彩色图标(Symbol 引用)
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点: 支持多色图标了,不再受单色限制。通过一些技巧…...

uniapp自定义字体图标、使用阿里矢量图标库
1、基本使用 首先进入阿里图标库网站 然后搜索自己想要的图标,中英文都可以 ,找到之后添加购物车 然后在购物车里面添加到项目,如果没有项目的需要先创建一个项目,创建项目很简单就不叙述了 然后在资源管理里面可以找到我们的项…...

基于IB(Interactive Brokers)盈透证券的股票及期货行情获取讲解
盈透证券,作为老牌帝国主义券商,能够提供强到变态的交易软件TWS,多到变态的全球股票、期货等产品覆盖,以及低到变态的交易费用。如果做全球股票或期货交易,能够对接盈透证券相关接口还是不错的选择,但是这里…...

交易员偏爱市场的理由
为什么要交易Forex——Forex交易的优势 Forex交易有很多优点。以下是如此多的人选择货币市场的几点原因: 没有佣金 货币交易没有清算费、汇兑费、政府手续费和经纪费。大多数Forex retailer通过所谓的“点差”来获取收入。 没有交易手数要求和限制 在期货市场上…...

AAAI 2023| 旷视研究院入选论文亮点解读
近日,国际人工智能顶级会议 AAAI 2023 (Association for the Advancement of Artificial Intelligence)公布了录用结果。本届会议共收到来自全球的 8777 篇论文投稿,其中 1721 篇论文被录用,论文录用率为 19.6%。AAAI …...

Linux服务器端高性能本地部署
推理部署是最后一步 服务端和移动端部署 服务端部署需求 飞桨全景图 Paddle Inference 推理库特性 性能对比测试 应用 部署流程 开发预测程序五步走 GPU推理 python进行GPU推理 C GPU推理 tensor RT进行转换 模型压缩 加速不明显的原因...

电脑服务器高配置和高性能,为高性能工作站服务 超算系统配置推荐
高性能计算(HPC) 指通常使用很多处理器(作为单个机器的一部分)或者某一集群中组织的几台计算机(作为单个计算资源操作)的计算系统和环境。有许多类型的HPC系统,其范围从标准计算机的大型集群,到高度专用的硬件。大多数基于集群的HPC系统使用高性能网络互…...

高性能计算(HPC)和智能计算理解
1.现代终端设备一般都跟云端服务器相连,但只要可能,我们都希望计算可以在本地终端解决,这样做的好处是多方面的:既可以减小网络带宽的压力,又可以避免网络传输产生的时延,还可以让用户的数据更安全。现代终端设备一般用一个片上系统 (SoC)做计算,上面部署了通用的CPU和集…...

高性能计算系统——大数据/快速数据分析中的高性能技术
大数据/快速数据分析中的高性能技术 高性能计算的目的是为了数据密集型以及处理密集型的工作实现少费而多用的目标。计算机、存储设备和网络解决方案也相应变得高性能和可扩展。 高通量计算(HTC)同高性能计算(HPC)存在很多不同之…...

Linux高性能服务器技术总结
文章目录1 服务器简介2 I/O复用技术2.1 循环方式2.2 select 方式2.3 poll方式2.4 epoll 方式3 多线程方式4 CPU多核并行计算5 深度分析内核性能5.1 中断处理5.2 内存拷贝5.3 上下文切换5.4 局部性失效5.5 内存管理6 高性能网络框架DPDK1 服务器简介 服务器是提供计算服务的设备…...

高性能计算卡Tesla K20简介
1.简介 Tesla K20是由NVIDIA公司研发,用于服务器高性能计算的一款GPU,是Tesla品牌下的一个产品。 NVIDIA研发的高性能计算产品Tesla K20,基于开普勒(Kepler)架构,核心芯片GK110、拥有71亿个晶体管&#x…...
AMAX - 数据中心、高性能计算以及服务器
AMAX http://www.amaxchina.com/ AMAX 于 1979 年创立于美国硅谷,是数据中心、高性能计算以及服务器 OEM 解决方案值得信赖的领先企业及业界标杆。AMAX 总部位于加州硅谷,为全球用户提供完善的计算解决方案。...

性能服务器怎么使用,高性能服务器使用帮助
1 远程登陆必要信息:服务器 IP 地址,用户名和密码1.1 Windows 系统下载安装 PuTTY 软件打开 PuTTY 软件,在 Host Name (or IP address) 处输入 IP 地址,然后点击最下方 Open 按钮根据提示依次输入用户名和密码即可登陆(注意&…...

iphone5将采用无线供电技术?
关于iphone5的传言是越来越多了。前不久才有媒体爆料说iphone5将可能采Liquidmetal合金外壳,上周又有媒体报道iphone5将会使用无线供电技术。无线供电作为一种新型的非接触式充电技术,现推广于小家电,手机充电等,有很大的前景。下…...
SOC | 四种 SOC修正算法
静态修正 BMS处于静态模式(不带载),查询OCV表格,根据OCV曲线得出现在电压和温度下对应的SOC值,再等待下个带载时刻开始修正SOC,以一定速率加快或者减慢安时积分平滑修正至目标值; 优点&…...

机器狗是怎么动起来的?这个up主花三个月自制硬核“机器人心脏”,可承载机械战甲
大数据文摘出品 作者:牛婉杨 还记得今年3月火遍b站的技术宅稚晖君吗?他的一则自制迷你电视的视频在b站有着397万的播放量,更是超越众多二次元视频荣登全站排行榜第5名。 为什么这则视频这么火?因为这个电视相当“硬核”ÿ…...

ABAP学习笔记之——第七章:ABAP数据字典
一、数据字典 在 ABAP 程序里使用的所有对象 (表、视图、结构体、类型等)统称为 ABAP 数据字典。这些对象的信息叫 Metadata 或者 Data Definition,另外,ABAP 数据字典有定义和管理数据结构,集中管理系统中使用的对象的功能。 数据字典类型&…...

高温预警c语言,高温预警37°C,这个夏天太突然了 | 美好清单
“斗指东南,维为立夏,万物至此皆长大。”进入五月,温度陡然升高,转眼间就进入孟夏时节。记忆里,小时候的夏天是小卖铺几角钱就可以买到的冰棍;是在凉水里泡上半个钟头才能吃的西瓜;是闷闷的午后…...

减速电机使用注意事项
转载:http://www.jinjunteng.com/html/Show/?id1969&owen1%D0%C2%CE%C5%D7%CA%D1%B6&owen2&Ujinjunteng&iff4&idjf1910&1969.html 作者:魏世军 发布日期:2014-10-27 直流减速电机使用一般注意事项 一:过负载及…...

【机械制造基础部分(京玉海第二版)部分思考题】
机械制造基础部分思考题33个思考题新增1铸件结构的工艺性问题1.合金的流动性、收缩性及铸造性能的影响2.砂型铸造的分型面的选择原则3.砂型铸造件常见缺陷及消除方法4.浇注系统的组成5.常见特种铸造方法及其适用范围6.常见铸件的铸造方法(见P128)8.金属变…...

证券期货业信息技术服务连续性管理指南 连续性程序
连续性程序 10.1 概述 行业机构依据信息技术 服务风险评估和业务影响分析结果,在信息技术服务连续性策略指导下,建立信息技术服务连续性 程序,编制信息技术服务连续性计划,确保信息技术服务中断事件能够得到及时响应和处置。 信息…...

Unity中的旋转和矩阵操作
Definition for Matrix4x4 is from unity Matrix4x4 matrix new Matrix4x4(); matrix.SetRow(0, new Vector4(m[3], m[6], m[9], m[12] / scaleMultiplier));//经过实际测试前三个都是0,从第四个开始才跟transform中的数据一样&am…...

arduino 矩阵肩膀_怎样连接4×4带Arduino的矩阵键盘以及如何从键盘获取数据
在本教程中,我们将学习44矩阵键盘以及Arduino键盘接口的工作原理。键盘是一种输入设备,用于输入密码,拨打号码,浏览菜单甚至控制机器人。您可能已经看到ATM上使用了键盘,安全系统,电话等,允许用…...

android手机方向 矩阵,android – 磁场,旋转矩阵和全局坐标
我想我已经阅读了关于这个主题的所有帖子,但我仍然无法理解一些事情:Q1:为了获得全局坐标系中的磁场矢量,我需要将反转旋转矩阵和磁场矢量相乘,为什么我需要反转旋转矩阵?Q2:假设我有一个设备,我可以使用getOrientation(…)方法根…...

老司机带带你,教你学会Java中又骚又暴力的“反射”技术
在Java中有这么一个很骚的技术,几乎贯穿了所有主流的框架,在所有主流框架的底层中你都可以看见它的身影,这个技术就是反射。关于反射,有很多小白会觉得很难,搞不清楚到底是怎么回事,也不知道该怎么用&#…...

手把手教你做自控项目(一)S7-200SMART零基础之水泵/液位的手自动两地控制
从今天起呢,我们开始了解一些自动化的小项目是如何完成的,系统的了解一下从最初的计划方案到最后竣工验收的整个过程。 把整个小自控项目中的所有知识点都教给大家,你如果是零基础也没关系,只要你跟着我们每一期都认知学习&#x…...

200plc经典案例,两台水泵,一用一备
200plc,经典案例,两台水泵,一用一备 水泵控制要求 1,有一个总启动和总停止,控制这两路的启停 2,两台水泵,水泵一备一用,系统上电后1#电机先工作,24小时后,2#电…...

基于STM32单片机的智能鱼缸控制系统原理图PCB
功能介绍: 0.本系统采用STM32F103C8T6作为单片机 1.采用DS1302时钟芯片可实时显示时间,通过四个功能按键可设置投喂等操作定时时间 2.具有WiFi模块可以与手机进行数据传输通信 3.采用防水型的DS18B20传感器可以测量水温 4.采用DC002作为电源接口可直接输…...

单片机怎么控制水泵灭火_基于51单片机供水系统控制自动化
供水系统水位控制原理下图是水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内,为此,在水塔的不同高度安装固定不动的三根金属棒,以感知水位变化情况。其中A棒处于下限水位以下&…...

树莓派通过继电器控制水泵
树莓派通过继电器控制水泵硬件要求继电器的工作原理接线方式代码编写硬件要求 树莓派4b、一个1路5V继电器、一个12V小水泵、一个能装四个五号电池的电池盒和四个五号电池、一个面包板和若干杜邦线。 继电器的工作原理 接线方式 (电源电压可能不足,但是可以工作) …...

计算机学自动控制原理,华中科技大学计算机学院《自动控制原理》实验指导书.pdf...
华中科技大学计算机学院《自动控制原理》实验指导书.pdf自动控制原理实验指导书计算机科学与技术学院实验一 控制系统的初步认识过程控制CS4000系统介绍过程控制是针对工业生产过程中液位、流量、温度、压力等参数的控制。一、CS4000系统组成1、双管路流量系统8 9系统包括两个独…...

【编译原理】泵引理
泵引理1 泵引理证明语言非正则2 泵引理证明语言不是上下文无关的浅浅冒泡一下我这个科研废物。 1 泵引理证明语言非正则 关于正则语言的泵引理:若AAA是一个正则语言,则存在一个数ppp(泵长度)使得,如果sss是AAA中任一长…...

两种微型水泵介绍——微型电磁泵和微型隔膜泵
微型水泵:组成形式为电机泵体,且泵体上有一进一出两个接口,水从入水口进,排水口出。凡是采用这种形式,且体积小巧、袖珍的水泵,都叫微型水泵。微型水泵的作用就是抽水,在各种电器具中得到非常广…...

【青少年编程】【三级】绘制图形
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…...

博主日常工作中使用的shell脚本分享
前言:今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作。该脚本用于本地电脑和服务器交互上,实现以下功能:自动拉取自己个人电脑上的源码到服务器上yocto包的源码文件夹。自动运行compile 、str…...

单GPU每秒76帧,重叠对象也能完美分割,多模态Transformer用于视频分割效果惊艳...
来源丨机器之心视频分割效果优于所有现有方法,这篇入选CVPR 2022的论文是用Transformer解决CV任务的又一典范。基于注意力的深度神经网络(DNN)在NLP和CV等不同领域的各种任务上都表现出了卓越的性能。这些进展使得此类网络(如 Tra…...

一场冠军两场Top,我的CCF比赛总结!
本文是代码届的小白同学的分享,虽然刚入门学习,但已经有很多收获,希望能继续加油进步。个人介绍 本人计算机专业研二在读,本科电子信息工程,由于疫情的原因,开学也晚了,很多都受到了影响&#x…...

一个3D车道线检测方法PersFormer及其开源OpenLane数据集
来源丨计算机视觉深度学习和自动驾驶arXiv上2022年3月论文“PersFormer: 3D Lane Detection via Perspective Transformer and the OpenLane Benchmark“ ,作者来自上海AI实验室,以及几所高校。最近3D车道检测方法出现,解决许多自动驾驶场景&…...

Attention SLAM:一种从人类注意中学习的视觉单目SLAM
点击上方“3D视觉工坊”,选择“星标”干货第一时间送达作者丨泡椒味的口香糖来源丨GiantPandaCV 0. 引言当人们在一个环境中四处走动时,他们通常会移动眼睛来聚焦并记住显而易见的地标,这些地标通常包含最有价值的语义信息。基于这种人类本能…...

【青少年编程】【四级】用逗号分隔列表
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…...

ArcGIS中ArcMap模型构建器ModelBuilder的模型建立与运行操作方法
本文介绍在ArcMap软件中,模型构建器(ModelBuilder)的建模与使用方法。 首先,在ArcMap中打开“ModelBuilder”。 建立一个模型,我们一般需要两种素材,一是该模型所需的初始数据,二是该模型具体的…...

双目立体视觉建立深度图_深度相机原理揭秘--双目立体视觉
原标题:深度相机原理揭秘--双目立体视觉导读为什么非得用双目相机才能得到深度?双目立体视觉深度相机的工作流程双目立体视觉深度相机详细工作原理理想双目相机成像模型极线约束图像矫正技术基于滑动窗口的图像匹配基于能量优化的图像匹配双目立体视觉深…...

微信生成公众号带参数二维码用户头像 加上文字生成图片(三)
// 建立一幅 434X630 的图像$im imagecreatetruecolor(434,630); //设置透明背景图 如果用imagecreate 则图片二维码上的用户头像变灰$textcolor imagecolorallocate($im, 255, 0, 255);$str"你好!"; //解决中文乱码所以用imagettftext 方法$white imagecolo…...

打开catia界面全是白色怎么办_基于CATIA的圆柱螺旋拉伸弹簧有限元分析(文末有“彩带”)...
弹簧是一种利用弹性来工作的机械零件。用弹性材料制成的零件在外力作用下发生形变,除去外力后又恢复原状。从事机械设计的朋友常常需要设计弹簧,关于弹簧的相关知识大家可以查阅机械设计手册。今天我给大家分享一篇基于CATIA的圆柱螺旋拉伸弹簧有限元分析…...
聊聊答题应用题库的建立
前段时间,答题 APP 如火如荼的发展,各大互联网公司都加入了撒币大战,包括像冲顶大会,百万英雄,芝士英雄等等。随之而来的也是各个答题应用辅助的兴起。 网上已经有不少答题应用的辅助,一般来说包括两个步骤…...
利用OpenCV建立视差图像
点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google C项目编程风格指南 (中文版) 分享我们都看过3D电影,他们看起来都很酷,这给了我…...
教你接入公众号发博客弹幕
不知道你有没有这么想过,在微信个人公众号越来越普遍,自媒体越来越流行的时候,是否想过申请一个自己的微信公众号折腾一下呢?在朋友圈里看到越来越多的小伙伴都在转发自己微信公众号里的文章,你会想我要搞个微信公众号…...

NDK 开发实战 - 微信公众号二维码检测
关于二维码识别,我们一般都是用的 Zxing 或者 Zbar ,但它们的识别率其实不是很高,有些情况下是失灵的,比如下面这两张图: 使用开源库 Zxing 扫描以上两张二维码,有一张死活不识别。使用微信是可以的&#x…...

电脑如何进行连接
按下windowR键,输入mstsc,然后输入计算机IP地址...

JVM调优之StringTable调优
jdk1.8之后,JVM内存结构如下 所谓的StringTable,即字符串常量池(以下简称串池),存放在堆内存中。 我们先介绍一下intern方法 String s "ab"; //将这个字符串对象尝试放入串池,如果有则并不会放…...

机试_3_数据结构(一)
本章学习基本的线性数据结构,包括向量、队列和栈。这些基础的数据结构是后续很多高级内容的基础。 一、向量 数组作为一种基本的数据类型,它是有限个类型相同的变量的线性集合,组成数组的各个变量称为数组的元素。每个元素对应一个下标&…...

axios使用fordata上传文件
文章目录一、FormData的作用?二、使用步骤1.获取file文件数据2.读入数据FormData对象的相关常用方法一、FormData的作用? FormData提供一种表示表单数据的键值对的构造方式,实现表单数据的序列化,从而减少表单元素的拼接ÿ…...

Java基础集合上篇
本篇博文目录:一.集合框架二.List1. ArrayList (数组)2.Vector ( 数组实现、线程同步)3.LinkList(链表)三.Set1.HashSet(Hash 表)2.LinkedHashSet( HashSetLinkedHashMap…...

共聚焦显微镜能做什么
共聚焦显微镜主要采用3D捕获的成像技术,它通过数码相机针孔的高强度激光来实现数字成像,具有很强的纵向深度的分辨能力。 共聚焦显微镜成像原理 共焦显微镜装置是在被测对象焦平面的共轭面上放置两个小孔,其中一个放在光源前面,…...

分享五款小伙伴们私信推荐最多的功能软件
最近陆陆续续收到好多小伙伴的私信,这边也是抓紧时间整理出几个好用的软件,希望可以帮到大家。 1.浏览器下载插件——FVD Downloader FVD Downloader是一款非常知名的浏览器插件,能够帮助你在任何网页上下载视频、音频文件。众所周知&#…...

快速测温医疗级电子体温计方案开发
电子体温计开发方案由单片机SIC8833型号,通过单片机程序开发而成;它与以往的水银体温计不同,是通过电子元器件来代替水银,测量后体温度数还可以一数字显示到小显示屏上。一、电子体温计方案规格简介:温度部:…...

TimeSeries时间序列函数-移动平均法
简单移动平均法clc, cleary [533.8 574.6 606.9 649.8 705.1 772.0 816.4 892.7 963.9 1015.1 1102.7];m length(y);n [4,5]; % n位移动平均的项数,选取4和5分别做一次运算for i 1:length(n)for j 1:m-n(i)1yhat{i}(j) sum(y(j:jn(i)-1))/n(i);endy_predict(i…...

MMDetection3D:数据加载简析
目录数据加载流程create datadatasetpipelinedataloader参考资料数据加载流程create data从数据集的原始数据文件中读取数据,并且按指定的格式组织成 pickle 文件保存,在 data_converter 里有具体的各个数据集的转换方式。如果想用于训练\测试的数据内容…...

QT实现自定义控件之控件代理--comboboxDelegate
QT实现了MVC,那么QT在操作控件的时候也就三板斧了,显示自然是View,Model提供数据(访问数据都靠其中的索引QModelIndex),控制自然就是代理了,而且关键是代理,因为代理的作用是在数据模型和显示vi…...

代码随想录day23
669. 修剪二叉搜索树 https://leetcode.cn/problems/trim-a-binary-search-tree/ 首先分情况:root是null直接返回;root值小于low,root直接变为right;root值大于high,root直接变为left;当前遍历到的结点的左…...

【测试方法】Android 7 及以上系统信任用户自定义证书
一、背景 测试工作经常会启用代理服务来协助测试(用于抓包、mock 数据、埋点自动化测试等),而 Android 7 及以上系统版本不再信任用户自己导入的 CA 证书,导致无法在 Android 7 及以上系统的设备上处理 https 协议的请求。 二、操…...

(深度学习快速入门)第四章第六节:重要和常见的卷积神经网络结构
文章目录一:经典网络结构(1) LeNet-5(CNN开山始祖)(2)AlexNetA:简介B:网络结构(3)VGGNetA:简介B:网路结构二:复…...

数据值中查找数学公式:TuringBot Crack
TuringBot 是一款桌面软件,它使用符号回归从数据值中查找数学公式。 终极回归工具 假设您想从一组输入变量中预测一个数值。到 2023 年,大多数人会采用以下两种方式之一: 对数据拟合直线或多项式。使用一些极其复杂的黑盒方法(神经…...

RESA车道线路沿检测
一、当前车道线检测遇到的问题 1、车道标注中固有的稀疏监督信号,使其一直很有挑战性 2、传统卷积不能很有效的提取细长的车道线和路沿(方格内有效特征很少),没有利用形状先验 3、SCNN提出在行列间传递信息,但是顺序信息传递是耗时的&…...

Java 最接近原点的 K 个点
最接近原点的 K 个点中等给定一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点,并且是一个整数 k ,返回离原点 (0,0) 最近的 k 个点。这里,平面上两点之间的距离是 欧几里德距离( √(x1 - x2)2 (y…...

2023年情人节即将到来,跨境卖家们准备好了吗?
再过不久,就是一年一度的2月14日情人节。这不仅是一个浪漫的节日,同时也是一个促销的大好时机。情人节是美国的第四大消费节日,Nox聚星数据显示,2022年美国情人节消费高达239亿美元,同比增长9.6%。 目前情人节相关的热…...

游戏服务器丢包该怎么办
如果游戏玩家用户在多人游戏中遇到延迟和卡顿,尽管所使用的独立服务器提供高速连接,也可能遇到数据包丢失的问题。下面本文将深入探讨什么是丢包,什么不是丢包,并探索一些简单的解决方案。文章后续还将解释有时无法解决丢包问题的…...

【Hadoop】面试
文章目录1.MR流程2. Namenode、Datanode、SecondaryNamenode作用3. Hdfs的介绍与应用场景4. SecondaryNamenode如何恢复数据(检查点机制)5. 小文件问题6. Hadoop和Spark的区别1.MR流程 数据输入——Mapper——Shuffle——Reducer——数据输出 数据输入——>Map…...

java不理解this?5分钟彻底弄懂this关键字
注:也可以观看视频:https://www.bilibili.com/video/BV1XM4y1X79jthis ,翻译为:这、这个,在java中应该翻译为 “本对象” 或 “对象本身” ,指向的是对象自己类似于日常的称呼,比如,…...

C/C++之动态内存申请
前言 在开发中,如果需要在运行时才能确定需要申请的资源类型及内存大小,则需要进行动态内存申请,C提供了mallco/free来进行资源申请,C还提供了new/delete以及new[]/delete[]来申请资源,手动申请资源需要非常谨慎,如果…...

数据结构与算法(1)稀疏数组
当一个数组中大部分元素为 0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值; ②把具有不同值的元素的行列及值记录在一个小规模的数组中,…...

Python入门第二课——Python的变量和简单数据类型
目录前言一、变量变量的命令规则:二、简单的数据类型1.字符串2.整数3.浮点数三、注释总结前言 学习任何计算机语言之前我们都需要了解该语言的变量和简单的数据类型,这部分内容往往很简单,同时也是很多人会忽略的地方,要知道&…...

Redis设计与实现 -- 浅谈Redis持久化
在讲解Redis持久化相关的话题之前,我们需要了解的是Redis为什么这么快?也就是Redis的IO模型 – 多路复用。 我们一句话概括为什么Redis这么快: Redis是单线程的,使用多路复用的IO模型。(当然,这只是很重要的一个方面&…...

SP800_186_OverView
文章目录2. Overview of Elliptic Curves2.1 Non-binary Curves2.1.1 Curves in Short-Weierstrass Form2.1.2 Montgomery Curves2.1.3 Twisted Edwards Curves2.2 Binary Curves3. Recommended Curves for U.S. Federal Government Use3.1 Choice of Underlying Fields3.1.2. …...

全球化安全生产 质量保障体系建设探索
作者:肖刚毅、张俊、李晶磊(全球化业务平台团队) 全球化电商中的业务、技术及架构和国内技术都有一定差异,从安全生产保障和质量保障角度,这些差异带来了更多的挑战,本文将为大家分享安全生产和质量保障相关…...

手机发射机的功能电路(4)---上变频器、功率放大器
一、发射上变频器 发射上变频器实际上是一个频谱搬移电路,它存在于带发射上变频的发射机电路结构中。在发射上变频器中,发射中频处理电路输出的发射已调中频信号,与RXVCO或UHFVCO、RFVCO)信号进行混频,得到最终发射信号。发射上变频器也是一个混频电路,前面讲混频器时说,混频器…...

记一次 Mockito.mockStatic 泄漏导致的单元测试偶发报错排查过程
相信用 Java 写过单元测试的读者们对 Mockito 不会陌生。至于 Mockito 是什么,为什么要用 Mockito,本文不再赘述。本文记录了一次在 Apache ShardingSphere 项目中,由 Mockito.mockStatic 使用不当导致的单元测试偶发报错排查过程。 文章目录…...

Python学习-----流程控制2.0(循环结构-->while循环、for循环、range()函数)
目录 循环结构 (1)while循环 (2)for循环 range()函数 循环的嵌套 编辑 上一期我们讲了Python中的选择结构,链接在下面Python学习-----流程控制1.0(选择结构、缩进法则)_守约斯维奇的博客-CSDN博客 这一期&am…...

2022年高职组软件测试赛项赛题及评分标准
任务 考查点 评分标准 评分细则 分值 任务一 环境搭建及系统部署 (5分) 环境搭建及系统部署包括搭建与配置测试环境,安装与部署应用系统等,对过程和结果进行截图,完成环境搭建及系统部署报告 1.测试环境搭建与…...

不坑盒子:强大的word插件,让工作更高效
不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理,如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件,这是一个非常好用的插件工具,专门应用在Word文档中,支持Office 2010以上的版本,用户可以…...

非标自动化设备ERP系统能够帮助企业解决哪些管理难题?
非标自动化设备产品的多样化和个性化要求企业能够将客户需求、设备结构管理与配置、智能设计、生产协作管理等过程有机地结合在一起,非标自动化设备行业传统的企业管理模式已经不能适应市场需求的个性化变迁。非标自动化设备行业常见的管理难点:信息孤岛…...

20230207英语学习
Startup Plans to Bring the Dodo Back From the Dead 这家公司拟复活已灭绝几百年的渡渡鸟?! Billion-dollar startup Colossal Biosciences claims it has come a step closer to reviving the dodo, a flightless bird that has been extinct since …...

学习如何使用GPT2进行文本生成(torch+transformers)
学习如何使用GPT2进行文本生成(torchtransformers) GPT2是OPen AI发布的一个预训练语言模型,见论文《Language Models are Unsupervised Multitask Learners》,GPT-2利用单向Transformer的优势,做一些BERT使用的双向T…...

基于UEFI的数据传输工具
摘要:由于UEFI框架下没有提供数据传输的模块,使得测试或者调试开发时需要经常对数据文件进行人工拷贝,导致了实现测试自动化或远程调试的不便。采用Socket数据传输方式设计并实现了UEFI下数据传输的工具,通过使用串口线来连接Host…...

Linux 并发与竞争实验
目录 一、原子操作实验 1、利用点灯工程创建模板 修改makefile编辑 2、atomic.c代码添加 ①、定义 atomic_t 的变量 ②初始化变量 atomic_set函数原型 ③判断是否被使用 atomic_read函数原型 atomic_dec函数原型 ④释放原子变量 atomic_inc函数原型 3、atomicAPP.…...

Golang 提取视频中音频,存为WAV格式 | Golang工具
目录 前言 环境依赖 代码 总结 前言 本文提供将视频中音频提取出来存为wav格式,一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装,可以参考我的另一篇文章:windows ffmpeg安装部署_阿良的博…...

145、【动态规划】leetcode ——70. 爬楼梯:暴力法+动态规划(C++版本)
题目描述 原题链接:70. 爬楼梯 解题思路 1、暴力法 递归方式 class Solution { public:int res 0;void traversal(int n) {if(n 0) { // 每遍历出一种情况,就将结果加一res;return ;} else if (n < 0) {return ;}climbStairs(n - 1); // 探…...

【手写 VueRouter 源码】第七篇 - 路由变化触发视图更新
一,前言 上篇,介绍了路由匹配的实现,包括以下几个点: 路由匹配的分析;路由匹配的实现:router.match、matcher.match、createRoute; 本篇,继续介绍路由变化触发视图更新; 二&#…...

机器学习之朴素贝叶斯分类器原理详解、公式推导(手推)、面试问题、简单实例(python实现,sklearn调包)
目录1. 朴素贝叶斯原理1.1. 特性1.2. 思路2. 公式推导3. 简单实例3.1. 数据集脱单数据集2.0脱单数据集1.0西瓜数据集3.2. python实现3.3. sklearn实现3.4. 实验结果4. 几个注意点(面试问题)5. 运行(可直接食用)1. 朴素贝叶斯原理 1.1. 特性 朴素贝叶斯…...

什么样的光源不伤眼睛?精选优秀的全光谱护眼台灯
日光对眼睛最好,所有人造灯都不如日光对眼睛友好,日光指的是全光谱照射,而现在许多护眼灯做到全光谱照射,所以护眼灯成为很多家庭的必备产品之一,晚上学习、工作,有了护眼灯的陪伴,既明亮又不伤…...

复杂因子秒级计算,文谛资产是这样做到的...
上海文谛资产管理有限公司(以下简称“文谛资产”)秉持理性、务实、高效、专业的投资精神,凭借科学的量化投资战略、先进的量化交易技术和成熟的风险管理能力深耕量化领域,以创造长期稳定收益为投资目标,为国内外投资者…...

投稿计算机SCI期刊,什么是同行评议? - 易智编译EaseEditing
首先,初审论文的可能不是审稿人,有些稿源丰富的相对高端期刊,还会由作为大同行的编辑对稿件的内容本身,尤其是创新性等方面对稿件进行评估。 这个编辑内部初审,对于牛期刊而言也会拒掉许多投稿,这一过程通…...

如何添加 WhatsApp按钮打开Facebook页?SaleSmartly(ss客服)为您解答
关键词:SaleSmartly(ss客服);Facebook WhatsApp 按钮想要了解如何添加 WhatsApp 按钮到您的 Facebook 页?您来对地方了。在本文中,我们将概述合并 WhatsApp 按钮 Facebook 页面,并提供有关如何执…...

【CodeFroces】【DP】Maximum White Subtree
CodeForces 1324F Maximum White Subtree 题目传送门 题目大意 给定一棵树,每个节点为白色或黑色,现对每个节点 uuu,选出任意大小的包含该节点的连通图,使得图上白色点数目与黑色的数目的差距最大。 分析 不妨记白点权值为1&…...

RTC直播与RTMP直播
RTC直播与RTMP直播 RTMP传统直播成本低廉,已大规模部署稳定运行,延时较高直播场景。 RTC直播主要用于对延迟要求高实时互动直播场景。 传统直播与RTC直播对比 以下整理了一下传统直播与RTC直播的不同之处: MR直播 MR直播实例(混合现实直播…...

Elasticsearch7.8.0版本入门——集群部署(linux环境-centos7)
目录一、三台服务器信息二、Elasticsearch7.8.0单机部署三、Elasticsearch7.8.0集群部署3.1、分别再三台服务器中都安装Elasticsearch7.8.03.2、修改192.168.136.23服务器中elasticsearch配置文件3.2、修改192.168.136.24服务器中elasticsearch配置文件3.3、修改192.168.136.25…...

STM32开发(五)STM32F103 通信 —— CAN通信编程详解
文章目录一、基础知识点二、开发环境1、硬件开发准备2、软件开发准备三、STM32CubeMX相关配置1、STM32CubeMX基本配置2、STM32CubeMX CAN相关配置四、Vscode代码讲解五、结果演示CAN 内部回环测试CAN 正常模式测试使用ADALM2000分析工具解析CAN时序一、基础知识点 了解CAN通讯…...

VOC/YOLO/COCO数据集格式转换及LabelImg/Labelme/精灵标注助手Colabeler标注工具介绍
数据集格式:VOC(xml)、YOLO(txt)、COCO(json) 本文主要对Label格式,以及LabelImg、Labelme、精灵标注助手Colabeler这常用的三种数据标注软件进行介绍。 1 Label格式 LabelImg是目标检测数据标注工具,可以标注标注两种格式: VOC…...

linux下原子操作指令
目录 原子操作CAS 原子操作 Demo CAS C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 原子操作CAS 原子操作 所谓原子操作是指不会被线程调度机制打断的操作,当某次操作一旦开始,就一直运行到结束,中间不会有任何中…...

Kafka入门(二)
1、Kafka集群工作进程 下面了解一下Kafka的工作流程,Kafka集群会将消息存储在Topic中,每条记录会由一个Key、一个Value和一个Timestamp组成。 Kafka中的消息是以Topic进行分类的,生产者生产消息,消费者消费消息,读取和…...

古月居ros2机器人系列修改图片后如何编译问题
A(我):你好删掉这两个文件后它出现了learning——node未找到这种错误;不仅如此,我建立了另一个同样的文件,而这次我是先修改了路径再编译的,尽管这次新生成的build是修改后的,并且也并未出现多余的…...

PTA Advanced 1164 Good in C C++
目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 易错测试点 易错点&C知识UP 代码 题目 When your interviewer asks you to write "Hello World" using C, can you do as the following figure shows? Input …...

数学建模练习——非线性规划
...

十、数据库操作
数据库操作 一旦创建 数据模型后,Django 自动给予你一套数据库抽象 API,允许你创建(create),检索(retrieve),更新(update)和删除(delete)对象。 为了方便调试我们通过下面的命令进入交互式python命令行: python man…...

Linux -终端中的编辑器vi(2)
4.常用命令4.8缩排和重复执行命令功能>>向右增加缩进<<向左减少缩进.重复上次命令缩排命令 在开发程序时,统一增加代码的缩进比较有用!一次性在选中代码前增加4个空格,就叫做增加缩进一次性在选中代码前删除4个空格,就…...

鼎盛合方案——轮胎充气泵方案
轮胎的质量好坏直接影响到备胎上位的时间长短,而在轮胎的使用中如果充气不恰当则是又给了备胎一个摩拳擦掌准备登场的机会。诶、怎么今天老是说备胎备胎的,对象和她的蓝颜知己这几天确实走的近了一些。发展方向有点不对……她们昨天还一起吃饭也没叫我&a…...

Python常见异常类型
开发人员在编写程序时,难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误,还有的是程序运行时与系统的规则冲突造成的系统错误,等等。总的来说,编写程序时遇到的…...

测试工作杂记
1、安卓 测试过程中系统突然卡住不能动了、系统直接(Crash)崩溃掉了、应用程序无响应(ANR),即出现闪退或者异常的情况下 adb logcat -c && adb logcat > d:\logcat.txt 抓包工具android studio (接口、参…...

数据库笔记(三)
havingwhere后面只能写普通字段条件,不能写聚合函数条件having关键字专门用来写聚合函数条件的,并且需要和group by结合使用,写在分组的后面查询每个部门的平均工资,要求平均工资大于2000;select dept_id, avg(sal) a from emp group by dept_id having a>2000;查询每种工作…...

AD硬件电路学习笔记(四)四层板实战(上)之常见模块要求
系列文章目录 AD硬件电路学习笔记(一)常见的管脚名字以及FPGA、Lora AD硬件电路学习笔记(二) GND的种类及PCB布线实战 AD硬件电路学习笔记(三)mos管开关电路学习总结 文章目录系列文章目录常见要点防静电…...