yanbin's Blog

使用 libmosquitto 遇到的几个问题

1. 使用 libmosquitto 时必须要调用 mosquitto_loop_forever() 或者 mosquitto_loop();
 
2. mosquitto_loop_forever(); mosquitto_loop() 的第三个参数 max_packets 目前并没有使用,
    但是为了保持兼容性,必须设置为 1.
 
3. mosquitto_loop_start() 并不是在 thread 中调用,而是会启动一个 thread 处理 network  traffic, 
    称为 network thread; 同样的 mosquitto_loop_stop() 不是一定要在 thread 中调用,
    而是结束之前通过 mosquitto_loop_start() 创建的 network thread,
    mosquitto_loop_stop() 会等待 network thread 结束,而为了让 network thread 结束,
    又必须提前调用 mosquitto_disconnect(),
    不过可以通过设置 mosquitto_loop_stop() 的第二参数来强制 network thread 结束;

 
4.  注册 will message 同时指定 will topic。mosquitto_will_set() 的第二个参数就是指定 will topic 的。
     这就是 mqtt 里所说的 will message 有相应的 topic,  mosquitto_sub, mosquitto_pub 都有参数,
     可以指定 will topic: --will-topic;
 
5. 如果不使用 mosquitto_loop() 或者 mosquitto_loop_forever() 可以使用:
    (a) mosquitto_socket() 获取 connect socket handle;
    (b) 使用 select() 查询 socket handle 可读/可写;

继续阅读

mqtt 基础

0. mqtt 是一种轻量级的 publish/subscribe 消息传输协议。
   这是一个应用层协议, 一种互联网通信协议,并不依赖底层网络协议。
   正因为其轻量级,所以在低电量设备的中广泛应用。mqtt 可以应用在更多的情景。
   常见的应用:facebook, 微博。
 
1. mqtt message 规格:
   MAX LENGTH: The Payload length valid values are between 0 and 268,435,455 (0xf,fff,fff).
   没错是 7 个f, 256 * 1024 * 1024 - 1.
 
2. mqtt 之 "pub/sub":
   mqtt 的基础原理是推送消息(publishing messages)和订阅主题(subscribing topics), 称为 "pub/sub".
   clients 连接到 broker ---> subscrib topics, 其他 clients 连接到 broker ---> publish message 到 topic,
   所有订阅了这个 topic 并且在线的 clients 都会收到这条 message.
 
   假如 clients publish message 到 topic, 但是订阅这个 topic 的 clients
   都没有在线, 或者还没有 client 订阅这个 topic. 这条 message 将会被消失(被丢弃了?是的被丢弃了)。
   可以设置 message 的 retained flag,再有其他 client 订阅到 topic 时会收到这条 message.
 
   1) 如果 publish message 时有 client 订阅到 topic, 这个条 message 还会保留吗?
   2) FIXME: 保留的 message 发送过之后还会再次发送到其他后来订阅到 topic 的 client 吗?
      **** retained message 保证每当 client 订阅 topic 时,会把 message 发送到 client.
            所有新在线的 client 都可以收到这条 message 直到 borker 进程重启。
      **** 即使 broker 进程重启,也有办法从硬盘存储中读取之前的消息,并且按照消息类型安排发送。
 
3. mqtt, broker:
   提供通用的简单的接口,接受其他 client 的连接。client 可以将 subscribedmessage 存入 database、
   发送到 twitter. 当然也可以从 database, twitter 读取 message 并推送。
   协议接口是简单通用的,任何实现的 client 都可以连接到任何实现的 broker.
 

继续阅读

libcurl 简单使用

1. 必须首先调用 curl_global_init(), 并且指定 CURL_GLOBAL_ALL 作为参数。

    curl_global_init() 会分配一些内存,用于内部的实现。

 

2. 调用 curl_global_cleanup() 清除 curl_global_init() 分配的资源。
    当然这个函数可以在程序任何执行之中调用,不一定是程序将要结束之前调用。
    在完成了所有与 liburl 有关的工作之后,调用 curl_global_cleanup().
 
3. 使用 easy-functions  或者 multi-functions
    1) easy-functions 一般来说可以满足基本工作。
    2) 调用 CURL *curl_easy_init() 获得一个 easy session handle, 其实可以说是获得一个 curl handle.
    3) 使用 curl_easy_setopt(); 指定一个要请求的 URL.
    4) 使用 curl_easy_perform(); 完成请求,这里可能会阻塞。
    5) 使用 curl_easy_cleanup(curl), 完成清理工作。
 
4) curl_global_init() 一般会从系统分配内存。
    也可以使用 curl_global_init_mem() 指定一个自定义的内存地址给 libcurl  用来分配内存 ,这个地址可以是 stack, 也可以是动态分配的。
 

继续阅读




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee