Esempio n. 1
0
        public void BleHostInitialize()
        {
            Task.Run(() =>
            {
                CSR_BLE_TRANSPORT transport = new CSR_BLE_TRANSPORT()
                {
                    transportType   = (byte)CsrBleDefine.CSR_BLE_TRANSPORT_USB,
                    usbDeviceNumber = (byte)CsrBleDefine.CSR_BLE_DEFAULT_USB_DEVICE_NUMBER,
                };

                if (CsrBleDll.CsrBleHostInit(false, null, ref transport) == 0)
                {
                    Error("Unable to initialize uEnergy Host.");
                    MessageBox.Show("蓝牙无法初始化!");
                    return;
                }

                if (!CsrBleDll.CsrBleHostStart(0))
                {
                    Error("Unable to start uEnergy Host.");
                    MessageBox.Show("蓝牙HOST无法开始!");
                    return;
                }

                Trace("BleHostInitialize");
                BleHostProcessMsg();
            });
        }
Esempio n. 2
0
        public void BleHostInitialize()
        {
            Task.Run(() =>
            {
                var transport = new CSR_BLE_TRANSPORT
                {
                    transportType   = (byte)CsrBleDefine.CSR_BLE_TRANSPORT_USB,
                    usbDeviceNumber = (byte)CsrBleDefine.CSR_BLE_DEFAULT_USB_DEVICE_NUMBER
                };

                if (CsrBleDll.CsrBleHostInit(false, null, ref transport) == 0)
                {
                    Error("[CSR]:CsrBleHostInit Fail!");
                    throw new InvalidOperationException("BleHostInit CsrBleHostInit Fail!");
                }

                if (!CsrBleDll.CsrBleHostStart(0))
                {
                    Error("[CSR]:CsrBleHostStart Fail!");
                    throw new InvalidOperationException("BleHostInit CsrBleHostStart Fail!");
                }

                Info("[CSR]:BleHostInitialize Success!");
                BleHostProcessMsg();
            });
        }
Esempio n. 3
0
 private void OnConnectResult(CSR_BLE_CONNECT_RESULT cr)
 {
     CurDevInfo.ConnHandle = cr.connectHandle;
     CsrBleDll.CsrBleClientDiscoverDatabase(cr.connectHandle);
     IsConnected = true;
     OnUpdateBleConnectEvent("蓝牙连接:" + CurDevInfo);
 }
Esempio n. 4
0
        public async Task <bool> BleClientWriteChar(BleGattCharacteristic character, byte[] data)
        {
            return(await Task.Run(() =>
            {
                if (!character.Service.GattDevice.Connected)
                {
                    Error("[CSR]:BleClientWriteChar when device is not connect!");
                    return false;
                }

                var value = Marshal.AllocHGlobal(data.Length);
                Marshal.Copy(data, 0, value, data.Length);

                if (CsrBleDll.CsrBleClientWriteCharByHandle(
                        character.Service.GattDevice.Handle, false, character.Handle, (ushort)data.Length, value))
                {
                    if (_writeEvent.WaitOne(5000))
                    {
                        Marshal.FreeHGlobal(value);
                        Debug("[CSR]:BleClientWriteChar Success!");
                        return true;
                    }
                }

                Marshal.FreeHGlobal(value);
                Debug("[CSR]:BleClientWriteChar Fail!");
                return false;
            }));
        }
Esempio n. 5
0
        public bool BleWriteChar(byte[] data)
        {
            if (!IsConnected)
            {
                Error("BleWriteChar when no device is connect!");
            }

            IntPtr value = Marshal.AllocHGlobal(data.Length);

            Marshal.Copy(data, 0, value, data.Length);

            if (CsrBleDll.CsrBleClientWriteCharByHandle(CurDevInfo.ConnHandle, false, (ushort)CurDevInfo.WriteHandle,
                                                        (ushort)data.Length, value))
            {
                Marshal.FreeHGlobal(value);

                if (_writeEvent.WaitOne(5000))
                {
                    Debug("BleWriteChar Success!");
                    return(true);
                }
            }
            Marshal.FreeHGlobal(value);
            return(false);
        }
