zfanji / mfunhcu

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BXXH项目文件说明
==============
Make By:ZJL
2016/02/23 Update By:LZH

##说明 
**这里的文档可以让你更好的了解`MFUN`项目,更好的使用。 **

**欢迎对文档内容进行补充,把`MFUN`项目变得更清晰易懂。**

##为你的github生成wiki
**如果你在github上fork了`MFUN`项目,而且想为项目生成wiki,可以用这里的文件来生成。**


###文件内容说明:
</wechat根目录下>
 ->cloud_callback,做为第三方云的后台入口
 ->index,mFun欢迎进入页面, 测试用没有实际用处
 ->README,本文件
 ->config.yaml,SAE Cron应用服务配置

\bi Business “Intelligence目录”
 ->bi_db.class,BI数据库交互接口
 ->bi_service.class,BI业务逻辑处理

\config “配置目录”
 ->config,定义项目所用到的全局参数
 ->errCode,辅助wechat.class,成为其SDK的一部分

\database “数据库API目录”
 ->db_common.class, 定义跨平台的公共数据库操作相关的API
 ->db_emc.class, 定义用于EMC数据库操作相关的API
 ->db_humidity.class,定义用于湿度数据库操作相关的API
 ->db_noise.class,定义用于噪声数据库操作相关的API
 ->db_pmdata.class,定义用于颗粒物PM2.5数据库操作相关的API
 ->db_temperature.class,定义用于温度数据库操作相关的API
 ->db_video.class,定义用于视频数据库操作相关的API
 ->db_weixin.class,定义用于微信数据库操作相关的API
 ->db_winddirection.class,定义用于风向数据库操作相关的API
 ->db_windspeed.class,定义用于风速数据库操作相关的API

\hcutool "HCU工具目录"
 ->gethint,界面提示信息
 ->hcu_ctrl.index,HCU控制界面
 ->hcu_ctrl.process,HCU控制界面处理API

\jsp,“微信客户端Java界面目录 (主要由ZSC维护)”

\oam  “操作维护工具目录”
 ->DbTest,database临时测试程序
 ->index,微信工具界面
 ->qrcode.png,二维码生成临时图像文件
 ->tool.ajxhisdata,用于被tool.pageshare.php调用的后台历史数据访问php程序
 ->tool.create.menu,后台强制创建菜单
 ->tool.dev.bind,后台强制绑定用户
 ->tool.pageshare,测试页面共享以及JSSDK功能
 ->tool,测试工具角色,可以写测试脚本,进行在线测试
 ->tool.qrcode.gen,受控index.php页面的二维码自动生成程序

\sdk “底层基础SDK”
 ->\phpqrcode,二维码生成SDK目录
 ->hcu_iot.class,HCU互操作SDK,
 ->wechat.class,基础公号的SDK,SAE后台处理response入口
 ->wx_iot.class,IHU硬件设备微信公众号处理
 ->wx_jssdk,JSSDK类封装

\service “主要业务逻辑目录”
 ->common.class, 公共业务逻辑处理,如心跳,时间同步,版本等
 ->emc.class,电磁辐射业务逻辑处理
 ->humidity.class,湿度业务逻辑处理
 ->noise.class,噪声业务逻辑处理
 ->pmdata.class,空气颗粒物业务逻辑处理
 ->temperature.class,温度业务逻辑处理
 ->video.class,视频业务逻辑处理
 ->winddirection.class,风向业务逻辑处理
 ->windspeed.class,风速业务逻辑处理

###SAE运行或部署步骤:
1. 配置Config.php运行环境参数
2. 打包本项目成*.zip文件
3. 上传到SAE云
4. 导出导入MySql数据库
5. 在微信接入第三方云界面,确认微信接口URL的Token验证通过
6. 在后台管理TOOL界面,确认API接口Token刷新机制工作正常

##生成page
**你也可以将wiki文档,生成为个人站点,会更加直观。**
**比如使用 Hexo 或者其他的框架之类。**
**这块的话,请自行搜索相关资料。**

//= ZJL, 2016 June.20, CURRENT_SW_DELIVERY R02.D12
> 准备对整个项目工程进行较大的改动,改动的目的主要有几个:1)明晰的架构 2)方便可扩展性 3)多人协同工作更加方便 4)适应多个项目并存 5)模块的复用性
> 程序架构演进的第一步是目录结构,第二步是VM机制
> 修改所有的数据库命名
> 修改所有的L1-L5程序目录和目录名字
> 修改程序VM层,将不同内容分开放置
> 将系统模块定义为CLASS,名字空间全局唯一
> 定义各种CLASS的命名规则
> 搭建msg_send和msg_rcv的框架,思考其CLASS相互之间调用的关系以及生命周期
> 考虑程序被调用的入口方式问题
> 将所有的全局常量全部命名成为MFUN_XXX,以便减少潜在的重名错误,同时让命名具备更加明确的意义
> 修改所有CLASS和DBI的命名
> 增加所有任务模块的入口
> 框架基本搭建完成,还需要完善消息发送和处理方式
> 二次包含vmlayer.php出现告警全部消除,所有的包含都放在VM中,其它任务模块不再包含了VMLAYER了
> 搭建好了IOT_HCU对应传感器的所有任务框架
> 修改好了SDK_WECHAT
> IOT_WX还未修改完整,
  =>ihu_device_L25_content_process:发送到EMC/PM25的L3/L4处理信息,需要到SENSOR EMC/PM25处理完整,
  不再回来,目前的流程需要在L3/L4完成一部分后,再返回IOT_WX程序模块再处理。这部分等待完善。
  =>ihu_device_L28_usercmd_text_process:同上

//= ZJL, 2016 June.29, CURRENT_SW_DELIVERY R02.D13
> 增加AQYC/TBSWR/EMCWX的H5YUI界面入口,先考虑将界面模块纳入到统一的VM处理模块机制中,包括CRON模块
> IOT_WX修改好了,支持气象6参数以及相应的任务模块
> 扩展系统消息到DATA_READ_INSTANT以及DATA_REPORT_TIMING,以支持所有的瞬时读取和定时发送模式。L2SNR传感器框架改好以支持。
> 搭建后台数据库分库的雏形,BXXH分为bxxhl1l2l3, bxxhl4aqyc, bxxhl4tbswr, bxxhl4emcwx, bxxhl5bi等不同数据库
> 最复杂的AQYC界面对应的数据库也分开了,但可能有潜在的问题,需要再测试和调整
> 数据库文件分别保存备份了

//= ZJL, 2016 June.29, CURRENT_SW_DELIVERY R02.D14
> 研究图像文件的存储,经过验证,图片二进制文件的存储和读取,均成功!

//= Multi author, 2016 June30, CURRENT_SW_DELIVERY R02.D15
> 数据表单访问单一原则:同一个表单,只能在一个地方撰写相应的DBI接口API函数,如果其他任务模块需要用到,则需要通过调用相应API函数达成,
而非直接访问该数据库,以便减少数据表单修改而导致多个地方修改的问题
> 基于这个思路,l4aqycui中的dbi_xxx需要较多修改,基于几个诉求:
  = 本文件太大,不利于多人并行开发工作
  = 同一个CLASS,集成了访问多个数据库和数据表单的API,不适合于表单API单一原则
  = 希望该项目是基于大模块机制,以便提高复用性以及简单性
  = 数据生成功能需要移到l3appl中,界面项目只完成接口的任务,从而简化整个项目
> 数据表单命名大调整
> 其它L2SNR传感器在数据库以及DBI访问函数,均创建了基本的功能

//= Multi author, 2016 July.1, CURRENT_SW_DELIVERY R02.D16
> 临时修复L4AQYC的REQUEST.php,让其可以使用,等待将其结构转换为不同功能的VM机制

//= LZH, 2016 July.3, CURRENT_SW_DELIVERY R02.D17
> 合并调试最新UI模块

//= ZJL, 2016 July.4, CURRENT_SW_DELIVERY R02.D18
> 继续完善L4AQYC UI的VM
> 将L4AQYC UI任务全部改造为VM机制
> Requet.php改造为入口函数,同时调用L1_MAIN_ENTRY中的AQYC_UI入口,从而将所有入口全部排到一个层次
> 试图增加SOCKET LISTENING的入口,待完善

//= ZJL, 2016 July.5, CURRENT_SW_DELIVERY R02.D19
> CRON增加到VM任务中,同时支持1-10级不同的时间颗粒度
> SOCKET LISTENING任务增加到VM中,处理函数挂载到onReceive事件中
> 这两项执行任务需要通过Linux/VPS的服务配置来启动,而不是通过appach来启动的,这个要特别注意。
> 本来打算支持的RabbitMQ也是类似机理,考虑到其使用的复杂性,暂时没用,未来一旦需要支持超过1M的连接,就需要了
> 建立JD/APPLE入口的框架
> 逐步建立L2SENSOR中的工程参数配置,减少直接数据常量定义

//= ZJL, 2016 July.6, CURRENT_SW_DELIVERY R02.D20
> 给Logger数据条目增加版本属性,以便及时分析是在哪个版本下出现的问题
> 增加TRACE机制,方便调试
> 修正L2SNR_MINREPORT数据表单中$result=inqury的结果==FALSE的潜在性错误
> 完善消息定义中的自动编码,解放了每次需要手动调整数值的过程

//= ZJL, 2016 July.6, CURRENT_SW_DELIVERY R02.D21
> 工参数据表单的初步框架
> AQYC的开机图片等信息将存入到系统工参配置数据表单中
> 初步搭建完成F1到FX的数据DBI框架

//= ZJL, 2016 July.7, CURRENT_SW_DELIVERY R02.D22
> 完善项目+logfrom的完整标识
> 扩展更加丰富支持的协议标准,到APPLE/JD的程序框架
> ZHB的解码需要进一步完善,目前还非常不完善
> Log功能再完善,可以开始恢复后台管理界面及相应LOG工具了
> 给L4AQYC制作完整的TEST CASES,发现9个遗留问题
> 给CRON增加自动化测试,待完善程序执行细节
> 试图给EMCWX增加自动化测试集,欠缺完善的测试数据
> SOCKET只有在AQ_HCU环境下才能测试,待完善

//= ZJL, 2016 July.7, CURRENT_SW_DELIVERY R02.D23
> 完善EMCWX测试例程
> 将commsg.php中的全局定义分为IHU/HCU两个不同的类别
> 增加NBIOT的基础框架功能

//= ZJL, 2016 July.8, CURRENT_SW_DELIVERY R02.D24
> 增加sysinfo数据表单
> 完善WECHAT之中部分函数的命名,以方便理解程序结构
> 完善整个NBIOT的程序架构以及相应的命名规则,以便后期扩展更加方便和准确
> 排比句,创出框架LTE-V车联网,IGM煤气表以及农业AGC,暂时没创其UI部分

//= ZJL, 2016 July.10, CURRENT_SW_DELIVERY R02.D25
> 完善常亮命名的丰富性和一致性
> IPM376架构搭建完成

//= ZJL, 2016 July.11, CURRENT_SW_DELIVERY R02.D26
> 构建IPM376的解码功能
> 构建CJ188规范的对应程序框架,以支持水表、煤气表、电表等内容

//= ZJL, 2016 July.13, CURRENT_SW_DELIVERY R02.D27
> 增加AQYC程序升级的接口,以及相应的处理函数功能,还有待完善管理模块对软件版本的后天管理,以及用户界面对程序升级的触发
> 增加相应的SW UPDATE测试程序
> 继续完善CJ188编解码

//= LZH, 2016 July.13, CURRENT_SW_DELIVERY R02.D28
> 增加最新手机界面UI功能支持,界面十大功能框架
> 继续完善CJ188功能

//= ZJL, 2016 July.15, CURRENT_SW_DELIVERY R02.D29
> IPM376改造为完善的STD_QG376规范,跟IPM不再保持唯一的映射关系
> 完善CJ188功能框架,完成上行解码链路的工作
> QL:单独创建了一个给Yii2使用的数据库,从而不再跟本数据库相混淆
> 继续测试代码:UL的测试代码完成

//= LZH, 2016 July.15, CURRENT_SW_DELIVERY R02.D30
> fix UI界面bug,所有修改框架前的界面功能回归测试OK

//= ZJL, 2016 July.16, CURRENT_SW_DELIVERY R02.D31
> 继续下行链路CJ188的编制
> 下行链路的功能部分完成,CJ188 SDK还等待完成

//= ZJL, 2016 July.18, CURRENT_SW_DELIVERY R02.D32
> DL测试代码完成
> 上行链路增加了写入过程
> 新增加的上行链路中测试代码也完善

//= ZJL, 2016 July.18, CURRENT_SW_DELIVERY R02.D33
> 下行DL代码的SDK
> SDK DL全部完善好,测试脚本验证好,输出码流正常
> CJ188服务器一侧的,算是全部完成了
> Bug fix on L2SDK NBIOT dbi functions.

//= LZH, 2016 July.21, CURRENT_SW_DELIVERY R02.D34
> UI界面增加视频播放和软件下载功能
> 视频播放功能测试代码完善,输出正确
> ZJL: 修正apach中报出的几个小错误

//= LZH, 2016 July.25, CURRENT_SW_DELIVERY R02.D35
> UI界面增加仪表反控功能
> 修改数据库swfactory和hwinventory表单,完善软件下载功能

//= LZH, 2016 Aug.04, CURRENT_SW_DELIVERY R02.D36
> 修改新框架下微信配置提交不成功的bug,新框架下微信配置cloud_callback_wechat提交成功
> 修改AQYC界面上查询结果为空时返回false导致页面无效,退回登录界面的不合理操作
> 修改微信EMC_READ click事件发送消息没有构造的bug
> 修改微信菜单

//= LZH, 2016 Aug.09, CURRENT_SW_DELIVERY R02.D37
> 修改微信菜单
> 爱启扬尘UI采用JS编译文件,去掉了路径依赖,可以部署在WWW下任意路径

//= LZH, 2016 Aug.11, CURRENT_SW_DELIVERY R02.D38
> 增加小慧云支持(http://121.40.118.33)

//= LZH, 2016 Aug.23, CURRENT_SW_DELIVERY R02.D39
> 增加小慧智能服务号支持,服务号和测试号分别创建新菜单
> EMC微信H5页面支持

//= LZH, 2016 Aug.30, CURRENT_SW_DELIVERY R02.D40
> 修改EMC微信H5界面功能使用新架构
> 使用服务号微信公众平台开发 OAuth2.0网页授权认证, EMC微信H5网页授权获取用户基本信息(openid)

//= LZH, 2016 Sep.04, CURRENT_SW_DELIVERY R02.D41
> 修改EMC微信测试号菜单,增加生产工具的扫码绑定功能
> 完善EMCWX测试case

//= QL, 2016 Sep.12, CURRENT_SW_DELIVERY R02.D42
> Socket功能增加,实现PM25操控
> GetCameraStatus功能的消息和相应函数增加

//= QL, 2016 Sep.13, CURRENT_SW_DELIVERY R02.D43
> Socket只设置heartbeat_idle_time,未设置heartbeat_check_interval,底层将不会创建心跳检测线程,PHP代码中未来可以调用heartbeat方法手工处理超时的连接

//= QL, 2016 Sep.14, CURRENT_SW_DELIVERY R02.D44
> 改变原先require特定文件开启9502socket端口的做法,增加socket_client_sync.class类开启阻塞式tcp连接,目前先发后收,实现UI参数传递,
> swoole server开启demonize参数,运行日志记录到log文件

//= QL, 2016 Sep.19, CURRENT_SW_DELIVERY R02.D45
> socket心跳重新开启,60秒遍历所有连接,600秒内没有传送,关闭连接
> swoole server关闭demonize参数,利用crontab脚本来守护进程

//= LZH, 2016 Sep.19, CURRENT_SW_DELIVERY R02.D46
> 修改微信公众号菜单,完善EMC网页显示功能
> 完善扫描绑定功能,增加相应WXEMC测试case

//= LZH, 2016 Oct.02, CURRENT_SW_DELIVERY R02.D47
> 完善小慧智能服务号菜单以及EMC H5功能
> 增加智能云锁任务

//= LZH, 2016 Oct.07, CURRENT_SW_DELIVERY R02.D48
> l4oamtool增加批量导入MAC,deviceID功能

//= QL, 2016 Oct.15, CURRENT_SW_DELIVERY R02.D49
> draft tbswr module done with draft test case passed

//= LZH, 2016 Oct.26, CURRENT_SW_DELIVERY R02.D50
> 清理代码,去掉表t_l3f3dm_sitemapping和表t_l3f2cm_projmapping
> 修改数据表单的属性,将可以为空的字段设置成NULL
> 数据库增加云控制锁项目表单

//= LZH, 2016 Oct.29, CURRENT_SW_DELIVERY R03.D01
> 添加云控锁项目

//= LZH, 2016 Nov.05, CURRENT_SW_DELIVERY R03.D02
> 添加云控锁接口消息,全局量定义
> 将l1comvm中全局消息常量按照工程重新组合
> 清除testcase中的告警,现在除了需要用到swoole_client的case,本地windows环境测试无法运行外,所有case运行正常

//= LZH, 2016 Nov.07, CURRENT_SW_DELIVERY R03.D03
> 创建云控锁所有l2sensorproc任务并添加相应消息

//= LZH, 2016 Nov.13, CURRENT_SW_DELIVERY R03.D04
> 完成云控锁所有与下位机的接口消息
> 添加云控锁UI界面的钥匙管理功能

//= LZH, 2016 Dec.02, CURRENT_SW_DELIVERY R03.D05
> FHYS功能完善,第一个deliver现场版本
> 增加BFSC波峰组合秤项目

//= LZH, 2016 Dec.11, CURRENT_SW_DELIVERY R03.D06
> FHYS UI和后台MFUNHCU采用统一新消息结构定义
> 登录功能调试OK,其他接口还在测试中,改动比较大,先git上传一次

//= LZH, 2016 Dec.13, CURRENT_SW_DELIVERY R03.D07
> FHYS UI和后台MFUNHCU新消息结构测试完成

//= LZH, 2016 Dec.16, CURRENT_SW_DELIVERY R03.D08
> AQYC UI和后台MFUNHCU新消息结构测试完成
> 修改视频和摄像头控制处理

//= LZH, 2016 Dec.27, CURRENT_SW_DELIVERY R03.D09
> 添加FHYS微信开锁界面
> 调整t_l3f2cm_projinfo和t_l3f3dm_siteinfo表单,使项目和站点1对多映射逻辑更合理

//= QL, 2017 Jan.5, CURRENT_SW_DELIVERY R03.D10
> 增加hcu performance性能统计功能

//= QL, 2017 Jan.11, CURRENT_SW_DELIVERY R03.D11
> 增加hcu alarm data上报功能

//= QL, 2017 Jan.13, CURRENT_SW_DELIVERY R03.D12
> 丰富hcu inventory data上报功能,增加db version字段的存入,增加mac地址的传递
> 关于mac地址和hcu name之间的匹配逻辑,后续待讨论和完善

//= LZH, 2017 Feb.05, CURRENT_SW_DELIVERY R03.D13
> FHYS第二版调试,增加4C聚合状态报告
> AQYC UI功能完善
> 增加HUITP协议消息定义

//= QL, 2017 Feb.14, CURRENT_SW_DELIVERY R03.D14
> 增加对于alarm消息的解析,根据PM25阀值触发录像开启、关闭,拍摄照片,并回传参数

//= LZH, 2017 Feb.21, CURRENT_SW_DELIVERY R03.D15
> FHYS功能完善,增加微信开锁,蓝牙开锁和RFID开锁功能,增加告警处理功能
> AQYC根据客户反馈UI功能完善

//= LZH, 2017 Mar.19, CURRENT_SW_DELIVERY R03.D16
> FHYS功能完善,修复微信开锁bug,socket listening bug
> 增加HUITP消息,IE字典,完善HUITP消息解码功能,测试OK

//= LZH, 2017 Apr.08, CURRENT_SW_DELIVERY R03.D17
> 增加FHYS常用站点功能
> 更新FHYS状态报告消息,增加锁未安装状态
> 添加FHYS蓝牙钥匙自动生成功能

//= LZH, 2017 May.26, CURRENT_SW_DELIVERY R03.D18
> 增加短信密码找回功能,增加告警短信通知功能
> 修改用户权限管理,用户登录后只能看到自己授权的项目,站点,设备等
> 根据阜华和爱启用户的反馈,完善FHYS和AQYC界面

//= LZH, 2017 June.12, CURRENT_SW_DELIVERY R03.D19
> 更新FHYS短信平台,修改用户权限分类
> 修改FHYS开锁抓拍照片处理流程,开站上传照片和开锁抓拍照片分开显示
> 更新AQYC登录界面,highchart,视频跳转,站点地图跳转等


//待完善的功能
1. dbi_devinfo_update()需要修改,添加设备时预计结束时间和实际结束时间应该在项目信息里
2. 添加设备时没有选择该设备装配了那些传感器,sensorctrl表没有更新

//已知的潜在错误
1. task_l2sdk_iot_hcu.class.php, line108,引用父进程的函数指针,编译器发现潜在错误,如何消除? 目前执行都很正常,但是程序代码不好看
2. l3appl->fxyyy中,调用_encode函数出错,如何办?
    //$jsonencode = _encode($retval);
    $jsonencode = json_encode($retval, JSON_UNESCAPED_UNICODE);


/**************************************************************************************
*  架构描述                                                                           *
**************************************************************************************/
==> NBIOT_IPM376: 整个设计是以NBIOT_IPM376为基础,主要是为了电力系统中协议376的编解码
==> NBIOT_IPM_UI: 模拟后台对NBIOT的模块进行操作,包括主动读取电表数据的菜单项
==> 物联网模块的后台接入,以及手机终端APP的查询,造成后台将会有2个程序入口
==> 目前所有的不同系统都是这种架构
==> 当前暂时支持的程序架构有:电磁辐射项目,爱启扬尘项目,陶波水污染项目,窄带物联网电表项目
==> 特殊缩写代表的含义:IPM智能电表,IGM智能气表,LTEV车联网,AGC农业物联网,IWM智能水表。SDK已经创建完成,但对应的UI并没有全部创建,需要等待具体的业务需求。

==> 有关PROGRAM / PLATFORM / POROJECT之间的关系
    //定义技术平台,用于SDK在相互之间调用以及SDK调用不同的SENSOR任务时的一种技术性交换矩阵,以节省代码的重复性
    //技术平台本身没有任何意义,它纯粹从实用性角度,人为的给调用函数提供了一种方便性的区分而已
    //技术平台+PROJECT构成了函数调用的两个灵活区分,这两者的应用由于历史的缘故,在使用规则上和概念上,并没有严格的区分,全拼调用者的喜好
    //PROGRAM是更为高层的概念,原则上我们可以认为,PROGRAM > PLATFORM > PROJECT




/*
https://segmentfault.com/a/1190000002963223
http://blog.haohtml.com/archives/15484
http://blog.csdn.net/lmj623565791/article/details/37607165
http://pecl.php.net/package/amqp
http://blog.haohtml.com/archives/15491
http://stackoverflow.com/questions/13776164/connect-to-rabbitmq-from-php-windows
http://www.th7.cn/Program/php/201410/297470.shtml

消息的处理,是有两种方式:
A,一次性。用 $q->get([...]),不管取到取不到消息都会立即返回,一般情况下使用轮询处理消息队列就要用这种方式;
B,阻塞。用 $q->consum( callback, [...] ) 程序会进入持续侦听状态,每收到一个消息就会调用callback指定的函数一次,直到某个callback函数返回FALSE才结束。
关于callback,这里多说几句: PHP的call_back是支持使用数组的,比如: $c = new MyClass(); $c->counter = 100; $q->consume( array($c,'myfunc') ) 这样就可以调用自己写的处理类。MyClass中myfunc的参数定义,与上例中processMessage一样就行。
在上述示例中,使用的$routingkey = '', 意味着接收全部的消息。我们可以将其改为 $routingkey = 'key_1',可以看到结果中仅有设置routingkey为key_1的内容了。
注意: routingkey = 'key_1' 与 routingkey = 'key_2' 是两个不同的队列。假设: client1 与 client2 都连接到 key_1 的队列上,一个消息被client1处理之后,就不会被client2处理。而 routingkey = '' 是另类,client_all绑定到 '' 上,将消息全都处理后,client1和client2上也就没有消息了。
在程序设计上,需要规划好exchange的名称,以及如何使用key区分开不同类型的标记,在消息产生的地方插入发送消息代码。后端处理,可以针对每一个key启动一个或多个client,以提高消息处理的实时性。如何使用PHP进行多线程的消息处理,将在下一节中讲述。
更多消息模型,可以参考: http://www.rabbitmq.com/tutorials/tutorial-two-python.html

public function mfun_l1vm_msg_send($msg)
{
//配置信息
$conn_args = array(
'host' => MFUN_MQ_RABBIT_HOST,
'port' => MFUN_MQ_RABBIT_PORT,
'login' => MFUN_MQ_RABBIT_LOGIN,
'password' => MFUN_MQ_RABBIT_PSWD,
'vhost'=> MFUN_MQ_RABBIT_VHOST);
//$e_name = 'e_linvo'; //交换机名
//$q_name = 'q_linvo'; //无需队列名
//$k_route = 'key_1'; //路由key

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

//消息内容
//$message = "TEST MESSAGE! 测试消息!";
$message = $msg;

//创建交换机对象
$ex = new AMQPExchange($channel);
$ex->setName(MFUN_MQ_RABBIT_EXCHANGE);

//发送消息
$channel->startTransaction(); //开始事务
for($i=0; $i<5; ++$i){
echo "Send Message:".$ex->publish($message, MFUN_MQ_RABBIT_EXCHANGE)."\n";
}
$channel->commitTransaction(); //提交事务
$conn->disconnect();
}

public function mfun_l1vm_msg_rcv()
{
//配置信息
$conn_args = array(
'host' => MFUN_MQ_RABBIT_HOST,
'port' => MFUN_MQ_RABBIT_PORT,
'login' => MFUN_MQ_RABBIT_LOGIN,
'password' => MFUN_MQ_RABBIT_PSWD,
'vhost'=> MFUN_MQ_RABBIT_VHOST);
//$e_name = 'e_linvo'; //交换机名
//$q_name = 'q_linvo'; //队列名
//$k_route = 'key_1'; //路由key

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName(MFUN_MQ_RABBIT_EXCHANGE);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declare()."\n";

//创建队列
$msgQue = new AMQPQueue($channel);
$msgQue->setName(MFUN_MQ_RABBIT_QUEUE);
$msgQue->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$msgQue->declare()."\n";

//绑定交换机与队列,并指定路由键
echo 'Queue Bind: '.$msgQue->bind(MFUN_MQ_RABBIT_EXCHANGE, MFUN_MQ_RABBIT_ROUTE_KEY)."\n";

//阻塞模式接收消息
echo "Message:\n";
while(True){
$msgQue->consume('processMessage');
$msgQue->consume('processMessage', AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();
}

/**
* 消费回调函数
* 处理消息
*/
/*
function processMessage($envelope, $queue) {
var_dump($envelope->getRoutingKey);
$msg = $envelope->getBody();
echo $msg."\n"; //处理消息
$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答
}


*/

About


Languages

Language:JavaScript 58.8%Language:PHP 30.3%Language:CSS 7.7%Language:HTML 3.2%Language:Shell 0.0%Language:Batchfile 0.0%