Node应用

蓝牙

有经典蓝牙(classic)和低功耗蓝牙(Bluetooth Low Energy BLE).

BLE关键术语:每个蓝牙4.0的设备都是通过服务和特征来展示自己的。
service : 一个设备必然包含一个服务以上(至少包含一个服务,有可能包含更多的服务)。
characteristic : 包含在服务下, 描述该服务下特定的功能的, 一般拥有多个characteristic, 而且characteristic有类型, 读(read), 写(write), 通知(notify)等。
UUID(Universally Unique Identifier) : 设备的每一个service有相应的UUID, 同时每一个characteristic也有相应的UUID。

  • Service:服务,服务是一个集合的特点。例如有一个名为“心率监视器”的服务,其中包括诸如“心率测量”的特征。可以在bluetooth.org上找到现有基于GATT的个人资料和服务的列表。
  • GATT:通用属性简档,用于通过BLE链路发送和接收称为“属性”的短数据块的一般规范。所有当前的低能量应用配置文件都基于GATT。
    蓝牙SIG为低能量设备定义了许多配置文件 。 配置文件是设备在特定应用程序中的工作方式的规范。 请注意,设备可以实现多个配置文件。 例如,设备可以包含心率监视器和电池水平检测器。
  • ATT:属性协议,GATT建立在ATT之上,也称为GATT/ATT。ATT经过优化,可在BLE设备上运行,为此它使用尽可能少的字节。每个属性由通用唯一标识符(UUID)唯一标识,UUID是用于唯一标识信息的字符串ID的标准化128位格式。由ATT传送的属性被格式化为特征和服务。
  • 特征:特征含描述特征值的单个值和0-n个描述符。即每个特征值包含一个value 和多个 descriptor,在某个特征值的value中包含数据信息。
  • Descriptor:描述符,描述符是描述特征值的定义属性。

每个service包含一个或多个characteristic(特征值)

蓝牙常用开发步骤
https://www.jianshu.com/p/2809ead73d2a

蓝牙协议4.0、4.1、4.2的比较

SIG在2010年发布了4.0的specification,2013年发布了4.1的specification,2014年又发布了4.2的specification。从4.0版本起,革命性的加入了BLE协议部分,同时将2.1+EDR和3.0+HS全都包含在内。4.1和4.2在4.0的基础上做了改进,主要包括连接速度,传输效率等等,可以看出是向着适用于物联网的方向做的改进。
首先,相比4.0,4.1和4.2最明显的特点是增加了一个volume 7:Wireless Coexistence volume。主要介绍手机的无线共存测试。移动通讯采用4G-LTE标准后会占用2.4GHz频段,4.1和4.2的specification对此做出了测试。
4.1和4.2在4.0的基础上添加了IPv6和6LowPAN,搭载蓝牙芯片的设备可以取得在互联网上的唯一标记,与其他的联网设备进行通讯。
4.1和4.2提高了4.0的传输速率,4.0的协议栈规定了每包承载有效数据不大于20字节,4.2把这个数值扩大了10倍,最终将BLE的传输速率提高了2.5倍,不过据说要等硬件升级才能感受到这一低功耗高速率的传输方式。
4.1和4.2实现了主从一体,比如智能手环作为主和防丢器连接的时候,智能手环同时也可以作为从和智能手机相连。
4.1和4.2再有一个很重要的方面是改进了蓝牙连接的安全性。
物联网构成无线连接一定是组网灵活、低功耗、带宽适用和安全的,蓝牙在向着这样的方向发展。与wifi和zigbee相比,蓝牙无疑是最有竞争力成为物联网协议的无线连接规范。

NODE REPL

REPL(Read Eval Print Loop:交互式解释器)

Node 自带了交互式解释器,可以很好的调试 Javascript 代码,可以执行以下任务:

读取 – 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
执行 – 执行输入的数据结构
打印 – 输出结果
循环 – 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。

http://www.runoob.com/nodejs/nodejs-repl.html

安卓手机向Mac通过蓝牙发送文件

mac系统偏好设置>共享 勾蓝牙共享,选接受并存储。

小米手环
http://www.cnblogs.com/wobeinianqing/p/5883135.html
http://www.jianshu.com/p/1dfba61e2a9d

其它
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html
https://developer.android.com/guide/topics/connectivity/bluetooth.html?hl=zh-cn#TheBasics
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html?hl=zh-cn
https://github.com/akexorcist/Android-BluetoothSPPLibrary
https://github.com/Jasonchenlijian/FastBle/issues
http://blog.csdn.net/dingjikerbo/article/details/49254573
https://github.com/dingjikerbo/BluetoothKit
http://blog.csdn.net/woshasanguo/article/details/41082395
https://my.oschina.net/tingzi/blog/215008
http://www.jianshu.com/p/2268cfedc051
http://www.cnblogs.com/cxk1995/p/5693979.html
http://blog.csdn.net/fangqiangqi/article/details/51510115
https://books.google.ca/books?id=vw9JDwAAQBAJ&pg=PT164&lpg=PT164&dq=%E8%93%9D%E7%89%99%E4%B8%BB%E4%BB%8E%E6%A8%A1%E5%BC%8F+%E4%B8%80%E5%AF%B9%E5%A4%9A&source=bl&ots=qIFm7_6O47&sig=gd0F710X2JwmVK5905XUh9xI0mk&hl=zh-CN&sa=X&redir_esc=y#v=onepage&q=%E8%93%9D%E7%89%99%E4%B8%BB%E4%BB%8E%E6%A8%A1%E5%BC%8F%20%E4%B8%80%E5%AF%B9%E5%A4%9A&f=false