Esempio n. 6
0
 public void BleHostScanStop()
 {
     if (!isBleInitialized)
     {
         Error("BleHostInitialize Fail!");
         return;
     }
     CsrBleDll.CsrBleHostStopLESearch();
 }
Esempio n. 7
0
        public void BleHostScanStop()
        {
            if (!IsBleHosted)
            {
                Error("[CSR]:BleHostInitialize Fail!");
                return;
            }

            CsrBleDll.CsrBleHostStopLESearch();
            Debug("[CSR]:BleHostScanStop");
        }
Esempio n. 8
0
        public bool BleHostConnect()
        {
            CsrBleDll.CsrBleHostStopLESearch();

            if (DevInfoSelected == null)
            {
                Error("BleHostConnect No Device Selected!");
                return(false);
            }

            if (CurDevInfo != null)
            {
                BleHostDisconnect();
            }

            CurDevInfo      = DevInfoSelected;
            DevInfoSelected = null;

            if (CurDevInfo != null)
            {
                string addr = CurDevInfo.Address;
                var    dev  = bleSearchResults.FindAll(r => r.deviceAddress.ToString() == addr);
                if (dev.Count == 0)
                {
                    Error(string.Format("BleHostConnect Find Device Error at {0}", addr));
                    return(false);
                }


                if (CsrBleDll.CsrBleHostSetConnectionParams((ushort)CsrBleDefine.CSR_BLE_PARAMETER_IGNORE,
                                                            (ushort)CsrBleDefine.CSR_BLE_PARAMETER_IGNORE,
                                                            CsrBleDefine.MIN_CONN_INTERVAL,
                                                            CsrBleDefine.MAX_CONN_INTERVAL,
                                                            CsrBleDefine.SLAVE_LATENCY,
                                                            CsrBleDefine.LINK_TIMEOUT))
                {
                    //set parameters is success
                    if (CsrBleDll.CsrBleHostConnect(dev[0].deviceAddress))
                    {
                        if (_dbDiscoverEvent.WaitOne(8000))
                        {
                            Trace(string.Format("CsrBleHostConnect {0} Success!", dev[0].deviceAddress));
                            OnUpdateBleConnectEvent("蓝牙连接成功:" + dev[0].deviceAddress);
                            return(true);
                        }
                    }
                }
                Trace(string.Format("CsrBleHostConnect {0} Fail!", dev[0].deviceAddress));
                OnUpdateBleConnectEvent("蓝牙连接失败:" + dev[0].deviceAddress);
            }
            return(false);
        }
Esempio n. 9
0
        public void BleHostTerminate()
        {
            isRun = false;

            if (!CsrBleDll.CsrBleHostDeinit())
            {
                Error("Unable to de-initialize uEnergy Host.");
            }
            else
            {
                OnLogEvent("BleHostTerminate");
            }
        }
Esempio n. 10
0
        public void BleHostScanStart()
        {
            if (!isBleInitialized)
            {
                Error("BleHostInitialize Fail!");
                return;
            }
            bleSearchResults.Clear();
            DevInfos.Clear();

            CsrBleDll.CsrBleHostCancel();
            CsrBleDll.CsrBleHostStopLESearch();
            CsrBleDll.CsrBleHostStartLEScan();
        }
Esempio n. 11
0
        public void BleClientWriteConfig(BleGattCharacteristic character, byte config)
        {
            if (!character.Service.GattDevice.Connected)
            {
                Error("[CSR]:BleClientWriteConfig when device is not connect!");
                return;
            }

            if (!CsrBleDll.CsrBleClientWriteConfiguration(character.Service.GattDevice.Handle, character.DescriptorHandle,
                                                          character.Handle, config))
            {
                Error("[CSR]:BleClientWriteConfig Fail!");
            }
        }
Esempio n. 12
0
        public void BleHostTerminate()
        {
            _isRun = false;

            CsrBleDll.CsrBleHostCancel();

            if (!CsrBleDll.CsrBleHostDeinit())
            {
                Error("[CSR]:BleHostTerminate Fail!");
            }
            else
            {
                Info("[CSR]:BleHostTerminate Success!");
            }
        }
