hum*_*rim 6 iphone xcode network-programming objective-c wifi
我在我的应用程序中编写了一个代码,用于启用设备到设备的无线通信(仅传输文本/字符串).该代码与从Developer.Apple.com下载的Apple示例Witap应用程序相同.
它在我的网络工作正常和另一个网络也.
但它不能在我的客户端站点工作.
我花了一些时间在客户端站点来解决设备没有相互通信的问题,这就是我找到的.他们在他们的安全设置中阻止对等通信......"并且我的设备通信被识别为点对点.
有没有办法解决这个问题除了苹果支持的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上单击设备名称后,它将调用"didSelectRowAtIndexPath"委托,该委托在BrowserViewController类中实现(它是一个TableView类委托).
它将根据TableView索引从我们的服务数组中选择一个NetService名称(保存所有发现的服务),并将结果NSService设置为当前服务.
触发委托"didResolveInstance",它将设置InPutStream和OutPutStream值.
在获取InPutStream和OutPutStream的值之后,它将调用"OpenStream"方法来打开输入和输出Streams.
最后,它释放NSService和Picker对象,并准备发送包含所选设备的消息.
工作的发送按钮
使用字符串参数从BrowserViewController类调用"send"函数.它可以是用户文本输入或语音识别后生成的字符串.
将输入字符串转换为uint_8数据类型并将其发送到接收器设备.
接收方工作
当数据到达接收器设备时,将触发"TcpServerAcceptCallBack"委托(在TcpServer类中实现).
它将通过另一个名为"HandleNewConnectionFromAddress"的TcpServer类委托从BrowserViewControll calss调用"DidAcceptConnectionForServer"方法.
触发"AppController"类中的"流句柄委托",它将检查是否有任何可用的位.
如果字节可用,则将uint_8类型数据转换为字符串,并在接收器文本框中显示结果字符串.
还可以使用生成的字符串加载图像并在AppBundle的图像视图中显示它.</ p>
在 WiTap 源 Networking/TCPServer.m 中,套接字的端口设置为零(= 内核选择端口号,并且其值大于 50000)。您可以将 0 更改为 81,这样爱管闲事的安全设置将不再将您归类为点对点。1 到 1023 之间的任何值都可以。