10 приложений для управления компьютером с Android телефона

10 приложений для управления компьютером с Android телефона Роботы

: дистанционное управление компьютером через bluetooth на примере se w700i

Предисловие

Так уж сложилось что у меня нет и никогда не было ни музыкального центра ни DVD проигрывателя. Зато у меня есть комп, неплохой ресивер, сносная акустика 5.1 и телек 29″. Соответственно ни центр, ни ДВД мне не нужен.

Фильмы я смотрю только на телевизоре. ИМХО пялиться 2 часа в 17″ монитор – извращение.

Это все прекрасно, но есть одно НО….

10 приложений для управления компьютером с Android телефона

Уже несколько лет я мучаюсь проблемой…..

КАК управлять фильмами, музыкой не поднимая зад с дивана!!!10 приложений для управления компьютером с Android телефона

Ведь если бы у меня были центр и ДВД, я мог бы делать это пультом.

Такой вот гемор…..

Решение проблемы

Пару дней назад я приобрел телефон – Sony-Ericsson W700i.

На достоинствах и недостатках тела останавливаться не буду. Изучая меню нашел такой пункт меню:
Развлечение -> Дистанционное управление, и рядом значок Bluetooth. Ага, это уже интересно.

там доступны 3 приложения:
Presenter, MediaPlayer, Desktop.

Воткнул в комп Bluetooth-контроллер Akorp. Связал 2 устройства между собой. Выбрал
Desktop. На экране телефона появилась виртуальная клавиатура, но комп не реагировал на все нажатия клавиш тела.

Я зашел в тупик…. Но на счастье на этом сайте обсуждают все на свете, в том числе какие грибы ест SEVER NN
10 приложений для управления компьютером с Android телефона. Зашел в ветку по телефонам SE:
https://forums.radiocopter.ru/viewtopic.php?t=136554.
Поделился своей проблемой, и через некторое время получил реальную помощь. Нужно еще было установить ПО, а с моим дешевым Bluetooth-контроллером в комплекте были только драйверы. Мне посоветовали скачать BlueSoleil.

качаем отсюда:
http://www.ivtcorporation.com/download/BlueSoleil_Download.php#edr

сккачал, установил….Программа имеет ознакомительную версию и ряд ограничений, например размер передаваемого файла не более 5Мб.

Но меня это не особо расстроило, так как файлы можно передавать и через стандартный драйвер, а можно и через USB-кабель, который был в комплекте с телом.

Самое главное, что появилось управление HID-устройством, что мне и нужно было.

Дальше все просто, связываем тело с компом выбираем
MediaPlayer, и наслаждаемся управлением, лежа на диване. К сожалению есть небольшой минус: телефон управляет только стандартным WMP. Другими прогами для воспроизведения музыки и видео нет.

Но и это не смертельно, так как есть еще и
Desktop. Вот здесь мы уже можем управлят курсором мыши, перемещая его по экрану джойстиком телефона, а также там есть кнопки мыши: левая и правая. В общем все, что нужно для управления рабочим столом.

Весь вчерашний вечер я провалялся на диване, наслаждаясь управлением с телефона….

P.S. Может я кончено отстал от жизни…. но вы бы видели изумленные лица знакомых жены, когда мы сидели на кухне, а я, держа руку в кармане, переключал песни на компе, который находится в другой комнате.

И объяснял это современным цифровыми технологиями, которые распознают мои мысли……..

Определение BroadcastReceiver

Следующим шагом будет определение нашего BroadcastReceiver, задачей которого будет фильтрация намерений с нашими действиями, определенными до получения LocalBroadcastManager, для запуска функций обратного вызова, определенных в предыдущем разделе. Поэтому мы используем BluetoothSDKListenerHelper как:

class BluetoothSDKListenerHelper {
    companion object {

        private var mBluetoothSDKBroadcastReceiver: BluetoothSDKBroadcastReceiver? = null

        class BluetoothSDKBroadcastReceiver : BroadcastReceiver() {
            private var mGlobalListener: IBluetoothSDKListener? = null

            public fun setBluetoothSDKListener(listener: IBluetoothSDKListener) {
                mGlobalListener = listener
            }

            public fun removeBluetoothSDKListener(listener: IBluetoothSDKListener): Boolean {
                if (mGlobalListener == listener) {
                    mGlobalListener = null
                }

                return mGlobalListener == null
            }

            override fun onReceive(context: Context?, intent: Intent?) {
                val device =
                    intent!!.getParcelableExtra<BluetoothDevice>(BluetoothUtils.EXTRA_DEVICE)
                val message = intent.getStringExtra(BluetoothUtils.EXTRA_MESSAGE)

                when (intent.action) {
                    BluetoothUtils.ACTION_DEVICE_FOUND -> {
                        mGlobalListener!!.onDeviceDiscovered(device)
                    }
                    BluetoothUtils.ACTION_DISCOVERY_STARTED -> {
                        mGlobalListener!!.onDiscoveryStarted()
                    }
                    BluetoothUtils.ACTION_DISCOVERY_STOPPED -> {
                        mGlobalListener!!.onDiscoveryStopped()
                    }
                    BluetoothUtils.ACTION_DEVICE_CONNECTED -> {
                        mGlobalListener!!.onDeviceConnected(device)
                    }
                    BluetoothUtils.ACTION_MESSAGE_RECEIVED -> {
                        mGlobalListener!!.onMessageReceived(device, message)
                    }
                    BluetoothUtils.ACTION_MESSAGE_SENT -> {
                        mGlobalListener!!.onMessageSent(device)
                    }
                    BluetoothUtils.ACTION_CONNECTION_ERROR -> {
                        mGlobalListener!!.onError(message)
                    }
                    BluetoothUtils.ACTION_DEVICE_DISCONNECTED -> {
                        mGlobalListener!!.onDeviceDisconnected()
                    }
                }
            }
        }

        public fun registerBluetoothSDKListener(
            context: Context?,
            listener: IBluetoothSDKListener
        ) {
            if (mBluetoothSDKBroadcastReceiver == null) {
                mBluetoothSDKBroadcastReceiver = BluetoothSDKBroadcastReceiver()

                val intentFilter = IntentFilter().also {
                    it.addAction(BluetoothUtils.ACTION_DEVICE_FOUND)
                    it.addAction(BluetoothUtils.ACTION_DISCOVERY_STARTED)
                    it.addAction(BluetoothUtils.ACTION_DISCOVERY_STOPPED)
                    it.addAction(BluetoothUtils.ACTION_DEVICE_CONNECTED)
                    it.addAction(BluetoothUtils.ACTION_MESSAGE_RECEIVED)
                    it.addAction(BluetoothUtils.ACTION_MESSAGE_SENT)
                    it.addAction(BluetoothUtils.ACTION_CONNECTION_ERROR)
                    it.addAction(BluetoothUtils.ACTION_DEVICE_DISCONNECTED)
                }


                LocalBroadcastManager.getInstance(context!!).registerReceiver(
                    mBluetoothSDKBroadcastReceiver!!, intentFilter
                )
            }

            mBluetoothSDKBroadcastReceiver!!.setBluetoothSDKListener(listener)
        }

        public fun unregisterBluetoothSDKListener(
            context: Context?,
            listener: IBluetoothSDKListener
        ) {

            if (mBluetoothSDKBroadcastReceiver != null) {
                val empty = mBluetoothSDKBroadcastReceiver!!.removeBluetoothSDKListener(listener)


                if (empty) {
                    LocalBroadcastManager.getInstance(context!!)
                        .unregisterReceiver(mBluetoothSDKBroadcastReceiver!!)
                    mBluetoothSDKBroadcastReceiver = null
                }
            }
        }
    }
}

