Aceitar automaticamente emparelhamentos bluetooth


9

Estou executando um Raspberry PI 3 decapitado e quero que ele aceite automaticamente emparelhamentos de qualquer dispositivo.

Eu vi essa resposta em uma pergunta idêntica:

Aceitar automaticamente conexões Bluetooth em um Pi 3

Mas parece estar um pouco desatualizado e alguns dos comandos usados ​​parecem não existir.

Estou executando a 2016-05-27-raspbian-jessie.imgimagem do sistema operacional.


O que você quer dizer com "alguns dos comandos usados ​​parecem não existir"? O que exatamente não funcionou para você?
— Dmitry Grigoryev

11
Se bem me lembro bluetooth-agent, mas não tenho certeza.
— Gilad Naaman

Respostas:


7

Como o bluetooth-agentcomando não existe em Jessie, a maneira moderna é canalizar comandos relevantes para bluetoothctl. Com base nessa pergunta de SO , o seguinte script deve habilitar o emparelhamento automático sem a entrada manual de pinos:

sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent 
EOF

11
Isso funcionou para tornar meu RPi Zero W detectável na inicialização. Eu havia atualizado anteriormente minha configuração de Bluetooth através das etapas descritas aqui e com este script .
— charliesneath

Isso funciona, mas você se importa em me dizer como fazer com que o raspberry pi confie automaticamente no dispositivo após o emparelhamento? Obrigado
— Daniele Segato

Parece que isso permite o emparelhamento, mas não autoriza conexões por falta de um agente. Acredito que a parte do agente desse script não funcione corretamente. Quando executo esse script, recebo No agent is registered, parece que o default-agentcomando é executado rapidamente. Quando eu insiro os comandos manualmente, ele não apresenta esse erro, mas, depois que eu bluetoothctlo encerro, o registro do agente é cancelado e a tentativa de conexão falha. Se eu sair bluetoothctlcorrendo, eu recebo um prompt perguntando se você deseja realizar a conexão, que não é tão NoInputNoOutputcomo você esperaria ...
— Matthijs Kooijman

Eu suspeito que a NoInputNoOutputpolítica não é tanto uma autorização, mas parte do protocolo bluetooth para descobrir que tipo de mecanismo de autorização (por exemplo, um pino pode ser usado?) Está disponível.
— Matthijs Kooijman

