TinyMail研究—Camel-lite的插件系统

本文介绍了TinyMail邮件系统的插件机制,详细解释了STORE和TRANSPORT两种类型的提供者及其接口,通过示例展示了如何使用TinyMail进行邮件的发送与接收。

TinyMail研究—Camel-lite的插件系统

             

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:李先静<xianjimli at hotmail dot com>

更新时间:2007-4-19

 

TinyMail是一套针对移动设备设计的邮件系统框架,为了达到最大的灵活性,它采用了很多设计模式和先进的编程技术,让框架的每一部分都可以定制和配置。TinyMail流行的趋势非常明显,Nokia770/800GPE Phone Edition等项目中都使用了它。因为我们也要开发邮件系统,所以花了几天时间去研究它的实现,这里记录一些研究笔记,供有兴趣的朋友参考。本文介绍一下Camel-lite的插件系统。

 

邮件的收/发协议有好几种,比如SMTPPOPIMAP等等,Tinymail并不依赖于特定的收/发协议,这些协议都是以插件的方式加入进来的,扩展和裁减都很方便。Tinymail把协议的实现称为提供者(provider)

 

提供者(provider)可以分为两类:STORETRANSPORT。前者实现CamelStore接口,用于邮件的接收,比如POP3IMAP。后者实现CamelTransport接口,用于邮件的发送,比如SMTPSendmail

 

CamelProvider定义了provider的公共数据结构,其中包括像协议、名称、描述、配置和许可证等等信息,其中最重要的是object_types成员,它描述了STORETRANSPORT的类型,用它来创建协议实现的实例。

 

每个provider都以独立的共享库方形提供,并且exportcamel_provider_module_init函数,在该函数内,provider调用camel_provider_register向系统注册自己,只有注册之后才能被使用者使用。而系统在初始化时,调用camel_provider_init去加载所有的provider

 

CamelServiceSTORETRANSPORT共同的基类,它定义了一些两者都要实现的虚函数,比如connect/ disconnect用于建立和断开连接,cancel_connect用于取消连接,query_auth_ types用于查询认证类型。

 

CamelTransport是发送协议必须实现的接口,它只有一个函数send_to,它的参数包括邮件、发件人和收件人等信息。

 

CamelStore是接收协议必须实现的接口,它和IMAP能很好的对应起来。它的要求看起来非常复杂,它并没有提供接收邮件的函数,相反它提供了一些管理folder的函数。要接收邮件,先用get_folder得到CamelFolder,然后调用CamelFolder的函数get_message才行。

 

下面的例子展示了发送邮件的方法:

static char *types[] = { "to", "cc", "bcc" };

 

void sendMail(CamelMimeMessage *msg, CamelException *ex)

{

         CamelInternetAddress *from, *addr, *to;

         CamelTransport *trans;

 

         if (camel_mime_message_get_from(msg) == NULL) {

                   camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot send message: No from address set");

                   return;

         }

 

         trans = (CamelTransport *)camel_session_get_service(session, "smtp://localhost/", ex);

         if (camel_exception_is_set(ex))

                   return;

         camel_service_connect(trans, ex);

         if (camel_exception_is_set(ex))

                   goto noconnect;

 

         to = camel_internet_address_new();

         for (i=0;i<sizeof(types)/sizeof(types[0]);i++) {

                   CamelInternetAddress *addr = camel_mime_message_get_recipients(msg, types[i]);

 

                   if (addr)

                            camel_address_cat(to, addr);

         }

 

         camel_transport_send_to(trans, msg, camel_mime_message_get_from(msg), to, ex);

         camel_object_unref(to);

         camel_transport_disconnect(trans, FALSE, NULL);

noconnect:

         camel_object_unref(trans);

}

 

下面的例子展示了接收邮件的方法:

#include <camel/camel.h>

#include <camel/camel-store.h>

#include <camel/camel-session.h>

#include <camel/camel-folder.h>

 

int main(int argc, char* argv[])

{

    g_type_init();

    g_thread_init(NULL);

    camel_init(NULL, 0);

 

    camel_provider_init();

 

    CamelException* ex = camel_exception_new();

 

    CamelSession* session = CAMEL_SESSION(camel_object_new(CAMEL_SESSION_TYPE));

    camel_session_construct(session, "/tmp");

 

    CamelStore* store = CAMEL_STORE(camel_session_get_service_connected(session,

        "pop://topmailtester:top321@pop.sohu.com",

        CAMEL_PROVIDER_STORE, ex));

 

    CamelFolder* inbox = camel_store_get_inbox(store, ex);

    GPtrArray* uids = camel_folder_get_uids(inbox);

 

    int i = 0;

    for(i = 0; i < uids->len; i++)

    {

        CamelMimeMessage* message = camel_folder_get_message(inbox, uids->pdata[i], CAMEL_FOLDER_RECEIVE_FULL, 0, ex);

        camel_mime_message_dump(message, 1);

        CamelStream* fs = camel_stream_fs_new_with_name(uids->pdata[i], O_CREAT|O_RDWR, 0664);

        camel_data_wrapper_write_to_stream(CAMEL_DATA_WRAPPER(message), fs);

 

        camel_object_unref(CAMEL_OBJECT(fs));

        camel_object_unref(CAMEL_OBJECT(message));

        printf("%p/n", uids->pdata[i]);

    }

   

    camel_folder_free_uids(inbox, uids);

   

    camel_object_unref(CAMEL_OBJECT(store));

    camel_object_unref(CAMEL_OBJECT(session));

    camel_exception_free(ex);

   

    return 0;

}

 

参考资料:

http://www.go-evolution.org

 

~~end~~

 
内容概要:本文围绕“基于改进型SVPWM调制的钳位型单相三电平NPC逆变器中点电位平衡”展开仿真研究系统探讨了如何通过改进的空间矢量脉宽调制(SVPWM)策略有效抑制单相三电平中性点钳位(NPC)逆变器中存在的中点电位漂移问题。研究依托Simulink仿真平台构建系统模型,详细分析了不同调制策略对中点电压波动的影响机制,验证了所提出控制方法在提升输出波形质量、增强系统稳定性方面的有效性。同时,文档附带了多项相关科研主题资源,涵盖多电平逆变器控制、虚拟同步发电机(VSG)、微电网能量管理、信号处理、路径规划、机器学习与深度学习等多个前沿方向,展现了较强的综合性与科研实用价值。; 适合人群:电气工程、自动化、新能源科学与工程、电力电子与电力传动等领域的硕士、博士研究生,以及从事电力系统控制、可再生能源并网技术研究的科研人员与工程技术人员。; 使用场景及目标:① 深入理解三电平NPC逆变器的工作原理及中点电位不平衡的成因与危害;② 掌握改进型SVPWM调制策略的设计思想及其在中点电位控制中的实现路径;③ 利用Simulink搭建电力电子系统仿真模型,开展控制算法的验证与优化;④ 拓展至三相多电平逆变器、VSG构网型控制、微电网协同优化等高级课题的研究与复现。; 阅读建议:建议读者结合Simulink仿真环境进行实操演练,重点关注调制策略中开关状态选择与作用时间分配对中点电荷累积的影响机制。初学者应先夯实传统SVPWM理论基础,再逐步过渡到改进策略的学习;进阶研究者可尝试将该方法推广至多目标协同控制或引入智能优化算法进一步提升动态响应性能。
内容概要:本文档聚焦于三电平ANPC并网逆变器的先进控制策略研究,重点阐述了一种融合DPWMA(离散脉宽调制)调制、正负序电流分离控制与电网电压前馈补偿的复合控制方法,并基于Simulink平台完成了系统建模与仿真验证。该方法旨在提升逆变器在电网电压不平衡等复杂工况下的动态响应性能与运行稳定性,特别针对低电压穿越(LVRT)能力进行了优化设计。研究内容还涵盖了中点电位平衡控制、虚拟同步发电机(VSG)技术以及构网型逆变器的双闭环控制架构,体现了对高阶电力电子变换系统深层次的建模与控制探索。文档同时罗列了大量相关的MATLAB/Simulink仿真实例,覆盖电力电子、新能源并网、优化算法、机器学习、路径规划等多个前沿科研领域,强调了科研工作中“借力”现有成果与追求“创新”突破的双重重要性。; 适合人群:从事电力电子与电力传动、新能源发电系统、微电网与智能电网控制等相关领域的研究生、科研人员及工程技术人员,要求具备扎实的电力系统基础知识、现代控制理论背景以及熟练的MATLAB/Simulink仿真操作能力。; 使用场景及目标:①深入研究三电平ANPC逆变器在不平衡电网条件下的高性能控制策略;②实现DPWMA调制技术与正负序电流独立控制的协同仿真与性能评估;③设计并验证融合电网前馈补偿与中点电位平衡的复合控制算法;④作为高级电力电子系统仿真与构网型控制技术的学习范本与项目开发参考。; 阅读建议:建议读者结合文档指引,通过指定公众号或网盘获取完整的仿真模型资源,在Simulink环境中动手复现核心控制模块,重点关注正负序分离算法、DPWMA调制波生成逻辑与前馈控制环节的实现细节,同时参考文末列出的多样化研究方向,以拓宽技术视野并激发创新思维。
内容概要:本文围绕三相并网逆变器的控制策略展开深入研究,提出了一种基于虚拟阻抗与统一有源阻尼相结合的复合控制方法,并融合SVPWM(空间矢量脉宽调制)与SPWM(正弦脉宽调制)两种调制技术,在Simulink平台中构建完整的系统仿真模型。该策略旨在解决弱电网条件下由LC滤波器引发的谐振不稳定问题,通过引入虚拟阻抗重塑输出阻抗特性,结合统一有源阻尼技术实现对多模态谐振的有效抑制,从而提升系统的稳定性与鲁棒性。研究详细阐述了虚拟阻抗的设计原理、有源阻尼的实现机制及其与电流环、电压环等传统控制结构的集成方式,同时对比分析了SVPWM与SPWM在动态响应速度、稳态精度及谐波抑制能力等方面的性能差异,验证了所提控制策略在改善电能质量与增强系统动态性能方面的优越性。; 适合人群:具备电力电子、新能源发电或自动控制等相关专业背景,从事并网逆变器建模、控制算法开发与稳定性分析的研究生、科研人员及电力系统领域工程技术人员。; 使用场景及目标:①用于解决三相并网逆变器在弱电网环境下面临的LC滤波器谐振失稳问题;②为提升并网系统的电能质量与运行可靠性提供高效的阻尼补偿方案;③适用于高校科研仿真验证、企业技术研发优化以及高级课程教学案例设计与实践。; 阅读建议:建议结合提供的Simulink仿真模型进行实操演练,重点关注虚拟阻抗参数整定与统一有源阻尼环节的协调设计,深入探究不同调制策略下系统频域特性与时域响应的变化规律,通过对比实验全面评估控制策略的有效性、适应性与工程应用潜力。
内容概要:本文针对不对称电网条件下ANPC三电平并网逆变器的高性能控制问题,提出了一种结合DPWMA(不连续脉宽调制)与正负序电流分离技术的前馈控制策略。通过Simulink搭建仿真模型,系统实现了在电网电压不平衡工况下的负序电流有效抑制、中点电位动态平衡以及并网电流高质量输出,显著提升了逆变器的电能质量和系统鲁棒性。研究深入探讨了DPWMA调制方式的优势,设计了双闭环控制架构与前馈补偿机制,优化了正负序分量的解耦控制流程,从而增强了系统在复杂电网环境下的动态响应能力和稳定性。该方法为高功率等级、高可靠性要求的并网系统提供了有效的控制解决方案。; 适合人群:具备电力电子与电力系统基础知识,从事新能源发电、并网逆变器控制、电能质量治理等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 研究三电平ANPC逆变器在不对称电网下的控制策略;② 掌握DPWMA调制与正负序分离控制的协同机制;③ 实现并网逆变器在电压不平衡条件下的电流精确控制与中点电位稳定;④ 通过Simulink搭建仿真模型,验证先进控制算法的有效性。; 阅读建议:建议结合Simulink仿真模型进行学习,重点关注控制框图的设计逻辑与参数整定过程。在理解理论基础上,动手复现仿真案例,深入分析不同电网故障下系统的响应特性,以提升对复杂控制策略的实际应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值