http://www.jouhu.com/blog/?p=2632

1 前言

最近在考虑Android平台下基于Mosquitto实现持久层的群消息推送的问题,在这里整理一下思路。以为实现做准备。

2 Mosquitto项目说明

Mosquitto项目是一个基于IBM MQTT协议的消息通讯服务器端,作者在考虑到Windows以及Linux及其他平台通用性的要求下,采用了select模型。按照模型本身,其所支撑的实时在线用户不要超过3000为宜。如果需要实现更多用户的群发,可以参考本博客另外一个文章 Android和iPhone平台的一种集群推送服务架构。

3 实现的思路
3.1 Android端用户下载客户端安装,然后启动允许推送后,生成其唯一ID号。
3.2 客户端使用该唯一ID号登录Mosquitto端后,将该ID插入DB Server,如MYSQL,同时将该ID插入Memcached。参考代码read_handle_server.c的 283行,在这里执行上步说的两个操作,并将该客户端在线状态设置为1.
3.3 当服务器端获得客户端退出的消息时,将该客户端在线状态设置为0,同时将该客户端从Memcached移除。参考代码loop.c的260行和275行。
3.4 当同一客户端登录的时候,参考代码read_handle_server.c的201行。
3.5 参考client/pub_client.c代码,实现一个独立的server端。
实现流程:
读取待发送数据->从memcached中读取在线用户->调用mosquitto_publish推送数据到客户端。

4 server段伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mosquitto_lib_init();
mosq = mosquitto_new(id, NULL);
mosquitto_will_set(mosq, true, will_topic, will_payloadlen, will_payload, will_qos, will_retain);
mosquitto_connect_callback_set(mosq, my_connect_callback);
mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);
mosquitto_publish_callback_set(mosq, my_publish_callback);
rc = mosquitto_connect(mosq, host, port, keepalive, true);
MSG iMSGNum = GetMSG();
int iUserNum = GetUsers(list);
for(int i = 0 ; i <  iUserNum ; i ++)
{
    rc2 = mosquitto_publish(mosq, &mid_sent, topic, strlen(buf), (uint8_t *)buf, qos, retain);
}
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();

5 测试例子

这里使用的是 优狐安卓推送端进行测试。

5.1 启动Android端的 优狐即时推送客户端,点击开启
5.2 我们可以看到这个topic为 tokudu/155935358
5.3 下载mosquitto的源代码。
5.4 解压后,make && make install
5.5 执行(这里要注意:出错)

mosquitto_pub: error while loading shared libraries: libmosquitto.so.0: cannot open shared object file: No such file or directory

这是由于目录是生成到/usr/local/lib目录了,应该拷贝到/usr/lib目录

ln -s /usr/local/lib/libmosquitto.so.0 /usr/lib/libmosquitto.so.0

mosquitto_pub -h familysguardian.com -p 9999 -m sssss -t tokudu/155935358 -d

5.6 在Android端可以看到发送的消息sssss了。

5.7 在Server的实现方面可以完全参考pub_client.c的代码例子。

6 参考文章
6.1 http://mosquitto.org/download/
6.2 http://mosquitto.org/
6.3 http://doandroid.info/%E5%9B%A2%E9%98%9F%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91%E4%BD%9C%E5%93%81%E5%8F%8Ademo/android%E5%8D%B3%E6%97%B6%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81%E5%B9%B3%E5%8F%B0demo/
6.4 http://familysguardian.com:8888/android_push/send.php
6.5 http://familysguardian.com:8888/android_push/index.php
6.6 http://doandroid.info/2012/03/19/android%E5%92%8Ciphone%E5%B9%B3%E5%8F%B0%E7%9A%84%E4%B8%80%E7%A7%8D%E9%9B%86%E7%BE%A4%E6%8E%A8%E9%80%81%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84/

-END-

