Обнаружен CoreBluetoothПериферийный обратный вызов через какое-то время? - PullRequest
0 голосов
/ 11 октября 2018

Позвольте мне объяснить сценарий.Я ищу маяк с помощью iPhone.Когда маяк обнаружен, я периодически отправляю полученное значение «RSSI» на веб-сервер (длительность 1 секунда).Я делаю это, запуская таймер, когда я получаю «DiscoveredPeripheralCallback».Хотя приведенный ниже метод непрерывно вызывается вначале, после создания экземпляра таймера он останавливается, и теперь выполняется только таймер.Я предполагаю, что что-то, связанное с многопоточностью, вызывает проблему.

Однако, если я закомментирую таймер, все работает нормально, и я получаю непрерывные обратные вызовы на методе делегата, но добавляю таймер и вызываю API внутри, который являетсявызывая некоторые проблемы.

    [Export("centralManager:didDiscoverPeripheral:advertisementData:RSSI:")]
    public override void DiscoveredPeripheral(CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI)
    {


         Console.WriteLine("METHOD - 1");
        StartTimer();
        string DeviceName = peripheral.Name;
        discoverdBeacon.AddRawRSSI(RSSI.DoubleValue);
    }

Ниже приведен метод таймера, при котором я вызываю API.

private static void StartTimer()
    {
        // Create a timer with a one second interval.
        if (rssiTimer == null)
        {
            Console.WriteLine("Timer Created");
            rssiTimer = NSTimer.CreateRepeatingScheduledTimer(TimeSpan.FromSeconds(1.0), async delegate
            {
                Console.WriteLine("METHOD - 2");
                var result = await SendBeaconDataToServer(179, 0, -81);
                Console.WriteLine("Result = " + result);
            });
            rssiTimer.Fire();

        }

    }

// Метод API

public static async Task<String> SendBeaconDataToServer(int majorId, int loopId, double rssiValue)
    {

        List<Peripheral> beaconsArray = new List<Peripheral>();
        Peripheral item = new Peripheral();
        item.major = majorId; //Keep major values in the range of 178-181
        item.minor = loopId;//Keep minor value as zero for now.
        item.rssi = rssiValue;
        beaconsArray.Add(item);



        BeaconInfo info = new BeaconInfo();
        info.Panic = true;
        info.TagType = true;
        info.TagID = 101;
        info.Anchors = beaconsArray.ToArray();

        var result = await SharedWebClient.Instance.PostUserDetailsDataToServer(info, null);
        return result;


    }
...