0

我知道类似的问题被问了很多,即“我可以从我的 wp8 打印吗?”。大多数人似乎满足于简单的“不”回应。我希望将此功能添加到我的应用程序中,并且我知道它可以在某种程度上实现 - 即使我现在只能支持非常小的打印机集。

我查看了应用程序PrintHand,它似乎具有我需要的功能:打印到无线和蓝牙打印机。

我一直在浏览蓝牙场景文档,我认为这可能有助于发现蓝牙打印机。这是一个开始。也许它也有助于识别无线打印机。

我意识到我需要从非常小的项目开始,我想首先尝试枚举当前网络上可用的任何无线打印机(我还没有蓝牙)。是否有人碰巧有一个关于如何开始或更好的正确方向的指针,一些相关的示例代码?

非常感谢!

4

2 回答 2

1

我能提供的最好的是我的 Github Repo,它与 Wifi 打印机无关,但与 Google 云打印无关。

在他们的文档中并没有真正使用 Google Cloud Print 的 .net 参考,但代码在 Mono 中工作,并且应该很容易转移到 .NET 和 Windows Phone。

MonoGCP

于 2013-09-09T17:50:31.797 回答
1

我能够使用简单服务发现协议检测到附近的无线打印机。

这是我的示例函数:

private const string SSDP_IP = "239.255.255.250";
private const string SSDP_PORT = "1900";

public async static void DiscoverAsync2()
{       
    var multicastIP = new HostName(SSDP_IP);
    var found = false;

    using (var socket = new DatagramSocket())
    {
        socket.MessageReceived += (sender, e) =>
        {
            var reader = e.GetDataReader();
            var bytesRemaining = reader.UnconsumedBufferLength;
            var receivedString = reader.ReadString(bytesRemaining);

            // TODO: something useful with this new info

            found = true;
        };

        await socket.BindEndpointAsync(null, string.Empty);
        socket.JoinMulticastGroup(multicastIP);

        while (true)
        { 
            found = false;

            using (var stream = await socket.GetOutputStreamAsync(multicastIP, SSDP_PORT))
            {
                var request = new StringBuilder();
                request.AppendLine("M-SEARCH * HTTP/1.1");
                request.AppendLine("HOST: " + SSDP_IP + ":" + SSDP_PORT);
                request.AppendLine("MAN: \"ssdp:discover\"");
                request.AppendLine("MX: 3");
                request.AppendLine("ST: urn:schemas-upnp-org:device:Printer:1"); // use ssdp:all to get everything
                request.AppendLine(); // without this extra blank line, query won't run properly
                var buff = Encoding.UTF8.GetBytes(request.ToString());

                await stream.WriteAsync(buff.AsBuffer());

                await Task.Delay(5000);

                if (!found)
                    break;
            }
        }
    }
于 2013-09-18T19:38:20.740 回答