2016-06-27 3 views
0

난에 오류가 있습니다파이썬 : 오류 : (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! –

+0

@KlausD. 임씨는 지식과 경험이 거의없는 새로운 파이썬입니다. 오류를 설명해 주시면 정말 고맙습니다. 고맙습니다. –

+0

오류는 소켓이 명령을 받아 들일 수없는 상태임을 나타냅니다. 이 문제는 대개 이미 닫힌 소켓을 다시 사용하려고 시도하거나 다른 방법으로 닫힌 경우에 발생합니다. –

답변

0

출력이 나타납니다 오류 코드와 함께하는 OSError를보고합니다. 이것은 기본 운영 체제에 의해 제기되기 때문에 파이썬 특정 문제가 아닙니다.

standard library's errno feature을 사용하면 운영 체제의 오류 코드에 대한 정보를 얻을 수 있습니다.

또한 the os.strerror function를 통해 오류 코드에 대한 설명을 요청할 수 있습니다 :

import os 

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

그래서, 당신의 프로그램이하고있는 일이 파일 기술자를 사용합니다 (의 입력/출력 스트림을 나타내는 정수를 만든다 실행중인 프로그램)에 실제로 첨부 된 파일이 없습니다. 운영체제가 불평하고, 파이썬은이를 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

도움 주셔서 감사합니다! 문제를 해결할 수 있었지만 문제를 일으킨 블루투스 동글에 문제가있었습니다. –

+0

당신을 진심으로 환영합니다. 이 답변이 귀하의 질문에 대답한다면, 투표하십시오. 그것이 옳다고 생각되면 대답으로 받아 들여주십시오. – bignose

관련 문제