2016-06-27 20 views
0

Ich habe Fehler bei:Python: Fehler: (9, ‚Bad Dateideskriptors‘)

"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')" 

Ich bin nicht sicher, was die Ursache des Fehlers ist, und ich habe Welche Lösung auch immer versucht, die online verfügbar ist, aber es ergab sich der gleiche Fehler.

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 

Voll Fehler Traceback:

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

Bitte fügen Sie den vollständigen Fehler Zurückverfolgungs auf Ihre Frage! –

+0

@KlausD. Ich bin neu bei Python, mit sehr wenig Wissen und Erfahrung. Ich schätze es sehr, wenn Sie mir den Fehler erklären könnten. Vielen Dank. –

+0

Der Fehler weist darauf hin, dass sich der Socket in einem Zustand befindet, in dem er Ihre Befehle nicht akzeptieren kann. Dies geschieht normalerweise, wenn Sie versuchen, einen bereits geschlossenen Socket erneut zu verwenden, oder er wurde anderweitig geschlossen. –

Antwort

0

Der Ausgang erscheint eine OSError zu berichten, die durch einen Fehlercode begleitet wird. Dies ist kein Python-spezifisches Problem, da es vom zugrunde liegenden Betriebssystem ausgelöst wird.

Sie können die standard library's errno feature verwenden, um Informationen über die Fehlercodes des Betriebssystems zu erhalten.

Sie können auch für die Beschreibung eines Fehlercodes fragen über the os.strerror function:

import os 

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

So etwas Ihr Programm nutzt einen Dateideskriptor zu tun (die ganze Zahl, die einen Eingangs-/Ausgangsstrom in der repräsentiert laufendes Programm), an das keine Datei angehängt ist. Das Betriebssystem beschwert sich und Python meldet dies als OSError.

Sie können the OSError object you catch für seine Fehlercode abfragen (das errno Attribut) und welche Dateiname wurde berichtet (das filename Attribut):

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

Danke für Ihre Hilfe! Haben es geschafft, das Problem zu lösen, war etwas falsch mit dem Bluetooth-Dongle, der das Problem verursacht hat. –

+0

Gern geschehen. Wenn diese Antwort Ihre Frage beantwortet, stimmen Sie bitte ab; Wenn Sie es für richtig halten, akzeptieren Sie es bitte als Antwort. – bignose