Mosquitto持久层群推消息实现思路相关推荐

  1. 【转】Mosquitto持久层群推消息实现思路

    1 前言 最近在考虑Android平台下基于Mosquitto实现持久层的群消息推送的问题,在这里整理一下思路.以为实现做准备. 2 Mosquitto项目说明 Mosquitto项目是一个基于IBM ...

  2. 个推里群推php教程,GitHub - lyx2297999137/yii2-igetui: yii2个推

    yii2-igetui yii2个推 配置: 'components' => [ 'getui'=>[ 'class'=>'sugao2013\getui\Push', 'appId ...

  3. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...

  4. 服务器如何向c winform推送信息,C局域网聊天工具消息推送实现思路与源码.doc

    C局域网聊天工具消息推送实现思路与源码 C#局域网聊天工具怎么实现? 网络通讯编程的基础便是协议,信息的发送常用的协议有面向连接的TCP协议,以及不面向连接的UDP协议TCP:Transmission ...

  5. ASP.NET Core SignalR实时推送配置,业务层实时推送SignalR消息

    web框架版本:.NET 6 不需要安装nuget有关signalr的包 微软参考文档: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/ ...

  6. IM群聊消息如此复杂,如何保证不丢不重?

    1.前言 群聊已经成为主流IM软件的基本功能,不管是QQ群.还是微信群,一个群友在群内发了一条消息,那么对于IM服务器来说需要保证: 在线的群友能第一时间收到消息: 离线的群友能在登陆后收到消息. 由 ...

  7. Mybatis持久层开发

    文章目录 Mybatis持久层开发简要步骤 概述: 示例: 总结: 注意要点: 基于Mapper代理的示例 基于注解的示例 应用场景: 主键返回 批量查询 动态SQL 缓存 关联查询 延迟加载 逆向工 ...

  8. im即时通讯开发:群聊消息如此复杂,如何保证不丢不重

    群聊已经成为主流IM软件的基本功能,不管是QQ群.还是微信群,一个群友在群内发了一条消息,那么对于IM服务器来说需要保证: 在线的群友能第一时间收到消息: 离线的群友能在登陆后收到消息. 常见的群消息 ...

  9. java开源持久层框架集

    原文链接:http://www.open-open.com/3_18.htm Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Ja ...

最新文章

  1. R语言ggplot2可视化在X轴上可视化时间标签实战:可视化时间标签、对时间标签进行旋转
  2. Spring Boot 2.4.3、2.3.9 版本发布,你准备好了吗?
  3. Quartz 框架快速入门(一)
  4. java里面赋值运算符解释_java复合赋值运算符和赋值运算符
  5. leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
  6. python中正确的输入语句_python中,输入简单的非法语句为什么显示不一致呢
  7. python to datetime_Python中缺少datetime.timedelta.to_seconds()-float?
  8. android电视开发远程开关机,一种电视电脑一体机及其实现远程开关机控制的方法...
  9. linux svnadmin,linux安装centos7.5基于SVN+Apache+svnadmin实现SVN的web管理
  10. cs用服务器运行,如何搭建自己的CS服务器(插件配置篇)
  11. 基于Android设备的 Kali Linux渗透测试教程(内部资料)
  12. 使用python 批量修改图片分辨率
  13. js简单实现根据身份证号码识别性别年龄生日
  14. 关于airdroid免root操作
  15. 贵州杰赛s65机顶盒子CPU S905M-B 刷机教程及纯尽版固件
  16. 外包两年跳进外企和大厂,简历污点不是外包经历,是技术太差
  17. 【Android】通用系列 —— 快速搭建设置界面
  18. 《晚风》 带来阵阵清凉
  19. FPGA基本引脚知识
  20. 离线安装mariadb

热门文章

  1. Day-1 HTML基本标签和CSS常用样式
  2. 本地音乐如何导入apple_如何将Apple音乐歌曲用作iPhone闹钟
  3. 第101章 SQL函数 NVL
  4. 时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)
  5. nginx服务器的文档根目录,nginx更改根目录
  6. 【渝粤教育】电大中专电子商务网站建设与维护 (4)作业 题库
  7. [2021年最新]国产时序性数据TDenige入门
  8. Win10运行程序提示不受信任的解决方法【系统天地】
  9. 公司注册步骤包含的内容,公司注册步骤
  10. 计算机结构及CISC和RISC