通过蓝牙接收消息到raspberrypi

时间:2016-11-30 20:36:42

标签: android ios bluetooth raspberry-pi

我希望通过蓝牙接收来自手机的消息

我写了以下代码,

import bluetooth

hostMACAddress = '18:9E:FC:A1:81:93' # The MAC address of my iphone
port = 3
backlog = 1
size = 1024
s = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
s.bind((hostMACAddress, port))
s.listen(backlog)
try:
    client, clientInfo = s.accept()
    while 1:
        data = client.recv(size)
        if data:
            print(data)
            client.send(data) # Echo back to client
except: 
    print("Closing socket")
    client.close()
    s.close()

当我运行此代码时,如何收到消息给我的Raspberry,我看到没有收到消息,我的覆盆子检测到我的iPhone的MAC地址,但我想发送一些消息,看看覆盆子的蓝牙是否可以收到它

请告诉我在此代码中我必须做哪些修改才能实现蓝牙连接

1 个答案:

答案 0 :(得分:1)

我还没有使用Flutter完成构建应用程序,但是我已经使用python准备好了服务器/客户端代码。

Server.py

import socket
import os
import multiprocessing
from multiprocessing import pool
os.system('sudo python3 relay.py C') #runs relay program and setups up GPIO pins
hostMACAddress = 'B8:27:EB:A3:B6:EB' # The MAC address of a Bluetooth adapter on the server.
backlog = 4
port=3
size = 1024
s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s.bind((hostMACAddress,port))
s.listen(backlog)

def new_client(client):
    while 1:
        data = client.recv(size)
        if data:
            n=data.decode("utf-8")
            if n == 'ON':
                os.system('sudo python3 relay.py ON')
            if n == 'OFF':
                os.system('sudo python3 relay.py OFF')
            if n == 'CLOSE':
                break
            client.send(data)


if __name__ == '__main__':
    client, address = s.accept()
    pool = multiprocessing.Pool(4)
    pool.map(new_client, (client, ))
    pool.close()
    pool.join
    print("Closing socket")
    client.close()
    s.close()

这是我在树莓派上运行的服务器程序。 由于蓝牙与Web套接字编程有点不同,因此我实现了多线程以始终允许4个活动连接(套接字),因此我必须要有创造力才能在任何客户端关闭连接后保持应用程序的运行。 基本上,如果我收到消息ON / OFF,它将依次运行另一个python程序来打开或关闭继电器,如果我收到CLOSE消息,则终止线程。

Client.py

import bluetooth
bd_addr = 'B8:27:EB:A3:B6:EB'
port = 3
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr,port))
print("Connected")
while True:
    try:
        data = input()
        sock.send(data.encode())
        if data == 'CLOSE':
            break
    except KeyboardInterrupt:
        sock.close()

这是我在计算机上运行的客户端程序。 通知,两个代码中的地址相同(我的raspberry pi的MAC地址),因为raspberry pi需要使用蓝牙适配器的地址(如果某些机器具有多个接口),并且客户端需要服务器蓝牙MAC地址以启动套接字连接。您还需要在raspbery pi中配置的端口以在我的情况3中接收连接。

让我知道您是否需要其他信息。 制作实现套接字编程的应用程序会很有趣!