Esempio n. 13
0
 public void BleHostDisconnect()
 {
     CsrBleDll.CsrBleHostCancel();
     if (CurDevInfo != null)
     {
         if (CsrBleDll.CsrBleHostDisconnect(CurDevInfo.ConnHandle))
         {
             Trace(string.Format("CsrBleHostDisconnect {0} Success!", CurDevInfo));
             OnUpdateBleConnectEvent("蓝牙断开成功:" + CurDevInfo);
             return;
         }
         Trace(string.Format("CsrBleHostDisconnect {0} Fail!", CurDevInfo));
         OnUpdateBleConnectEvent("蓝牙断开失败:" + CurDevInfo);
     }
 }
Esempio n. 14
0
        public void BleHostScanStart()
        {
            if (!IsBleHosted)
            {
                Error("[CSR]:BleHostInitialize Fail!");
                return;
            }

            _csrSearchResults.Clear();
            GattSearchDevices.Clear();

            CsrBleDll.CsrBleHostCancel();
            CsrBleDll.CsrBleHostStopLESearch();
            Thread.Sleep(300);
            CsrBleDll.CsrBleHostStartLEScan();
            Debug("[CSR]:BleHostScanStart");
        }
Esempio n. 15
0
        public byte[] BleReadChar()
        {
            if (!IsConnected)
            {
                Error("BleWriteChar when no device is connect!");
            }

            if (CsrBleDll.CsrBleClientReadCharByHandle(CurDevInfo.ConnHandle, (ushort)CurDevInfo.ReadHandle))
            {
                if (_readEvent.WaitOne(5000))
                {
                    Debug("BleWriteChar SUCCESS!");
                    return(_readBytes);
                }
            }

            Debug("BleWriteChar FAIL!");
            return(null);
        }
Esempio n. 16
0
        public bool BleSwitchMode()
        {
            if (!IsConnected)
            {
                Error("BleWriteChar when no device is connect!");
            }

            //switch (mode)
            //{
            //    case XcobraDataMode.NORMAL:
            //        _curServiceUuid = XIM_NORMAL_SERVICE;
            //        break;
            //    //case XcobraDataMode.BLOBS:
            //    //    _curServiceUuid = XIM_BLOBS_SERVICE;
            //    //    break;
            //    case XcobraDataMode.CALIB:
            //        _curServiceUuid = XIM_IMU_RAW_SERVICE;
            //        break;
            //    case XcobraDataMode.BATTERY:
            //        _curServiceUuid = XIM_BATTERY_SERVICE;
            //        break;

            //    default:
            //        return true;

            //}

            if (CurDevInfo != null)
            {
                CsrBleDll.CsrBleClientDiscoverDatabase(CurDevInfo.ConnHandle);

                if (_dbDiscoverEvent.WaitOne(8000))
                {
                    OnLogEvent("BleSwitchMode Success!");
                    return(true);
                }
            }

            OnLogEvent("BleSwitchMode Fail!");
            return(false);
        }
Esempio n. 17
0
        private void OnDatabaseDiscoveryResult(CSR_BLE_DATABASE_DISCOVERY_RESULT database)
        {
            int servicePtrPos = GetServicePtrPos((ushort)_curServiceUuid, ref database);

            if (servicePtrPos != 0xFF)
            {
                CSR_BLE_SERVICE service =
                    (CSR_BLE_SERVICE)Marshal.PtrToStructure(
                        database.services + servicePtrPos * Marshal.SizeOf(typeof(CSR_BLE_SERVICE)),
                        typeof(CSR_BLE_SERVICE));

                //if (_curServiceUuid != XIM_BATTERY_SERVICE)
                {
                    var nCharacter = service.nCharacteristics;
                    CSR_BLE_CHARACTERISTIC readCharcter =
                        (CSR_BLE_CHARACTERISTIC)
                        Marshal.PtrToStructure(service.characteristics, typeof(CSR_BLE_CHARACTERISTIC));

                    CSR_BLE_CHARACTERISTIC writeCharcter =
                        (CSR_BLE_CHARACTERISTIC)
                        Marshal.PtrToStructure(
                            service.characteristics + 1 * Marshal.SizeOf(typeof(CSR_BLE_CHARACTERISTIC)),
                            typeof(CSR_BLE_CHARACTERISTIC));

                    CurDevInfo.ReadHandle  = readCharcter.handle;
                    CurDevInfo.WriteHandle = writeCharcter.handle;

                    if (readCharcter.nDescriptors > 0)
                    {
                        var descHandle =
                            (CSR_BLE_CHARACTERISTIC_DSC)Marshal.PtrToStructure(readCharcter.descriptors,
                                                                               typeof(CSR_BLE_CHARACTERISTIC_DSC));
                        CsrBleDll.CsrBleClientWriteConfiguration(CurDevInfo.ConnHandle, descHandle.handle,
                                                                 readCharcter.handle, 0x01);
                    }
                }
                _dbDiscoverEvent.Set();
            }
        }
