Отключить или включить телефон радио в Windows Mobile 6.5.3

1

Я хотел бы включить или отключить телефонную радиостанцию в зонах с низкой связностью. Можно ли сделать это? Я использую motorola ES400 для разработки.

  • 0
    Помимо ответа ниже, другой вариант - использовать SDK устройства производителя (который Moto называет своим EMDK).
Теги:
compact-framework
windows-mobile
.net-cf-3.5
windows-mobile-6.5

3 ответа

1
Лучший ответ

Вам нужно P/Invoke GetDeviceList и ChangeRadioState из ossvcs.dll. Код, который на самом деле делает это, немного длинный для сообщения SO, поэтому я оставлю его вам, чтобы все получилось - это не очень сложно (там есть какой-то C-код, и там есть код С# на CodeProject, даже я Я не использовал его так YMMV).

Другой альтернативой является использование класса Radios в SDF, который уже завершен.

2

Во-первых: Импортируйте эти DLL

    [DllImport("ossvcs.dll", EntryPoint = "#276", CharSet = CharSet.Unicode)]
    private static extern uint GetWirelessDevice(ref IntPtr pDevice, int pDevVal);

    [DllImport("ossvcs.dll", EntryPoint = "#273", CharSet = CharSet.Unicode)]
    private static extern uint ChangeRadioState(ref RDD pDevice, int dwState, int saveAction);

    [DllImport("ossvcs.dll", EntryPoint = "#280", CharSet = CharSet.Unicode)]
    private static extern uint FreeDeviceList(IntPtr pDevice);

И вот копия кода, который я использую для Motorola MC65, который должен работать и для вас.

    [StructLayout(LayoutKind.Auto)]
    struct RADIODEVSTATE
    {
        public const int RADIODEVICES_ON = 1;
        public const int RADIODEVICES_OFF = 0;
    }

    /*
    typedef enum _RADIODEVTYPE
    {
        RADIODEVICES_MANAGED = 1,
        RADIODEVICES_PHONE,
        RADIODEVICES_BLUETOOTH,
    } RADIODEVTYPE;
     */
    [StructLayout(LayoutKind.Auto, CharSet = CharSet.Unicode)]
    struct RADIODEVTYPE
    {
        public const int RADIODEVICES_MANAGED = 1;
        public const int RADIODEVICES_PHONE = 2;
        public const int RADIODEVICES_BLUETOOTH = 3;
    }

    /*
    typedef enum _SAVEACTION
    {
        RADIODEVICES_DONT_SAVE = 0,
        RADIODEVICES_PRE_SAVE,
        RADIODEVICES_POST_SAVE,
    } SAVEACTION;
     */
    [StructLayout(LayoutKind.Auto, CharSet = CharSet.Unicode)]
    struct SAVEACTION
    {
        public const int RADIODEVICES_DONT_SAVE = 0;
        public const int RADIODEVICES_PRE_SAVE = 1;
        public const int RADIODEVICES_POST_SAVE = 2;
    }

    /*
    struct RDD 
    {
        RDD() : pszDeviceName(NULL), pNext(NULL), pszDisplayName(NULL) {}
        ~RDD() { LocalFree(pszDeviceName); LocalFree(pszDisplayName); }
        LPTSTR   pszDeviceName;  // Device name for registry setting.
        LPTSTR   pszDisplayName; // Name to show the world
        DWORD    dwState;        // ON/off/[Discoverable for BT]
        DWORD    dwDesired;      // desired state - used for setting registry etc.
        RADIODEVTYPE    DeviceType;         // Managed, phone, BT etc.
        RDD * pNext;    // Next device in list
    }; //radio device details
     */
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct RDD
    {
        [MarshalAs(UnmanagedType.LPTStr)]
        public string pszDeviceName;

        [MarshalAs(UnmanagedType.LPTStr)]
        public string pszDisplayName;

        public uint dwState;
        public uint dwDesired;
        public int DeviceType;
        public IntPtr pNext;
    }


    private static bool SetDeviceState(int dwDevice, int dwState)
    {
        var pDevice = new IntPtr(0);

        //Get the first wireless device
        var result = GetWirelessDevice(ref pDevice, 0);

        if (result != 0)
            return false;

            //While we're still looking at wireless devices
            while (pDevice != IntPtr.Zero)
            {
                //Marshall the pointer into a C# structure
                var device = (RDD)System.Runtime.InteropServices.Marshal.PtrToStructure(pDevice, typeof(RDD));

                //If this device is the device we're looking for
                if (device.DeviceType == dwDevice)
                {
                    //Change the state of the radio
                    result = ChangeRadioState(ref device, dwState, SAVEACTION.RADIODEVICES_PRE_SAVE);
                }

                //Set the pointer to the next device in the linked list
                pDevice = device.pNext;
            }

            //Free the list of devices
            FreeDeviceList(pDevice);

        //Turning off radios doesn't correctly report the status, so return true anyway.
        return result == 0 || dwState == RADIODEVSTATE.RADIODEVICES_OFF;
    }

И, чтобы отключить телефон, просто вызовите следующий метод:

    /// <summary>
    /// Disables the phone radio on device
    /// </summary>
    public void DisablePhoneRadio()
    {
            SetDeviceState(RADIODEVTYPE.RADIODEVICES_PHONE, RADIODEVSTATE.RADIODEVICES_OFF);
    }

Поэтому просто используйте любые условные операторы и вызовите DisablePhoneRadio(), когда вам нужно его отключить, а при включении телефонного радио просто отскакивает RADIODEVSTATE.RADIODEVICES_OFF с RADIODEVSTATE.RADIODEVICES_ON так:

    /// <summary>
    /// Enables the phone radio on device
    /// </summary>
    public void EnablePhoneRadio()
    {
            SetDeviceState(RADIODEVTYPE.RADIODEVICES_PHONE, RADIODEVSTATE.RADIODEVICES_ON);
    }

Надеюсь это поможет!

0

Проверьте эту тему. Интересный подход к потоковым вызовам и мониторинг состояния подключения к устройству и включение и выключение сотового радио на мобильных устройствах Windows Mobile.

http://www.codeproject.com/Messages/4117749/Re-Csharp-Wrapper.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню