1

我有一个 OBEXConnect 和 OBEXRequest 自定义函数,我没有使用它的库 OBEXConnect 函数如下

    private bool OBEXConnect()
    {
        //send client request
        byte[] ConnectPacket = new byte[7];

        ConnectPacket[0] = 0x80;            // Connect
        ConnectPacket[1] = 0x00;            // Packetlength Hi Byte
        ConnectPacket[2] = 0x07;            // Packetlength Lo Byte
        ConnectPacket[3] = 0x10;            // Obex v1
        ConnectPacket[4] = 0x00;            // no flags
        ConnectPacket[5] = 0x20;            // 8k max packet size Hi Byte
        ConnectPacket[6] = 0x00;            // 8k max packet size Lo Byte

        stream.Write(ConnectPacket,0,ConnectPacket.Length);

        //listen for server response
        byte[] ReceiveBufferA = new byte[3];
        stream.Read(ReceiveBufferA,0,3);

        if (ReceiveBufferA[0] == 160) // 0xa0
        { 

            //success, decode rest of packet
            int plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is...

            //listen for rest of packet
            byte[] ReceiveBufferB = new byte[plength-3];
            stream.Read(ReceiveBufferB,0,plength-3);

            int obver = ReceiveBufferB[0]; //server obex version (16 = v1.0)
            int cflags = ReceiveBufferB[1]; //connect flags
            int maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet size

            return true;
        } 
        else
        {
            return false;
        }
    }

这是 OBEXRequest 函数

private int OBEXRequest(string tReqType, string tName, string tType, string tFileContent)
    {
        //send client request

        int i;
        int offset;
        int packetsize;
        byte reqtype = 0x82;

        int tTypeLen = 0x03;
        int typeheadsize;
        int typesizeHi = 0x00;
        int typesizeLo = 0x03;

        //tName = "contact.vcf";
        //tType = "text/x-vCard";
        //tFileContent = "BEGIN:VCARD\r\nVERSION:2.1\r\nN:;aardvark\r\nFN:aardvark\r\nEND:VCARD\r\n";

        if (tReqType == "GET")
        {
            reqtype = 0x83;         // 131 GET-Final
        }

        if (tReqType == "PUT")
        {
            reqtype = 0x82;         // 130 PUT-Final
        }

        packetsize = 3;

        //Name Header
        int tNameLength = tName.Length;
        int nameheadsize = (3 + (tNameLength*2) + 2); 
        int namesizeHi = (nameheadsize & 0xff00)/0xff;
        int namesizeLo = nameheadsize & 0x00ff;
        packetsize = packetsize + nameheadsize;

        if (tType != "") 
        {
            //Type Header
            tTypeLen = tType.Length;
            typeheadsize = 3 + tTypeLen + 1;
            typesizeHi = (typeheadsize & 0xff00)/0xff;
            typesizeLo = typeheadsize & 0x00ff;
            packetsize = packetsize + typeheadsize;
        }

        //Body
        int fileLen = tFileContent.Length;
        int fileheadsize = 3 + fileLen ;
        int filesizeHi = (fileheadsize & 0xff00)/0xff;;
        int filesizeLo = fileheadsize & 0x00ff;;

        packetsize = packetsize + fileheadsize;

        int packetsizeHi = (packetsize & 0xff00)/0xff;
        int packetsizeLo = packetsize & 0x00ff;

        byte[] tSendByte = new byte[packetsize];

        //PUT-final Header
        tSendByte[0] = reqtype;                                     // Request type e.g. PUT-final 130
        tSendByte[1] = Convert.ToByte(packetsizeHi);                // Packetlength Hi
        tSendByte[2] = Convert.ToByte(packetsizeLo);                // Packetlength Lo

        offset = 2;

        //Name Header
        tSendByte[offset+1] = 0x01;                                 // HI for Name header       
        tSendByte[offset+2] = Convert.ToByte(namesizeHi);           // Length of Name header (2 bytes per char)
        tSendByte[offset+3] = Convert.ToByte(namesizeLo);           // Length of Name header (2 bytes per char)

        // Name+\n\n in unicode
        byte[] tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName);
        tNameU.CopyTo(tSendByte,offset+4);

        offset = offset + 3 + (tNameLength*2);
        tSendByte[offset+1] = 0x00;                                 // null term
        tSendByte[offset+2] = 0x00;                                 // null term

        offset = offset + 2;

        if (tType != "") 
        {
            //Type Header
            tSendByte[offset+1] = 0x42;                                 // HI for Type Header 66
            tSendByte[offset+2] = Convert.ToByte(typesizeHi);           // Length of Type Header
            tSendByte[offset+3] = Convert.ToByte(typesizeLo);           // Length of Type Header

            for (i=0;i<=(tTypeLen-1);i++) 
            {
                tSendByte[offset+4+i] = Convert.ToByte(Convert.ToChar(tType.Substring(i,1)));
            }
            tSendByte[offset+3+tTypeLen+1] = 0x00;                      // null terminator

            offset = offset+3+tTypeLen+1;
        }

        //Body
        tSendByte[offset+1] = 0x49;                                 //HI End of Body 73
        tSendByte[offset+2] = Convert.ToByte(filesizeHi);           //
        tSendByte[offset+3] = Convert.ToByte(filesizeLo);           //1k payload + 3 for HI header

        for (i=0;i<=(fileLen-1);i++) 
        {
            tSendByte[offset+4+i] = Convert.ToByte(Convert.ToChar(tFileContent.Substring(i,1)));
        }
        //tSendByte[offset+4+fileLen] = 0x00;                           // null terminator

        offset = offset+3+fileLen;

        stream.Write(tSendByte,0,tSendByte.Length );

        //listen for server response

        //TODO: can hang here forever waiting response...

        bool x = stream.DataAvailable; // changed bluetoothclient - public NetworkStream GetStream()

        byte[] tArray4 = new byte[3];
        stream.Read(tArray4,0,3);

        x = stream.DataAvailable;

        if (tArray4[0] == 160) // 0xa0
        {
            int plength = (tArray4[1] * 256) + tArray4[2] - 3;
            byte[] tArray5 = new byte[plength];
            if (plength >0) 
            {
                stream.Read(tArray5,0,plength);
                //TODO: data in returned packet to deal with
            }
            return 160;
        }

        if (tArray4[0] == 197) // 0xc5 Method not allowed
        {
            return 197;
        }

        if (tArray4[0] == 192) // 0xc0 Bad Request
        {
            return 192;
        }

        return 0;
    }

我想阅读手机的电话簿,但我没有成功但我尝试了一部三星手机它给出了错误错误请求我遵循上述解决方案但是当 name = null 然后 obexrequest 函数给出错误

当我在华为手机上尝试它时,它给出了未知错误

我也尝试了这段代码,它抛出了这个方法没有实现的错误

在 c# 中使用 obex 读取联系人

我这样称呼这些函数

            string tName = "";
            string tType = "text/x-vCard";
            string tFileContent = "";

            int result = OBEXRequest("GET",tName,tType,tFileContent);

            switch (result)
            {
                case 160: // 0xa0
                    addtolog("OK");
                    break;

                case 197: // 0xc5
                    addtolog("Method not allowed");
                    break;

                case 192: // 0xc0
                    addtolog("Bad Request");
                    break;

                default:
                    addtolog("Other Error");
                    break;
            }

任何人都可以指出我的错误吗

4

0 回答 0