pjsip接收短信

2023-12-24

任何人都知道有关如何设置 pjsip 客户端来接收消息的任何好例子。 我可以使用以下方式从客户端发送消息:

pjsua_im_send(sip_acc_id, &to, NULL, &msgbody, NULL, NULL);

到任何数字。

但我不知道如何才能将消息接收到已注册的 sip 帐户中。

任何信息,将不胜感激。

注意:我只能使用 pjsip 而不能使用其他库。

Edit:我发现的一些新东西:

http://trac.pjsip.org/repos/ticket/1070 http://trac.pjsip.org/repos/ticket/1070

http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf http://www.pjsip.org/release/0.5.4/PJSIP-Dev-Guide.pdf(然而,该文件中关于传入消息的所有内容是这样的:

16.1.2 接收MESSAGE

应用程序将接收任何对话框之外传入的 MESSAGE 请求 模块。 对话框内传入的 MESSAGE 请求将通过以下方式通知对话框的使用情况on_tsx_state()对话框的回调。

它仍然没有说明如何处理传入消息。

http://www.ietf.org/rfc/rfc3261.txt http://www.ietf.org/rfc/rfc3261.txt

http://trac.pjsip.org/repos/wiki/SIP_Message_Buffer_Event http://trac.pjsip.org/repos/wiki/SIP_Message_Buffer_Event

Edit2:有人告诉我需要使用 on_pager 函数来实现此功能。所以我尝试了但不幸的是仍然没有成功。

这是我所做的:

/* Initialize application callbacks */
  app_config->cfg.cb.on_call_state = &on_call_state;
  app_config->cfg.cb.on_call_media_state = &on_call_media_state;
  app_config->cfg.cb.on_incoming_call = &on_incoming_call;
  app_config->cfg.cb.on_reg_state = &on_reg_state;
  app_config->cfg.cb.on_pager = &on_pager;

以及 on_pager 实现:

static void on_pager(pjsua_call_id call_id, const pj_str_t *from, const pj_str_t *to, const pj_str_t *contact, const pj_str_t *mime_type, const pj_str_t *body) {

    NSLog(@"****************  on_pager called  **********************");
    AppDelegate *app = (AppDelegate *)[AppDelegate sharedApplication];

    pjsua_call_info ci;

    pjsua_call_get_info(call_id, &ci);

    PJ_UNUSED_ARG(call_id);
    PJ_UNUSED_ARG(to);
    PJ_UNUSED_ARG(contact);
    PJ_UNUSED_ARG(mime_type);

    [app ring];

    //PJ_LOG(3,(THIS_FILE, "MESSAGE from %.*s: %.*s (%.*s)", (int)from->slen, from->ptr, (int)text->slen, text->ptr, (int)mime_type->slen, mime_type->ptr));

    postMessageStateNotification(call_id, &ci);

}

我期望应用程序在收到消息时调用 on_pager 但事实并非如此。on_incoming_call然而,确实被叫了。


事实证明,我的做法是正确的,只是服务器的问题。 接收消息现已正常!

总结一下,基本上就是:

注册 sip 时:

 app_config->cfg.cb.on_pager = &on_pager;

这将注册在收到短信时调用的 on_pager() 函数。 剩下的取决于您在该函数内做什么。

这是函数头:

static void on_pager(pjsua_call_id call_id, const pj_str_t *from, const pj_str_t *to, const pj_str_t *contact, const pj_str_t *mime_type, const pj_str_t *body)

我认为函数参数等一切都是不言自明的。无论如何,感谢大家的尝试!

app_config 是在 pjsua_init() 函数内部传递的。

另外,在 sipStartup() 中,我们注册了 iOS 的 NSNotification 函数。

