【发布时间】: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