zoukankan      html  css  js  c++  java
  • python实现蓝牙通信

    安装和示例

    linux下安装

    sudo apt-get install python-pip libglib2.0-dev
    sudo pip install bluepy

    官方示例

    import btle
    
    class MyDelegate(btle.DefaultDelegate):
        def __init__(self, params):
            btle.DefaultDelegate.__init__(self)
            # ... initialise here
    
        def handleNotification(self, cHandle, data):
            # ... perhaps check cHandle
            # ... process 'data'
    
    
    # Initialisation  -------
    
    p = btle.Peripheral( address )
    p.setDelegate( MyDelegate(params) )
    
    # Setup to turn notifications on, e.g.
    #   svc = p.getServiceByUUID( service_uuid )
    #   ch = svc.getCharacteristics( char_uuid )[0]
    #   ch.write( setup_data )
    
    # Main loop --------
    
    while True:
        if p.waitForNotifications(1.0):
            # handleNotification() was called
            continue
    
        print "Waiting..."
        # Perhaps do something else here

    蓝牙通信模块pybluez的使用

    选择蓝牙通信对象

    import bluetooth
    
    target_name = "My Device"
    target_address = None
    
    nearby_devices = bluetooth.discover_devices()
    
    for bdaddr in nearby_devices:
    if target_name == bluetooth.lookup_name( bdaddr ):
    target_address = bdaddr
    break
    
    if target_address is not None:
    print("found target bluetooth device with address ", target_address)
    else:
    print("could not find target bluetooth device nearby")

    查询设备服务 

    import bluetooth
    
    nearby_devices = bluetooth.discover_devices(lookup_names=True)
    for addr, name in nearby_devices:
    print(" %s - %s" % (addr, name))
    
    services = bluetooth.find_service(address=addr)
    for svc in services:
    print("Service Name: %s" % svc["name"])
    print(" Host: %s" % svc["host"])
    print(" Description: %s" % svc["description"])
    print(" Provided By: %s" % svc["provider"])
    print(" Protocol: %s" % svc["protocol"])
    print(" channel/PSM: %s" % svc["port"])
    print(" svc classes: %s "% svc["service-classes"])
    print(" profiles: %s "% svc["profiles"])
    print(" service id: %s "% svc["service-id"])
    print("")

    通过RFCOMM方式进行通信

    采用类似于socket编程模型的方式进行蓝牙通信的编程

    1.服务器端程序

    import bluetooth
    
    server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
    
    port = 1
    server_sock.bind(("",port))
    server_sock.listen(1)
    
    client_sock,address = server_sock.accept()
    print "Accepted connection from ",address
    
    data = client_sock.recv(1024)
    print "received [%s]" % data
    
    client_sock.close()
    server_sock.close()


    2. 客户端程序

    import bluetooth
    
    bd_addr = "01:23:45:67:89:AB"
    
    port = 1
    
    sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
    sock.connect((bd_addr, port))
    
    sock.send("hello!!")
    
    sock.close()

    通过L2CAP方式进行通信

    L2CAP的sockets方式几乎等同于RFCOMM的sockets方式,唯一的不同是通过L2CAP的方式,并且端口是0x1001到0x8FFF之间的奇数端口。默认的连接可以传送的可靠报文是672个字节。

    1.服务器端程序

    import bluetooth
    
    server_sock=bluetooth.BluetoothSocket( bluetooth.L2CAP )
    
    port = 0x1001
    server_sock.bind(("",port))
    server_sock.listen(1)
    
    client_sock,address = server_sock.accept()
    print "Accepted connection from ",address
    
    data = client_sock.recv(1024)
    print "received [%s]" % data
    
    client_sock.close()
    server_sock.close()


    2.客户端程序

    import bluetooth
    
    sock=bluetooth.BluetoothSocket(bluetooth.L2CAP)
    
    bd_addr = "01:23:45:67:89:AB"
    port = 0x1001
    
    sock.connect((bd_addr, port))
    
    sock.send("hello!!")
    
    sock.close()

    调整MTU大小

    l2cap_sock = bluetooth.BluetoothSocket( bluetooth.L2CAP )
     # connect the socket
    bluetooth.set_l2cap_mtu( l2cap_sock, 65535 )

    refer:

    An Introduction to Bluetooth Programming

    Python之蓝牙通信模块pybluez学习笔记

  • 相关阅读:
    Elasticsearch崩溃解决办法
    阿里云服务器ubuntu14.04安装Redis
    error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
    本机访问阿里云服务器上的Elasticsearch
    阿里云服务器配置ElasticSearch
    ElasticSearch-RTF的安装
    【已解决】neo4j-import使用过程中遇到的问题(there's a field starting with a quote and whereas it ends that quote there seems to be characters in that field /Executor has been shut down in panic)
    OutOfMemoryError和StackOverflowError
    线程的终止
    scala基础
  • 原文地址:https://www.cnblogs.com/-wenli/p/11646928.html
Copyright © 2011-2022 走看看