首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CBPeripheralManager中正确添加服务

如何在CBPeripheralManager中正确添加服务
EN

Stack Overflow用户
提问于 2017-12-08 14:18:08
回答 1查看 1.1K关注 0票数 3

我试图使用Visual将服务添加到用于IOS的CBPeripheralManager中。但是,当我使用另一个设备扫描我的外围设备时,我没有看到我添加的服务。广告名称是正确的,但我只看到其他服务(想必是iphone的默认名称)。

作为附带说明,我写了这个程序的迅速和得到同样的问题。

我的xcode版本是9,我的ios目标版本是11。

我的代码如下

代码语言:javascript
复制
CBPeripheralManager _peripheral;
public BLEPeripheral()
    {
        _peripheral = new CBPeripheralManager();//this, DispatchQueue.CurrentQueue);
        _peripheral.CharacteristicSubscribed += (object sender, CBPeripheralManagerSubscriptionEventArgs e) =>
        {
            Console.WriteLine("Device Subscribed: {0}", e.Central.UUID);
            _connectedDevices.Add(e.Central);
            ServiceSubscribed(this, e);
        };

        _peripheral.WriteRequestsReceived += (object sender, CBATTRequestsEventArgs e) => {
            Console.WriteLine("Write Request Received");
        };


        _peripheral.ServiceAdded += (object sender, CBPeripheralManagerServiceEventArgs e) =>
        {
            Console.WriteLine("Service {0} was added", e.Error);
            Console.WriteLine(e.Service.Characteristics.Length.ToString());
            Console.WriteLine(e.Service.UUID.ToString());

            IsAdvertising = true;
            StartAdvertisingOptions advOptions = new StartAdvertisingOptions();
            advOptions.LocalName = "myDevice";

            _peripheral.StartAdvertising(advOptions);
            Console.WriteLine("starting the advertisement");
        };

        _peripheral.AdvertisingStarted += (object sender, Foundation.NSErrorEventArgs e) =>
        {
            Console.WriteLine("Advertising did start");
        };

        _peripheral.StateUpdated += (object sender, EventArgs e) =>
        {
            Console.WriteLine("UpdatedState: {0}", _peripheral.State);
        };

    }

我的服务设置代码是:

代码语言:javascript
复制
public void setupService()
    {
        txChar = new CBMutableCharacteristic(txCharUUID, CBCharacteristicProperties.Notify, null, CBAttributePermissions.Readable);
        var MyServiceUUID = CBUUID.FromString("A66C4FFC-52C6-4C04-B97C-34E5E91DG5BG");

        MyService = new CBMutableService(MyServiceUUID, true);
        MyService.Characteristics = new CBMutableCharacteristic[] { txChar };
        _peripheral.AddService(MyService);

    }

外围管理器的状态是PoweredOn。在按下添加服务的按钮并开始广告之前,我会检查这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 14:30:46

您的解决方案不起作用的主要原因可能是CBPeripheralManager方法只能在State==PoweredOn中使用。苹果文档在概述中说明了这一点。

我可以在你的例子中看到另一个潜在的小问题。在StartAdvertisingOption中,您没有设置ServiceUUID,所以您没有为您的服务做广告。应该是StartAdvertisingOptions advOptions = new StartAdvertisingOptions { LocalName = "myDevice", ServicesUUID = new CBUUID[] { _uuidService } };

下面是一个工作解决方案,在这个解决方案中,我移动了CBPeripheralManager事件中的所有UpdateState逻辑:

代码语言:javascript
复制
public class BleGattServerManager
{
    private CBPeripheralManager _PeripheralManager;
    private CBUUID _uuidService = CBUUID.FromString("625D74A2-3E61-4D1E-8949-8BE42DFDC6DA");

    public BleGattServerManager()
    {
        //set up peripheral
        _PeripheralManager = new CBPeripheralManager();
        _PeripheralManager.StateUpdated += _PeripheralManager_StateUpdated;
        _PeripheralManager.AdvertisingStarted += _PeripheralManager_AdvertisingStarted;
        _PeripheralManager.ServiceAdded += _PeripheralManager_ServiceAdded;
    }

    private void _PeripheralManager_ServiceAdded(object sender, CBPeripheralManagerServiceEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Service added");
    }

    private void _PeripheralManager_AdvertisingStarted(object sender, NSErrorEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Advertising started");
    }

    private void _PeripheralManager_StateUpdated(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("State=" + _PeripheralManager.State);

        if (_PeripheralManager.State == CBPeripheralManagerState.PoweredOn)
        {
            //set up the GATT service
            CBUUID uuidCharact = CBUUID.FromString("5BDAFB34-DA3F-40AA-8F9C-8AD409CB0063");
            NSData readme = NSData.FromString("readme!");
            CBMutableCharacteristic _CharacRead = new CBMutableCharacteristic(uuidCharact, CBCharacteristicProperties.Read, readme, CBAttributePermissions.Readable);
            CBMutableService service = new CBMutableService(_uuidService, true);
            service.Characteristics = new CBMutableCharacteristic[] { _CharacRead };

            _PeripheralManager.AddService(service);

            StartAdvertisingOptions advData = new StartAdvertisingOptions { LocalName = "my GATT!", ServicesUUID = new CBUUID[] { _uuidService } };
            _PeripheralManager.StartAdvertising(advData);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47716181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档