Проблема с WiFi подключением в rx1950

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
basilmak
Новенький (0 lvl)
Сообщения: 17
Зарегистрирован: Ср июн 04, 2003 15:03

Проблема с WiFi подключением в rx1950

Сообщение basilmak » Вт июн 26, 2007 12:12

rx1950 применяем для системы сбора информации. Хотели из него в нужные нам моменты брать инфу по WiFi. Выяснили, убив 2 дня, что rx1950 стабильно перестает пинговаться в WiFi сети минут через 15, если не загружен трафиком по самые уши. Как из своей проги на C# переподключить WiFi соединение, ткните плиз куда капать... Или как это вылечить (есть в Инете инфа, что это типа в эконом режим WiFi адаптеры КПК уходят, но в этом никаких "галок" как отучить нет...)

basilmak
Новенький (0 lvl)
Сообщения: 17
Зарегистрирован: Ср июн 04, 2003 15:03

Сообщение basilmak » Ср июн 27, 2007 11:41

Поддержка HP подтвердила - в WM2003 была галочка, в WM 5.0 её нет - WiFi засыпает и отключить это штатно средств нет (сам КПК то на БП и не засыпает).
У кого какие умные мысли в помощь будут? Из опыта
1) если КПК "теребить" (экран трогать например), то WiFi не засыпает. Как имитировать активность юсера программно? Можно в C# событие генерировать типа "касание экрана..." и нажатие кнопок?
2) Если непрерывно пинговать КПК с другого компа - тоже WiFi не отключается (но в нашем случае другого компа штатно нет)
3) Изнутри КПК нашли как пинговать ( в Self Test) - как его из C# вызывать для пингования (или пинговать из C#) никто не подскажет??????

Ginger
Кандидат (3 lvl)
Сообщения: 151
Зарегистрирован: Вс июл 20, 2003 11:03

Сообщение Ginger » Ср июн 27, 2007 13:29

1. У чистого WinAPI есть функция SendInput. Она синтезирует команды с клавиатуры или мыши, но в платформе .Net я похожего не нашел. Но я не пишу под .net, по-этому не буду точно утверждать, что нет. Хотя предполагаю с 80% вероятностью, что такой команды нет.

2. Нечего сказать, коль компа второго нет =)

3. Вот тебе пример пинга на C#. Довольно простой, но все вроде правильно. Если что-то не будет получаться, поищи в гугле исходники - их дофига. Есть более навороченные, с обратной связью и тд и тп.
Маленькое замечание по поводу еще карты. Сделай на WiFi-ном соединении IP адрес вроде 192.168.0.200 и пингуй этот адрес. Потому как некоторые реализации IP-стека врубаются, что 127.0.0.1 или localhost это он же, и не лезут до физического уровня.

Код: Выделить всё

/*
C# Network Programming 
by Richard Blum

Publisher: Sybex 
ISBN: 0782141765
*/
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SimplePing
{
   public static void Main(string[] argv)
   {
      byte[] data = new byte[1024];
      int recv;
      Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw,
                 ProtocolType.Icmp);
      IPEndPoint iep = new IPEndPoint(IPAddress.Parse(argv[0]), 0);
      EndPoint ep = (EndPoint)iep;
      ICMP packet = new ICMP();

      packet.Type = 0x08;
      packet.Code = 0x00;
      packet.Checksum = 0;
      Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2);
      Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2);
      data = Encoding.ASCII.GetBytes("test packet");
      Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);
      packet.MessageSize = data.Length + 4;
      int packetsize = packet.MessageSize + 4;

      UInt16 chcksum = packet.getChecksum();
      packet.Checksum = chcksum;

      host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);
      host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);
      try
      {
         data = new byte[1024];
         recv = host.ReceiveFrom(data, ref ep);
      } catch (SocketException)
      {
         Console.WriteLine("No response from remote host");
         return;
      }
      ICMP response = new ICMP(data, recv);
      Console.WriteLine("response from: {0}", ep.ToString());
      Console.WriteLine("  Type {0}", response.Type);
      Console.WriteLine("  Code: {0}", response.Code);
      int Identifier = BitConverter.ToInt16(response.Message, 0);
      int Sequence = BitConverter.ToInt16(response.Message, 2);
      Console.WriteLine("  Identifier: {0}", Identifier);
      Console.WriteLine("  Sequence: {0}", Sequence);
      string stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4);
      Console.WriteLine("  data: {0}", stringData);
      
      host.Close();
   }
}

class ICMP
{
   public byte Type;
   public byte Code;
   public UInt16 Checksum;
   public int MessageSize;
   public byte[] Message = new byte[1024];

   public ICMP()
   {
   }

   public ICMP(byte[] data, int size)
   {
      Type = data[20];
      Code = data[21];
      Checksum = BitConverter.ToUInt16(data, 22);
      MessageSize = size - 24;
      Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
   }

   public byte[] getBytes()
   {
      byte[] data = new byte[MessageSize + 9];
      Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
      Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
      Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
      Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
      return data;
   }

   public UInt16 getChecksum()
   {
      UInt32 chcksm = 0;
      byte[] data = getBytes();
      int packetsize = MessageSize + 8;
      int index = 0;

      while ( index < packetsize)
      {
         chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
         index += 2;
      }
      chcksm = (chcksm >> 16) + (chcksm & 0xffff);
      chcksm += (chcksm >> 16);
      return (UInt16)(~chcksm);
   }
}

basilmak
Новенький (0 lvl)
Сообщения: 17
Зарегистрирован: Ср июн 04, 2003 15:03

Сообщение basilmak » Ср июн 27, 2007 21:30

Спасибо! Копаю дальше...

basilmak
Новенький (0 lvl)
Сообщения: 17
Зарегистрирован: Ср июн 04, 2003 15:03

Сообщение basilmak » Чт июн 28, 2007 12:31

текст пинга в XP идёт, в КПК валится по ходу выполнения на строке

host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

Буду признателен, если ткнёт на исходник заведомо работающий в WM 5.0. Нагуглил их, разбираюсь, но время поджимает...

Ginger
Кандидат (3 lvl)
Сообщения: 151
Зарегистрирован: Вс июл 20, 2003 11:03

Сообщение Ginger » Чт июн 28, 2007 15:59

К сожалению, нет девайса с Wi-Fi. Конкретней помочь не могу.
Могу только предложить тоже самое,используя чистый с++ без CF.
Но это уже дело вкуса =)

Закрыто

Вернуться в «Программирование для КПК»