4

PCとNokiaE63の間にRFCOMMクライアントサーバー通信システムをセットアップしようとしています。サーバーのセットアップにPythonとPyBluezを使用し、電話でクライアントをプログラムするためにPyS60を使用しています。

ただし、PyBluezは接続を受け入れていません。

サーバーのコードは次のとおりです。

from bluetooth import *

server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

advertise_service( server_sock, "SampleServer",
                   service_id = uuid,
                   service_classes = [ uuid, SERIAL_PORT_CLASS ],
                   profiles = [ SERIAL_PORT_PROFILE ], 
#                   protocols = [ OBEX_UUID ] 
                    )

print "Waiting for connection on RFCOMM channel %d" % port

client_sock, client_info = server_sock.accept()
print "Accepted connection from ", client_info

try:
    while True:
        data = client_sock.recv(1024)
        if len(data) == 0: break
        print "received [%s]" % data
except IOError:
    pass

print "disconnected"

client_sock.close()
server_sock.close()
print "all done"

そしてここにクライアントのコードがあります

#!/usr/bin/env python

import socket

class BTReader:
  def connect(self):
    self.sock=socket.socket(socket.AF_BT, socket.SOCK_STREAM)
    addr, services=socket.bt_discover()
    print "Discovered: %s, %s" % (addr, services)
    port = services[services.keys()[0]]
    print port
    address=(addr,port)
    print "Connecting to", str(address), "..."
    self.sock.connect(address)
    print "OK."
    data = "Hello, World!"
    print "Sending data:", data
    self.sock.send("Hello World!");
    print "SENT."

  def close(self):
    self.sock.close()

def main():
  bt=BTReader()
  bt.connect()
  bt.close()

if __name__ == '__main__':
  main()

両方のプログラムを実行すると、この出力が得られます

1)サーバー(PC):RFCOMMチャネル1での接続を待機しています[そして、そこにとどまります。接続を確認しません。WINPDBを使用して確認しましたが、電話が接続を確立したことを示した後でも、サーバースクリプトはserver_sock.accept()ループに残ります。]

2)クライアント(電話):

Discoverd: xx:xx:xx:xx:xx:xx {u'SampleServer':1}
1
Connecting to ('xx:xx:xx:xx:xx:xx', 1) ...
OK.
Sending data: Hello World!
Traceback (most recent call last):
...
...
File "c;\resource\socket.py" , line 409, in send return self._sock.send(data, f, cb)
error: (0, 'Error')

問題の原因は何ですか?

4

3 に答える 3

2

1年後のことはわかっていますが、別の解決策があります。Debianの特定のバージョン(Raspbianなど)およびおそらく他のいくつかのディストリビューション。server_sock.accept()はデフォルトでハングし、接続を受け入れることはありません-ペアリングされたデバイスからでも!ただし、これに対する解決策は非常に簡単です。/etc/bluetooth/main.confに移動すると、プラグインの無効化と呼ばれる行があります。行を追加するか、次のように変更します。-

 DisablePlugins = pnat

次に、Bluetoothサービスを再起動します。-

 sudo invoke–rc.d bluetooth restart

現在、修正されている可能性があります。

幸運を!

参考:DebianでPyBluezを使用してペアリングせずにRFCOMM?

于 2014-01-29T08:53:52.813 に答える
0

PyBluezライブラリのRfcomm-client.pyの例を読み直す必要があります。BluetoothSocketオブジェクトの代わりにランダムソケットを使用している理由がわかりません...

しかし、それがエラーだと思います。さらなる読者のために詳細に:

クライアントコードを見ると、彼はソケットモジュールをインポートして使用していました。これは、pybluezとは何の関係もなく、間違っています。

ヒントとして、PyBluezライブラリの2つの例(クライアントとサーバー)を機能させてから、アプリケーションを作成してみてください。

于 2012-09-04T12:25:20.130 に答える
0

サーバーがウィンドウを表示し、ユーザーに接続の承認を求める場合があります。Xサーバーなしで実行すると、ダイアログウィンドウが表示されなくなり、接続が拒否されます。(これに過去半日を費やしました... !!!)

于 2013-06-20T07:13:28.297 に答える