昨天晚上,突然接到让我做一个红外通信的小东西,没法子,只好留下来加个班了!当然,首先考虑到的是c#.net,毕竟时间短,想找直接利用它的类不就ok了!可惜啊,捣鼓了半天,发现IrDAClient类只在1。1中支持,而我用的已经是2。0,我只能望而生叹了!当然,既然提到了,就给大家简单说下,以下是来自msdn的代码:
 // Align the infrared ports of the devices.
// Click the Receive button first, then click Send.
private void SendButton_Click(object sender, System.EventArgs e)
{
    IrDAClient irClient = new IrDAClient();
    string irServiceName = "IrDATest";
    IrDADeviceInfo[] irDevices;
    int buffersize = 256;

    // Create a collection of devices to discover.
    irDevices = irClient.DiscoverDevices(2);

    // Show the name of the first device found.
    if ((irDevices.Length == 0))
    {
        MessageBox.Show("No remote infrared devices found.");
        return;
    }
    try
    {
        IrDAEndPoint irEndP =
            new IrDAEndPoint(irDevices[0].DeviceID, irServiceName);
        IrDAListener irListen = new IrDAListener(irEndP);
        irListen.Start();
        irClient = irListen.AcceptIrDAClient();
        MessageBox.Show("Connected!");
    }
    catch (SocketException exSoc)
    {
        MessageBox.Show(("Couldn\'t listen on service "
                        + (irServiceName + (": " + exSoc.ErrorCode))));
    }
   
    // Open a file to send and get its stream.
    Stream fs;
    try
    {
        fs = new FileStream(".\\My Documents\\send.txt", FileMode.Open);
    }
    catch (Exception exFile)
    {
        MessageBox.Show(("Cannot open " + exFile.ToString()));
        return;
    }
   
    // Get the underlying stream of the client.
    Stream baseStream = irClient.GetStream();
   
    // Get the size of the file to send
    // and write its size to the stream.
    byte[] length = BitConverter.GetBytes(fs.Length);
    baseStream.Write(length, 0, length.Length);
   
    // Create a buffer for reading the file.
    byte[] buffer = new byte[buffersize];
    int fileLength = (int) fs.Length;
    try
    {
        // Read the file stream into the base stream.
        while ((fileLength > 0))
        {
            Int64 numRead = fs.Read(buffer, 0, buffer.Length);
            baseStream.Write(buffer, 0, Convert.ToInt32(numRead));
            fileLength = (fileLength - Convert.ToInt32(numRead));
        }
        MessageBox.Show("File sent");
    }
    catch (Exception exSend)
    {
        MessageBox.Show(exSend.Message);
    }
    fs.Close();
    baseStream.Close();
    irClient.Close();
}
而面对这样的问题,我只能一步步慢慢了解,用c++写下啦,关于用c++的代码,我不打算都提,因为我现在用了自己封好的类,弄起来也不少。我就介绍下思想。并且贴出简单的sample。
要实现红外通信的话,内部的原理是通过socket进行通信,当然,如果你要用串口红外设备的话,那还得考虑串口的东西。而用到的是红外自己的协议AF_IRDA。现在就是如何获得红外设备了。DEVICELIST这个结果体是用来存放获取的红外设备的信息的!同时我们用getsockopt来获取这些设备的DEVICELIST。
Sample:
typedef struct _PACKET //接收发送数据包结构   
{
    DWORD       dLength;  //接收发送数据长度
    CHAR        cString[500];//接收数据
} PACKET;
SOCKET c_Socket; //客户端Socket
//IrDA地址
SOCKADDR_IRDA    address = {AF_IRDA, 0, 0, 0, 0, "IrSend"};
      DEVICELIST            dLst;   
    int        dLstLen = sizeof(dLst),num = 0,i=0;
    c_Socket = socket(AF_IRDA, SOCK_STREAM, 0);
    dLst.numDevice = 0;   
    PACKET         Packet;
    //试6次,以便找到服务器端SOCKET
    while ((dLst.numDevice == 0) && (num <= 6))   
        {
        getsockopt(c_Socket, SOL_IRLMP, IRLMP_ENUMDEVICES,
                   (char *)&dLst, &dLstLen);       
          if (dLst.numDevice!=0) break;
        num++;
        Sleep(600);
        }
    if  (num > 6)
        return ;
    else //找到服务器端SOCKET
        {
        for (i = 0; i <= 3; i++)            
            address.irdaDeviceID[i]=dLst.Device[0].irdaDeviceID[i];
        //连结服务器端SOCKET
        connect(c_Socket , (struct sockaddr *)&address,
            sizeof(SOCKADDR_IRDA));
        memset(Packet.cString,0,sizeof(Packet.cString));
        Packet.dLength = len;
        memcpy( Packet.cString, Buffer, len);
        //发送数据
        send(c_Socket,(CHAR FAR *)&Packet,len+sizeof(DWORD), 0 );
        closesocket(c_Socket);   
           }
   return ;
以上便是我的理解,如果有什么不对,请指教。

posted on 2008-02-26 10:50  MRChen  阅读(415)  评论(1编辑  收藏  举报