【问题标题】:Send a stream of data from WatchKit从 WatchKit 发送数据流
【发布时间】:2015-10-26 19:13:34
【问题描述】:

对于我在 Apple Watch 上做的一个项目,我正在寻找一种将数据流发送到本地网络上的服务器的方法。这是快速的在线数据,所以我更喜欢通过 UDP 发送(但这对我来说不是严格要求)。数据是手表当前的加速度计读数,每分每秒读取一次。

我正在使用 WatchOS 2(Beta 4)、iOS 9(Beta 4)(以及 Xcode 7 的最新测试版)。

我使用了以下代码:

- (void) sendMsg: (NSString *)msg{
    int socketSD = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (socketSD <= 0) {
        NSLog(@"Error: Could not open socket.");
        return;
    }

    // set socket options enable broadcast
    int broadcastEnable = 1;
    int ret = setsockopt(socketSD, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
    if (ret) {
        NSLog(@"Error: Could not open set socket to broadcast mode");
        close(socketSD);
        return;
    }

    // Configure the port and ip we want to send to
    struct sockaddr_in broadcastAddr;
    memset(&broadcastAddr, 0, sizeof(broadcastAddr));
    broadcastAddr.sin_family = AF_INET;
    inet_pton(AF_INET, SERVER_IP, &broadcastAddr.sin_addr);
    broadcastAddr.sin_port = htons(SERVER_PORT);

    char *request = "Message from Watch";
    ret = sendto(socketSD, request, strlen(request), 0, (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr));
    if (ret < 0) {
        NSLog(@"Error: Could not open send broadcast.");
        close(socketSD);
        return;
    }
}
- (IBAction)watchGoButtonTouched {
    [self sendMsg:@"Hi"];
}

在手表模拟器中成功将消息发送到服务器,但在实际手表上运行时,我收到错误Error: Could not open send broadcast.。 我应该提一下,相同的代码在手表所连接的 iPhone 上运行良好。

由于这些原因,我担心上面的代码会因为 beta 问题而失败,超出了我的代码范围。我很想知道您是否有其他想法。

如果是测试版问题,我等不及修复了,所以我想在这里询问有关如何发送符合以下几点的数据的任何想法:

  • 基本上,这是一种将流量直接从手表发送到本地网络上的 UDP 服务器的方法。
  • 数据必须在接收时发送(因此不能选择连接多个数据点)
  • UDP 更可取,但任何其他低延迟发送数据流的方式都很好。
  • 这是一个黑客马拉松项目,它是一个非常酷的想法的概念验证。这意味着,AppStore 合规性或电池问题不适用于此处。

任何帮助将不胜感激!

非常感谢 :) 丹

【问题讨论】:

  • 也许看看这个库,支持 UDP 并且可能会帮助您排除它是否是一个 beta 错误。 github.com/robbiehanson/CocoaAsyncSocket 也可以参考这个,可能只对WatchKit有效,对watchOS无效stackoverflow.com/questions/28905131/…
  • 您可以使用 WatchConnectivity 将 AppleWatch CoreMotion 数据流式传输到手机,并让 iPhone 将数据发送到服务器。查看如何使用 WatchConnectivity stackoverflow.com/questions/31457811/… 这是一个解决方法,直到错误(?)被修复。也许对于一个黑客马拉松项目就足够了
  • @sbarow,正如我所说,这是一个黑客马拉松项目,所以我不害怕“简要”窗口,因为它不适用于这里(而且,我不在乎如果某些测量结果发送失败,则很多),但我肯定会检查那个库。谢谢!
  • @Philip - 这是我的 B 计划,但我担心该解决方案会有很大的延迟。
  • 很遗憾,我可以确认 AsyncUdpSocket 和 GCDAsyncUdpSocket(来自 CocoaAsyncSocket)都不会从手表发送 UDP 数据。适用于模拟器,但不适用于手表本身。

标签: ios sockets watchkit apple-watch


【解决方案1】:

嗯,从 WatchOS 2 Beta 5 开始,仍然没有任何方法可以从手表发送快速信息。

我确实找到了一种解决方法(限制使其不适合用于生产) - 虽然原始帖子中提到的 cmets 方法都不能高速传递信息,但我'已经注意到日志(通过NSLog() 发布)确实非常快地进入 Xcode 控制台窗口。我猜 Apple 使用低级蓝牙通信系统来传递这些消息。

我编写了一个简短的脚本来从 Xcode 读取这些日志,从而近乎实时地从手表中获取数据。从 mac 我可以将它发送到我想要的任何地方(如果我愿意,甚至可以在途中处理它)。此处描述了解决方案及其限制 - Reading Apple Watch syslog (NSLog()) in real-time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多