引言
在本文中,我将告诉您如何通过Bluegiga BLED112蓝牙模块将AtomTag剂量计连接到Raspberry PI,以便将测量结果传输到人员监视服务。AtomTag-适用于智能手机和平板电脑的蓝牙低功耗剂量计,带有Geiger计数器SBM-20。设备将传输到服务器:剂量率,统计错误和电池电量。在文章的结尾,我们将看到剂量计的读数与天气事件如何相关。(narodmon.ru) — SaaS ( , ) (, , ., , , ), - () .
Generic Attribute Profile (GATT)
AtomTag剂量计支持GATT配置文件。在蓝牙术语中,配置文件是特定蓝牙设备可用的一组功能。GATT配置文件定义了数据存储的层次结构。该结构如图所示:
服务是一个包含几个称为特征的属性的容器。所有服务都有唯一的标识符UUID和HANDLE。例如,剂量计有2种服务:1.为用户提供的服务,其中包含读取测量结果和记录用户设置(声音警报设置)的特征。2。包含用于存储出厂设置的特征的服务:校准因子,设备名称等。特征 -包括:1.值(通常不超过20个字节)。2.描述符-在此描述特性的目的,存储数据的类型以及特性的设置。3.唯一标识符UUID和HANDLE。我们感兴趣的数据:记录的脉冲数和电池电量完全存储在特性中。发光二极管
该模块是USB-CDC设备,在系统中定义为/ dev / ttyACM0,并且不需要在内核版本4.4的Raspbian Jessie Lite上安装任何驱动程序。与模块的数据交换也与串行端口一样进行。交换协议是二进制的。我们不会自己编写协议解析器,因为 该模块有很多命令,并且可以从制造商处获得C格式的SDK。到SDK的链接将在本文的末尾。Raspberry PI软件
我们从SDK需要以下文件:1。 cmd_defs.c,cmd_defs.h2. apitypes.h3. commands.c4. uart.c,uart.c的API是一个回调为主。 commands.c文件声明了未使用的回调的存根实现。 SDK定义了两种可以来自模块的消息类型:事件和操作结果。在我们的程序中,当测量特性发生变化时,我们将使用剂量计每2秒发送一次的警报,从剂量计接收数据。结果,模块每隔2秒就会出现一个事件,并会调用相应的回调。让我们分析使用剂量计连接和交换数据的算法:1.打开端口/dev/ttyACM0
2。使用重新启动功能的蓝牙模块api ble_cmd_system_reset();
3通过使用其地址连接到装置ble_cmd_gap_connect_direct()
4名的请求的设备和服务的范围的列表,其中特征是HANDL'y这些服务ble_cmd_attclient_read_by_group_type()
5.活动结束后ble_evt_attclient_procedure_completed
与查询特性清单ble_cmd_attclient_find_information().
6.在事件ble_evt_attclient_find_information_found
记测量特性和客户特性配置描述符(CCCD)的HANDL。7.万一发生,请ble_evt_attclient_procedure_completed
打开警报。在上一段中,我们认识到了CCCD的句柄,并且可以读取或写入它。要启用通知,您需要使用以下功能在CCCD描述符中设置“ notifications enabled”标志ble_cmd_attclient_attribute_write()
。与设备断开连接后,此句柄的值将重置。8.现在,当更改设备特性的值时,将引发一个事件ble_evt_attclient_attribute_value(const struct ble_msg_attclient_attribute_value_evt_t *msg)
。您可以通过参数将一个特性与另一个特性区分开:
定义测量特性值的结构:msg->atthandle.
typedef struct __attribute__((__packed__)){
uint8 status_flags;
float dose;
float doserate_search;
uint16 pulses_last2sec;
uint8 battery;
uint8 temperature;
} atomtag_measurement_t;
atomtag_measurement_t measurement_char;
由于测量特征值中的字节顺序为小端,因此将所有这些字节复制到打包结构中就足够了:memcpy((uint8 *)&measurement_char, msg->value.data, msg->value.len);
将在6分钟的时间间隔内计算剂量率。我们不会每6分钟发送一次证词到narodmon.ru服务器。除了剂量率,我们还将发送电池电量和统计错误。所有计算都在ble_evt_attclient_attribute_value()
文件的回调中进行, main.c.
使用tcp协议将读数发送到端口8283 narodmon.ru。未检查来自服务器的响应。文字通讯协定:#00:00:00:00:00:00\n
#R1#10.5#err = 10%, batt = 100%\n
##
首先是设备的MAC地址(6个字节)。在源代码中,以MAC地址为例,不要忘记对其进行更改!此外,在10.5 -在MR / h的剂量率,呃-统计误差来编译这一切用gcc的帮助:gcc -std=gnu99 -lm main.c cmd_def.c commands.c uart.c web.c -o narodmon-bin
为了使程序在加载操作系统后能够自动启动,我在rc.local文件的退出0之前添加了以下几行:cd /
./home/pi/narodmon/narodmon-bin /dev/ttyACM0 5c:31:3e:da:e8:9c
5c:31:3e:da:e8:9c-蓝牙设备的地址,如果使用以下扫描参数运行此程序,则可以找到该地址:./narodmon-bin /dev/ttyACM0 scan
结果
设备运行几天后,图表上出现了有趣的事情。在这里,您可以看到降雪期间剂量率的变化。11月11日晚上17:00到18:00,冻雨停止,开始下雪。随着积雪厚度的增加,平均剂量率降低。剂量计安装在距地面2米的高度。剂量率下降的原因是,雪层部分屏蔽了地球表面的自然伽马辐射。而且,雪层阻止了gas气进入表面,其子产物可以通过常规剂量计检测到。现在我们可以估算出雪的厚度了:)在那些日子里,大约有8-10厘米的降雪量。航空摄影在世界范围内被实践用来评估水力发电厂所在地区的积雪厚度,以便了解春季可能发生的洪水类型。由于具有更高的灵敏度,因此仅使用带有闪烁探测器的伽马能谱仪。在民间监测服务的其他剂量计上也观察到了类似的图像,尽管并非所有剂量计都如此频繁地提供数据,并且不清楚在那里使用了哪种算法来计算剂量率。可以通过添加一个缓冲区来修改该程序,当没有Internet连接时,剂量计读数将保存到该缓冲区。People's Monitoring API使您可以追溯发送读数。也值得将树莓派连接到不间断电源。尽管设计简单,但仍有可能获得约30天的正常运行时间。可在此处找到国家监测地图上的剂量计。请不要踢-我是Linux新手。
参考文献
1. AtomTag剂量计2. SDK和Bluegiga BLED112文档3. 人员监视服务4. 蓝牙LE,规范5. Raspberry PI程序的源代码
6. 人员监视监视Android应用程序