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.

Gilad Naaman
fonte
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
Dmitry Grigoryev
fonte
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
FlippingBinary
fonte
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
hyu
fonte
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

Aprofundar Solanki
fonte
-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")
Serge Stroobandt
fonte
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