游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

mqtt应用于进程间通信

  前言
  上一篇分享了:简单认识认识mqtt及mosquitto,但也只是分享了mqtt的一些概念及mosquitto的一些介绍。这不,就有读者来催更了:
  这一篇我们就来分享mqtt应用于进程间通信的实例。我们沿用例说嵌入式实用知识之JSON数据这篇文章的综合demo来改造改造。那个综合demo的功能是这样子的:
  这是以socket来作为进程间通信的方式,并且这个demo是基于Windows写的,需要包含Windows特定的头文件。
  本篇笔记我们把上面这个综合demo改为:
  我们用mqtt来作为进程间通信的方式,在Linux下进程测试。
  先贴代码:jsonprint进程源码
  jsonprint。c:程序功能:组JSON格式数据包并发送(MQTT发布者客户端程序)编译命令:gcccJSON。cjsonprint。cL。。mosquittobuildliblmosquittoojsonprint导出mosquitto动态库:exportLDLIBRARYPATH。。mosquittobuildlib:LDLIBRARYPATH作者:ZhengN公众号:嵌入式大杂烩includestdio。hincludestdlib。hincludestring。hincludecJSON。hinclude。。mosquittolibmosquitto。hdefineSTUNAMELEN32学生结构体typedefstructStudent{charname〔STUNAMELEN〕;名字intnum;学号intcscore;C语言分数}StudentDef,pStudentDef;内部函数声明staticStudentDefStudentDataPrepare(void);staticcharStudentsDataPacket(pStudentDefStu);staticvoidStudentDataSend(constchardata);staticvoidMqttClientInit(void);staticvoidMqttClientClean(void);boolcleansessiontrue;structmosquittomosqNULL;函数:main参数:说明:返回:intmain(void){StudentDefstu{0};charstudataNULL;intstucount0;inti0;MQTT客户端初始化MqttClientInit();需要登记的学生总人数printf(Pleaseinputnumberofstudent:);scanf(d,stucount);while(istucount){准备数据stuStudentDataPrepare();JSON格式数据组包studataStudentsDataPacket(stu);发送数据StudentDataSend(studata);}回收操作MqttClientClean();return0;}函数:StudentDataPrepare,准备组包需要的数据参数:说明:返回:获取得到的数据staticStudentDefStudentDataPrepare(void){charname〔STUNAMELEN〕{0};intnum0;intcscore0;StudentDefstu;名字printf(Pleaseinputname:);scanf(s,name);if(strlen(name)STUNAMELEN){strncpy((char)stu。name,name,strlen(name)1);}else{printf(Thenameistoolong);}学号printf(Pleaseinputnum(0100):);scanf(d,num);stu。numnum;C语言分数printf(Pleaseinputcscore(0100):);scanf(d,cscore);stu。cscorecscore;returnstu;}函数:StudentsDataPacket,JSON格式数据组包参数:Stu:组studentjson数据包需要的数据说明:返回:JSON格式的字符串staticcharStudentsDataPacket(pStudentDefStu){charresstringNULL;返回值cJSONnameNULL;名字cJSONnumNULL;学号cJSONcscoreNULL;C语言分数创建一个JSON对象,{}扩起来cJSONobjcJSONCreateObject();if(objNULL){gotoend;}创建name:xxx键值对namecJSONCreateString(Stuname);if(nameNULL){gotoend;}cJSONAddItemToObject(obj,name,name);创建num:207键值对numcJSONCreateNumber(Stunum);if(nameNULL){gotoend;}cJSONAddItemToObject(obj,num,num);创建cscore:95键值对cscorecJSONCreateNumber(Stucscore);if(nameNULL){gotoend;}cJSONAddItemToObject(obj,cscore,cscore);resstringcJSONPrint(obj);呈现为JSON格式resstringcJSONPrintUnformatted(obj);呈现为无格式if(resstringNULL){fprintf(stderr,Failedtoprintmonitor。);}异常情况统一Delete(free)end:cJSONDelete(obj);returnresstring;}函数:StudentDataSend,JSON格式字符串数据组包发送参数:data:要发送的数据说明:返回:JSON格式的字符串staticvoidStudentDataSend(constchardata){printf(s:s,FUNCTION,data);发布消息mosquittopublish(mosq,NULL,testtopic,strlen(data)1,(constchar)data,0,0);}函数:MqttClientInit,MQTT客户端初始化参数:void说明:返回:staticvoidMqttClientInit(void){libmosquitto库初始化mosquittolibinit();创建mosquitto客户端mosqmosquittonew(NULL,cleansession,NULL);if(NULLmosq){printf(Createmqttclientfailed。。。);mosquittolibcleanup();return;}连接服务器if(mosquittoconnect(mosq,localhost,1883,60)){printf(Unabletoconnect。。。);return;}网络消息处理线程intloopmosquittoloopstart(mosq);if(loop!MOSQERRSUCCESS){printf(mosquittolooperror);return;}}函数:MqttClientClean,MQTT客户端清理操作参数:void说明:返回:staticvoidMqttClientClean(void){mosquittodestroy(mosq);mosquittolibcleanup();}jsonparse进程源码
  jsonparse。c:程序功能:接收JSON数据并解析(MQTT订阅者客户端程序)编译命令:gcccJSON。cjsonparse。cL。。mosquittobuildliblmosquittoojsonparse导出mosquitto动态库:exportLDLIBRARYPATH。。mosquittobuildlib:LDLIBRARYPATH作者:ZhengN公众号:嵌入式大杂烩includestdio。hincludestdlib。hincludestring。hincludecJSON。hinclude。。mosquittolibmosquitto。hdefineSTUNAMELEN32学生结构体typedefstructStudent{charname〔STUNAMELEN〕;名字intnum;学号intcscore;C语言分数}StudentDef,pStudentDef;内部函数声明staticvoidStudentsDataParse(pStudentDefStu,constcharJsonStudnetData);staticvoidPrintParseResult(constpStudentDefStu);staticvoidSaveParseResult(constpStudentDefStu);staticvoidmymessagecallback(structmosquittomosq,voiduserdata,conststructmosquittomessagemessage);staticvoidmyconnectcallback(structmosquittomosq,voiduserdata,intresult);内部全局变量staticFILEstufpNULL;函数:main参数:说明:返回:boolcleansessiontrue;intmain(void){structmosquittomosqNULL;libmosquitto库初始化mosquittolibinit();创建mosquitto客户端mosqmosquittonew(NULL,cleansession,NULL);if(NULLmosq){printf(Createmqttclientfailed。。。);mosquittolibcleanup();return1;}绑定连接、消息接收回调函数mosquittoconnectcallbackset(mosq,myconnectcallback);mosquittomessagecallbackset(mosq,mymessagecallback);连接服务器if(mosquittoconnect(mosq,localhost,1883,60)){printf(Unabletoconnect。。。);return1;}循环处理网络消息mosquittoloopforever(mosq,1,1);回收操作mosquittodestroy(mosq);mosquittolibcleanup();return0;}函数:StudentsDataParse,JOSN格式学生期末数据解析参数:JsonStudnetData:JSON数据Stu:保存解析出的有用数据说明:返回:staticvoidStudentsDataParse(pStudentDefStu,constcharJsonStudnetData){cJSONstudentjsonNULL;studentjson操作对象,可代表{}扩起来的内容cJSONnameNULL;cJSONnumNULL;cJSONcscoreNULL;开始解析studentjsoncJSONParse(JsonStudnetData);if(NULLstudentjson){constcharerrorptrcJSONGetErrorPtr();if(errorptr!NULL){fprintf(stderr,Errorbefore:s,errorptr);}gotoend;}解析获取name得值namecJSONGetObjectItemCaseSensitive(studentjson,name);if(cJSONIsString(name)(namevaluestring!NULL)){memset(Stuname,0,STUNAMELENsizeof(char));memcpy(Stuname,namevaluestring,strlen(namevaluestring));}解析获取num的值numcJSONGetObjectItemCaseSensitive(studentjson,num);if(cJSONIsNumber(num)){Stunumnumvalueint;}解析获取cscore的值cscorecJSONGetObjectItemCaseSensitive(studentjson,cscore);if(cJSONIsNumber(cscore)){Stucscorecscorevalueint;}end:cJSONDelete(studentjson);}函数:PrintParseResult,打印输出解析结果参数:说明:返回:staticvoidPrintParseResult(constpStudentDefStu){printf(name:s,num:d,cscore:d,Stuname,Stunum,Stucscore);}函数:SaveParseResult,保存解析结果参数:Stu:需要保存的数据说明:返回:staticvoidSaveParseResult(constpStudentDefStu){charwritebuf〔512〕{0};staticintstucount0;以可在文件末尾追加内容的方式打开文件if((stufpfopen(ParseResult。txt,a))NULL){printf(Openfileerror!);returnexit(EXITFAILURE);}按指定格式写入文件snprintf(writebuf,512,name:s,num:d,cscore:d,Stuname,Stunum,Stucscore);sizetlenfwrite((char)writebuf,1,strlen(writebuf),stufp);文件位置指针偏移fseek(stufp,lenstucount,SEEKSET);stucount;关闭文件fclose(stufp);}函数:mymessagecallback,消息接收回调函数参数:返回:staticvoidmymessagecallback(structmosquittomosq,voiduserdata,conststructmosquittomessagemessage){StudentDefstu{0};if(messagepayloadlen){printf(ss,messagetopic,(char)messagepayload);解析JSON数据StudentsDataParse(stu,(constchar)messagepayload);打印输出解析结果PrintParseResult(stu);保存数据到文件SaveParseResult(stu);}else{printf(s(null),messagetopic);}fflush(stdout);}函数:myconnectcallback,连接回调函数参数:返回:staticvoidmyconnectcallback(structmosquittomosq,voiduserdata,intresult){if(!result){订阅testtopic主题的消息mosquittosubscribe(mosq,NULL,testtopic,0);}else{fprintf(stderr,Connectfailed);}}编译运行
  1、编译生成jsonparse、jsonprint程序:gcccJSON。cjsonparse。cL。。mosquittobuildliblmosquittoojsonparsegcccJSON。cjsonprint。cL。。mosquittobuildliblmosquittoojsonprint
  这里用到链接动态库的方式生成可执行程序。关于动态链接与静态链接,可查看往期笔记:静态链接与动态链接(Linux)、静态链接与动态链接。
  2、执行jsonparse、jsonprint程序:
  执行这两个程序会报错:
  。jsonparse:errorwhileloadingsharedlibraries:libmosquitto。so。1:cannotopensharedobjectfile:Nosuchfileordirectoryjsonprint:errorwhileloadingsharedlibraries:libmosquitto。so。1:cannotopensharedobjectfile:Nosuchfileordirectory
  这是因为不能找到共享库文件libmosquitto。so。1,加载失败。
  因为一般情况下Linux会在usrlib路径中搜索需要用到的库,而libmosquitto。so。1库并不在这个路径下。
  解决方法有两种:一种就是把这个文件拷贝至usrlib路径下,但是一般不允许这样做,一般用户也不允许往这个路径里拷贝东西。另一种就是把libmosquitto。so。1库所在路径增加为动态库的搜索路径,命令为:exportLDLIBRARYPATH。。mosquittobuildlib:LDLIBRARYPATH
  关于这方面的说明可以阅读往期笔记:静态链接与动态链接(Linux)
  按照上述方法添加动态库搜索路径之后就可以正常运行这两个程序:
  ParseResult。txt文本里得到:
  实验成功!
  以上就是本次的分享,代码写得比较仓促,如有错误,麻烦指出,谢谢!由于准备demo花了挺多时间,包括注释也写了很多。所以本篇文章就不做过多的说明,感兴趣的朋友可以结合本篇文章的demo及mosquittoclientpubclient。c、mosquittoclientsubclient。c这两个源文件。
  本篇文章的demo:
  由于篇幅有限。代码可在私信回复关键词:jsonmqttdemo,即可获取。
  1024G嵌入式资源大放送!包括但不限于CC、单片机、Linux等。私信回复1024,即可免费获取!

36氪首发国产数据库厂商聚云位智获亿元级B轮融资,将拓展更多作者咏仪编辑苏建勋36氪获悉,聚云位智获近亿元B轮融资,由达晨财智领投,朗玛峰创投、中翔资本跟投。乐中资本担任本轮财务顾问。本轮融资将用于技术和产品持续研发。……科幻之纪念阿斯特拉星球磁浮是阿斯特拉发现的。被称为代号3的生命体提出了一种设想。假设在超高压磁场状态下,氕氘发生聚变反应,制造出了等离子推力的聚变发动机。其核心意义是否类似于第二次……想买一个相机,小型的,买着玩玩而已,不需要太专业,有什么推荐你好,很高兴回答你的问题,想买一个相机,小型的相机玩玩而已,我觉得就买宾得微单相机使用它不错,小巧玲珑,随身携带特别方便简单,你只是玩玩而已,又不爱好摄影,买个宾得相机就OK啦……为什么买电脑的越来越少了?如果非要说确实少了,那就是需求少了,大部分人购买电脑的需求很直接,要么办公学习,要是游戏娱乐,很显然办公那部分基本饱和了,因为没有不行。但是游戏娱乐那帮人真的是替代品太多……戴上助听器觉得耳朵闷怎么回事?戴上助听器觉得耳朵闷主要是堵耳原因造成的,耳朵本来是开放的,说话的时候有一部分能量从耳道释放出来了,戴上助听器后耳塞堵住了,导致能量不能释放,出现闷堵的感觉。这种情况也可以通过……互联网拆墙先过支付关消息属实,会继续与其他平台一起面向未来,相向而行。9月28日,面对市场上阿里旗下多应用接入微信支付的传言,阿里给出了肯定的回答。据悉,阿里旗下饿了么、优酷、大麦、考拉海购……2022年还能做亚马逊吗?都说亚马逊不好做,但是每年还是有很多卖家入驻。亚马逊对比其他跨境平台投资算低的了。干亚马逊没有不刷单的,得控制,违规就容易封号,正常经营不会有问题的。不过一个非常明显的现……曲面屏麒麟芯片,华为5G旗舰少量现货供应,不等iPhone1从目前的形式来看,如今的iPhone13系列已经是属于大卖的情况,而此番所提及到的13香也是名不虚传,针对于iPhone13系列能够在国内市场火爆也并不会感到意外,毕竟现如今的……微信会不会被替代?其实很简单,微信是在qq基础上才有今天,只要移动联通电信合伙推出个类似app,手机号码自动注册,使用可赠送话费,取代微信分分钟的事。或许未来同样会出现一个相对微信更加便捷……教育的本质是什么?今天我们从两个话题出发,为你提供知识服务。一是百度发布新款无人驾驶车,二是程序员日即将到来。我们来看看从这些话题当中,能学到点啥知识。本周,自动驾驶领域有一条值得关注的消……小米MIX5Pro搭载超大奥利奥镜头徕卡调校去年年底,小米推出了小米12、小米12Pro、小米12X三款机型,不过正如传闻所显示的,超大杯的小米12Ultra遗憾缺席了本次发布会。而根据相关爆料,这款超大杯旗舰只是暂时缺……大跌!游戏风波何时停止?多家上市公司发声中新经纬2月22日电(吴晓薇)停发游戏版号的余波仍未消除。21日,雪球平台一用户发布消息称,腾讯将被重锤。随后引发市场恐慌,港股游戏股21日走弱,截至收盘腾讯控股跌5。2……
我的痘痘是怎么好的?还不是馨漫之舍的功劳从上学的时候就开始长痘痘,所以一直很讨厌痘痘,最终我还是战胜了痘痘,现在脸上干净白嫩,终于可以自信满满的出门了。很久的时间我因为脸上的痘痘太多,都不爱出门,独自在家的感受真的很……白敬亭天盛长歌挑战女装look初识世故人情终落泪星关系8月31日讯由沈严、刘海波联合执导,陈坤、倪妮、赵立新、倪大红、袁弘领衔主演,王鸥、白敬亭等主演的电视剧《天盛长歌》在湖南卫视金鹰独播剧场持续热播,并在爱奇艺、芒果TV全……演精分角色上瘾?徐海乔夜天子又演了两个人星关系8月31日讯近日,由徐海乔主演的古装剧《夜天子》正在火热播出中。徐海乔饰演的男主角叶小天,无论是机智过人的头脑还是勇敢无畏的作风,都分分钟圈粉无数。不过在最新的剧情中,竟……张铭恩沙海剧情白热化网友有颜又会演星关系8月31日讯由南派三叔同名小说改编,张铭恩搭档吴磊、秦昊、杨蓉等主演的现代探险题材电视剧《沙海》持续热播中。随着更新,剧情已进入白热化阶段,张铭恩饰演的张日山不仅带动了剧……马元那座城这家人再遇亡妻角色共情大展演技星关系12月18日讯近日,由邵警辉执导,陶陶编剧,马元、童蕾、萨日娜、李建义、吴迪、张雅蓓、王昱超等人联袂出演的暖冬治愈情怀钜制《那座城这家人》,正在湖南卫视金鹰独播剧场热播中……马元那座城这家人眼技十足谈角色解读苦难与坚韧星关系12月17日讯由马元、童蕾、萨日娜、李建义、吴迪、张雅蓓、王昱超等实力演员联袂出演,邵警辉执导,陶陶编剧的暖冬治愈情怀钜制《那座城这家人》,目前正在湖南卫视金鹰独播剧场热……景甜火王走心诠释奉剑获赞古装收官现代再会星关系12月18日讯由景甜、陈柏霖领衔主演的《火王之破晓之战》将于今晚正式收官,该剧自播出以来,收视喜人,市场份额表现亮眼,在网络上引发热议。剧中景甜饰演的司徒奉剑在得知修复炎……新大陆NLSDP工业手持终端的优势新大陆NLSN7DP工业手持终端面向工业领域的同企业级DPM扫描终端,支持可变光源,丰富的照明系统和新一代工业解码算法,对镭雕、打点等直接元件表示(DPM)条码都具有好大的解码……BTV跨年首发阵容引期待幸运锦鲤贺新年星关系12月17日讯距离2019年的到来已不足一个月,北京卫视跨年晚会正在如火如荼的筹备中。据悉,此次北京卫视跨年晚会邀请30多位明星嘉宾助阵,近日最新公布首批嘉宾名单为ONE……秦昊电视剧江河水今日开播正气浩荡上演阔斧改革路星关系12月14日讯由李小亭执导,秦昊领衔,郭涛、阚清子等演员共同主演的都市年度大剧《江河水》将于今晚19:30在江苏卫视幸福剧场开播。该剧改编自杜卫东、周新京的同名小说,讲述……马元那座城这家人遭遇矿难较真演戏两日未卸妆星关系12月113日讯演员马元最新作品,暖冬治愈情怀钜制《那座城这家人》,于湖南卫视金鹰独播剧场热播出正酣,该剧由马元、童蕾、萨日娜、李建义、吴迪、张雅蓓、王昱超等实力演员联袂……侯明昊人不彪悍枉少年持续热播彪式暖男惹人爱星关系12月13日讯由企鹅影视、耀客传媒联合出品,侯明昊、万鹏、张耀、代露娃、李明德主演的青春校园剧《人不彪悍枉少年》正在腾讯视频热播,该剧根据天涯社帖子衍生的同名小说改编,以……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网