2016 年 11 月
第 31 卷,第 11 期
此文章由机器翻译。
Azure IoT 中心 - 使用 Azure IoT 中心捕获和分析脑电波
大脑是解释来自多个源和多个接口,同时输入,并且随后触发某种操作或反应的引擎。源喜欢鲜花、 周日,或 firecrackers 和接口,像气味、 视线之外和声音可以触发 calmness、 物理移入阴影或嘈杂听错反应。目前,像这样可靠算法尚不存在由于大规模的源、 人力和接口之间的变量数。
派生此复杂算法的方法是更好地理解如何脑起作用,并且在许多情况下,如 smelling 鲜花、 正在刻录太阳和意外听到 firecrackers 所作出的反应。本文介绍如何获取更多洞察力上如何大脑函数在给定方案以期有一天在多个意外的情况下可靠地定义所作出的反应的算法。
捕获、 存储和分析大脑波形
在本文中介绍的项目使用多种技术来捕获、 存储和分析大脑波形,其中每个进行了简要描述 图 1。前两个部分 — 捕获大脑波形,并将它们存储到 Azure IoT 中心 — 本文的下一步的各部分所述。将在以后的文章 MSDN 杂志 》 的这篇文章的第 2 部分中说明的其余三个组件。
图 1 的大脑分析项目的组件
组件 | 角色 | 简要说明 |
Emotiv Insights SDK | 捕获 | 将转换为数字的大脑波大脑接口 |
Azure IoT 中心 | 存储 | 用于将 IoT 设备呈现数据的临时存储队列 |
SQL Azure | 存储 | 高度可伸缩的、 价格合理和弹性数据库 |
流分析 | 存储 | Azure IoT 和 SQL Azure 之间的接口 |
Power BI | 分析 | 使用简单的基于图形的支持的数据分析工具 |
部分按组件,每个包括的功能和技术的说明,以及编码或配置要求的详细信息。该解决方案的不同部分进行排序的方式采用我在其中创建它们。但是,就可以在将多个不同的有序序列中创建它们。技术目标是上载使用大脑计算机接口 (BCI) 收集大脑波、 将其存储到 SQL Azure 数据库和分析数据与 Power BI。
捕获大脑波形
当大脑接收输入,并且需要做出响应时,它决定如何将通过激发称为神经振动的神经元之间的电气电流回答。这些神经振荡是导致大脑中的真实、 可录制振动的明暗度不同和从不同位置的物理移动。
Electroencephalograph 捕获这些振动并仅在过去几年里有公司开始创建价格合理 BCI 以捕获这些脑活动。(许多这些公司和设备的列表是 bit.ly/2c7j4fw。) 此外,这些公司的几个已经创建一个 SDK,可以实现实时的可视化效果和脑活动的存储其设备。
我将简短 post 描写我将我脑波放入 Azure 中的初始意图您可以阅读在 bit.ly/294Hi4R。请注意,我选择此项目 Emotiv 见解 BCI。此 BCI 与每个提供五个不同的大脑频率,注意状态读数有五个电极 (AF3、 AF4、 T7、 T8 和 O1),如中所示 图 2。
图 2 Emotiv 见解 BCI 读数
大脑频率 | 注意 篈 |
ALPHA | 放松、 高级别的创造力,反射 |
LOWBETA | 社交活动、 令人兴奋,警报 |
HIGHBETA | 焦点、 快速的思维、 工作 |
灰度 | 想想,active 最佳频率 |
THETA | 睡眠状态,drowsy、 meditative 和在做梦 |
Emotiv SDK 是可下载从 GitHub (github.com/Emotiv) 对其进行轻松地配置; 此示例使用社区 sdk 版本。在配置 C# 版本的 sdk 即可使用 Visual Studio 运行时,还有三个"难题"不是直观︰
- 您需要将关闭注意到 Visual Studio 项目的"位数"并且位数属性面向否。 第 3 中的组件的位数。
- 请确保 DotNetEmotivSDK.dll 编译为否。 3 具有相同位数。
- 您需要手动将 edk.dll 和 glut32.dll/glut64.dll 复制到工作目录,例如的解决方案︰ /bin/Debug 或/bin/Release。
若要开始,导航到社区中的 C# 项目-sdk-master\examples\C # 文件夹并打开 Visual Studio 中的 DotNetEmotivSDK 解决方案。将 DotNetEmotivSDK 项目为启动项目设置,右键单击该项目并选择设置为启动项目,然后通过按 Ctrl + Shift + B 编译该项目。应特别注意目标平台并确保 SDK 在配置过程中保持一致。您应选择 x86 或 x64。
接下来,在 Visual Studio 中创建新的控制台应用程序并添加对在 DotNetEmotivSDK 项目的编译过程中创建通过右键单击引用并导航到 ex DotNetEmotivSDK.dll 的引用︰ \obj\x86\Release 目录,然后选择刚编译二进制文件。最后,按 DotNetEmotivSDK.dll 下达将 edk.dll 和 glut*.dll 文件复制到相同的工作目录。有 edk.dll 和 glut*.dll 的多个副本。选择包含在 SDK 中,此位置中的二进制文件社区-sdk-master\bin\win32,如果在已编译为 32 位的所有内容,否则,请选择 64 位版本。
一旦 SDK 已正确配置并且新的控制台应用程序,将使用 Emotiv Program.cs 类中引用库中的功能。如果需要,请将 BrainComputerInterface 项目在可下载的示例代码中查看。因为这是执行一些验证之前 BCI 设备的位置,则应特别注意 GetHeadsetInformation。
GetHeadsetInformation 方法 EmoStateUpdatedEventHandler,EmoEngine 类的 ProcessEvents 方法调用时触发该订阅。GetHeadsetInformation 方法将继续调用 ProcessEvents 在一段时间内的循环执行,直到 bool stopHeadsetInformation 设置为 false。当触发 EmoStateUpdatedEventHandler 时,它执行 engine_EmoStateUpdated 方法,该检查电池方法级别以及信号强度。务必收集电池有可接受的费用的 BCI 数据的有效性以及是否有足够的蓝牙 4.0 LE 连接 BCI 联系人和计算机之间。
在源代码中,捕获 BCI 数据不会开始这些两个度量值都通过了足够的阈值,例如,chargeLevel > 1 前 (& a) (& a) signalStrength > EdkDll.IEE_SignalStrength_t.BAD_SIG。只要信号强度大于的 IEE_SignalStrength_t.NO_SIG,其中 NO_SIG 意味着没有信号,该设备被视为正常运行,而不是最佳选择,因此 signalStrength 必须至少等于 GOOD_SIG 然后再继续。此外,maxChargeLevel 为 5 并且当前大于 1 的电量级别反映了正常工作状态。捕获大脑波形的代码,电池电量水平、 信号强度和电极的每个联系人的质量如下所示︰
EmoState es = e.emoState;
EdkDll.IEE_SignalStrength_t signalStrength =
es.GetWirelessSignalStatus(); es.GetBatteryChargeLevel(
out chargeLevel, out maxChargeLevel);
WriteLine($"AF3: {(int)es.GetContactQuality(
(int)EdkDll.IEE_InputChannels_t.IEE_CHAN_AF3)}");
WriteLine($"AF4: {(int)es.GetContactQuality(
(int)EdkDll.IEE_InputChannels_t.IEE_CHAN_AF4)}");
WriteLine($"T7: {(int)es.GetContactQuality(
(int)EdkDll.IEE_InputChannels_t.IEE_CHAN_T7)}");
WriteLine($"T8 : {(int)es.GetContactQuality(
(int)EdkDll.IEE_InputChannels_t.IEE_CHAN_T8)}");
WriteLine($"Pz : {(int)es.GetContactQuality(
(int)EdkDll.IEE_InputChannels_t.IEE_CHAN_O1)}");
警告: BCI 可用来实现从电极的读数,即使联系人质量已损坏。当捕获数据时,可能不是其他电极电极的一些工作,这不是理想的情况下,因为得出的结论的数据分析从更高版本所做可能被错误地解释如果所有电极在会话期间都不完全正常运行。该示例将对度量值并确认所有电极功能; 没有代码不过,这应该然后再将存储度量值是这种情况。编码逻辑以确认所有电极都是否完全正常运行之前运行代码的替代方法是使用可从进行在线 Emotiv CPANEL bit.ly/1LZge5T。您将看到类似于 图 3。
图 3 验证电极 BCI 的大脑接口上
一旦 engine_EmoStateUpdated 方法确认 BCI 是否正常运行,它会将设置 stopHeadsetInformation = false,将中断 while 循环 GetHeadsetInformation 方法中的。中所示的 C# 代码从每个电极读取频率 图 4 和 GetBrainInterfaceMeasurements 方法中找到。该方法首先创建用五个引用元素,每个电极在设备上的一个引用元素的类型 EdkDll.IEE_DataChannel_t 是一维数组。最后,程序遍历每五个电极并输出到控制台的频率优势。请注意,EmoEngine 类的 GetAverageBandPowers 方法接受 channel\electrode (channelList[i]) 和大脑批了数值表示形式是将存储到其中的频率变量 (theta、 alpha、 low_beta、 high_beta 和伽玛)。每个与电极一起读数均会呈现给控制台窗口中使用静态的 WriteLine 方法在系统类中找到。
图 4 读取大脑频率值接口电极
EmoEngine engine = EmoEngine.Instance;
EdkDll.IEE_DataChannel_t[] channelList = new EdkDll.IEE_DataChannel_t[5]
{
EdkDll.IEE_DataChannel_t.IED_AF3,
EdkDll.IEE_DataChannel_t.IED_AF4,
EdkDll.IEE_DataChannel_t.IED_T7,
EdkDll.IEE_DataChannel_t.IED_T8,
EdkDll.IEE_DataChannel_t.IED_O1
};
while (true)
{
for (int i = 0; i < 5; i++)
{
engine.IEE_GetAverageBandPowers(0, channelList[i],
theta, alpha, low_beta, high_beta, gamma);
WriteLine($"Channel: {channelList[i]}");
WriteLine($"Alpha: {alpha[0].ToString()}, Low Beta: {low_beta[0].ToString()}, " +
$"High Beta: {high_beta[0].ToString()}, Gamma: {gamma[0].ToString()}, " +
$"Theta: {theta[0].ToString()}");
}
}
控制台应用程序要求您具有 Emotiv 见解 BCI 和与之有效的蓝牙连接。所选 BCI,无论的原则是按以下方式相同︰
- 在开始之前捕获和存储数据请确保设备处于最佳且一致的状态,以便所有记录的数据收集以相同的方式。
- 了解如何配置电极以及什么这些度量值,然后访问度量值并显示它们,以便以后进行存储和分析。
一旦有了控制台应用程序使用,并将结果写入到控制台窗口中,转到下一节,其中讨论了如何配置 Azure IoT 中心。将在这篇文章的第 2 部分中讨论如何配置流分析将用于分析和学习 BCI 数据插入到其中的 SQL Azure 数据库。
并行之间编写代码和大脑
我相信我所做的代码结构的构造和人类的特点之间的连接的唯一人员。似乎在很多方面的代码平台构建旨在的使用我们自己人类的特点,在代码中定义自己的能力看起来非常好,因为它流,几乎没有思想。考虑的面向对象的编程术语继承,其中子类从父类接收一组属性和特性。在工作的上下文中,子级接收从其父级,如眼睛颜色和头发颜色属性。此外,能够引导、 闪烁和,依然芳香是人类通常拥有的有序特征的示例,我的父母一样。但是,这些特性并不直接来自我的父母,它们继承通过许多代从基本工作类本身开始。
如果您打算创建一个工作的类,您可能需要通过包括所有基本的人工属性执行操作,如性别,使该类中的特征吃、 休眠、 松口气了,依此类推。然后,将创建继承自人工类,具有反射等一些附加唯一或更多高级特性的父类、 说话,喜欢,依次类推假设,与否,,继承的类的每一代变得更加复杂和复杂随着时间的推移。继承渐进式排列到较新的子类的实现。
方式人类说话,并将与每一代,是称为多态性的另一个编程概念的发生位置的更改通知。多态性意味着,尽管父特征都有相同的名称、 用途和意图的子级,但它可以执行不同的方式,并且具有多个输入,以便更精确的结果。例如,尽管父任务具有朗读的容量,子可以有类似说话此外还包括与支持人员交谈的能力以多种语言的方法。到 speak 的方法,则其他参数应为语言类型。此输入将不会出现在 speak 的方法的父级。派生或重载说话特征还可能包括诸如面部的表达式或音转折点之类的一些增强的通信功能。
创建这些结构化的类,复杂的方法和属性的唯一一套是到了实践经验教训,我们在内部 self 与存在的精彩之旅。构造并定义自己是了解为什么说我们自己是的最好办法。还有一件事,但是,即很快就意识到后生成的模型,即︰ 如何触发方法,因此子实际做点什么。实例化类并非难事 (子子 = 新 Child()) 但的引擎,然后将调用的方法,并使用这些属性是什么? 不带引擎,就存在是静止不动并 thoughtless 实体。而人引擎使用如视觉、 嗅觉和触觉的感官来触发适当的方法,计算机引擎使用的数据和编码的逻辑,以将输入解释为某项操作的基础。为了正确编码逻辑写入我们首先需要全面了解人们的工作方式,我们不执行该操作。缺少的信息是的大脑。
存储大脑波形
为了存储从 BCI 收集大脑波形,有许多必需的组件。从各个角度看,您可以想象,弄简单的 ADO.NET 连接到本地 SQL 数据库就是这样;但是,如果您想要让许多设备都很多人使用该应用程序,使用 Azure IoT 中心是转由于其可靠性和可伸缩性的最佳方法。以下三个组件需要成功上载和存储大脑波︰
- Azure 的 IoT 中心
- 设备标识
- 代码来上载大脑批
- SQL Azure 实例和数据表
- 流分析接口
我将现在讨论更详细地创建 Azure IoT 中心。
创建 Azure IoT 中心
它临时存储的假定条件下的数据的多个行,另一实体,如读取器或,这种情况下,流分析作业,请在被监视队列并采取措施,一次消息到达时,Azure IoT 中心是类似于消息队列。Azure IoT 中心的好处是它非常灵活处理,可在短时间内扩展到很大的大小。测试时此解决方案,我插入每秒就以下三个行,并且客户端的记录计数精确匹配的服务器端计数。每秒的三个事件是很小;Azure IoT 中心可处理数百万的每秒事件数。
若要创建 Azure IoT 中心,您需要一个 Azure 订阅和访问在 Azure 门户 bit.ly/2bA4vAn。单击 + 新菜单项和导航到物联网并选择 IoT 中心。输入所需的数据,然后按创建按钮。很可能有 IoT 中心层每个订阅只能有一个免费。免费层支持每个工作日的 8000 事件。免费层是我选择了此项目;但是,如果需要插入更多的事件,然后选择适当的存储层。创建后,查看详细信息,如中所示 图 5。
图 5 BCI Azure IoT 中心的详细信息页
创建 Azure IoT 中心后下, 一步是创建唯一的设备标识所需的连接并将数据上载到 Azure IoT 中心。可下载的源代码包含一个名为 BrainComputerInterface-CreateIdentity,后者将执行此活动的控制台项目。若要创建您自己的项目,首先在 Visual Studio 中创建空的控制台应用程序。创建后,右键单击该项目并选择管理 NuGet 包,然后搜索并添加用提供的示例的代码; Microsoft.Azure.Devices 包使用版本 1.0.11。
代码设备实体的创建,访问 Azure IoT 中心并通过选择共享获取连接字符串在开始之前访问从设置边栏选项卡的策略。接下来,选择相应的策略中的表中所述 图 6。选择一个表所示的策略将打开边栏选项卡中显示的权限和共享访问密钥。复制连接字符串的主键,并使用它来设置连接字符串中所示的值 图 7。
图 6 连接字符串策略、 权限和用法
策略 | 权限 | 用法 |
Iothubowner | 注册表读/写、 服务/设备连接 | 管理 |
服务 | 服务连接 | 发送和接收端云的终结点上 |
设备 | 设备连接 | 发送和接收设备端终结点上 |
RegistryRead | 注册表读取 | 对标识注册表的读取访问权 |
RegistryReadWrite | 注册表读/写 | 对标识注册表的读/写访问 |
图 7 创建的每个唯一的设备 ID 的设备密钥
static RegistryManager _registryManager;
static string _connectionString = "the iothubowner connection string";
static void Main(string[] args)
{
_registryManager = RegistryManager.CreateFromConnectionString(_connectionString);
AddDeviceAsync().Wait();
ReadLine();
}
private static async Task AddDeviceAsync()
{
string deviceId = "ADD UNIQUE DEVICE ID";
Device device;
try
{
device = await _registryManager.AddDeviceAsync(new Device(deviceId));
}
catch (DeviceAlreadyExistsException)
{
device = await _registryManager.GetDeviceAsync(deviceId);
}
WriteLine($"Generated device key: {device.Authentication.SymmetricKey.PrimaryKey}");
}
若要创建设备标识,需要对标识注册表有写权限的策略的连接字符串。这意味着您将使用 iothubowner 或 registryReadWrite 策略。强烈建议为权限执行所需的任务; 所需的最少使用策略这将减少意外的操作,例如全局删除或更新操作的机会。保护 iothubowner 连接字符串参数并将其提供仅在需要创建设备标识或其他管理活动时。
查看示例代码所示 图 7。由于这是一个简单的程序,作为静态类变量; 创建 _connectionString 和 Microsoft.Azure.Devices.RegistryManager _registryManager它也是很好,在 Main 方法中创建它们,如果需要将它们作为方法参数传递。实例化通过调用 CreateFromConnectionStringMethod _registryManager 变量,然后以异步方式调用 Program.AddDeviceAsync 方法。
Program.AddDeviceAsync 方法调用 Microsoft.Azure.Devices.RegistryManager.AddDeviceAsync 方法,并传递新 Microsoft.Azure.Devices.RegistryManager.Device。如果尚不存在一个标识,则创建它;否则,会引发 Microsoft.Azure.Devices.Common.Exceptions.DeviceAlreadyExistsException。因为代码运行 try {} catch {} 代码块中处理异常。在 catch 块中 {} Microsoft.Azure.Devices.RegistryManager.GetDeviceAsyncmethod 调用,并且,在这两种情况下,是否已调用的添加或 Get 方法,设备项呈现到控制台。
一旦完成并编译代码,执行代码并记下设备项,如具有所需创建包含的逻辑连接,并将数据发送到下一节中使用的 Azure IoT 中心 DeviceClient 类。此外,再次查看 图 5 并请注意,设备链接最初灰显。创建设备之后,将启用 Azure IoT 中心边栏选项卡上的设备链接。方法单击该行可以禁用/启用该设备并检索设备的密钥,只是以防万一您在控制台窗口中创建时丢失。
已在上一节中写入代码以捕获大脑波形。现在应该做什么是,而不是编写 BCI 输出到控制台,将其写入到刚创建的 Azure IoT 中心。在示例代码中,还有一个名为 BrainComputerInterface 项目其中 while {} 循环中之前所述 图 2 将更改为调用新方法 SendBrainMeasurementToAzureAsync,如中所示 图 8, ,它将 BCI 数据发送到 Azure IoT 中心,而不是转储到控制台读取的大脑计算机接口。
图 8 大脑批插入 Azure IoT 中心
while (true)
{
for (int i = 0; i < 5; i++)
{
engine.IEE_GetAverageBandPowers(0, channelList[i],
theta, alpha, low_beta, high_beta, gamma);
SendBrainMeasurementToAzureAsync(channelList[i].ToString(), theta[0].ToString(),
alpha[0].ToString(), low_beta[0].ToString(),
high_beta[0].ToString(), gamma[0].ToString());
}
}
private static async void SendBrainMeasurementToAzureAsync(string channel,
string theta, string alpha, string lowbeta, string highbeta,
string gamma)
{
// ...
try
{
var brainActivity = new
{ ManufacturerId, HardwareId, ActivityId, ChannelId,
DeviceId, UserName, MeasurementDateTime, theta,
alpha, lowbeta, highbeta, gamma };
var messageString = JsonConvert.SerializeObject(brainActivity);
var message = new Message(Encoding.ASCII.GetBytes(messageString));
await deviceClient.SendEventAsync(message);
catch (Exception ex)
{ //...}
}
请注意,SendBrainMeasurementToAzureAsync 方法使用 Microsoft.Azure.Devices.Client.DeviceClient,如前面提到的并 Newtonsoft.Json 类,用于设置数据格式以及添加到云读取 BCI。如果创建新项目之后,通过右键单击该项目并选择管理 NuGet 包添加这些两个 NuGet 程序包。
现在,BCI 输出写入 Azure IoT 中心的代码已完成,可以将 BCI 放在头和启动上载。BrainComputerInterface 程序开始运行,它将要求您选择的情形是用来存储大脑波形。其中一些示例 smelling 鲜花,要在阳光下融化,听到爆竹,依此类推。选择的方案,验证电极/联系人为绿色 (请参阅 图 3),并准备好的电源和传感器模块后,大脑波将启动要捕获和上载到云。
请注意,这个时候,您将看到使用情况计量器 IoT 边栏选项卡更改为正在发送数据 (请参阅 图 5),但是,数据将被删除在大约 24 小时后因为,在这种情况下,没有数据库来存储数据和程序将消息从 Azure IoT 中心移到永久存储位置。在第 2 部分,SQL Azure 数据库创建,跟流分析作业,以便可以对数据进行分析并发现新事物。
总结
本系列文章最终应使您向该路径是两个方面。第一种是从认知从何处越了解有关你自己和您的大脑工作原理,越多就可以开始复制,或增强来提高您的生活质量的角度。机位于更好、 更快地完成数学运算,它们可以从更广泛的知识库,来制定决策,而无需情感,比人工大脑是能够绘制。如果由于某种原因,可以将此集成到您自己认知正在,使用某种类型的人工智能,然后您能够更快、 更准确地说就越大。
其他概念是能够在日常生活中使用控制项的想法。随着能够熟练地捕获和分析大脑波形的增加,能够信心十足地使用它们也会增加。后一个或多个思考过程喜欢推送,完美地定义请求订阅或数值调节钮,可以使用它们来控制对象,或执行活动,例如,更改电视频道或在无线广播信道。它甚至可能可以捕获读取,并且之前您自己将识别希望这样做可能采取某项操作。一切皆有可能。
Benjamin Perkins 是 Microsoft 的 C#、 IIS、 NHibernate 和 Microsoft Azure 上的四部著作的作者专家级工程师。 他最近完成的共同编写 《 C# 入门 6 编程使用 Visual Studio 2015 》 (Wrox)。与他联系。 benperk@microsoft.com。
衷心感谢以下 Microsoft 技术专家对本文的审阅: Sebastian Dau
Sebastian Dau 是在 Azure IaaS 团队嵌入专家级工程师