В действии или фрагменте мы реализуем наш IBluetoothSDKListener, который мы зарегистрируем через две функции registerBluetoothSDKListner() и unregisterBluetoothSDKListner(). Например:

Определите сервис Bluetooth

А теперь самая сложная часть – Bluetooth Service. Мы собираемся определить класс, расширяющий Service, в котором мы определим функции, позволяющие привязывать Service и управлять потоками Bluetooth-соединения:

class BluetoothSDKService : Service() {

    // Service Binder
    private val binder = LocalBinder()

    // Bluetooth stuff
    private lateinit var bluetoothAdapter: BluetoothAdapter
    private lateinit var pairedDevices: MutableSet<BluetoothDevice>
    private var connectedDevice: BluetoothDevice? = null
    private val MY_UUID = "..."
    private val RESULT_INTENT = 15

    // Bluetooth connections
    private var connectThread: ConnectThread? = null
    private var connectedThread: ConnectedThread? = null
    private var mAcceptThread: AcceptThread? = null

    // Invoked only first time
    override fun onCreate() {
        super.onCreate()
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    }

    // Invoked every service star
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_STICKY
    }

    /**
     * Class used for the client Binder.
     */
    inner class LocalBinder : Binder() {
        /*
        Function that can be called from Activity or Fragment
        */
    }


    /**
     * Broadcast Receiver for catching ACTION_FOUND aka new device discovered
     */
    private val discoveryBroadcastReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context, intent: Intent) {
            /*
              Our broadcast receiver for manage Bluetooth actions
            */
        }
    }

    private inner class AcceptThread : Thread() {
      // Body
    }

    private inner class ConnectThread(device: BluetoothDevice) : Thread() {
      // Body
    }

    @Synchronized
    private fun startConnectedThread(
        bluetoothSocket: BluetoothSocket?,
    ) {
        connectedThread = ConnectedThread(bluetoothSocket!!)
        connectedThread!!.start()
    }

    private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {
      // Body
    }


    override fun onDestroy() {
        super.onDestroy()
        try {
            unregisterReceiver(discoveryBroadcastReceiver)
        } catch (e: Exception) {
            // already unregistered
        }
    }

    override fun onBind(intent: Intent?): IBinder? {
        return binder
    }

    private fun pushBroadcastMessage(action: String, device: BluetoothDevice?, message: String?) {
        val intent = Intent(action)
        if (device != null) {
            intent.putExtra(BluetoothUtils.EXTRA_DEVICE, device)
        }
        if (message != null) {
            intent.putExtra(BluetoothUtils.EXTRA_MESSAGE, message)
        }
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
    }

}

Чтобы сделать суть более читабельной, я закомментировал части о потоках, которые вы можете получить из официальной документации.

Как вы видите, в LocalBinder можно определить функции, которые будут видны действиям после привязки к ним. Например, мы можем определить функции для операций обнаружения, отправки сообщения или соединения, которые затем будут выполняться операции внутри сервиса.


    /**
     * Class used for the client Binder.
     */
    inner class LocalBinder : Binder() {
         /**
         * Enable the discovery, registering a broadcastreceiver {@link discoveryBroadcastReceiver}
         * The discovery filter by LABELER_SERVER_TOKEN_NAME
         */
        public fun startDiscovery(context: Context) {
            val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
            filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED)
            registerReceiver(discoveryBroadcastReceiver, filter)
            bluetoothAdapter.startDiscovery()
            pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STARTED, null, null)
        }
        
        
        /**
         * stop discovery
         */
        public fun stopDiscovery() {
            bluetoothAdapter.cancelDiscovery()
            pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STOPPED, null, null)
        }
        
        // other stuff

    }

Затем в потоках, управляющих сокетами, вы можете использовать функцию pushBroadcastMessage() для генерации событий и добавления информационного наполнения, такого как удаленное устройство и сообщение. Например:

private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {

        private val mmInStream: InputStream = mmSocket.inputStream
        private val mmOutStream: OutputStream = mmSocket.outputStream
        private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream

        override fun run() {
            var numBytes: Int // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs.
            while (true) {
                // Read from the InputStream.
                numBytes = try {
                    mmInStream.read(mmBuffer)
                } catch (e: IOException) {
                    pushBroadcastMessage(
                        BluetoothUtils.ACTION_CONNECTION_ERROR,
                        null,
                        "Input stream was disconnected"
                    )
                    break
                }

                val message = String(mmBuffer, 0, numBytes)

                // Send to broadcast the message
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_MESSAGE_RECEIVED,
                    mmSocket.remoteDevice,
                    message
                )
            }
        }

        // Call this from the main activity to send data to the remote device.
        fun write(bytes: ByteArray) {
            try {
                mmOutStream.write(bytes)

                // Send to broadcast the message
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_MESSAGE_SENT,
                    mmSocket.remoteDevice,
                    null
                )
            } catch (e: IOException) {
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_CONNECTION_ERROR,
                    null,
                    "Error occurred when sending data"
                )
                return
            }
        }

        // Call this method from the main activity to shut down the connection.
        fun cancel() {
            try {
                mmSocket.close()
            } catch (e: IOException) {
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_CONNECTION_ERROR,
                    null,
                    "Could not close the connect socket"
                )
            }
        }
    }

Мы закончили!

2 Параметры соединения

Параметры, определяющие соединение:

  • Интервал соединения

    Интервал соединения может принимать любое из значений между 7.5 мс и 4.0 секундами с шагом в 1.25 мс. Он задается центральным устройством в пакете запроса соединения. Центральное устройство может принять во внимание Предпочитаемые Параметры Соединения Периферийного Устройства (PPCP). Центральное устройство вправе принять их, модифицировать или отклонить.

  • Задержка ведомого (Slave Latency)

    Параметр задержки ведомого позволяет периферийному устройству оставлять без ответа определенное количество событий соединения и не слушать центральное устройство во время этих событий без инвалидации соединения. Это позволяет периферийному устройству переходить в режим энергосбережения на более длительный срок. Задержка ведомого отображает количество событий соединения, которое периферийное устройство может пропустить.

    Например, если установлена задержка три, то периферийное устройство может пропустить три последовательных события соединения, но затем оно должно будет выйти из режима энергосбережения, прослушать центральное устройство и ответить на следующее событие соединения.

  • Таймаут наблюдения (Supervision Timeout)

    Таймаут наблюдения используется для определения потери соединения. Он определяется как максимальное время между двумя полученными пакетами данных, прежде чем соединение считается потерянным. Его значение может задаваться в диапазоне между 100 мс и 32 секундами с шагом 10 мс. Другое условие выглядит следующим образом:

    Таймаут наблюдения > (1 задержка ведомого) * интервал соединения * 2

    Существует исключение, для которого таймаут наблюдения не применяется – в момент, когда соединение создано, но еще не установлено. В этом случае ведущее устройство примет решение о потере соединения, если не получит пакета от ведомого в течении 6 интервалов соединения.

  • Расширение длины данных (DLE)

    Это опция, которая позволяет пакетам данных содержать большее количество полезной нагрузки (до 251 байта, в случае, когда эта настройка выключена, полезная нагрузка составляет 27 байт). Эта возможность введена в версии 4.2 спецификации Bluetooth.

  • Максимальная единица передачи (MTU)

    Понятие максимальной единицы передачи используется в компьютерных сетях и определяет максимальный размер данных, которые можно передать по определенному протоколу. Максимальная единица передачи атрибута (в спецификации определена как ATT_MTU) это наибольший размер полезной нагрузки атрибута, который можно передать между клиентом и сервером.

    Эффективный размер ATT_MTU определяется наименьшим значением максимальных ATT_MTU поддерживаемых ведущим и ведомым. Например, если ведущее устройство поддерживает ATT_MTU 100 байт и ведомое устройство сообщает, что оно поддерживает ATT_MTU 150 байт, то ведущий решает, что для этого соединения будет использоваться ATT_MTU 100 байт.

    Примечание: Для достижения максимальной пропускной способности убедитесь, что включено расширение длины передаваемых данных (в случае, если вы используете Bluetooth 4.2 или новее). Это поможет снизить количество избыточно передаваемых служебных данных, таких как заголовки пакетов, за счет уменьшения числа пакетов.

Смотрите про коптеры:  Рекламный робот на продажу. Цена и стоимость рекламного робота

1 Протокол атрибутов (ATT)

