14574浏览
查看: 14574|回复: 18

[讨论] 【已解决】Bluno如何与Windows 8.1建立蓝牙连接

[复制链接]
本帖最后由 John_Masen 于 2014-7-1 21:59 编辑

我购买了Bluno和配套扩展版,用COM口通信没有问题。写了一个简单的温度湿度以及亮度收集程序,Bluno从扩展版上的传感器收集数据并通过COM口发送给PC,PC则负责把数据记录到CSV文件中,目前这一切运行良好。
但是尝试用蓝牙连接的时候发现Windows8.1连接Bluno似乎有些问题。我对于硬件以及Bluetooth LE还是新手,所以只能把我所知道的情况写在这里,请这里的老手予以指点。
1.Windows 8.1支持GATT(Client only)和RFComm协议,不支持GAT。
2.Windows 8.1要求所有编程访问的蓝牙设备必须已经配对过。
3.Bluno无法被扫描到,所以无法完成配对。
4. HID设备模式尚未尝试,会继续进行研究。

我不想再去买一个Bluno来做主从机,非常希望能够一个电脑就直接连接我的Bluno。

巫山冰  初级技匠

发表于 2014-7-25 01:34:32

本帖最后由 巫山冰 于 2014-7-25 01:36 编辑
John_Masen 发表于 2014-7-6 01:01
我在 https://blunowindows.codeplex.com/ 上发布了windows版本的Bluno Demo代码。
目前代码尚处在功能测试 ...

试了一下你的源码,没能打开。显示“不支持此接口”和“未能正确加载解决方案中的一个或多个项目。”两个窗口提示。

【已解决】Bluno如何与Windows 8.1建立蓝牙连接图1  【已解决】Bluno如何与Windows 8.1建立蓝牙连接图2
回复

使用道具 举报

pigweng  见习技师

发表于 2014-6-26 19:48:33

我有一个bluno nano,我用我的lumia920来搜索,好像搜索不到,我用我的surface pro能搜索到,但是目前还没配对上过
回复

使用道具 举报

巫山冰  初级技匠

发表于 2014-6-27 01:01:06

:( 我的Win8.1没有BLE,郁闷,试不了。
回复

使用道具 举报

Grey  中级技匠

发表于 2014-6-27 12:04:51

你需要一个WP的app,但很可惜,暂时没有wp的app
如果你只是想进行数据透传的话,可以买个BLE-Link 当接收器
回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-6-27 23:54:47

@Grey:谢谢你的支持,我想写一个Windows 8.1的程序,不是WP8。那个得等到官方的WP8.1升级出来以后才行,目前WP8并不支持BLE。
我发现使用我的ThinkPad S230u可以发现Bluno,也可以完成配对步骤(密码为000000)。接下来我再研究研究,如果有进展我会贴到这里来。
回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-6-28 02:25:31

本帖最后由 John_Masen 于 2014-6-28 02:57 编辑

查阅了不少资料,尝试了标准模式连接电脑后,附带的GATT Service包括了4个服务,其中3个为标准的服务180a,1801,1800(参考 https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx), 还附带了一个奇怪的DFB0服务,但是因为是非标准的服务,所以没办法拿到它的Characteristics描述,就无法进行通讯。
【已解决】Bluno如何与Windows 8.1建立蓝牙连接图1
我尝试过把芯片切换到HID模式,重新配对后服务一点也没变化,并没有增加HID设备,所以没法继续下去了。而且似乎设备断电后也不会自动重新连接,必须手动连接,不知道是硬件问题、设备驱动问题还是Windows自己的问题。

【固件已解决,已经升级到1.8】
我尝试过升级固件,目前我用的是1.6,结果系统把设备识别为一个新的Uno, 可是并没有多出一个U盘。可能是我的Windows 8.1不兼容的关系,希望官方能够尽快更新驱动解决这个问题。


最后附加我的代码,这段代码是用来扫描HID设备,得到的结果是0.  不过如果修改为获取 Generic Access (0x1800)以及那个奇怪的DFB0服务的话都可以正确获取对象。

        public async void test()
        {
            //Find the devices that expose the service  
            var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromShortId(0x1812));
            if (devices.Count == 0)
                return;
            //Connect to the service  
            System.Diagnostics.Debug.WriteLine(devices[0].Id);
            var service = await GattDeviceService.FromIdAsync(devices[0].Id);
            if (service == null)
                return;
            //Obtain the characteristic we want to interact with  
            //var characteristic = service.GetCharacteristics(GattCharacteristic.ConvertShortIdToUuid(0x2A4D))[0];
            //Windows.Storage.Streams.InMemoryRandomAccessStream im=new Windows.Storage.Streams.InMemoryRandomAccessStream();
            //Windows.Storage.Streams.DataWriter writer=new Windows.Storage.Streams.DataWriter(im);
            //writer.WriteString("ABC\n");
            //await writer.StoreAsync();
            //await writer.FlushAsync();
            
            //await characteristic.WriteValueAsync(writer.DetachBuffer());
        }