11
Provavelmente, mas você teria que continuar alimentando sim para todas as tentativas de emparelhamento (e não tenho certeza se isso funciona com stdin ou se o script tenta ser inteligente e tenta abrir o terminal diretamente, em vez de stdin (que também acontece às vezes) ... não tentei isso, porém, acabei usando o script python de gist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c
— Matthijs Kooijman

0

Eu apenas usei uma nova instalação 2016-09-23-raspbian-jessie-lite.imgpara experimentá-lo sem atualizações adicionais. Não, apt-get updatenão, apt-get install bluez-utilsnem nada. Esse comando único torna o Pi detectável e emparelhado. Sem um agente para controlar quem pode se conectar, ele permite que qualquer pessoa:

sudo hciconfig hci0 piscan

0

Raspbian - Jessie

sudo apt-get install expect

xxxxx.sh

#!/usr/bin/expect -f
set prompt "#"
spawn sudo bluetoothctl
sleep 1
expect -re $prompt
sleep 1
send "agent NoInputNoOutput\r"
sleep 2
expect "Agent registered"
send "default-agent\r"
expect -re $prompt
sleep 3
interact
expect eof

11
Uma resposta que consiste apenas em código não é muito explícita, portanto, forneça algumas explicações mais detalhadas sobre sua resposta. Recue também o seu bloco de código para que ele apareça como código; use 4 espaços ou uma guia, conforme sua preferência.

0

Eu estava enfrentando o mesmo problema e encontrei esse método para funcionar (RasPi 3, Modelo B, Raspbian 9 Stretch)

Estou usando o Raspberry Pi como um dispositivo IoT EDGE e precisava dele para aceitar solicitações de par de Bluetooth sem intervenção. Eu tenho um aplicativo Android que comunica informações de texto para o Pi via Bluetooth e minha declaração de problema precisava de qualquer dispositivo Android para conectar.

Em primeiro lugar, não estou executando nenhum agente Bluetooth separado (No Blueman, na verdade, tive que removê-lo)

Editou o arquivo .bashrc em

    sudo nano /home/pi/.bashrc

Adicionado dois comandos para isso no final

    sudo hciconfig hci0 piscan 
    sudo hciconfig hci0 sspmode 1

piscan torna Raspberry Pi Bluetooth detectável

O sspmode 1 habilita o 'Pareamento simples seguro', que é o mesmo tipo de método usado pelos fones de ouvido ou alto-falantes Bluetooth (basicamente dispositivos que não possuem uma tela onde você pode confirmar o PIN). E como esses comandos estão no .bashrc, eles são executados na inicialização.

Execute o script Bluetooth. Par. Embora exista um pop-up solicitando a confirmação, posso comunicar mensagens de e para o Pi com meu aplicativo

Nota: hci0 pode não ser o mesmo todo, pode ser hci1, hci2, verifique executando hciconfig na sua CLI

Isso é quase como uma engenhoca, e não tenho certeza se há alguma repercussão desconhecida, mas funciona. Quaisquer melhorias são apreciadas


-1

Você pode dar uma olhada no código fonte do EcoDroidLink . Ele aceita conexões Bluetooth sem a necessidade de fazer login.

EDIT: Pela demanda popular, aqui estão trechos de código do edl_agent módulo que faz isso acontecer.

# - automate the agent for running on a headless Pi - to answer pair and connection requests without a blocking query

import dbus
import dbus.service
import dbus.mainloop.glib
import bluezutils

BUS_NAME = 'org.bluez'
AGENT_INTERFACE = 'org.bluez.Agent1'
AGENT_PATH = "/test/agent"

bus = None
device_obj = None
dev_path = None

def set_trusted(path):
    props = dbus.Interface(bus.get_object("org.bluez", path),
                    "org.freedesktop.DBus.Properties")
    props.Set("org.bluez.Device1", "Trusted", True)

def dev_connect(path):
    dev = dbus.Interface(bus.get_object("org.bluez", path),
                            "org.bluez.Device1")
    dev.Connect()

class Rejected(dbus.DBusException):
    _dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
    exit_on_release = True

    def set_exit_on_release(self, exit_on_release):
        self.exit_on_release = exit_on_release

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Release(self):
        printlog("Release")
        if self.exit_on_release:
            mainloop.quit()

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def AuthorizeService(self, device, uuid):
        printlog("AuthorizeService (%s, %s)" % (device, uuid))
        authorize = "yes" #ask("Authorize connection (yes/no): ")
        if (authorize == "yes"):
            return
        raise Rejected("Connection rejected by user")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="s")
    def RequestPinCode(self, device):
        printlog("RequestPinCode (%s)" % (device))
        set_trusted(device)
        return "0000" #ask("Enter PIN Code: ")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="u")
    def RequestPasskey(self, device):
        printlog("RequestPasskey (%s)" % (device))
        set_trusted(device)
        passkey = "0000" #ask("Enter passkey: ")
        return dbus.UInt32(passkey)

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ouq", out_signature="")
    def DisplayPasskey(self, device, passkey, entered):
        printlog("DisplayPasskey (%s, %06u entered %u)" %
                        (device, passkey, entered))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def DisplayPinCode(self, device, pincode):
        printlog("DisplayPinCode (%s, %s)" % (device, pincode))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ou", out_signature="")
    def RequestConfirmation(self, device, passkey):
        printlog("RequestConfirmation (%s, %06d)" % (device, passkey))
        confirm = "yes" #ask("Confirm passkey (yes/no): ")
        if (confirm == "yes"):
            set_trusted(device)
            return
        raise Rejected("Passkey doesn't match")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="")
    def RequestAuthorization(self, device):
        printlog("RequestAuthorization (%s)" % (device))
        auth = "yes" #ask("Authorize? (yes/no): ")
        if (auth == "yes"):
            return
        raise Rejected("Pairing rejected")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Cancel(self):
        printlog("Cancel")

11
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
— Jacobm001

@ Jacobm001 Adicionei trechos de código. Está melhor agora?
— Serge Stroobandt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.