АТТ определяет, в каком виде сервер представит свои данные клиенту и как эти данные будут структурированы. Существует две роли, связанные с АТТ:

  • Сервер:

    Это устройство, которое предоставляет данные, которые оно содержит, или которыми управляет и, в некоторых случаях, другие аспекты поведения сервера, которые могут контролировать другие устройства. Это устройство, которое получает входящие команды от связанного устройства и отправляет ответы, уведомления и индикации.

    Например, беспроводной термометр будет вести себя как сервер, когда он будет предоставлять температуру окружающей среды, единицу измерений, свой уровень заряда и, возможно, временные интервалы, с которыми термометр производит измерения и сохраняет их результаты. Он также может уведомлять клиент (объясним позже) об изменениях температуры для того, чтобы клиент не опрашивал его непрерывно в ожидании готовых к отправке данных.

  • Клиент:

    Это устройство, которое взаимодействует с сервером с целью считать предоставляемые сервером данные и/или для того, чтобы контролировать его поведение. Это устройство, которое посылает команды и запросы и получает входящие уведомления и индикации. В предыдущем примере, мобильный телефон, который подключался к беспроводному термометру и считывал его показания температуры, действовал в роли клиента.

    Данные, предоставляемые сервером, сгруппированы в атрибуты. Атрибут это общий термин для любых типов данных, предоставляемых сервером, он определяет структуру этих данных. Например, сервисы и характеристики (будут описаны позднее) являются атрибутами. Ниже состав атрибута:

  • Тип атрибута (универсальный уникальный идентификатор, UUID)

    Это 16-битное (в случае стандартных атрибутов Bluetooth SIG) или 128-битное число (в случае атрибутов, определенных разработчиком устройства, vendor-specific UUID).

    Например, UUID для одобренного консорциумом атрибута значения температуры 0x2A1C. Одобренные консорциумом типы атрибутов имеют один общий (за исключением 16 бит) специальный 128-битный UUID:

    0000XXXX-0000-1000-8000-00805F9B34FB

    16-битный UUID будет подставлен вместо символов ХХХХ в базовом UUID.

    Собственный UUID может быть любым 128-битным числом, не совпадающим ни с одним из одобренных Bluetooth-SIG базовых UUID. Например, разработчик может создать свой собственный UUID для показаний температуры, такой как:

    F5A1287E-227D-4C9E-AD2C-11D0FD6ED640

    Одно из преимуществ использования стандартных UUID состоит в уменьшении размера пакета, так как UUID может быть передан в виде 16-битного числа, вместо передачи полного 128-битного числа.

  • Дескриптор атрибута

    Это 16-битное число, которое сервер присваивает каждому из своих атрибутов. Это число используется клиентом как ссылка на конкретный атрибут, и сервер гарантирует, что эта ссылка будет уникальной для атрибута, которому она присвоена, в течении всего времени существования соединения между устройствами. Дескриптор может иметь любое значение в диапазоне 0x0001-0xFFFF, значение 0х0000 зарезервировано.

  • Права атрибута

    Права определяют, может ли атрибут быть прочитан или записан, может ли он посылать уведомления или индикации, и какие уровни доступа требуются для каждой из этих операций. Эти права не определяются протоколом атрибутов (АТТ) и не могут быть прочитаны через него, они определяются на верхнем уровне (GATT или уровне приложения).

3.2 Характеристики

Характеристика всегда является частью сервиса и предоставляет часть тех данных, которые сервер хочет предоставить клиенту. Например, характеристика уровня заряда батареи показывает оставшийся уровень заряда батареи в устройстве, который может быть прочитан клиентом. Характеристика содержит набор атрибутов, которые облегчают работу с содержащимися в характеристике данными:

  • Свойства: представлены набором бит, определяющих то, каким образом значение характеристики может использоваться. Пример свойств: чтение, запись, запись без ответа, уведомление, индикация.

  • Дескрипторы: используются для хранения информации, связанной со значением характеристики. Примеры использования: расширенные свойства, пользовательское описание, поля, используемые для подписки на уведомления и индикации, поля, описывающие представление характеристики, такие как формат или единица измерения.

Понимание этих концепций важно, однако вы, как разработчик приложения, будете в основном взаимодействовать с API, предоставленным операционной системой или SDK чипсета, которые абстрагируют вас от многих этих понятий.

Например, вы можете иметь API для включения уведомлений для некоторых характеристик, который вы просто вызываете и вам нет необходимости знать, что результатом этого вызова будет запись значения 0x0001 в дескриптор конфигурации характеристик клиента (CCCD) на сервере.

Важно помнить, что, хотя нет никаких запретов или ограничений на количество характеристик, содержащихся в сервисе, сервисы предназначены для группировки связанных характеристик, которые определяют конкретные функции в устройстве.

Например, технически возможно создать сервис под названием сервис влажности, который будет включать в себя характеристику влажности и характеристику температуры. Но гораздо более логичным решением будет создать два отдельных сервиса для каждой несвязанной функции (отображение текущей температуры и отображение текущей влажности).

Стоит отметить, что Bluetooth SIG приняла довольно-таки большое количество сервисов и характеристик, которые удовлетворяют большей части распространенных сценариев использования. Для этих одобренных сервисов существуют спецификации, помогающие разработчикам реализовать их вместе с обеспечением соответствия и взаимодействия с каждым сервисом.

Если устройство заявляет о совместимости с сервисом, оно должно полностью соответствовать спецификации сервиса, опубликованной Bluetooth SIG. Это важно, если вы хотите разработать устройство, которое будет гарантированно подключаться к устройствам, изготовленными другим производителем.

Вы можете найти список одобренных сервисов здесь, и их спецификации здесь. Одобренные характеристики находятся по этому адресу.

Accesstogo rdp

При использовании программного обеспечения AccessToGo RDP можно выбрать два варианта протокола. Первый – собственный и платный. Второй – бесплатный RDP. С помощью этой программы можно настраивать качество передаваемой картинки, изменять вид клавиатуры (для ПК или стандартная смартфонная), устанавливать управление двухпальцевыми или трехпальцевыми жестами.

Среди других особенностей программы – поддержка нескольких языков и отдельный режим прокрутки. А еще – возможность использовать не только виртуальную, но и физическую клавиатуру, которая подключена к смартфону или планшету по USB (при наличии поддержки технологии OTG)

Единственный недостаток утилиты по сравнению с другими программами – меньшая скорость доступа, которая вряд ли позволит нормально воспроизводить на телефоне Full HD или 2K видео, даже если такой формат поддерживается гаджетом.

Bluetooth remote control: управление компьютером с мобильника

10 приложений для управления компьютером с Android телефона

Когда то очень давно мне в руки попал Хакер за
апрель 2003 года. В нем была статья про то, как через IrDA и при
помощи пульта дистанционного управления управлять Виндой. Я тогда помню накупил деталей, спаял ИК-приемник, но ничего у меня не вышло :). Недавно захотел довести начатое до конца, но уже на основе Bluetooth. Для этого нам понадобится тело с “синим зубом” и BT-адаптер для компа.

