예제 #1
0
        public override void Send(byte[] data)
        {
            try
            {
                if (device?.ConnectionHandle != null && isConnected)
                {
                    AutoResetEvent proceed = new AutoResetEvent(false);
                    ProcedureCompletedEventHandler complete = delegate(object sender, ProcedureCompletedEventArgs e)
                    {
                        Debug.WriteLine("Bluetooth: write complete");
                        proceed.Set();
                    };

                    bluetooth.BLEEventATTClientProcedureCompleted += complete;

                    if (data.Length > 20)
                    {
                        List <byte> payload = new List <byte>(data);
                        int         total   = data.Length;
                        bool        signal;

                        for (int i = 0; i < Math.Ceiling((double)data.Length / 20); i++)
                        {
                            bluetooth.SendCommand(this.port,
                                                  bluetooth.BLECommandATTClientAttributeWrite((byte)device.ConnectionHandle, (ushort)Handle.Write,
                                                                                              payload.GetRange(i * 20, (total < 20) ? total : 20).ToArray())
                                                  );
                            total -= 20;
                            signal = proceed.WaitOne(200);
                            if (!signal)
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        bluetooth.SendCommand(this.port, bluetooth.BLECommandATTClientAttributeWrite((byte)device.ConnectionHandle, (ushort)Handle.Write, data));
                        proceed.WaitOne(200);
                    }

                    bluetooth.BLEEventATTClientProcedureCompleted -= complete;
                }
                else
                {
                    throw new HardwareException("There is no reader connected");
                }
            }
            catch (InvalidOperationException e)
            {
                throw new HardwareException("There is no TappyUSB connected");
            }
        }
예제 #2
0
        public void Execute()
        {
            Byte[] writeToAttr = Ble.Lib.BLECommandATTClientAttributeWrite(this.Connection, this.AttributeHandle, (byte[])this.Value);

            ProcedureCompletedEventHandler handler = this.ProcedureCompletedHandler;

            Ble.Lib.BLEEventATTClientProcedureCompleted += handler;

            Ble.SendCommand(this.Port, writeToAttr);

            this.WaitEvent(() => _response != null);

            Ble.Lib.BLEEventATTClientProcedureCompleted -= handler;
        }
        private void FindServices()
        {
            // (established connection, handle.min_address, handle.max_address, primary gatt service attribute identifier)
            byte[] readGroups = Ble.Lib.BLECommandATTClientReadByGroupType(this.Connection, GATT_MIN_HANDLE, GATT_MAX_HANDLE, (byte[])GATT_SERVICE_TYPE_PRIMARY);

            Ble.Lib.BLEEventATTClientGroupFound += GroupFound;

            ProcedureCompletedEventArgs    procedureResponse = null;
            ProcedureCompletedEventHandler handler           = (sender, e) => {
                procedureResponse = e;
            };

            Ble.Lib.BLEEventATTClientProcedureCompleted += handler;

            Ble.SendCommand(this.Port, readGroups);

            this.WaitEvent(() => procedureResponse != null);

            Ble.Lib.BLEEventATTClientGroupFound         -= GroupFound;
            Ble.Lib.BLEEventATTClientProcedureCompleted -= handler;
        }
        private void FindAttributes(BlePeripheralService service)
        {
            byte[] findInfo = Ble.Lib.BLECommandATTClientFindInformation(this.Connection, service.StartHandle, service.EndHandle);

            FindInformationFoundEventHandler infoHandler = (sender, e) => this.AttributeFound(service, e);

            Ble.Lib.BLEEventATTClientFindInformationFound += infoHandler;

            ProcedureCompletedEventArgs    procedureResponse = null;
            ProcedureCompletedEventHandler handler           = (sender, e) => {
                procedureResponse = e;
            };

            Ble.Lib.BLEEventATTClientProcedureCompleted += handler;

            Ble.SendCommand(this.Port, findInfo);

            this.WaitEvent(() => procedureResponse != null);

            Ble.Lib.BLEEventATTClientFindInformationFound -= infoHandler;
            Ble.Lib.BLEEventATTClientProcedureCompleted   -= handler;
        }