对于我的项目,我需要通过蓝牙下载.zip文件。我使用python和obex来实现这一点。我已经实现了一个可以工作的python opp客户机(向ukBaz寻求帮助),但是我仍然使用os来启动服务器,所以我的服务器程序的其余部分不知道什么时候接收到文件。程序的其余部分已经完成,但是没有来自服务器的输出,我无法触发unzip函数运行。我读过bluez-obex API文档,似乎没有任何关于启动服务器的内容。有没有其他方法可以做到这一点?我的代码如下。
os.system("sudo obexpushd -B -o /home/pi/Desktop/ -n")发布于 2021-07-28 05:36:27
我不熟悉obexpushd,也不熟悉它为您提供了什么,而不是使用obexd所具有的功能。
我的理解是,您需要创建一个obex-agent来接受/拒绝使用obexd的蓝牙对象推送请求。
监视InterfacesAdded DBus信号应该会为您提供传输开始时所需的信息。然后,您可以在状态发生变化时监视PropertiesChanged信号。
我可以把一张照片从我的手机推送到RPi上运行的树莓派(我已经把手机和RPi配对了):
from gi.repository import GLib
import pydbus
BUS_NAME = 'org.bluez.obex'
PATH = '/org/bluez/obex'
AGENT_MANAGER_INTERFACE = 'org.bluez.obex.AgentManager1'
AGENT_INTERFACE = 'org.bluez.obex.Agent1'
SESSION_INTERFACE = 'org.bluez.obex.Session1'
TRANSFER_INTERFACE = 'org.bluez.obex.Transfer1'
ses_bus = pydbus.SessionBus()
def transfer_status_handler(iface, props_changed, props_removed):
    if iface == TRANSFER_INTERFACE:
        status = props_changed.get('Status')
        if status == 'complete':
            print('Transfer complete')
        elif status == 'queued':
            print('Still queued')
        elif status == 'active':
            print('transferring')
        elif status == 'suspended':
            print('Suspended')
        elif status == 'error':
            print('error')
def iface_added_handler(dbus_path, interfaces):
    if SESSION_INTERFACE in interfaces and 'server' in dbus_path:
        print('Server session added')
    elif TRANSFER_INTERFACE in interfaces and 'server' in dbus_path:
        print('Transfer started')
        transfer = ses_bus.get(BUS_NAME, dbus_path)
        transfer.onPropertiesChanged = transfer_status_handler
class Agent:
    """
      <node>
        <interface name='org.bluez.obex.Agent1'>
          <method name='Release'>
          </method>
          <method name='AuthorizePush'>
            <arg type='s' name='path' direction='out'/>
            <arg type='o' name='transfer' direction='in'/>
          </method>
          <method name='Cancel'>
          </method>
        </interface>
      </node>
    """
    def AuthorizePush(self, path):
        print('Authorize Push', path)
        transfer = ses_bus.get(BUS_NAME, path)
        props = transfer.GetAll(TRANSFER_INTERFACE)
        print(props)
        return props.get('Name')
    def Cancel(self):
        print('Authorization Cancelled')
    def Release(self):
        pass
if __name__ == '__main__':
    obex_mngr = ses_bus.get('org.bluez.obex', '/')
    obex_mngr.onInterfacesAdded = iface_added_handler
    mainloop = GLib.MainLoop()
    ses_bus.register_object('/test/agent', Agent(), None)
    print('Agent created')
    agnt_mngr = ses_bus.get(BUS_NAME, PATH)
    agnt_mngr.RegisterAgent('/test/agent')
    print('Agent registered')
    try:
        mainloop.run()
    except KeyboardInterrupt:
        mainloop.quit()这段代码只接受由它发出的任何请求。这可能是一件坏事,人们可能想要添加一些检查(或提示用户),如果文件应该被接受。
https://stackoverflow.com/questions/68547083
复制相似问题