Так как самому реализовывать в дельфи работу с bluetooth было долго и муторно, я решил взять уже готовую библиотеку: Bluetooth Framework Library, которую написал наш соотечественник (правда она без исходников). С библиотекой идет несколько демок, показывающих основные возможности.
Нам же сегодня потребуется KeypadControl. Отрываем source и устанавливаем библиотеку, потом копируем все содержимое этой папки, открываем demo_docdemoKeypadControl, вставляем и запускаем KeypadControl.dpr. Перед нами открылась главная форма этой демки. Она может обрабатывать нажатия кнопок на теле и по нажатию кнопок на форме эмулировать их нажатие на теле. Я предлагаю создать для тела простой мидлет, в котором будет крутиться цикл до тех пор, пока не нажата клавиша “0”. Его можно скачать тут
http://www.mobileservicesoft.narod.ru/blank.rar. Теперь необходимо придумать, за что будет отвечать каждая кнопка на теле. У меня siemens cx75 и для него я реализовал так: 

Смотрите про коптеры:  Конструкторы программируемых роботов

джойстик – перемещает курсор (причем перемещаем, пока кнопка нажата, в таймере) 
нажать его – левая кнопка мыши 
левая софт кнопка – двойное нажатие левой кнопки мыши 
правая софт кнопка – правая клавиша мыши 
зеленая трубка – reboot 
красная трубка – shutdown 
1 – enter 
2 – стрелка вверх 
3 – закрыть активное окно 
4 – стрелка влево 
5 – стрелка вниз 
6 – стрелка вправо 
7 – отрыть лоток CD 
8 – закрыть лоток CD 
9 – свернуть активное окно 

Для реализации задуманного нужно удалить все кнопки с форы кроме Connect и соответственно все обработчики нажатий на эти кнопки. Добавить таймер и все. ShowMessage(‘DOWN: ‘ Key) – тоже надо везде удалить.

Давайте посмотрим, как все это работает. Запускаем
приложение, появляется окно, на нем одна кнопка Connect, после ее нажатия вылезет несколько окон – там все
просто. Теперь соединение установлено. Нажатие кнопки на теле генерирует событие BFKeypadControlClientKeyDown(Sender: TObject; Key: String), где key – это код нажатой кнопки. Теперь нужно поместить простой case и все, хотя все лучше видно на исходнике:

key1:=key[1]; //это нужно, чтобы в обработке таймера знать какая кнопка была нажата 
a1:=0; 
a2:=0; 
case key[1] of 
'<' : a1:=-10; //
курсор влево 
'>' : a1:=10; //
курсор вправо 
'^' : a2:=-10; //
курсор вверх 
'V' : a2:=10; //
курсор вниз 
'F' : begin //
нажимаем левую кнопку мыши 
GetCursorPos(p); 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, P.x, P.y, 0, 0); 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, P.x, P.y, 0, 0); 
end; 
'[' : begin //
нажимаем левую кнопку мыши дважды 
GetCursorPos(p); 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, P.x, P.y, 0, 0); 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, P.x, P.y, 0, 0); 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, P.x, P.y, 0, 0); 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, P.x, P.y, 0, 0); 
end; 
']' : begin //
нажимаем правую кнопку мыши 
GetCursorPos(p); 
mouse_event(MOUSEEVENTF_RIGHTDOWN, P.x, P.y, 0, 0); 
mouse_event(MOUSEEVENTF_RIGHTUP, P.x, P.y, 0, 0); 
end; 
'S' : WinExec(PChar('shutdown -t 0 -r'),SW_SHOWNORMAL); //
reboot 
'C' : WinExec(PChar('shutdown -t 0 -s'),SW_SHOWNORMAL); //
shutdown 
'1' : begin //
эмулируем нажатие кнопки enter 
keybd_event(VK_RETURN,0,0,0); 
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); 
end; 
'2' : begin //
эмулируем нажатие стрелки вверх 
keybd_event(vk_up,0,0,0); 
keybd_event(vk_up,0,KEYEVENTF_KEYUP,0); 
end; 
'3' : SendMessage(GetForegroundWindow, WM_CLOSE,0,0); //
закрываем активное окно 
'4' : begin //
эмулируем нажатие стрелки влево 
keybd_event(VK_LEFT,0,0,0); 
keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0); 
end; 
'5' : begin //
эмулируем нажатие стрелки вниз 
keybd_event(VK_DOWN,0,0,0); 
keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0); 
end; 
'6' : begin //
эмулируем нажатие стрелки вправо 
keybd_event(VK_RIGHT,0,0,0); 
keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0); 
end; 
'7' : mciSendString('Set cdaudio door open wait', 0, 0, 0); //
отрываем лоток CD 
'8' : mciSendString('Set cdaudio door closed wait', 0, 0, 0);//
закрываем лоток CD 
'9' : ShowWindow(GetWindowLong(GetForegroundWindow,GWL_HWNDPARENT),SW_MINIMIZE); 
//
сворачиваем активное окно 
end; 
if (GetCursorPos(p)=true)and 
((key1='<')or(key1='>')or(key1='^')or(key1='V')) then 
begin 
Timer1.Enabled:=true; //
запускаем таймер 
SetCursorPos(p.X a1,p.Y a2); //
перемещаем курсор 
end; 

В обработке таймера прописываем перемещение курсора. Как только кнопку джойстика отпустили происходит BFKeypadControlClientKeyUp, где и нужно
прописать Timer1.Enabled:=false. 

Прога может работать при соединении тела с ПК через IrDA, Bluetooth и COM порт. Скачать исходник проги можно тут
http://mobileservicesoft.narod.ru/rem.rar, а саму библиотеку на
www.btframefork.com.