/***** SIP ********/
/* */
- (BOOL)sipStartup
{
    kSIPCallState         = @"CallState";
    kSIPRegState          = @"RegState";
    kSIPMwiInfo           = @"MWIInfo";

    if (_app_config.pool)
        return YES;

    self.networkActivityIndicatorVisible = YES;

    if (sip_startup(&_app_config) != PJ_SUCCESS)
    {
        self.networkActivityIndicatorVisible = NO;
        return NO;
    }
    self.networkActivityIndicatorVisible = NO;

    CTTelephonyNetworkInfo *phoneInfo = [[CTTelephonyNetworkInfo alloc] init];
    CTCarrier *phoneCarrier = [phoneInfo subscriberCellularProvider];
    NSLog(@"Carrier = %@", phoneCarrier);

    [self checkForConnection];

    NSTimer *timer;
    receiveCallTask = [[UIApplication sharedApplication]
                       beginBackgroundTaskWithExpirationHandler:^{

                       }];

    //timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(checkForConnection) userInfo:nil repeats:YES];


    /** Call management **/
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(processCallState:)
                                                 name: kSIPCallState object:nil];

    /** Registration management */
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(processRegState:)
                                                 name: kSIPRegState object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(processMessageState:)
                                                 name:kSIPMwiInfo object:nil];

    return YES;
}

processMessageState: 如下:

