2016-06-27 21 views
0

は私がでエラーが発生している:Pythonの:エラー:(9、「不正なファイルディスクリプタ」)

"File "/home/pi/blescan.py", line 78, in hci_le_set_scan_parameters 
    old_filter = sock.getsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, 14) 

error: (9, 'Bad file descriptor')" 

私は、エラーの原因が何であるかわからない、と私はオンラインで利用可能であるものは何でも解決策を試してみました、同じエラーが発生しました。

DEBUG = False 

import os 
import sys 
import struct 
import bluetooth._bluetooth as bluez 
from time import gmtime, strftime 


LE_META_EVENT = 0x3e 
LE_PUBLIC_ADDRESS=0x00 
LE_RANDOM_ADDRESS=0x01 
LE_SET_SCAN_PARAMETERS_CP_SIZE=7 
OGF_LE_CTL=0x08 
OCF_LE_SET_SCAN_PARAMETERS=0x000B 
OCF_LE_SET_SCAN_ENABLE=0x000C 
OCF_LE_CREATE_CONN=0x000D 

LE_ROLE_MASTER = 0x00 
LE_ROLE_SLAVE = 0x01 

# these are actually subevents of LE_META_EVENT 
EVT_LE_CONN_COMPLETE=0x01 
EVT_LE_ADVERTISING_REPORT=0x02 
EVT_LE_CONN_UPDATE_COMPLETE=0x03 
EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE=0x04 

# Advertisment event types 
ADV_IND=0x00 
ADV_DIRECT_IND=0x01 
ADV_SCAN_IND=0x02 
ADV_NONCONN_IND=0x03 
ADV_SCAN_RSP=0x04 


def returnnumberpacket(pkt): 
    myInteger = 0 
    multiple = 256 
    for c in pkt: 
     myInteger += struct.unpack("B",c)[0] * multiple 
     multiple = 1 
    return myInteger 

def returnstringpacket(pkt): 
    myString = ""; 
    for c in pkt: 
     myString += "%02x" %struct.unpack("B",c)[0] 
    return myString 

def printpacket(pkt): 
    for c in pkt: 
     sys.stdout.write("%02x " % struct.unpack("B",c)[0]) 

def get_packed_bdaddr(bdaddr_string): 
    packable_addr = [] 
    addr = bdaddr_string.split(':') 
    addr.reverse() 
    for b in addr: 
     packable_addr.append(int(b, 16)) 
    return struct.pack("<BBBBBB", *packable_addr) 

def packed_bdaddr_to_string(bdaddr_packed): 
    return ':'.join('%02x'%i for i in struct.unpack("<BBBBBB",bdaddr_packed[::-1])) 

def hci_enable_le_scan(sock): 
    hci_toggle_le_scan(sock, 0x01) 

def hci_disable_le_scan(sock): 
    hci_toggle_le_scan(sock, 0x00) 

def hci_toggle_le_scan(sock, enable): 
    cmd_pkt = struct.pack("<BB", enable, 0x00) 
    bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE, cmd_pkt) 


def hci_le_set_scan_parameters(sock): 
    old_filter = sock.getsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, 14) 



    SCAN_RANDOM = 0x01 
    OWN_TYPE = SCAN_RANDOM 
    SCAN_TYPE = 0x01 


def parse_events(sock, loop_count=100): 
    old_filter = sock.getsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, 14) 

    CurrentTime = strftime("%H:%M,%S", gmtime()) 
    flt = bluez.hci_filter_new() 
    bluez.hci_filter_all_events(flt) 
    bluez.hci_filter_set_ptype(flt, bluez.HCI_EVENT_PKT) 
    sock.setsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, flt) 
    done = False 
    results = [] 
    myFullList = [] 
    for i in range(0, loop_count): 
     pkt = sock.recv(255) 
     ptype, event, plen = struct.unpack("BBB", pkt[:3]) 
     #print "--------------" 
     if event == bluez.EVT_INQUIRY_RESULT_WITH_RSSI: 
       i =0 
     elif event == bluez.EVT_NUM_COMP_PKTS: 
       i =0 
     elif event == bluez.EVT_DISCONN_COMPLETE: 
       i =0 
     elif event == LE_META_EVENT: 
      subevent, = struct.unpack("B", pkt[3]) 
      pkt = pkt[4:] 
      if subevent == EVT_LE_CONN_COMPLETE: 
       le_handle_connection_complete(pkt) 
      elif subevent == EVT_LE_ADVERTISING_REPORT: 
       #print "advertising report" 
       num_reports = struct.unpack("B", pkt[0])[0] 
       report_pkt_offset = 0 
       for i in range(0, num_reports): 

        if (DEBUS == True): 
         print "-------------" 
         print "\tMAC address: ",  packed_bdaddr_to_string(pkt[report_pkt_offset + 3:report_pkt_offset + 9]) 
         TxPower, = struct.unpack("b", pkt[report_pkt_offset -2]) 
         print "\tTxpower:", -TxPower 
         rssi, = struct.unpack("b", pkt[report_pkt_offset -1]) 
         print "\tRSSI:", rssi 
         print "\tTime:", CurrentTime 
        # build the return string 
        Adstring = packed_bdaddr_to_string(pkt[report_pkt_offset + 3:report_pkt_offset + 9]) 
        Adstring += "," 
        Adstring += returnstringpacket(pkt[report_pkt_offset -22: report_pkt_offset - 6]) 
        Adstring += "," 
        Adstring += "%i" % returnnumberpacket(pkt[report_pkt_offset -6: report_pkt_offset - 4]) 
        Adstring += "," 
        Adstring += "%i" % returnnumberpacket(pkt[report_pkt_offset -4: report_pkt_offset - 2]) 
        Adstring += "," 
        Adstring += "%i" % struct.unpack("b", pkt[report_pkt_offset -2]) 
        Adstring += "," 
        Adstring += "%i" % struct.unpack("b", pkt[report_pkt_offset -1]) 
        #print "\tAdstring=", Adstring 
        myFullList.append(Adstring) 
       done = True 
    sock.setsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, old_filter) 
    return myFullList 

完全なトレースバックエラー:

Traceback (most recent call last): 
    File "/home/pi/blescan.py", line 79, in hci_le_set_scan_parameters 
    old_filter = socket.getsockopt(bluez.SOL_HCI, bluez.HCI_FILTER, 14) 
error: (9, 'Bad file descriptor') 

Traceback (most recent call last): 
    File "/home/pi/testblescan.py", line 15, in <module> 
    blescan.hci_enable_le_scan(socket) 
    File "/home/pi/blescan.py", line 67, in hci_enable_le_scan 
    hci_toggle_le_scan(socket, 0x01) 
    File "/home/pi/blescan.py", line 74, in hci_toggle_le_scan 
    bluez.hci_send_cmd(socket, OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE, cmd_pkt) 
error: (9, 'Bad file descriptor') 
+0

あなたの質問に完全なエラー・トレースバックを追加してください:そのエラーコード(errno属性)と報告されたものをファイル名(filename属性)のための

あなたが調べることができますthe OSError object you catch! @KlausD。 –

+0

私は非常に知識と経験をほとんど持っていません。あなたが私にエラーを説明できるかどうか本当に感謝します。ありがとうございました。 –

+0

エラーは、ソケットがコマンドを受け入れることができない状態にあることを示します。これは通常、すでに閉じられているソケットを再利用しようとするか、そうでなければ閉じられたときに発生します。 –

答えて

0

出力は、エラーコードが付属してOSErrorのを報告しているように見えます。これはPython固有の問題ではありません。なぜなら、それは基礎をなすオペレーティングシステムによって引き起こされているからです。

standard library's errno featureを使用すると、オペレーティングシステムのエラーコードに関する情報を取得できます。

あなたはまた、the os.strerror functionを経由して、エラーコードの説明を求めることができます:

import os 

os.strerror(9) # Returns the text value “Bad file descriptor”. 

だから、あなたのプログラムがやっている何かがファイルディスクリプタの使用(入力/出力ストリームを表す整数を作ります実行中のプログラム)には実際にファイルが添付されていません。オペレーティングシステムは不平を言って、PythonはそれをOSErrorとして報告します。

try: 
    do_the_thing() 
except OSError as exc: 
    logger_for_this_program(
      "Got OSError (code {exc.errno:d}, filename {exc.filename})".format(
       exc=exc)) 
+0

助けてくれてありがとう!問題の解決に成功したが、問題の原因となったBluetoothドングルに問題があった。 –

+0

ようこそ。この回答があなたの質問に答えるなら、それを投票してください。それが正しいと思うなら、答えとしてそれを受け入れてください。 – bignose

関連する問題