【发布时间】:2011-09-15 13:47:28
【问题描述】:
我在我的应用程序中编写了一个代码来启用设备到设备的 wifi 通信(仅传输文本/字符串)。该代码与从 Developer.Apple 下载的 Apple 示例 Witap 应用程序相同.com.
它在我的网络和其他网络中都可以正常工作。
但是它在我的客户站点中不起作用。
我在客户端站点上花了一些时间来解决设备无法相互通信的问题,这就是我发现的。他们在他们的安全设置中阻止了点对点通信……”并且我的设备通信被识别为点对点。
有什么办法可以解决这个问题 除了PEER 2 PEER wifi 通信以外,苹果还支持吗?
原型 WIFI 应用程序工作概念
WiFi应用主要有四个类,分别是AppController、Picker、BrowserViewController、TCP Server。
当应用程序加载时,AppController 类将初始化 NSInputStraem 和 NSOutPut Stream。
它还会从 TcpServer 类中调用“start”方法来设置端口号。
之后它会从 TcpServer 类中调用“enableBounjourWithDomain”方法。
上面的方法调用带有一个称为标识符的参数(它是一个通用名称,例如:WiTap),发送方正在搜索具有此通用标识符的设备。
执行此方法后,发送方设备可以识别我们的设备并能够连接。
获取自己的设备名称
Tcp serverServer 委托“DidEnabledBounjer”将在上述代码执行后工作,并给出当前设备名称。
然后 NSNetservice 委托“didFindService”将工作(当每个服务发现时它工作)并检索发现的服务名称。
获得新服务名称后,我们将检查它是否与我们从“DidEnabledBounjer”委托中获得的设备名称相同。
如果没有,新的服务名称将添加到名为 services 的 NSMutable 数组中。
然后 services 数组绑定到 Table 视图,我们可以看到发现的设备名称列表。
发现新设备:
没有用于发现新设备的计时器设置。
当新设备连接到同一个 WiFi 网络时,“DidFindservice”委托将触发(它是在 BrowserViewController 类中实现的 NSNetservice 委托)。
DidFindservice 将给出新的设备名称。得到它后,我们将检查它是否与我们从“DidEnabledBounjer”委托中获得的设备名称相同。
如果没有,服务名称将添加到名为 services 的 NSMutable 数组中。
然后根据设备名称对所有发现的设备名称进行排序并重新加载表格视图。
从表格视图中选择设备名称后工作
点击 TableView 上的设备名称后,会调用 BrowserViewController 类中实现的“didSelectRowAtIndexPath”委托(它是一个 TableView 类委托)。
它将根据TableView索引从我们的服务数组中选择一个NetService名称(包含所有发现的服务)并将生成的NSService设置为当前服务。
触发一个委托“didResolveInstance”,它将设置 InPutStream 和 OutPutStream 值。
在获取 InPutStream 和 OutPutStream 的值后,它会调用“OpenStream”方法打开输入和输出流。
最后它释放了 NSService 和 Picker 对象,并准备好向选定的设备发送消息。
发送按钮的作用
从BrowserViewController类中调用“send”函数,带一个字符串参数,可以是用户文本输入,也可以是语音识别后生成的字符串。
将输入字符串转换为uint_8数据类型并发送给接收设备。
接收端工作
当数据到达接收设备时,“TcpServerAcceptCallBack”委托将触发(在 TcpServer 类中实现)。
它将通过另一个名为“HandleNewConnectionFromAddress”的 TcpServer 类委托从 BrowserViewControll 调用“DidAcceptConnectionForServer”方法。
触发“AppController”类中的“流句柄委托”,它将检查是否有可用的咬合。
如果字节可用,则将 uint_8 类型的数据转换为字符串,我们将在接收者文本框中显示结果字符串。
并且还使用结果字符串从 AppBundle 加载图像并在 Image View 中显示它。
【问题讨论】:
标签: iphone objective-c xcode network-programming wifi