亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Win 10 IoT-Core RPI2 的通用串行蓝牙

组件和用品

Raspberry Pi 2 B 型
× 1
通用蓝牙 USB 加密狗
× 1
Arduino UNO
× 1
SparkFun 蓝牙调制解调器 - BlueSMiRF 银色
× 1

应用和在线服务

Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

关于这个项目

进一步

这个项目在 embedded101.com 中有详细讨论:

《Win 10 IoT-Core:蓝牙通用 Windows 串行应用》

关于

该项目是一个通用 Windows 应用程序,它使用遗传蓝牙 USB 加密狗通过蓝牙串行配置文件将物联网核心设备(例如 Raspberry PI 2)连接到嵌入式蓝牙设备。

背景

.Bluetooth 支持短距离的对等网络。与 Wi-Fi 网络不同,蓝牙连接是一对一的。两个设备可以连接和交互。例如,两个设备可以使用串行配置文件以对称方式连接,并在它们之间传递原始数据。但通常,蓝牙连接是不对称的,一端生成要在另一端使用的特定数据格式。例如,手机可以实现 A2DP(高级音频分发配置文件)配置文件并将音频流式传输到实现 HSP(耳机)配置文件的耳机。OBEX(对象交换)是两个设备之间的对称连接,因为它们在它们之间交换数据。

Microsoft IOT-Core 蓝牙示例项目使用 GATT(通用属性配置文件配置文件)。这为低功耗蓝牙协议提供配置文件发现和描述服务。通过该协议,可以在一端连接简单的低功耗设备,生成数据供复杂的处理器使用。

这是一个比 Microsoft 示例简单得多的项目。它只涉及基于 RFCOMM 配置文件的更通用的 SPP(串行端口配置文件)。它是用一个非常旧的 USB 蓝牙加密狗开发的,因此应该可以与任何蓝牙加密狗一起使用。

物联网应用

此应用程序是一个简单的蓝牙串行通用 Windows (Windows 10) 测试应用程序。它首先枚举(作为列表)与运行应用程序的设备蓝牙配对的所有设备。通过双击启动连接来选择一个。要发送的文本在文本框中输入并在按下按钮时发送。该应用程序会自动接收发送给它的任何文本(并显示它)。因此,当端点(如上)简单地回显其接收到的文本时,发送的文本应重新出现在 UW 应用程序的接收框中。


终点

使用蓝牙适配器测试 Arduino Uno。它有一个简单的屏蔽,可以回显它通过蓝牙连接接收到的任何字符:

盾牌设置:

// 串行环回应用程序// 过去设置// 由连接的系统启动// 注意可以与蓝牙一起使用,其中BT 设备的RxTx // 连接到Arduino 板的TxRx。 // 需要断开 BT 适配器以进行编程。 void setup() { // 我的适配器设置为此 BAUD 115200 // 这是 Arduino 到 BT 适配器端口速率 // 当 BT 适配器处于命令模式时设置。 // 它不是您无法设置的 BT 速率。 Serial.begin(115200);延迟(333);而(!串行);延迟(1000); Serial.println("敏捷的棕色狐狸跳过懒狗!");} 

盾环:

void loop() { char ch =Serial.read(); while ( 255 ==(byte) ch) { ch =Serial.read(); } Serial.print(ch);} 

配对

蓝牙是一种对等方案。在他们可以通过蓝牙连接之前,他们必须配对。这不是在应用程序中完成的。与密钥配对在嵌入式设备之间可能会出现问题,因为它们通常是无头的并且可能不支持弹出窗口(因为 IoT-Core 不支持)。有一个 IoT-Core 门户网站可以执行此操作,设备上还有一个命令行实用程序,可以通过 SSH shell 运行。最新版本的操作系统门户网站支持密钥配对,而该密钥配对在 Windows 10 RTM 期间缺失。 “Win 10 IoT-Core:蓝牙通用 Windows 串行应用程序”详细讨论了这种情况下的配对。

启动项目

应用项目是在 Visual Studio 2015 中使用通用 Windows 应用模板创建的:

新建项目-->Visual C#->Windows->空白应用程序(通用Windows)

创建应用界面

UI 是在 XAML 中实现的

根据上述(或类似)布局创建 UI:

用户界面非常简单,其创建方式如下:

  • 所有文本元素都是 TextBlocks,除了 SendText 是一个 TextBox
  • SendText 接受 CarriageReturn(即多行)
  • Recvd 文本启用了 WrapText(即多行)
  • UI 元素使用设置为水平方向的 StackPanel 按行组织
  • 然后将这些 StackPanel 与设置为垂直方向的 StackPanel 以及 ListBox 堆叠在一起。

您可能更喜欢使用相对堆栈面板或使用网格行和列等来布局 UI。

ConnectDevices 是一个 ListBox,其绑定源设置为 PairedDevices(稍后查看 ) 和一个由 TextBlock 组成的 ItemTemplate 绑定到 PairedDevices 的 Name 属性(稍后查看 )。

      

应用配置

  • 该应用不使用 IOT-Core 功能,因此不需要任何扩展参考。
  • 该应用需要一些特定的蓝牙和串行功能添加到 Package.appxmanifest。
  • 不幸的是,如果您在解决方案资源管理器中双击该文件,您获得的 UI 不支持添加这些功能,因此您需要通过右键单击解决方案资源管理器中的文件并选择打开方式来手动添加它们->XML 编辑器。

将功能部分(底部)修改为:

       

internetClient 功能已经存在。此应用程序不需要它,因此您可能希望将其删除。我把它留在里面。

配对设备信息

在应用程序启动时,使用以下方法枚举配对的设备:

DeviceInformationCollection DeviceInfoCollection

=await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));

这个集合然后变成一个 ObservableCollection 可以在 ListBox 中使用:

_pairedDevices =new ObservableCollection();

DeviceInfoCollection 通过创建 PairedDeviceInfo 进行迭代 每个项目的对象,然后添加到 _pairedDevices 收藏。

配对设备信息 是一个有属性的类:

名称 <字符串>

Id

DeviceInfo

该类有一个合适的构造函数。

设备信息Windows.Devices.Enumeration.DeviceInformation

在配对设备列表框中,名称 字段被(绑定)显示。

选择设备时(双击)端点的设备信息实际上是所选菜单项的一部分,因此用于建立连接。

连接

DeviceInformation 用于获取 RFCOMM 服务。然后使用端点主机名(实际上是它的蓝牙 Mac 地址)和 ServiceName 字符串作为 StreamSocket 建立连接。

_service =await RfcommDeviceService.FromIdAsync(DeviceInfo.Id);_socket =new StreamSocket();await _socket.ConnectAsync(_service.ConnectionHostName, _service.ConnectionServiceName); 

如果一切顺利,那么我们就有了一个连接 .. 套接字将是有意义的(非空)。

当然这是错误捕获(try-catch)

发送文本和接收文本使用套接字的 InputStream 和 OutputStream 属性。

接收文本

接收文本应该首先开始,因为它作为一个单独的线程运行。它运行异步等待以获取串行输入,处理输入然后运行另一个异步串行接收......所有这些都在一个循环中。此循环不断,直到产生取消。

private async void Listen(){ ReadCancellationTokenSource =new CancellationTokenSource(); if (_socket.InputStream !=null) { dataReaderObject =new DataReader(_socket.InputStream); // 继续读取串行输入 while (true) { await ReadAsync(ReadCancellationTokenSource.Token); } }}DataReader dataReaderObject;private CancellationTokenSource ReadCancellationTokenSource;private async Task ReadAsync(CancellationToken cancelationToken){ uint ReadBufferLength =1024; // 如果请求取消任务,则遵守 cancelToken.ThrowIfCancellationRequested(); // 设置 InputStreamOptions 以在一个或多个字节可用时完成异步读取操作 dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // 创建一个任务对象来等待serialPort.InputStream上的数据 loadAsyncTask =dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // 启动任务并等待 UInt32 bytesRead =await loadAsyncTask; if (bytesRead> 0) { string recvdtxt =dataReaderObject.ReadString(bytesRead); }} 

发送文本

虽然接收的文本是异步执行的,因为从应用程序的角度来看文本的到达是不确定的,发送的文本是从应用程序的 UI 操作的,因此本质上是同步的(尽管使用了 await 来释放 UI)。

private async void Send(string msg){ Task storeAsyncTask; DataWriter dataWriteObject =new DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); // 启动异步任务完成写操作 storeAsyncTask =dataWriteObject.StoreAsync().AsTask(); UInt32 bytesWritten =await storeAsyncTask;} 

按钮状态

命令按钮的启用和禁用取决于应用程序的状态。例如发送和开始接收按钮在应用未连接时禁用,但在应用连接时启用等。

享受! :)

代码

Github 上的 iotbluetoothserial
同样在 Codeplex(镜像)上 https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

制造工艺

  1. GoPiGo v2 与 Windows IoT
  2. 使用按钮通过 PWM 调光灯光
  3. 带模拟传感器的压力气流测量设备
  4. Arduino Gyroscope Game with MPU-6050
  5. Discord Security Camera with an ESP32
  6. 带 LED 和压电扬声器的 DHT11 传感器
  7. Unopad - 带有 Ableton 的 Arduino MIDI 控制器
  8. 带 3D 打印外壳的电池供电电视遥控器
  9. Arduino 带蓝牙控制 LED!
  10. 带有 Arduino 的简单障碍物传感器
  11. 带有 OK Google 的蓝牙语音控制设备
  12. 使用 Cortana 控制 LED