C#开发一个蓝牙通讯程序,实现在windows端查找周围的蓝牙设备,并将windows端上的文件通过蓝牙传输到手机上。目前采用的是OpenNETCF.Net.Bluetooth类库,能正常发现周围的蓝牙设备,手机也能够正常进行蓝牙连接并接收文件。

查找周围蓝牙设备

BluetoothClient bc = new BluetoothClient();
BluetoothDeviceInfo[] bdi;
bdi = bc.DiscoverDevices(10);//查找周围最多10个蓝牙设备
if (bdi.Length == 0)
{
    this.ShowErrMsg("请确认您的蓝牙已开启!");
    return;
}

打开数据流

public bool OBEXOpenStream(string BTMAC) 
{
    // serial port UUID
    Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;
    OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);
    client = new OpenNETCF.Net.Sockets.BluetoothClient();
    // define endpoint
    OpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);
    try 
    {
        //open socket
        client.Connect(endpoint);
    }
    catch 
    {
        //unable to connect (server not listening on spguid)
        return false;
    }
    //connect socket
    stream = client.GetStream();
    return true;
}

配对连接

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;
    }
}

发送文本内容

//send client request, start put
string tName = "text.txt";
string tType = "";
string tFileContent = "测试:" + this.txtContent.Text.Trim();
int result = OBEXRequest("PUT", tName, tType, tFileContent);
if (result == 160) 
{
    SendSuccess = true;
}

全部代码

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net.Sockets;
using OpenNETCF;
using OpenNETCF.Net;
using OpenNETCF.Net.Bluetooth;
using OpenNETCF.Net.Sockets;
public partial class _Default : System.Web.UI.Page 
{
    //Stream stream;
    NetworkStream stream;
    OpenNETCF.Net.Sockets.BluetoothClient client;
    protected void Page_Load(object sender, EventArgs e) 
    {
    }
    #region ShowErrMsg
        private void ShowErrMsg(string err) 
    {
        string str;
        str = "<script language='javascript'>";
        str += " alert('" + err + "')";
        str += "</script>";
        this.RegisterStartupScript("", str);
    }
    #endregion
        protected void btnSend_Click(object sender, EventArgs e) 
    {
        if (this.txtContent.Text.Trim() == string.Empty) 
        {
            this.ShowErrMsg("请输入发送内容!");
            return;
        }
        BluetoothClient bc = new BluetoothClient();
        BluetoothDeviceInfo[] bdi;
        bdi = bc.DiscoverDevices(10);
        //查找周围最多10个蓝牙设备
        if (bdi.Length == 0) 
        {
            this.ShowErrMsg("请确认您的蓝牙已开启!");
            return;
        }
        bool SendSuccess = false;
        try 
        {
            foreach (BluetoothDeviceInfo bd in bdi) 
            {
                if (OBEXOpenStream(bd.DeviceID.ToString())) 
                {
                    if (OBEXConnect()) 
                    {
                        //send client request, start put
                        string tName = "BRT优惠卷.txt";
                        string tType = "";
                        string tFileContent = "优惠卷内容:" + this.txtContent.Text.Trim();
                        int result = OBEXRequest("PUT", tName, tType, tFileContent);
                        if (result == 160) 
                        {
                            SendSuccess = true;
                        }
                    }
                    OBEXCloseStream();
                } else 
                {
                    this.ShowErrMsg("连接失败!" + bd.DeviceName.ToString());
                }
            }
            if (SendSuccess) 
            {
                this.ShowErrMsg("发送成功,谢谢使用!");
            }
        }
        finally 
        {
            OBEXCloseStream();
        }
    }
    #region OBEXOpenStream
        public bool OBEXOpenStream(string BTMAC) 
    {
        // serial port UUID
        Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;
        OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);
        client = new OpenNETCF.Net.Sockets.BluetoothClient();
        // define endpoint
        OpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);
        try 
        {
            //open socket
            client.Connect(endpoint);
        }
        catch 
        {
            //unable to connect (server not listening on spguid)
            return false;
        }
        //connect socket
        stream = client.GetStream();
        return true;
    }
    #endregion
        #region OBEXCloseStream
        private void OBEXCloseStream() 
    {
        if (stream != null) 
        {
            stream.Close();
        }
        if (client != null) 
        {
            client.Close();
        }
    }
    #endregion
        #region  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;
        }
    }
    #endregion
        #region 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:VCARDrnVERSION:2.1rnN:;aardvarkrnFN:aardvarkrnEND:VCARDrn";
        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 = System.Text.Encoding.Default.GetBytes(tFileContent).Length;
        //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+nn 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(tFileContent.Substring(i, 1));//Convert.ToByte(Convert.ToChar(tFileContent.Substring(i, 1)));
        //}
        byte[] bfile = System.Text.Encoding.Default.GetBytes(tFileContent);
        for (i = 0; i <= bfile.Length - 1; i++) 
        {
            tSendbyte[offset + 4 + i] = bfile[i];
        }
        //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;
    }
    #endregion
}
最后修改:2022 年 06 月 17 日 10 : 19 AM
如果觉得我的文章对你有用,请随意赞赏