在去年11月参加RTT的开发者大会的时候得闻RTT目前在用Nimble做为BLE stack,两年前我有看到过这个东西,当时觉得这种比较关键的技术一般来说开源的都不是比较好的东西,比较有竞争力的部分比如high performance、small footprint(有人抱怨nimble吃RAM太大)、low power等一般都不会开出来,所以也没有仔细研读过。今年由于工作的重心也转到了BT Controller,所以得好好研读下Nimble的source code,先纠正一个小小的错误,作为一个开始。
这里有一video介绍为啥要有nimble。
Periodic Advertising Sync Transfer (PAST)[未完结]
Periodic Advertising Sync Transfer 是BT 5.1的一个新feature,SIG官网上有一篇文章介绍的还不错What You Need to Know About Periodic Advertising Sync Transfer。这里就做一个简单的总结。
这个新概念的引入,本质上是为了省电。对于Legacy的advertising,Advertiser在interval附近会加一个Delay(0~10ms),那么Scanner就需要多开窗来抓到adverting 数据包,增加耗电,而PAST概念就是为了在某个场景下可以解决这个问题。
先看下几种Advertising的概念
1.Legacy Advertising
Legacy Advertising只在37/38/39三个Channel上打,为了避免adv event刚好跟Scannner的scan window完美错过,在Adv的Interval上会加一个随机值advDalay,让Anchor点随机shift一点点,增加与Scanner的scan window碰撞的几率,示意图如下:
下图为Legacy Adv的PDU的格式:
2.Extended Advertising
Legacy Advertising能发送的Adv data有限,所以后来又衍生出了 extended adv:在Data channel里也可以打Adv data,如下图。
而Extended Advertising引入的概念就比较多了,比如:
- Advertising Handle,
- Advertising Set
- Advertising Data ID
- …
当收到的Adv的type是 ADV_EXT_IND 时,Adv的Payload的数据格式如下:
3.Periodic Advertising
在Extended Advertising的基础上,在发送大量数据的时候又引入了Periodic Advertising。
Periodic Advertising 流程的建立有两种方式:
3.1 正常的Scanner 和 Advertiser的交互
如下图中AoD Transmitter 与 Smartphone的Sync。
3.2 已经有Periodic Advertising Synchronization infomation的一方,将该data通过 LE-C 转发给另外一个跟它连线的设备,就是PAST。
如下图右图中Smartphone 与Wearable Device之间的关系,Wearable device在前期不需要开Scan去抓ADV_EXT_IND就知道后续要到哪里去收AUX_SYNC_IND包,从而节约了电能。
4. 关于PAST的细节:
下图是Spec中关于Periodic Advertising的一个Sequence flow。
message 流程图如下:
下面三图中A是Scanner,B是Advertiser,A和B中有一个与C有BLE连线,那么会有三种情况:
4.1 A与B建立了Sync,A与C有连线,A通过LL_PERIODIC_SYNC_IND将Sync information通知给C,那么C就可以收B的Periodic Sync advertising。
4.2 流程同4.1,只是C一开始就Enable了report.
4.3 A与B建立Sync,B与C有连线,B通过LL_PERIODIC_SYNC_IND将Sync information通知给C,那么C就可以收B的Periodic Sync Advertising data了。
做笔记的利器Marginnote
在学习的过程中经常要做些笔记,记在笔记本上的话非常不方便的查阅。如果只是记日记,记录下每天都做了啥,那用纸质的笔记本还好; 但对于学习笔记要经常整理以及归纳,就得需要经常改动及查阅。
最近有发现一款非常不错的做笔记的软件Marginnote,目前只有iOS/Mac的版本,没有Android的版本。
这款软件可以很方便的在pdf文件上做标记,并且将pdf中的关键字,句子摘录出来,制作成思维导图。让我想起了大师李敖的读书方法,李敖每读一本书,会将书拆的很碎,把经典的句子都从书上剪下来,把剪下来的句子分类整理到自己的册子里,这样自己日后在写作的时候从相关的册子里之间找自己要的东西就好了。
下图为一个处于学习模式的marginnot的snapshot:
- 总共分为三块:左边为摘录出来的文字的一个逻辑关系;中间为根据左边文字的逻辑关系生成的思维导图;右边为原文;
- 用户可以调节左边摘录文字的逻辑关系(父子关系?兄弟关系?),同时中间的思维导图也会跟着变;
- 点击左边的摘录文字,右边的原文会自动跳转到该文字所在的位置。而且这些摘录的文字可以在右边原文中选用不同的颜色。
纯时间与毛时间
第一次看到这个比较新鲜精确的概念:纯时间与毛时间
比如你说你一天上班工作的时间是8小时,但实际上只有2小时是真正在工作的,其他时间可能在做无意义的发呆或是刷微信。那这8小时就是工作的毛时间,2小时就是工作的纯时间。
这个概念是在《奇特的一生》这本书里提到的,在豆瓣上评分还挺高。作者描述了俄罗斯科学家柳比歇夫的时间统计法,用日期+事件+花费时间的方式来记录自己一天所做的事情,并坚持了56年,没有一天断过。柳比歇夫在每周,每月,每年都对自己记录的时间做总结,看哪项事件用了多久,可以精确到分钟。这样有个好处是自己对时间的估算是非常精确的。除了做总结,柳比歇夫还对自己一生的时间做五年规划,每过五年,他就把度过的时间和干过的事分析一通,可以说是做个总的鉴定,总结能客观公正的反映过去一年的历史,抓住变化无常的老想溜掉的日常生活,抓住我们没有擦觉到的损失掉的不知去向的时间。
他能准确的感知时间,精确到1分钟,对他来说,时间的急流事看得见,摸得着的,他仿佛置身于这急流之中,觉得出来光阴冷冰冰的流逝。
然而对于没有远大目标的人来说,这个方法很难坚持下去,坚持也不见得有意义。
我自己每天会做日记记录做了那几件事情,但是还没有做过总结,只是对比下去年同一天在干啥,看起来还挺有意思的。看了这本书有一种豁然开朗的感觉,原来还有记录这么细致的日记,而且对自己的时间剖析的这么认真。
HCI command笔记
规范 Vol2 的Part E,讲HCI command的第7章有几个command,看起来很有用,这里list下
7.5.1 Read Faild Contact Counter command
这个计数器(Failed_Contact_Counter,两个字节)是用来记录由于flush timeout到期(一般是因为空气中信号干扰比较多,数据包重传比较多)而flush掉的数据包的个数,在做bt music的时候经常看到smartphone送过来的数据包的序列号不连续,如果smartphone有用这个command来monitor数据包的状况的话,就比较容易看到这个现象。
When the 802.11 PAL receives an HCI_Read_Failed_Contact_Counter command it shall return the number of consecutive incidents in which the remote device didn’t respond after the flus>h timeout had expired, and the L2CAP packet that was currently being transmitted was automatically flushed. The Failed Contact Counter is specific to each logical link.
7.1.47 Truncated Page command
可以用来探测目标设备在不在可连接范围内?
The HCI_Truncated_Page command is used to page the BR/EDR Controller with the specified BD_ADDR and then abort the paging sequence after an ID response has been received. See [Vol >2] Part B, Section 8.3.3 for additional information.
复习下page的几个步骤,请看下面的两张图:
BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 2, Part E page 1112
hexo 中启用数学公式
本文来自 https://blog.csdn.net/crazy_scott/article/details/79293576 感谢原作者。
安装插件
- 首先我们需要安装Mathjax插件
npm install hexo-math —save
2 更换Hexo的markdown渲染引擎,hexo-renderer-kramed引擎是在默认的渲染引擎hexo-renderer-marked的基础上修改了一些bug,两者比较接近,也比较轻量级。
npm uninstall hexo-renderer-marked —save
npm install hexo-renderer-kramed —save
解决语义冲突
由于LaTeX与markdown语法有语义冲突,在markdown中,斜体和加粗可以用或者_表示,在这里我们修改变量,将_用于LaTeX,而使用表示markdown中的斜体和加粗。
在博客根目录下,进入node_modules\kramed\lib\rules\inline.js,把第11行的escape变量的值做相应的修改:
//escape: /^\([\`{}[]()#$+-.!_>])/,
escape: /^\([`[]()#$+-.!_>])/,
这一步是在原基础上取消了对,{,}的转义(escape)。
同时把第20行的em变量也要做相应的修改:
// em: /^\b_((?:__|[\s\S])+?)_\b|^*((?:**|[\s\S])+?)*(?!*)/,
em: /^*((?:**|[\s\S])+?)*(?!*)/,
更改配置文件
这里是最重要的一步,我找了好久才在这个网站中找到适用的解决办法。
进入到主题目录,找到_config.yml配置问题,把mathjax默认的false修改为true,并更换cdn的url,具体如下:
# MathJax Support
mathjax:
enable: true
per_page: true
#cdn: //cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML
cdn: //cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML
如果配置文件里已经有这一行而且版本比这行还新的话,就可以不用更新。
写博客
在每次需要用LaTeX渲染的博文中,在文章的Front-matter里启动mathjax,具体如下:
-—
title: Hexo Usage
date: 2018-2-8 21:01:30
tags: Hexo
mathjax: true
-—
TRNG
TRNG(True Random Number Generator)是真随机数生成器。
真随机数生成器通常是通过放大电路的热噪声来产生随机数,温度高于绝对零度的原子都存在热运动,在集成电路里这些原子的热运动会在电路里产生噪声,噪声会使得电路中的电压存在微小的起伏,TRNG就是通过放大这些微小的起伏来产生随机数。
不过TRNG也有不少缺点。
- 首先就是产生随机数的速度很低,因为噪声放大电路有低通特性,使得高频的噪声被滤除了,而放大低频噪声就需要较长的时间,使得TRNG的工作频率受限。
- 其次是电路系统里有很多不同的噪声,但并不是所有噪声都是随机的,比如电源噪声中很大一部分就是和系统时钟强相关的。而TRNG是一个放大极小信号的电路,它对外界干扰是极其敏感的,为了避免外界非随机信号的干扰TRNG必须要耗费不少功率和面积在屏蔽上。由于面积和功耗限制,CPU中不能内置很多个TRNG;由于频率限制,单个TRNG输出的随机数数量有限,这使得单靠TRNG产生的随机数数量不足以满足系统需要。
还有用其他方法来生成随机数的,比如有个网站专门提供生成随机数的服务Random,该网站的随机数来自大气噪声(atmospheric noise)。
关于真随机数和伪随机数