蓝牙通讯过程

经典蓝牙和BLE的流程是不同的。
经典模式: 1.扫描设备. 2.建立设备连接. 3.建立socket连接. 4.发送和接收数据. 5.通讯完毕关闭连接清理缓存.
BLE 比经典模式复杂很多。
作为一个中心角色要实现完整的通讯,一般要经过这样几个步骤:
建立中心角色 -> 扫描外设(discover)—> 连接外设(connect) —> 扫描外设中的服务和特征(discover) —> 与外设做数据交互(explore and interact) —> 断开连接(disconnect)。

一个设备里的服务和特征往往比较多,大部分情况下我们只会在发现服务和特征的回调里去匹配关心其中几个。
数据的读分为两种,一种是直接读(reading directly),另外一种是订阅(subscribe)。具体用哪一种要看具体的应用场景以及特征本身的属性。特征有个properties字段(characteristic.properties),它是一个整型值,可能以下一些定义:

enum {  
     CBCharacteristicPropertyBroadcast = 0x01,  
     CBCharacteristicPropertyRead = 0x02,  
     CBCharacteristicPropertyWriteWithoutResponse = 0x04,  
     CBCharacteristicPropertyWrite = 0x08,  
     CBCharacteristicPropertyNotify = 0x10,  
     CBCharacteristicPropertyIndicate = 0x20,  
     CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,  
     CBCharacteristicPropertyExtendedProperties = 0x80,  
     };

如果要交互的特征的properties的值是0x10,表示只能用订阅的方式来接收数据。

RSSI

为什么无线信号(RSSI)是负值
答:其实归根到底为什么接收的无线信号是负值,这样子是不是容易理解多了。因为无线信号多为mW级别,所以对它进行了极化,转化为dBm而已,不表示信号是负的。1mW就是0dBm,小于1mW就是负数的dBm数。

弄清信号强度的定义就行了:
RSSI:接收信号强度 Received Signal Strength Indicator
Rss=10logP, 只需将接受到的信号功率P代入就是接收信号强度(灵敏度)。
RSSI的单位是dbm,假设发射功率取最大值为1mw,那么RSSI的值为0,也就是说距离蓝牙最近时在理想状态下所获取的RSSI的值为0,但在实际中基本不会存在这个理想状态,因此RSSI的值基本都为负数。而在蓝牙中,当距离很近时,所收到的RSSI的信号值大约在-50dbm。

UUID

每个蓝牙4.0的设备都是通过服务和特征来展示自己。一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位。例如一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来与收发数据。
服务和特征都是用UUID来唯一标识的,国际蓝牙组织为一些很典型的设备(比如测量心跳和血压的设备)规定了标准的service UUID(特征的UUID比较多,这里就不列举了),例如:

#define     BLE_UUID_ALERT_NOTIFICATION_SERVICE   0x1811  
 #define     BLE_UUID_BATTERY_SERVICE   0x180F  
 #define     BLE_UUID_BLOOD_PRESSURE_SERVICE   0x1810  
 #define     BLE_UUID_CURRENT_TIME_SERVICE   0x1805  
 #define     BLE_UUID_CYCLING_SPEED_AND_CADENCE   0x1816  
 #define     BLE_UUID_DEVICE_INFORMATION_SERVICE   0x180A  
 #define     BLE_UUID_GLUCOSE_SERVICE   0x1808  
 #define     BLE_UUID_HEALTH_THERMOMETER_SERVICE   0x1809  
 #define     BLE_UUID_HEART_RATE_SERVICE   0x180D  
 #define     BLE_UUID_HUMAN_INTERFACE_DEVICE_SERVICE   0x1812  
 #define     BLE_UUID_IMMEDIATE_ALERT_SERVICE   0x1802  
 #define     BLE_UUID_LINK_LOSS_SERVICE   0x1803  
 #define     BLE_UUID_NEXT_DST_CHANGE_SERVICE   0x1807  
 #define     BLE_UUID_PHONE_ALERT_STATUS_SERVICE   0x180E  
 #define     BLE_UUID_REFERENCE_TIME_UPDATE_SERVICE   0x1806  
 #define     BLE_UUID_RUNNING_SPEED_AND_CADENCE   0x1814  
 #define     BLE_UUID_SCAN_PARAMETERS_SERVICE   0x1813  
 #define     BLE_UUID_TX_POWER_SERVICE   0x1804  
 #define     BLE_UUID_CGM_SERVICE   0x181A

但还有很多设备并不在这个标准列表里,例如体脂秤血压计。蓝牙设备硬件厂商通常都会提供他们的设备里面各个服务(service)和特征(characteristics)的功能。比如哪些是用来交互(读写),哪些可获取模块信息(只读)等。

发表评论