Esempio n. 18
0
        private void OnHostConnectResult(CSR_BLE_CONNECT_RESULT conn)
        {
            var gattDevice = GattConnectDevices.Last();

            if (conn.result == 0)
            {
                gattDevice.Handle    = conn.connectHandle;
                gattDevice.Connected = true;

                CsrBleDll.CsrBleClientDiscoverDatabase(conn.connectHandle);
                Debug("[CSR]:OnHostConnectResult Success");
                OnDeviceConnectEvent("蓝牙连接 SUCCESS:" + gattDevice.Address);
            }
            else
            {
                gattDevice.Connected = false;
                Debug("[CSR]:OnHostConnectResult Fail");
                OnDeviceConnectEvent("蓝牙连接 FAIL:" + gattDevice.Address);
            }

            _connectEvent.Set();
        }
Esempio n. 19
0
        public async Task <byte[]> BleClientReadChar(BleGattCharacteristic character)
        {
            return(await Task.Run(() =>
            {
                if (!character.Service.GattDevice.Connected)
                {
                    Error("[CSR]:BleClientReadChar when device is not connect!");
                    return null;
                }

                if (CsrBleDll.CsrBleClientReadCharByHandle(character.Service.GattDevice.Handle, character.Handle))
                {
                    if (_readEvent.WaitOne(5000))
                    {
                        Debug("[CSR]:BleClientReadChar Success!");
                        return _readBytes;
                    }
                }

                Debug("[CSR]:BleClientReadChar Fail!");
                return null;
            }));
        }
Esempio n. 20
0
        public async Task <bool> BleHostDisconnect(BleGattDevice gattDevice)
        {
            if (!IsBleHosted)
            {
                Error("[CSR]:BleHostInitialize Fail!");
                return(false);
            }

            return(await Task.Run(() =>
            {
                if (CsrBleDll.CsrBleHostDisconnect(gattDevice.Handle))
                {
                    Debug("[CSR]:CsrBleHostDisconnect true!");
                    if (_disconnectEvent.WaitOne(2500))
                    {
                        if (!GattConnectDevices.Contains(gattDevice))
                        {
                            Debug($"[CSR]:CsrBleHostDisconnect {gattDevice.Address} Success!");
                            OnDeviceConnectEvent("蓝牙断开成功:" + gattDevice.Address);
                            gattDevice.OnDeviceDisconnectEvent(true);
                            return true;
                        }
                    }
                }

                if (GattConnectDevices.Contains(gattDevice))
                {
                    GattConnectDevices.Remove(gattDevice);
                }

                gattDevice.OnDeviceDisconnectEvent(false);
                Debug($"[CSR]:CsrBleHostDisconnect {gattDevice.Address} Fail!");
                OnDeviceConnectEvent("蓝牙断开失败:" + gattDevice.Address);
                return false;
            }));
        }
Esempio n. 21
0
        public void BleHostProcessMsg()
        {
            if (isRun)
            {
                OnLogEvent("BleHostThread is Running...");
                return;
            }
            OnLogEvent("BleHostThread Start...");

            isRun = true;
            MSG    m      = new MSG();
            IntPtr handle = new IntPtr(-1);
            int    ret;

            while ((ret = User32.GetMessage(ref m, handle, 0, 0)) != 0 && isRun)
            {
                if (ret == -1)
                {
                    //-1 indicates an error
                }
                else
                {
                    Trace("[BleMsg]:MSG.message - " + m.message.ToString("X4"));
                    //if (m.message == 50159)
                    {
                        switch ((uint)m.wParam)
                        {
                        //init
                        case CsrBleDefine.CSR_BLE_HOST_READY:
                            isBleInitialized = m.lParam > 0;
                            if (isBleInitialized)
                            {
                                Info("[BleMsg]:uEnergy Host library is initialized");
                                BleHostScanStart();
                                Info("[BleMsg]:CSR_BLE_HOST_READY");
                            }
                            else
                            {
                                //exit thread
                                isRun = false;
                                Error("Dongle failed to initialize! Please insert the dongle to computer!");
                                //MessageBox.Show("蓝牙初始化失败!");
                                return;
                            }
                            break;

                        //search result
                        case CsrBleDefine.CSR_BLE_HOST_SEARCH_RESULT:
                            var sr =
                                (CSR_BLE_DEVICE_SEARCH_RESULT)
                                Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                       typeof(CSR_BLE_DEVICE_SEARCH_RESULT));
                            OnSearchResult(sr);
                            Trace("[BleMsg]:CSR_BLE_HOST_SEARCH_RESULT");
                            break;

                        //search stopped
                        case CsrBleDefine.CSR_BLE_HOST_SEARCH_STOPPED:
                            Info("[BleMsg]:CSR_BLE_HOST_SEARCH_STOPPED");
                            break;


                        //connect result
                        case CsrBleDefine.CSR_BLE_HOST_CONNECT_RESULT:
                            var cr =
                                (CSR_BLE_CONNECT_RESULT)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_CONNECT_RESULT));
                            if (cr.connectHandle != 0)
                            {
                                OnConnectResult(cr);
                            }
                            Trace("[BleMsg]:CSR_BLE_HOST_CONNECT_RESULT");
                            break;

                        //disconnect
                        case CsrBleDefine.CSR_BLE_HOST_DISCONNECTED:
                            var dr =
                                (CSR_BLE_DISCONNECTED)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_DISCONNECTED));
                            if (dr.connectHandle != 0)
                            {
                                OnDisconnectResult(dr);
                            }
                            Trace("[BleMsg]:CSR_BLE_HOST_DISCONNECTED");
                            break;


                        //discover database
                        case CsrBleDefine.CSR_BLE_CLIENT_DATABASE_DISCOVERY_RESULT:
                            var dbRes = (CSR_BLE_DATABASE_DISCOVERY_RESULT)
                                        Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                               typeof(CSR_BLE_DATABASE_DISCOVERY_RESULT));
                            if (dbRes.result == 0)
                            {
                                OnDatabaseDiscoveryResult(dbRes);
                            }

                            Trace("[BleMsg]:CSR_BLE_CLIENT_DATABASE_DISCOVERY_RESULT");
                            break;


                        //connection update req
                        case CsrBleDefine.CSR_BLE_HOST_CONNECTION_UPDATE_REQUEST:
                            var connUpdateRequest =
                                (CSR_BLE_CONNECTION_UPDATE_REQUEST)
                                Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                       typeof(CSR_BLE_CONNECTION_UPDATE_REQUEST));
                            CsrBleDll.CsrBleHostAcceptConnUpdate(connUpdateRequest.connectHandle,
                                                                 connUpdateRequest.id, true);
                            Trace("[BleMsg]:CSR_BLE_HOST_CONNECTION_UPDATE_REQUEST");

                            break;

                        //connection update
                        case CsrBleDefine.CSR_BLE_HOST_CONNECTION_UPDATED:
                            var connUpdated =
                                (CSR_BLE_CONNECTION_UPDATED)
                                Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                       typeof(CSR_BLE_CONNECTION_UPDATED));
                            OnConnectionUpdated(connUpdated);
                            Trace("[BleMsg]:CSR_BLE_HOST_CONNECTION_UPDATED");
                            break;


                        //host just works
                        case CsrBleDefine.CSR_BLE_HOST_JUSTWORKS_REQUEST:
                            var justworksRequest =
                                (CSR_BLE_JUSTWORKS_REQUEST)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_JUSTWORKS_REQUEST));
                            CsrBleDll.CsrBleHostJustWorksResult(justworksRequest.deviceAddress, true, true);
                            Trace("[BleMsg]:CSR_BLE_HOST_JUSTWORKS_REQUEST");
                            break;


                        //scanning
                        case CsrBleDefine.CSR_BLE_HOST_LE_SCAN_STATUS:
                            Trace("[BleMsg]:CSR_BLE_HOST_LE_SCAN_STATUS");
                            break;

                        //read result
                        case CsrBleDefine.CSR_BLE_CLIENT_CHAR_READ_RESULT:
                            var readResult = (CSR_BLE_CHAR_READ_RESULT)
                                             Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_CHAR_READ_RESULT));
                            OnCharReadResult(readResult);
                            Trace("[BleMsg]:CSR_BLE_CLIENT_CHAR_READ_RESULT");
                            break;

                        //write result
                        case CsrBleDefine.CSR_BLE_CLIENT_CHAR_WRITE_RESULT:
                            var writeResult = (CSR_BLE_WRITE_RESULT)
                                              Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_WRITE_RESULT));
                            OnCharWriteResult(writeResult);
                            Trace("[BleMsg]:CSR_BLE_CLIENT_CHAR_WRITE_RESULT");
                            break;

                        //char notify
                        case CsrBleDefine.CSR_BLE_CLIENT_CHAR_NOTIFICATION:
                            var charData =
                                (CSR_BLE_CHAR_NOTIFICATION)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_CHAR_NOTIFICATION));
                            OnClientCharNofity(charData);
                            Trace("[BleMsg]:CSR_BLE_CLIENT_CHAR_NOTIFICATION");
                            break;


                        case CsrBleDefine.CSR_BLE_HOST_SECURITY_RESULT:
                            //bool encrypting = false;
                            //// security result.

                            //var secRes =
                            //    (CSR_BLE_SECURITY_RESULT)
                            //        Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_SECURITY_RESULT));

                            //if (secRes.result != CsrBleDefines.CSR_BLE_SECURITY_BONDING_ESTABLISHED)
                            //{
                            //    CsrBleDll.CsrBleHostCancel();
                            //    CsrBleDll.CsrBleHostDisconnect(CurDevInfo.ConnHandle);
                            //}
                            //else
                            //{
                            //    encrypting = true;
                            //}
                            Trace("[BleMsg]:CSR_BLE_HOST_SECURITY_RESULT");
                            break;

                        default:
                            Error(string.Format("[BleMsg]:Unhandled uEnergy Host library MSG {0:X}",
                                                (uint)m.wParam));
                            break;
                        }
                    }
                }
            }

            OnLogEvent("BleHostThread Finish.");
        }
Esempio n. 22
0
        public async Task <bool> BleHostConnect(BleGattDevice gattDevice)
        {
            if (!IsBleHosted)
            {
                Error("[CSR]:BleHostInitialize Fail!");
                return(false);
            }

            CsrBleDll.CsrBleHostStopLESearch();
            if (GattConnectDevices.Exists(d => d.Address == gattDevice.Address))
            {
                Warning($"[CSR]:BleHostConnect GattDevice {gattDevice.Address} Already Connected!");
                return(true);
            }

            return(await Task.Run(() =>
            {
                var csrDevice = _csrSearchResults.FindAll(r => r.deviceAddress.ToString() == gattDevice.Address);
                if (csrDevice.Count == 0)
                {
                    Error($"[CSR]:BleHostConnect Find GattDevice Error at {gattDevice.Address}");
                    return false;
                }

                GattSearchDevices.RemoveAll(d => d.Address == gattDevice.Address);

                GattConnectDevices.RemoveAll(d => d.Address == gattDevice.Address);
                GattConnectDevices.Add(gattDevice);
                Debug("[CSR]:GattConnectDevices Add Connecting Device!");

                if (CsrBleDll.CsrBleHostSetConnectionParams((ushort)CsrBleDefine.CSR_BLE_PARAMETER_IGNORE,
                                                            (ushort)CsrBleDefine.CSR_BLE_PARAMETER_IGNORE,
                                                            CsrBleDefine.MIN_CONN_INTERVAL, CsrBleDefine.MAX_CONN_INTERVAL,
                                                            CsrBleDefine.SLAVE_LATENCY, CsrBleDefine.LINK_TIMEOUT))
                {
                    //set parameters is success
                    if (CsrBleDll.CsrBleHostConnect(csrDevice[0].deviceAddress))
                    {
                        Debug("[CSR]:CsrBleHostConnect Start!");
                        if (_connectEvent.WaitOne(5000))
                        {
                            Debug($"[CSR]:CsrBleHostConnect {csrDevice[0].deviceAddress} Success!");
                            if (_databaseEvent.WaitOne(5000))
                            {
                                gattDevice.OnDeviceConnectEvent(true);
                                Debug($"[CSR]:DatabaseDiscover {csrDevice[0].deviceAddress} Success!");
                                OnDeviceConnectEvent("蓝牙连接成功:" + csrDevice[0].deviceAddress);
                                return true;
                            }
                        }
                    }
                }

                GattConnectDevices.Remove(gattDevice);
                gattDevice.OnDeviceConnectEvent(false);
                Debug("[CSR]:GattConnectDevices Remove Connect Fail Device!");

                Debug($"[CSR]:CsrBleHostConnect {csrDevice[0].deviceAddress} Fail!");
                OnDeviceConnectEvent("蓝牙连接失败:" + csrDevice[0].deviceAddress);
                return false;
            }));
        }
Esempio n. 23
0
        private void BleHostProcessMsg()
        {
            if (_isRun)
            {
                Warning("[CSR]:BleHostProcessMsg is Running...");
                return;
            }

            Debug("[CSR]:BleHostProcessMsg Start...");
            _isRun = true;
            var m      = new MSG();
            var handle = new IntPtr(-1);
            int ret;

            while ((ret = User32.GetMessage(ref m, handle, 0, 0)) != 0 && _isRun)
            {
                if (ret == -1)
                {
                    //-1 indicates an error
                }
                else
                {
                    Trace("[CSRMSG]:MSG.message - " + m.message.ToString("X4"));
                    //if (m.message == 50159)
                    {
                        switch ((uint)m.wParam)
                        {
                        //init
                        case CsrBleDefine.CSR_BLE_HOST_READY:
                            if (!OnHostReady(m.lParam > 0))
                            {
                                Debug("[CSRMSG]:CSR_BLE_HOST_READY ERROR!");
                                return;
                            }
                            Debug("[CSRMSG]:CSR_BLE_HOST_READY");
                            break;

                        //search result
                        case CsrBleDefine.CSR_BLE_HOST_SEARCH_RESULT:
                            var sr =
                                (CSR_BLE_DEVICE_SEARCH_RESULT)
                                Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                       typeof(CSR_BLE_DEVICE_SEARCH_RESULT));
                            OnHostSearchResult(sr);
                            Trace("[CSRMSG]:CSR_BLE_HOST_SEARCH_RESULT");
                            break;

                        //search stopped
                        case CsrBleDefine.CSR_BLE_HOST_SEARCH_STOPPED:
                            Debug("[CSRMSG]:CSR_BLE_HOST_SEARCH_STOPPED");
                            break;


                        //connect result
                        case CsrBleDefine.CSR_BLE_HOST_CONNECT_RESULT:
                            var cr =
                                (CSR_BLE_CONNECT_RESULT)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_CONNECT_RESULT));
                            OnHostConnectResult(cr);
                            Debug("[CSRMSG]:CSR_BLE_HOST_CONNECT_RESULT");
                            break;

                        //disconnect
                        case CsrBleDefine.CSR_BLE_HOST_DISCONNECTED:
                            var dr =
                                (CSR_BLE_DISCONNECTED)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_DISCONNECTED));
                            OnHostDisconnectResult(dr);
                            Trace("[CSRMSG]:CSR_BLE_HOST_DISCONNECTED");
                            break;


                        //discover database
                        case CsrBleDefine.CSR_BLE_CLIENT_DATABASE_DISCOVERY_RESULT:
                            var dbr = (CSR_BLE_DATABASE_DISCOVERY_RESULT)
                                      Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                             typeof(CSR_BLE_DATABASE_DISCOVERY_RESULT));
                            OnClientDatabaseDiscoveryResult(dbr);
                            Debug("[CSRMSG]:CSR_BLE_CLIENT_DATABASE_DISCOVERY_RESULT");
                            break;


                        //connection update request
                        case CsrBleDefine.CSR_BLE_HOST_CONNECTION_UPDATE_REQUEST:
                            var cur =
                                (CSR_BLE_CONNECTION_UPDATE_REQUEST)
                                Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                       typeof(CSR_BLE_CONNECTION_UPDATE_REQUEST));
                            CsrBleDll.CsrBleHostAcceptConnUpdate(cur.connectHandle,
                                                                 cur.id, true);
                            Debug("[CSRMSG]:CSR_BLE_HOST_CONNECTION_UPDATE_REQUEST");
                            break;

                        //connection update
                        case CsrBleDefine.CSR_BLE_HOST_CONNECTION_UPDATED:
                            var cu =
                                (CSR_BLE_CONNECTION_UPDATED)
                                Marshal.PtrToStructure(new IntPtr(m.lParam),
                                                       typeof(CSR_BLE_CONNECTION_UPDATED));
                            OnHostConnectionUpdated(cu);
                            Debug("[CSRMSG]:CSR_BLE_HOST_CONNECTION_UPDATED");
                            break;


                        //host just works
                        case CsrBleDefine.CSR_BLE_HOST_JUSTWORKS_REQUEST:
                            var jwr =
                                (CSR_BLE_JUSTWORKS_REQUEST)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_JUSTWORKS_REQUEST));
                            CsrBleDll.CsrBleHostJustWorksResult(jwr.deviceAddress, true, true);
                            Debug("[CSRMSG]:CSR_BLE_HOST_JUSTWORKS_REQUEST");
                            break;


                        //scanning
                        case CsrBleDefine.CSR_BLE_HOST_LE_SCAN_STATUS:
                            Debug("[CSRMSG]:CSR_BLE_HOST_LE_SCAN_STATUS");
                            break;

                        //read result
                        case CsrBleDefine.CSR_BLE_CLIENT_CHAR_READ_RESULT:
                            var read = (CSR_BLE_CHAR_READ_RESULT)
                                       Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_CHAR_READ_RESULT));
                            OnClientCharReadResult(read);
                            Debug("[CSRMSG]:CSR_BLE_CLIENT_CHAR_READ_RESULT");
                            break;

                        //write result
                        case CsrBleDefine.CSR_BLE_CLIENT_CHAR_WRITE_RESULT:
                            var write = (CSR_BLE_WRITE_RESULT)
                                        Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_WRITE_RESULT));
                            OnClientCharWriteResult(write);
                            Debug("[CSRMSG]:CSR_BLE_CLIENT_CHAR_WRITE_RESULT");
                            break;

                        //char notify
                        case CsrBleDefine.CSR_BLE_CLIENT_CHAR_NOTIFICATION:
                            var notify =
                                (CSR_BLE_CHAR_NOTIFICATION)
                                Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_CHAR_NOTIFICATION));
                            OnClientCharNofity(notify);
                            Trace("[CSRMSG]:CSR_BLE_CLIENT_CHAR_NOTIFICATION");
                            break;


                        case CsrBleDefine.CSR_BLE_HOST_SECURITY_RESULT:
                            //bool encrypting = false;
                            //// security result.

                            //var secRes =
                            //    (CSR_BLE_SECURITY_RESULT)
                            //        Marshal.PtrToStructure(new IntPtr(m.lParam), typeof(CSR_BLE_SECURITY_RESULT));

                            //if (secRes.result != CsrBleDefine.CSR_BLE_SECURITY_BONDING_ESTABLISHED)
                            //{
                            //    CsrBleDll.CsrBleHostCancel();
                            //    CsrBleDll.CsrBleHostDisconnect(CurDevInfo.ConnHandle);
                            //}
                            //else
                            //{
                            //    encrypting = true;
                            //}
                            Trace("[CSRMSG]:CSR_BLE_HOST_SECURITY_RESULT");
                            break;

                        default:
                            Error($"[CSRMSG]:Unhandled uEnergyHost MSG {(uint)m.wParam:X}");
                            break;
                        }
                    }
                }
            }

            Debug("[CSR]:BleHostThread Finish.");
        }