- (void)processMessageState:(NSNotification *)notification
{
    NSLog(@"*****     processMessageState is called     *****");
    NSNumber *value = [[ notification userInfo] objectForKey:@"CallID"];
    pjsua_call_id callId = [value intValue];

    int state = [[[ notification userInfo] objectForKey:@"Event"] intValue];

    switch (state) {
        case PJSIP_EVENT_UNKNOWN:
            NSLog(@"unknown event");
            break;
        case PJSIP_EVENT_TIMER:
            NSLog(@"timer event");
            break;
        case PJSIP_EVENT_RX_MSG:
            NSLog(@"received --> rx_msg");
            break;
        case PJSIP_EVENT_TX_MSG:
            NSLog(@"tx_msg");
            break;
        case PJSIP_EVENT_TRANSPORT_ERROR:
            NSLog(@"msg transport error");
            break;
        case PJSIP_EVENT_TSX_STATE:
            NSLog(@"event tsx state");
            break;
        case PJSIP_EVENT_USER:
            NSLog(@"event user");
            break;
        default:
            NSLog(@"processMessageState was called");
            break;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pjsip接收短信 的相关文章

随机推荐

  • AWS Lambda 是否支持 aws-sdk v3?

    我在 cdk 研讨会上创建了一个小型 lambda 函数here https cdkworkshop com 20 typescript 我正在打字稿中编写 lambda 函数 通过管道进行部署 该管道创建包含 lambda 函数的云形成堆
  • 如何在2008R2中从包含多个mdf文件的单个bak文件恢复数据

    我在一个 bak 文件中有多个 mdf 文件 如何恢复数据库中的 bak 文件 Run restore headeronly列出文件 设备 中的备份集 然后restore filelistonly查看要恢复的备份集的详细信息 然后resto
  • 浏览器如何检测哪个 HTTP 响应是他们的?

    假设您有多个正在运行的 Web 浏览器 所有这些浏览器显然都在端口 80 上侦听 那么浏览器如何判断传入的 HTTP 响应是否是由其自身发起的 是否捕捉到响应并显示出来 作为连接过程的一部分 TCP IP 连接被分配一个客户端端口 浏览器做
  • 为什么一类有效而另一类无效?

    正如您所看到的 具有非 void 返回类型很重要 class TestValid public String f List
  • Presto - 十六进制字符串到 int

    我正在尝试使用 presto 将十六进制字符串 以 0x 开头 转换为其整数值 例如0x100到 256 我的十六进制字符串称为 msg id 我尝试使用这个 from hex substr msg id 3 但我遇到了一个问题 因为fro
  • 迄今为止的字符串 - hive SQL

    我正在配置单元环境中运行查询 我有一列有时间戳 但在表中设置了一个字符串 我尝试了以下操作 全部返回 Null SELECT To date activitydate Cast cast activitydate as timestamp
  • 返回数组的动态编程硬币找零

    我试图获得目标金额总和的所有硬币 我能够获得所需数量的硬币 我将如何解决它 您可以无限次使用相同的硬币 例如 change 2 10 gt 2 2 2 2 2 def change coins amount result amount 1
  • 为什么我的条件格式在用VBA添加时会偏移?

    我试图添加这样的条件格式 如果表达式 G5 lt gt 然后将设置内部设置为绿色 使用此价格为 A 5 H 25 尝试了这个 工作正常 正如预期的那样 然后尝试使用以下代码将其改编为 VBA 代码 该代码可以工作 但不符合预期 With A
  • 如何处理“Cmake错误:无法找到请求的Boost库”?

    我正在尝试构建这个项目https github com DLuensch StereoVision ADCensus https github com DLuensch StereoVision ADCensus 在Windows10环境下
  • glib 是否可以以不引人注目的方式使用?

    我正在寻找一个良好的 C 通用库 https stackoverflow com q 2540 1593077在标准 C 库之上 并且看到了一些使用建议glib https developer gnome org glib 您的代码中的 干
  • 使用 CSS 垂直和水平对齐(中间和居中)[重复]

    这个问题在这里已经有答案了 我很困惑我该如何强迫自己div元素为中心 vertically and horizontally 在我的页面 意味着跨浏览器兼容性的一种或多种方式 有很多方法 具有固定度量的元素的中心水平和垂直对齐 CSS di
  • 如何淡出 MPMusicPlayerController 播放的声音?

    我想淡出播放的声音MPMusicPlayerController在特定时间段内 我怎样才能做到这一点 没有淡入淡出功能 因此您必须自己实现 循环直到音量为0 并为每一步添加延迟 如果您希望这一切在 2 秒后发生 请将代码放在一个块上 MPM
  • 在 C# 中签署 POST 表单以上传到 Amazon S3

    我在签署 Amazon S3 保单文件时遇到问题 有一些关于如何在 Ruby Java 和 Python 中执行此操作的示例 但当我尝试在 C 中执行此操作时 却行不通 我不断收到无效签名 我不确定我哪里出了问题 http aws amaz
  • 使用 Wix 安装字体而不是本地字体文件夹

    我正在使用 Wix 为网站创建安装 添加字体时 WiX 会选择 ttf 扩展名 并要求您将其安装到本地字体文件夹 当使用目录 Id FontsFolder 和 TrueType yes 时 如果你删除这些属性 它就会崩溃 有没有办法让 Wi
  • 从现有目标文件创建共享库

    我的 IDE 中有一个项目 我需要创建一个共享库以在扩展中使用 我不想使用共享库设置复制该项目 有没有办法使用我现有项目中的目标文件 o 构建共享库 据我了解 我可以为此编写一个 makefile 我假设您使用的是某种 Unix 并且可能正
  • 调整 XAML Grid.Background 图像的大小

    我有一个简单的 XAML 片段 它布置了一组图块 每个图块都有一个背景图像图标
  • Drive.DriveApi.getAppFolder(mGoogleApiClient) 已弃用

    在尝试设置适用于 Android 的 Google Drive API 时 在这一行中 Drive DriveApi getAppFolder mGoogleApiClient 我明白了 DriveApi and getAppFolder已
  • 重新启用 touchmove 事件侦听器。带有 Phonegap 的 iPhone 应用程序

    我的 js 顶部有以下内容 这是 iScroll 插件工作所必需的 document addEventListener touchmove function e e preventDefault false 在某些页面上 我需要重新启用此功
  • 这是将 NHibernate Isession 作为 PerWebRequest 处理的好解决方案吗

    我一直在努力研究 NHibernate 会话管理 现在最终找到了两种可能的解决方案来满足每个 Web 请求的会话 我在 ASPNET mvc 项目中使用 Windsor 进行 IoC 第一个解决方案是在 begin request 中打开会
  • pjsip接收短信

    任何人都知道有关如何设置 pjsip 客户端来接收消息的任何好例子 我可以使用以下方式从客户端发送消息 pjsua im send sip acc id to NULL msgbody NULL NULL 到任何数字 但我不知道如何才能将消