更新:
原来我的固件是1.7的,可以用官方软件更新
蓝牙升级到1.8后,把Bluno通电后 Windows可以自动连接设备了。不过切换到HID模式后设备开始报错,太累了,今天睡了。


bluno snap.png
回复

使用道具 举报

巫山冰  初级技匠

发表于 2014-6-28 08:25:19

:D 感谢分享。
回复

使用道具 举报

齐天大妖孽  中级技师

发表于 2014-7-1 10:20:59

windows编程没怎么接触过,不过我用ubuntu12.04或以上版本,可以通过blueZ协议栈和bluno通信了。
回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-7-1 13:04:25

最新的进展,在更新到1.8固件后,如果使用HID模式,则设备会出现电源故障错误。"
STATUS_DEVICE_POWER_FAILURE".
【已解决】Bluno如何与Windows 8.1建立蓝牙连接图1
如果使用COM透传,则还是原来的样子。看来除非Bluno支持GATT模式(RFComm模式为高速连接,LE设备不支持该模式),或者Windows支持GAT,否则看来是没希望了。
@齐天大妖孽 : 很羡慕Linux这方面的跟进速度,微软在BLE方面后知后觉让人十分蛋疼。


回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-7-1 15:57:39

已经实现计算机向Bluno发送信息了,接下来是研究如何接收Bluno发过来的信息。
回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-7-1 21:51:09

本帖最后由 John_Masen 于 2014-7-6 21:46 编辑

看了安卓的源代码后,找到了串口的GATT定义,已经完成了数据的发送和接收,以下是核心代码。需要Windows 8.1和支持Bluetooth LE的适配器,开发板需要配合accessory shield的标准BLUNO程序(并不是必须,你可以写一个Serial口的Echo,目前用这个只是因为使用了它取温度的API)。开发环境VS2013 , 模板为Windows Universal Appliation,接下来我会整理一下代码,把PlanProtoco移植到C#,做一个Windows版本的控制端出来。等到WP 8.1出来后,内核可以无需修改直接放到Windows Phone手机上使用。需要修改一下Package.appxmanifest,增加一段代码,我也放到下面了。

测试类
--------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Windows.Devices.Bluetooth;
using Windows.Devices.Bluetooth.GenericAttributeProfile;
namespace BLETest
{
    class Test1
    {
        GattCharacteristic commandService, serialService;
        public event EventHandler<string> DataArrived;
        private bool isConnected = false;
        public async Task Connect()
        {
            if (isConnected)
            {
                return;
            }
            //Find the devices that expose the service  
            var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromShortId(0xDFB0));
            if (devices.Count == 0)
                return;
            //Connect to the service  
            System.Diagnostics.Debug.WriteLine(devices[0].Id);
            var service = await GattDeviceService.FromIdAsync(devices[0].Id);
            if (service == null)
                return;
            //Obtain the characteristic we want to interact with  
            
            commandService = service.GetCharacteristics(GattCharacteristic.ConvertShortIdToUuid(0xDFB2))[0]; //Model Number
            serialService = service.GetCharacteristics(GattCharacteristic.ConvertShortIdToUuid(0xDFB1))[0]; //Model Number
            
            serialService.ValueChanged += serialService_ValueChanged;
            isConnected = true;
        }
        public void test()
        {
            sendCommand(commandService, "AT+PASSWORD=DFRobot\r\n");
            sendCommand(commandService, "AT+CURRUART=115200\r\n");
            sendCommand(serialService, "<TEMP>;");
        }
        private async void sendCommand(GattCharacteristic c,string content)
        {
            Windows.Storage.Streams.InMemoryRandomAccessStream im = new Windows.Storage.Streams.InMemoryRandomAccessStream();
            Windows.Storage.Streams.DataWriter writer = new Windows.Storage.Streams.DataWriter(im);
            writer.WriteString(content);
            var x = await c.WriteValueAsync(writer.DetachBuffer());
        }
        void serialService_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
        {
            Windows.Storage.Streams.DataReader reader = Windows.Storage.Streams.DataReader.FromBuffer(args.CharacteristicValue);
            string result=reader.ReadString(args.CharacteristicValue.Length);
            System.Diagnostics.Debug.WriteLine(result );
            if (DataArrived!=null)
         {
                DataArrived(this, result);
         }
        }
    }
}



--------------------Package.appxmanifest---------
在Capabilities中下面红字部分(其实不需要那么多,不过懒得删了):
<Capabilities>
    <Capability Name="internetClient" />
   <m2:DeviceCapability Name="bluetooth.genericAttributeProfile">
      <m2:Device Id="any">
        <m2:Function Type="serviceId:f000aa00-0451-4000-b000-000000000000"/>
        <m2:Function Type="serviceId:F000AA10-0451-4000-B000-000000000000"/>
        <m2:Function Type="serviceId:F000AA20-0451-4000-B000-000000000000"/>
        <m2:Function Type="serviceId:F000AA30-0451-4000-B000-000000000000"/>
        <m2:Function Type="serviceId:F000AA40-0451-4000-B000-000000000000"/>
        <m2:Function Type="serviceId:F000AA50-0451-4000-B000-000000000000"/>
        <m2:Function Type="serviceId:0000ffe0-0000-1000-8000-00805f9b34fb"/>
        <m2:Function Type="serviceId:00001800-0000-1000-8000-00805f9b34fb"/>
        <m2:Function Type="serviceId:00001801-0000-1000-8000-00805f9b34fb"/>
        <m2:Function Type="serviceId:0000180A-0000-1000-8000-00805f9b34fb"/>
        <m2:Function Type="serviceId:0000DFB0-0000-1000-8000-00805f9b34fb"/>
        <m2:Function Type="serviceId:00002A24-0000-1000-8000-00805f9b34fb"/>
      </m2:Device>
    </m2:DeviceCapability>

    <DeviceCapability Name="proximity" />
  </Capabilities>

回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-7-1 21:53:20

本帖最后由 John_Masen 于 2014-7-1 22:15 编辑

注意:这段代码肯定可以运行,我已经成功运行了(请求返回有些延迟,大约1-2秒,不清楚什么原因,不过发送很快)。 如果不能正常运行请不要发帖询问我,我会把Bluno扩展板的演示程序移植到Windows上后开源提供,在此之前我不能保证有时间回答调试相关问题。
一些注意事项:
1.必须先在windows中进行配对,配对密码000000(这点很重要)。如果出现驱动程序错误,请检查是否把工作模式切换到HID了(应该是FSM_TRANS_USB_COM_BLE模式)。如果工作模式没有问题,请到设备管理器里面删除该设备然后扫描硬件变化让windows自己重装一次驱动就好了。
2.蓝牙连接上的时候是无法Upload sketch的,请先切断连接。
3.Windows里面没有丢失链接的说法,也无法在程序里切断连接的。 我查了官方的资料,设计来就是这样,目的是由操作系统来接管这些事情,程序只需要考虑发送失败和响应超时问题即可。所以如果自己写程序,需要考虑这两点。

回复

使用道具 举报

巫山冰  初级技匠

发表于 2014-7-2 01:00:17

:lol 关注,向楼主学习。
回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-7-6 01:01:00

我在 https://blunowindows.codeplex.com/ 上发布了windows版本的Bluno Demo代码。
目前代码尚处在功能测试阶段,支持扫描Bluno设备和连接,读取温度和开关蜂鸣器。实现了PlanProtocol的.NET版本。
我会在全部完成后将程序发布到windows store,同时也欢迎大家随时下载源代码。希望能够帮助到更多的程序员进入这个领域。

开发环境:
Windows 8.1,计算机上搭载支持蓝牙4的芯片(如果你的计算机没有蓝牙4的芯片,可以购买USB的蓝牙4棒子。很便宜,淘宝上白菜价)。
VS 2013
Bluno和配套扩展版(使用官方提供的Bluno扩展版演示程序)

回复

使用道具 举报

Grey  中级技匠

发表于 2014-7-16 17:54:57

本帖最后由 Grey 于 2014-10-16 18:43 编辑

重看了一遍代码,确实很牛掰
回复

使用道具 举报

John_Masen  见习技师
 楼主|

发表于 2014-7-16 23:47:26

最近在研究NRF24L01的通讯,希望能够和红外配合实现近室内的低成本无线通讯。 不知道哪里有QI无线充电模块,也不知道QI协议是否能告知目标设备电量。如果可以用Arduino访问的话,也许可以配合彩色LED盘做一个发光盘来指示手机还有多少电。
Windows程序有些耽搁了。我会在过一阵子继续做这个程序。
目前源代码已经可以下载,如果你只是想连接Bluno进行蓝牙串口收发的话,目前的代码已经可以用来参考了。
回复

使用道具 举报

drink  中级技师

发表于 2014-12-17 16:57:06

我是进来拜大神,太感谢楼主的分享啦
回复

使用道具 举报

社区活动向导  管理员

发表于 2015-7-31 15:46:32

没想到社区里还有这样的大神,进来膜拜一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail