5. IOS 客户端开发指南
5.1. 概述
客户端 P2P 实时传输 SDK 库简称为 libt2u。
libt2u 的主要作用是将远端设备上的端口映射到本地,随后客户端就可以象直接使用 TCP/UDP 协议访问设备(设备IP地址:端口
)一样(127.0.0.1:映射端口
)访问远端设备。
虽然我们已经将建立 P2P 通道的时间优化至短短的3秒,但是为了让用户有更好的体验,我们建议,在客户端应用程序开启后,可以先与所有可能需要创建 P2P 连接的设备预先创建好 P2P 通道,从而使之后的交互可以立即进行。保持预先创建好的 P2P 通道只需要消耗极少量的系统资源和带宽。
在 IOS 平台下,可以使用 Objective-C
调用我们已经封装好的 C 语言静态链接库接口函数进行开发。
5.2. 开发步骤
5.2.1. 创建IOS应用程序项目
在main.m
中添加忽略掉管道破裂信号的代码,忽略掉后不会因为一些 TCP/IP 连接中断触发的管道破裂信号而导致整个应用程序崩溃退出:
int main(int argc, char * argv[]) {
//忽略管道破裂信号
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sa, 0);
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
5.2.2. 导入 SDK 文件
将 SDK 文件复制到工程下。
5.2.3. 包含头文件
#include "libt2u.h"
5.2.4. 初始化
t2u_init((char*)[m_svr_addr UTF8String], m_svr_port, NULL);
这是初始化接口,在应用启动时调用一次即可,不需要每次创建P2P通道时都调用。
参见接口:t2u_init
初始化后,调用查询状态函数,等待客户端连接上服务器,代码如下:
//循环线程
while(bRunning == true)
{
int ret = t2u_status(); //查询状态
if (ret>0) //已连接到服务器
{
//TODO:...
}
else //没有连接到服务器,继续等待
sleep(1);
}
参见接口:t2u_status
5.2.5. 查询设备是否在线
在与设备创建 P2P 连接前,可以先查询一下设备是否在线,如果不在线,就没必要进行后面的步骤了,代码如下:
int ret;
//---------------查询设备是否在线-----------------
ret = t2u_query((char*)[m_dev_uuid UTF8String]);
如果返回值是1,表示在线,参见接口:t2u_query
5.2.6. 映射端口
将设备的端口映射到本地,假如在设备上有一个 web 服务,服务端口是 80,我们将设备上的 80 端口映射到本机的 8080 端口上,代码示例如下:
ret = t2u_add_port((char*)[m_dev_uuid UTF8String], m_dev_port, m_local_port);
返回值是已映射的端口,在本例中,已经指定了映射到本地的端口号,实时应用中,由于指定端口可能存在已被占用的情况,因此可以将最后一个参数设置为 0,接口函数自动分配一个可用的端口,并在返回值中返回。
参见接口:t2u_add_port
5.2.7. 等待映射结果
T2uNetStat stat;
int ret = t2u_port_status(m_local_port, &stat);
返回 1 时表示映射成功。
参见接口:t2u_port_status
5.2.8. 映射成功后,使用标准TCP连接流程进行后续工作
眏射成功后,就可以按标准的TCP连接流程进行后续工作,本例中,已将设备端的 80 端口映射到本地的 8080 端口上,此时打开手机的浏览器,在地址栏中输入:http://127.0.0.1:8080
,将打开设备端的 web 页面。
5.2.9. 关闭 P2P 连接
t2u_del_port(port);
关闭 P2P 通道,所有使用该 P2P 通道的 TCP 连接也会中断。参数 port 是由 t2u_add_port/t2u_add_port_v3 映射的本地端口。
参见接口:t2u_del_port
5.2.10. 退出程序时释放资源
t2u_exit();
退出时释放资源。
参见接口:t2u_exit
详细接口函数,请参见:libt2u C语言 API 接口说明
SDK 库及 DEMO 程序,请从这里下载。