Remote control (дистанционное управление компьютером через android)

Этой статьёй я (Tamir) открываю раздел Smart. В этой рубрике будут выходить статьи, посвящённые смартфонам, КПК, планшетам и другим портативными ЭВМкам.

Как вы уже поняли из названия статьи, речь сегодня пойдёт об удалённом управлении. Лет 5 назад я впервые натолкнулся на телефон, который обладал функцией управления компьютером через блютуз. В то время это показалось мне очень занимательным. Можно было, не вставая с кровати переключать фильмы, делать громче, тише, листать презентации.

Но время не стоит на месте, на дворе уже 2022 год. И не для кого ни секрет, что популярность приобрели умные гаджеты (смартфоны, КПК, планшетные компьютеры).

Просматривая Android маркет на предмет бесплатных и функциональных программ, я наткнулся на интересное приложение Unified Remote.

Программа поддерживает настройку соединения с компьютером по беспроводным сетям Wi-fi и Bluetooth в ручном и автоматическом режиме, имеет приятный, лаконичный интерфейс и незатейливое название.

Также программу отличает система поддержки пользователей. Ну, или, в крайнем случае, вы сможете написать разработчикам.

Для бесплатной версии (на момент написания статьи — январь 2022 года) доступны следующие 14 пультов:

  • Basic Input – выполняет функцию удалённого тачпада
  • File Manager – позволяет вам просматривать содержимое вашего компьютера, а также открывать его.
  • Keyboard – виртуальная клавиатура
  • Media – универсальный пульт для медиа плееров
  • Navigation— поддерживает функции перемещения так, словно вы используете стрелки клавиатуры, Enter, backspace, escape, alt, tab.
  • Numpad – ввод чисел и знаков аналогичных расположенным на цифровой части компьютерной клавиатуры
  • Power – операции с питанием компьютера (Выключение, Перезагрузка, Гибернация)
  • Scroll Wheel – функции колёсика мыши
  • Slide Show – для управления мультимедийными презентациями.
  • Spotify — пульт управления сервисом Spotify
  • Start – позволяет вам получить доступ к программам, расположенным в меню «Пуск»-> «Все программы»
  • Task Manager – выводит на экран список выполняемых программ из диспетчера задач вашего компьютера.
  • VLC – пульт управления VLC плеером
  • Windows Media Center – пульт управления Windows Media Center
  • Windows Media Player – пульт управления Windows Media Player
  • You Tube – пульт управления You TUBE плеером

К сожалению, полный набор из 28 пультов и возможность создавать свои, доступны только в платной версии приложения (3.69$).

В настройках можно выставить несколько пультов для быстрого переключения между ними:

Preferences -> «Quick Switch»

В целом и общем Unified Remote – отличная бесплатная программа для дистанционного управления компьютером.

Как использовать?

Google Play Market предлагает десятки приложений, которые предоставляют возможность удаленного управления. При этом для подключения доступна не только операционная система Windows, но и Mac, Linux. Однако большинство из них – крайне дорогостоящие.

Может сложиться ошибочное представление, что бесплатных аналогов для удаленного управления не существует. Это не так. Существует как минимум два мощных и бесплатных инструмента: Microsoft Remote Desktop и TeamViewer. Рассмотрим их.

Управление компьютером с помощью Microsoft Remote Desktop

Это мощная утилита от компании Microsoft, вышедшая не так давно. Данная программа позволяет подключаться к компьютерам, на которых установлена Windows 7 или Windows 8.

Ищем программу на Google Play Market и скачиваем. Для того чтобы подключаться к компьютеру с нашего устройства, необходимо внести некоторые изменения в настройках системы компьютера:

Переходим в Панель управления -> Система, выбираем пункт Настройка удаленного доступа, после чего устанавливаем галочку на «Разрешить подключаться только с компьютеров, на которых работает удаленный стол с проверкой подлинности на уровне сети»:

Разрешить удаленный доступ к компьютеру

Что делать если нижняя часть «Удаленный рабочий стол» отсутствует?

Это означает, что у вас отключен брандмауэр Windows. Для его включения переходим на рабочий стол, правая кнопка по «Мой компьютер», выбираем «Управление». Открываем «Службы» и в списке находим «Брандмауэр», после чего меняем его состояние на «Включен».

Включение брандмауэра Windows

После столь несложных манипуляций переходим к программе, которую мы установили на наше устройство. Добавляем новое подключение, нажав на крестик:

Добавление подключения в Microsoft Remote Desktop

Ввод параметров подключения к компьютеру

Как узнать IP компьютера?

Используем сочетание клавиш Win R, в открывшемся окне вводим cmd. После открытия командной строки, пишем ipconfig. «IPv4 адрес» и есть нужный нам IP:

Определение локального IP адреса компьютера

Вводим его в окно добавления подключения Remote Desktop. При желании можно указать пароль.

Готово! Вы успешно подключитесь к удаленному компьютеру и увидите его рабочий стол.

Управление компьютером с помощью TeamViewer

Данная программа является одной из популярнейших в своем роде. Она бесплатна, удобна и очень распространена среди пользователей ПК. Однако мало кто знает о том, что не так давно разработчики выпустили своё детище и на Android. В отличие от Microsoft Remove Desktop, TeamViewer позволяет подключаться к компьютерам с установленными операционными системами Windows, Mac и Linux.

Передача файлов

В большинстве случаев пользователи передают различные данные между двумя мобильными девайсами посредством технологии Bluetooth. Телефоны должны находиться неподалеку друг от друга с активированной функцией беспроводной передачи файлов. На устройствах под управлением Android данная опция активируется двумя способами.

Свайпом вниз по экрану телефона откройте верхнюю «шторку» и на панели доступа выберите иконку Bluetooth, если она там находится. Если ее нет, вы можете добавить быстрый запуск на верхнюю панель или воспользоваться вторым способом.

Второй вариант несколько длиннее. Вам необходимо найти раздел с настройками на главном экране или в меню устройства (зависит от оболочки). После этого открыть вкладку с настройками беспроводной сети и активировать функцию Bluetooth.

Смотрите про коптеры:  Как подключить телефон к машине через Bluetooth: шаг за шагом

Названия и внешний вид меню на Android могут меняться в зависимости от версии операционной системы и оболочки производителя. Но принцип включения Блютуза везде одинаковый.

Теперь нужно подключить телефон к другому устройству:

  1. Откройте приложение, через которое вы просматриваете файлы для передачи на другой телефон. Например, стандартная галерея для просмотра фото, файловый менеджер для общих данных и так далее.
  2. Выберите нужны файл и откройте дополнительное меню. В нем выберите вариант «Передать» или «Поделиться».
  3. После этого появится список вариантов передачи. Среди них найдите Bluetooth.
  4. Активируйте Блютуз на втором устройстве и подождите, пока передающий смартфон найдет его.
  5. При подключении введите пароль, если на девайсе установлена защита.
  6. Подождите окончания передачи данных. Об успешном завершении свидетельствует соответствующее уведомление.

Теперь рассмотрим подключение двух телефонов на ОС iOS. Сначала точно так же включите функцию Bluetooth через главное меню или с помощью панели быстрого доступа. Однако на устройствах Apple данная «шторка» открывается свайпом вверх.

Теперь откройте настройки беспроводной сети и включите поиск устройств. После того, как будет найден второй телефон, подключитесь к нему и сохраните в памяти.

Некоторые устройства отображаются в поиске не с настоящим названием фирмы и модели, а кодом из цифр или букв. Предварительно посмотрите имя девайса в настройках, чтобы не подключиться к постороннему телефону. Актуально при передаче данных в общественном месте.

Трюк 4: работаем с bt-адаптером напрямую

Долгое время Bluetooth стеки для Windows предоставляли настолько скудные возможности
, что программисты просто обходили эту платформу стороной. Этим объясняется, что большинство программ для серьезных забав c «синим зубом» разрабатываются под никсовую платформу.

Некоторые из хитрых приемов мы разберем именно на это платформе, а именно FreeBSD
(напомню, что на диске прошлого номера мы выкладывали свежий 7.0 релиз этой ОС). Сама технология Bluetooth
официально стала поддерживаться на ней только с 5-ой ветки на базе подсистемы Netgraph.

  1. Подключаем устройство: kldload ng_ubt
  2. Копируем сценарий подгрузки стека в удобное место: cp /usr/share/examples/netgraph/bluetooth/rc.bluetooth /usr/local/etc/rc.bluetooth
  3. Копируем сценарий подгрузки стека в удобное место и запускаем: sh /usr/local/etc/rc.bluetoots start ubt0

Теперь хочу познакомить тебя с утилитой hccontrol. Это одна из основных программ для работы с BT-модулем. Именно она выполняет все операции, связанные с интерфейсом HCI, и имеет следующий синтаксис: hccontrol –n . Проверим функциональность нашего устройства, просканиров эфир на наличие устройств:

hccontrol –n ubt0hci Inquiry

Как результат, утилита выведет информацию о найденных устройствах, в том числе их MAC-адреса. Надо заметить, что каждое из устройств Bluetooth, будь то хедсет или обыкновенный телефон, представляет некоторый набор сервисов
.

Базовый перечень включает в себя: CIP (Common ISDN Access), CTP (Cordless Telephony), DUN (dial-up networking), FAX (FAX), FTRN (Obex File Transwer), HSET (Headset), NAP (Network Access Point). Чтобы выяснить, какие сервисы предоставляет то или иное устройство, используется запрос на специальном протоколе SPD (Service Descovery Protocol).

# spdcontrol -a browse

Трюк 6: перехватываем из эфира разговоры по гарнитуре

Одна из основных угроз радиотехнологий состоит в том, что данные можно перехватить. Первое, что приходит в голову, касаемо Bluetooth – прослушать разговоры людей, использующих гарнитуру. И зачастую это реально! На хакерском фестивале What the Hack в Нидерландах специалисты из группы Trifinite продемонстрировали, как при помощи ноутбука с Linux, специальной программы и направленной антенны можно подслушать, о чем говорит через Bluetooth-гарнитуру водитель проезжающего автомобиля.

Группа разработала программу Car Whisperer («Автомобильный шептун»). Возможности программы относительно невелики: прослушать можно только тех, кто забыл сменить заводские пароли доступа к Bluetooth наподобие«0000» или «1234». Но таких бедолаг, поверь, очень и очень много!

«Шептун» способен вклиниться и успешно пройти «pairing» устройств, получив информацию, передаваемую с каркита или хедсета на мобилку. Хочу обратить внимание: утилита позволяет не только получить информацию, передающуюся между хедсетом и мобилой, но и инжектить туда свою. Мы решили проверить возможности этой программы, скачав Car Whisperer с сайта разработчиков.

Перед началом операции рекомендуется изменить класс своего устройства, особенно если программа будет использоваться с компьютера:

hciconfig адаптер class 0x500204# 0x500204 – это класс «phone»

В противном случае некоторые «умные» девайсы могут заподозрить неладное. Смотрим синтаксис утилиты, который выглядит следующим образом:

./carwhisperer «что внедряем в линию» «что захватываем из линии» «адрес устройства» [канал]

Мы взяли внедряемый файл прямо из папки утилиты, а в качестве выходного указали out.raw:

./carwhisperer 0 message.raw /tmp/out.raw00:15:0E:91:19:73

На выходе получаем файл out.raw. Прослушать его в чистом виде нельзя: необходимо преобразовать в аудио формат, для чего потребуется дополнительная утилита. Подойдут довольно многие аудио конвертеры, например SoX:

raw –r 8000 –c 1 –s –w out.raw –t wav –r 44100 –c 2 out.wav

Кроме прослушивания, можно войти в систему, просмотреть телефонную книгу и воспользоваться другими возможностями «свободных рук» с Bluetooth. Принцип такой: сначала осуществляется поиск активных устройств и проверка на предмет сервиса HS (Head Set). Далее исследуется MAC-адрес устройства и производится попытка подключения с использованием стандартного ключа. Если коннект установлен, то с устройством можно делать все, что угодно (в пределах доступного набора AT-команд).

На практике это выглядит следующим образом. Сначала осуществляется поиск всех активных гарнитур с помощью команды «sdptool search HS», которая выдает примерно такой ответ:

Inquiring …Searching for HS on 00:0A:3A:54:71:95 …Service Name: HeadsetService RecHandle: 0x10009Service Class ID List:”Headset” (0x1108)”Generic Audio” (0x1203)Protocol Descriptor List:”L2CAP” (0x0100)”RFCOMM” (0x0003)Channel:

Далее осуществляется попытка открыть RFCOMM соединение на SCO audio channel с помощью команды «rfcomm connect 2 00:0A:3A:54:71:95 1» и посылка нужных AT-команд. Приведу небольшую статистическую заметку о данных авторизации на некоторые модели беспроводных гарнитур:

Nokia (00:02:EE…) – pin=”5475″Audi UHV (00:0E:9F…) – pin=”1234″O’Neill (00:80:37…) – pin=”8761″Cellink (00:0A:94…) – pin=”1234″Eazix (00:0C:84…) – pin=”1234″

Кстати говоря, тот же принцип может использоваться для несанкционированного подключения и ко всем остальным устройствам. При помощи AT-команд и протокола RFCOMM можно, к примеру, прочитать SMS-сообщение или даже отправить его с чужого телефона на платный номер, поставив владельца девайса на деньги. Будь бдителен!

Управление устройством по блютус

Эта статья служит продолжением предыдущей статьи «Смартфон управляет игрушечным автомобилем» и должна помочь пользователям, решившим повторить проект, управлять своим устройством с помощью блютус, используя среду программирования BASIC!..

Управление голосом эффектное, но не очень надежное средство управления, особенно когда расстояние до объекта управления более 2 метров. Мешает затухание и реверберация звука и посторонние шумы, кроме того нужен постоянный доступ к интернету. Надежнее управление по блютус.

Для этого написаны две программы.

Одна программа, назову её «Сервер», работает на смартфоне, управляющем устройством. Сервер будет слушать канал связи, получать команды и выполнять их.

Другая, назову ее «Клиент», работает на смартфоне, который выполняет роль пульта ДУ. Клиент будет инициировать связь, формировать команду, передавать ее по блютус серверу.

Команда представляет собой текстовое сообщение. Например, “right”, а можно “r”, что должно интерпретироваться как «вправо», и означать включение привода руля вправо и маршевого двигателя вперёд на 300 миллисекунд.

Перед началом работы программ между смартфонами надо будет организовать доступ. Для этого откройте настройку, включите блютус, включите поиск доступных устройств и выберите смартфоны.

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

Сначала запускается программа «Сервер», после того как Вы убедитесь, что она начала слушать канал связи, запускаете Клиент и управляете устройством.

Этими программами демонстрируется только передача команд, интерпретация их в световые пятна на экране была показана в прошлой статье. Остановка работы программ производится клиентом. Если возникает необходимость остановить работу сервера непосредственно на смартфоне, нажмите три раза клавишу возврат.

Листинг программы «Сервер»

FN.DEF speak(t$)
TTS.INIT
TTS.SPEAK t$
TTS.STOP
FN.END

speak("начало работы сервера")
ONERROR:
newConnection:
BT.OPEN
speak ("Жду запрос на соединение ")
DO %         
BT.STATUS s
IF s = 1
!speak("Слушаю")
ELSEIF s =2
speak( "Соединяюсь")
ELSEIF s = 3
speak( "Соединение создано")
ENDIF
PAUSE 1000
UNTIL s = 3 %       

BT.DEVICE.NAME device$

DO %---------
BT.STATUS s
IF (s<> 3)
speak( "Соединение разорвано")
GOTO new_connection
ENDIF

DO % ======
BT.READ.READY rr
IF rr
BT.READ.BYTES s$
PRINT ":";s$
s$ =mid$(s$,1,len(s$)-1)
speak(s$)
IF (s$="end") THEN GOTO xEnd
ENDIF
UNTIL rr = 0 % ======

UNTIL 0 % --------

xEnd:
speak("Сервер остановлен")
BT.CLOSE
END

Листинг программы «Клиент»

ARRAY.LOAD menucom$[], "Вперед", "Назад", "Вправо", "Влево", "Остановить клиент", "Остановить сервер"

BT.OPEN
BT.CONNECT

n = 0
DO %           
BT.STATUS s
IF s = 1
PRINT "Слушаю, секунды: ", n  
ELSEIF s =2
PRINT "Соединяюсь, секунды: ",n  
ELSEIF s = 3
PRINT "Есть соединение"
ENDIF
PAUSE 1000

UNTIL s = 3 %         

BT.DEVICE.NAME device$
PRINT device$
PAUSE 1000

x = 0
DO %#########
SELECT menu, menuCom$[], "Выбери команду"
IF menu = 1 THEN BT.WRITE "forward"
IF menu = 2 THEN BT.WRITE "backward"
IF menu = 3 THEN BT.WRITE "right"
IF menu = 4 THEN BT.WRITE "left"
IF menu = 5 THEN x=1
IF menu = 6 THEN BT.WRITE "end"
UNTIL x=1 %#########

BT.CLOSE
END

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector