-
请问, 下面证书验证失败的问题有谁碰到过么?使用demo代码:Agentlite_LinuxC_Demo.zip环境: hisi35161970-01-01 02:40:07 SCK INF: sock(2) disc lasterr:91970-01-01 02:40:07 HTTP INF: UHttpFsm(2)[1:CONNECTING] run SCK(2) msg(2:TCP_DISC) to [CONNECTING] ok1970-01-01 02:40:07 SCK INF: sock(2) close1970-01-01 02:40:07 TLS INF: tls method use 3, old 01970-01-01 02:40:07 TLS INF: tls use same ctx.1970-01-01 02:40:07 SCK INF: sock(3) HTTP(2) mode:1 type:4 open 192.***.*.120 :364311970-01-01 02:40:07 SCK INF: sock(3) cretls ret:01970-01-01 02:40:07 SCK INF: sock(3) connecting 49.*.**.24 :8943 ret:0 errno:01970-01-01 02:40:07 HTTP INF: UHttpFsm(2)[1:CONNECTING] run TMR(0) msg(1:WAIT_RECONN) to [CONNECTING] ok1970-01-01 02:40:07 SCK INF: sock(2) delete send:0 recv:0 discard:0 scnt:0 rbuf:0 uerr:01970-01-01 02:40:07 TLS ERR: tlsssl shutdown error[1].1970-01-01 02:40:07 SCK INF: sock(2) deltls ret:01970-01-01 02:40:07 SCK INF: sock(3) 49.*.**.24 :8943 preconnect1970-01-01 02:40:07 HTTP INF: UHttpFsm(2)[1:CONNECTING] run SCK(3) msg(0:TCP_ACK) to [CONNECTING] ok1970-01-01 02:40:07 TLS ERR: tlsssl connect error[1] errno[0] e:33****686-error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed1970-01-01 02:40:07 SCK INF: sock(3) disc lasterr:9参考https://bbs.huaweicloud.com/forum/thread-35453-1-1.html, 重新下载证书,问题依旧没有解决常见问题(1)OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failedagentLite 证书校验失败,请检查证书是否配置正确,证书一般是放置在demo中的conf目录下的rootcert.pem 文件,如果该目录下已经存在证书文件,请点击下载更换证书
-
端云互通组件-MQTT开发指南(下)摘要:本文介绍使用野火开发板通过Agent Tiny SDK的端云互通组件,使用MQTT协议快速接入华为云平台。通过平台侧、设备侧的开发以及调测过程来了解经BS接入物联网平台模式的具体流程,希望对你有所帮助。1.介绍SDK简介Agent Tiny是部署在具备广域网能力、对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报和命令接收等功能。Agent Tiny SDK是Huawei Agent Tiny软件开发工具包(Software Development Kit),通过Agent Tiny SDK端云互通组件,简单快速地实现与华为物联网平台安全可靠连接,可以大大减少开发周期,快速构建IoT产品。端云互通组件可以采用MQTT、CoAP和LWM2W协议接入物联网平台。Agent Tiny SDK全景图如图1所示。2. 开发环境2.1硬件需求开发计算机、运行win7及以上操作系统野火开发板STM32F429IG、数据线Jlink下载器、网线、USB转串口2.2软件需求IDE(包括GCC编译器、JDK运行环境、make工具、Jlink驱动、Eclipse)串口工具(QCOM-V1.6)实名认证的华为云账号SDK源码3.接入物联网平台流程根据设备中的接入地址,可以将接入物联网平台分为两种模式:直接接入物联网平台模式通过设备发放服务接入物联网平台模式两种接入方式的对比:直接接入物联网平台示意图通过设备发放服务接入物联网凭条示意图4. 直接接入实例 https://bbs.huaweicloud.com/blogs/1435115. 经BS接入实例本章节以LINUX平台通过以太网经BS接入物联网平台为例,详细讲述接入流程。总体操作流程参考下图. 设备发放服务信息参考下表5.1平台侧开发进入物联网平台,选择设备发放->进入设备发放服务。根据上图,依次在设备发放服务中产品导入->设备导入->发放策略->发放设备。设备导入成功后,记住设备标识(nodeid),设备id(deviceid)和密钥(password),这三个信息主要用于对接华为云时的设备鉴权。具体操作参考如下。进入设备发放平台在物联网平台选择“设备发放”,公测期间需要申请公测权限,可在设备发放页面选择申请公测权限并填写相关信息,申请权限通过后,点击“进入设备发放服务”。导入产品在设备发放服务页面选择“产品导入”->从产品中心导入->选择最后一个源机固定端设备导入设备发放服务页面选择“设备导入”->点击页面右上角“单个导入”->弹出导入设备基本信息配置,产品信息选择上一步导入的产品、设置设备标识码、设备名称、访问方式选择“域名”配置发放策略在设备发放服务页面选择“发放策略”->点击“设备名称筛选”->添加实例->在添加实例配置框内填写关键字,关键字为设备导入中的设备名称、选择发放区域、点击“确定”。发放设备选择“设备仓库”->选择“发放设备”->弹出对话框点击“确定”->立即启动启动后,发放状态为已发放5.2设备侧开发设备侧开发前准备l 下载SDK源码。l 获取接入信息(进入物联网平台,在“设备发放 > 设备引导对接信息”页面查看“接入信息”中的“MQTT接入方式”)l Linux平台(准备好GCC编译环境以及Make工具)上传源码到linux平台源码目录如下修改mk文件参考如下内容,修改targets/LINUX/GCC/config.mk CONFIG_OS_TYPE := "linux" CONFIG_ARCH_CPU_TYPE := "x86-64" CONFIG_SHELL_ENABLE := n CONFIG_STIMER_ENABLE := y CONFIG_DRIVER_ENABLE := n CONFIG_AT_ENABLE := n CONFIG_CJSON_ENABLE := y CONFIG_TCPIP_ENABLE := y CONFIG_TCPIP_TYPE := "linux_socket" CONFIG_DTLS_ENABLE := y CONFIG_DTLS_TYPE := "mbedtls_cert" CONFIG_MQTT_ENABLE := y CONFIG_MQTT_TYPE := "paho_mqtt" CONFIG_OC_MQTT_ENABLE := y CONFIG_OC_MQTT_TYPE := "soft" CONFIG_DEMO_ENABLE := y CONFIG_DEMO_TYPE := "oc_tls_mqtt_bs_demo"### 产品逻辑 ###修改接入信息修改demos/oc_tls_mqtt_bs_demo.c的对接信息 #define BS_SERVER_ADDRESS "iot-bs.cn-north-4.myhuaweicloud.com" //设备发放服务提供的MQTT对接地址 #define BS_SERVER_PORT "8883" //设备发放服务提供的MQTT对接端口 #define DEMO_WITH_BOOTSTRAP_NODEID "mqtt_test_001" //设备发放时导入设备的设备标识码 #define DEMO_WITH_BOOTSTRAP_PASSWORD "ecc8dca5dfe4686bc71b" //设备发放时导入设备成功后提供的密钥make编译生成Huawei_LiteOS.elf运行Huawei_LiteOS.elf5.3调测在设备发放服务中选择“设备仓库”,查看设备的引导状态为“引导成功”登录设备管理服务,选择“设备管理”,进入设备管理服务点击下图左下角图标,选择设备-所有设备,可以看到设备状态为“在线”点击设备名称,进入设备详情页面到此调测完成。
-
端云互通组件-MQTT开发指南(上)摘要:本文介绍使用野火开发板通过Agent Tiny SDK的端云互通组件,使用MQTT协议快速接入华为云平台。通过平台侧、设备侧的开发以及调测过程来了解直接接入物联网平台模式的具体流程,希望对你有所帮助1.介绍SDK简介Agent Tiny是部署在具备广域网能力、对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报和命令接收等功能。Agent Tiny SDK是Huawei Agent Tiny软件开发工具包(Software Development Kit),通过Agent Tiny SDK端云互通组件,简单快速地实现与华为物联网平台安全可靠连接,可以大大减少开发周期,快速构建IoT产品。端云互通组件可以采用MQTT、CoAP和LWM2W协议接入物联网平台。Agent Tiny SDK全景图如图1所示。2. 开发环境2.1硬件需求开发计算机、运行win7及以上操作系统野火开发板STM32F429IG、数据线Jlink下载器、网线、USB转串口2.2软件需求IDE(包括GCC编译器、JDK运行环境、make工具、Jlink驱动、Eclipse)串口工具(QCOM-V1.6)实名认证的华为云账号SDK源码3.接入物联网平台流程根据设备中的接入地址,可以将接入物联网平台分为两种模式:直接接入物联网平台模式通过设备发放服务接入物联网平台模式两种接入方式的对比:直接接入物联网平台示意图通过设备发放服务接入物联网凭条示意图4.直接接入实例下面以野火STM32F429IG开发板通过以太网直接接入物联网平台为例,详细讲述接入流程。总体操作流程参考下图。说明:野火STM32F429IG开发板的详细资料可以从http://www.firebbs.cn/forum.php下载。产品模型参考设备信息参考4.1平台侧开发进入开发中心,根据上图,依次在开发中心中新建项目->新建产品->定义产品模型->注册设备。新建项目选择开发者中心并进入。点击“我的项目”中“+”,创建自己的项目。输入项目信息后点击“确定”。点击“进入项目”。新建产品选择产品开发新建产品,即可跳转到产品模型定义界面。选择自定义产品方式创建产品。补全产品的各类信息,点击“创建”,提示创建成功后点击“确定”,前往产品开发。定义产品模型选择新建服务,开始添加产品的相关特性给产品定义一个属性:batteryLevel,用于设备向平台上报,定义为int型,最大值设置为100,访问模式RWE全部勾选,完成后点击确定;给产品增加一个命令:cmd,设置下发命令属性名称:ioswitch,用于平台向设备发送命令,定义为int型,最大值99。通过上报和下发,构成了我们演示的上行和下行通道。添加完后保存:创建设备创建了产品模型之后,我们需要根据模型创建具体的设备。点击设备管理->添加真实设备,即可进入添加设备界面。进入界面之后,选择我们刚才建立的产品模型“sdk_test_001”,进行设备创建。设备标识(nodeid)是识别该设备的唯一标识符,要求唯一,此处为示范,用户使用时以实际命名为准。此处注意,确认之后自动生成产品设备ID(deviceid)及密钥(password),请记录下设备标识(nodeid)、设备ID(deviceid)及密钥(password),这三个信息主要用于对接华为云时的设备鉴权。创建完毕之后,即可在设备管理中看到刚刚创建的设备,此时设备状态为离线。到此为止,平台侧开发完毕。4.2设备侧开发设备侧开发前准备 下载SDK源码 获取接入信息(进入开发中心的“sdk_test_098”项目中,在“应用 > 对接信息”页面查看“设备接入信息”中的“MQTT接入方式”) 说明:SDK采用的是GCC+MakeFile模式,用户可以根据自己的IDE开发环境灵活适配。修改mk文件集成开发环境搭建好后,修改targets\STM32F429IGTx_FIRE\config.mk CONFIG_OS_TYPE := "liteos" CONFIG_ARCH_CPU_TYPE := "armv7-m" CONFIG_SHELL_ENABLE := y CONFIG_STIMER_ENABLE := y CONFIG_DRIVER_ENABLE := y CONFIG_AT_ENABLE := y CONFIG_CJSON_ENABLE := y CONFIG_TCPIP_ENABLE := y CONFIG_TCPIP_TYPE := "lwip_socket" CONFIG_DTLS_ENABLE := y CONFIG_DTLS_TYPE := "mbedtls_cert" CONFIG_MQTT_ENABLE := y CONFIG_MQTT_TYPE := "paho_mqtt" CONFIG_OC_MQTT_ENABLE := y CONFIG_OC_MQTT_TYPE := "soft" CONFIG_DEMO_ENABLE := y CONFIG_DEMO_TYPE := "oc_tls_mqtt_demo" ### 产品逻辑 ###修改接入信息参考如下内容,修改demos/oc_tls_mqtt_demo.c #define DEFAULT_LIFETIME 10 #define DEFAULT_SERVER_IPV4 "49.4.93.24" //物联网平台MQTT接入地址 #define DEFAULT_SERVER_PORT "8883" //物联网平台MQTT接入端口 #define CN_MQTT_EP_NOTEID "device_001" //平台侧新建的设备标识码 #define CN_MQTT_EP_DEVICEID "c4ef0d27-8ea5-41aa-837f-361cff947601" //平台侧设备创建成功后提供的设备ID #define CN_MQTT_EP_PASSWD "314483483108d92db143" //平台侧设备创建成功后提供的密钥编译运行修改完成,编译然后debug。4.3调测通过串口工具,可以看到设备已经和物联网平台建立连接。登录开发平台->“sdk_test_098”项目 ->设备管理,可以看到我们的设备已经上线,点击调试产品,可以进入我们平台的设备调试界面。可以看到所创建的设备已经上报的数据输入ioswitch值88,点击“发送”。在串口工具可以看到接收到的命令到此调测完成。博文链接:https://bbs.huaweicloud.com/blogs/143511
-
前提条件已完成MQTT协议产品的开发。一、在开发中心导出产品的Profile文件进入开发中心,选择“产品->产品开发”,点击需要转商用的MQTT产品。在该产品开发空间,点击“Profile定义”,然后点击“导出Profile”,导出MQTT产品。本地保存路径自定义。二、在设备管理导入产品的Profile文件进入设备管理服务,在“我的应用”选择需要导入Profile文件的应用,然后点击左下角第一个按钮,进入该应用。选择“产品模型”,鼠标移至右上角的“新增产品模型”,点击“本地导入”。在“手动导入产品”页面,填写产品名称,上传上文导出的Profile文件,然后点击“确定”,完成产品的导入。至此,产品可以在设备管理使用,在产品模型列表,点击“详情”,可以查看产品详情。三、在设备管理注册设备验证产品的能力选择“设备->设备注册”,在“单个注册”页面,点击“创建”。在“单设备注册”页面,填写设备相关信息,产品模型选择上文导入的产品,然后点击“确定”,完成设备注册。使设备上电,并上报一条数据,然后在“设备->所有设备”,点击刚注册的设备,进入“设备详情->设备信息”,查看“最近上报数据”,验证数据是否正确。
-
之前分享了openssl交叉编译方法,现在可以将编译好的openssl动态库使用到paho mqtt中了。P.S.如果系统中已有openssl库,则可以直接使用。是否有安装openssl可以直接在控制台输入openssl命令,如果没有报命令不识别之类的,且出现如下结果就说明已安装了openssl:一、准备工作下载paho.mqtt.c源码,github下载地址:https://github.com/eclipse/paho.mqtt.c解压后上传到linux编译机上将交叉编译工具链也上传解压,并确认交叉编译器所在路径。如果是64位的编译链,还需要确认头文件(sysroot)所在路径 (详细确认方法请参考openssl交叉编译方法的帖子内容)二、修改Makefile主要修改3个地方:交叉编译器路径(准备工作中找到的交叉编译器所在路径)和openssl目录(之前编译好的openssl库所在目录,因为要替换的不只一处,可在文本编辑器中全局搜索openssl再自行替换),如下图所示(点击下图可使用鼠标滚轮放大缩小)如果要增加编译选项,可以加在CFLAGS中(编译选项根据需求添加,可以不添加):上图中增加的编译选项:-Wall -O3 -Wl,-z,relro,-z,now,-z,noexecstack -fno-strict-aliasing -fno-omit-frame-pointer -pipe -Wall -MD -MP -fno-common -freg-struct-return -fno-inline -fno-exceptions -Wfloat-equal -Wshadow -Wformat=2 -Wextra -rdynamic -Wl,-z,relro,-z,noexecstack -fstack-protector-strong -fstrength-reduce -fno-builtin -fsigned-char -ffunction-sections -fdata-sections -Wpointer-arith -Wcast-qual -Waggregate-return -Winline -Wunreachable-code -Wcast-align -Wundef -Wredundant-decls -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs 三、编译出库修改好Makefile后就可以编译了,先make clean一下(把原来的编译结果先清空),再make即可编译完成后可以在build/output目录下看到编译好的库:四、其他说明如果不需要交叉编译工具,而是直接使用gcc,那么修改Makefile时只要修改openssl目录即可(编译选项可加可不加)
-
本代码基于MQTT_AL开启成功的前提,使用MQTT_AL提供的API进行连接测试: 测试代码: ```c #include <osal.h> #include <mqtt_al.h> #include <string.h> #define DEFAULT_LIFETIME 60 #define DEFAULT_SERVER_IPV4 "122.51.89.94" #define DEFAULT_SERVER_PORT 1883 #define CN_MQTT_EP_CLIENTID "emqx-test-001" #define CN_MQTT_EP_USERNAME "mculover666" #define CN_MQTT_EP_PASSWD "123456789" static int task_report_msg_entry(void *args) { int ret = -1; void *handle = NULL; mqtt_al_conpara_t config; mqtt_al_string_t str_temp; /* 配置结构体 */ str_temp.data = DEFAULT_SERVER_IPV4; str_temp.len = sizeof(DEFAULT_SERVER_IPV4); config.serveraddr = str_temp; config.serverport = DEFAULT_SERVER_PORT; config.security = en_mqtt_al_security_none; config.version = en_mqtt_al_version_3_1_0; str_temp.data = CN_MQTT_EP_CLIENTID; str_temp.len = sizeof(CN_MQTT_EP_CLIENTID); config.clientid = str_temp; str_temp.data = CN_MQTT_EP_USERNAME; str_temp.len = sizeof(CN_MQTT_EP_USERNAME); config.user = str_temp; str_temp.data = CN_MQTT_EP_PASSWD; str_temp.len = sizeof(CN_MQTT_EP_PASSWD); config.passwd = str_temp; config.cleansession = 1; config.willmsg = NULL; config.keepalivetime = DEFAULT_LIFETIME; config.timeout = 30; /* 配置并连接服务器 */ handle = mqtt_al_connect(&config); if(handle == NULL) { /* 连接出错 */ printf("config error.\r\n"); return -1; } else { /* 进一步检查服务器返回值 */ if(config.conret != cn_mqtt_al_con_code_ok) { /* 服务器返回值出错 */ printf("server return error, conret = %d.\r\n", config.conret); return -1; } else { printf("connect to server success.\r\n"); } } while(1) { printf("config ok.\r\n"); osal_task_sleep(5*1000); } } int standard_app_demo_main() { /* 创建任务 */ osal_task_create("task_reportmsg",task_report_msg_entry,NULL,0x800,NULL,8); return 0; } ``` # 结果  
-
>本代码仅作分享,关于AT框架、SAL组件、Cjson组件、MQTT组件、mbedtls组件、OC_MQTT组件的讲解及配置详解,请持续关注小熊派官方教程。 本代码基于OC_MQTT_AL开启成功的前提,使用OC_MQTT_AL提供的API进行连接测试: ```c #include <osal.h> #include <oc_mqtt_al.h> #define DEFAULT_LIFETIME 60 #define DEFAULT_SERVER_IPV4 "49.4.93.24" #define DEFAULT_SERVER_PORT "8883" #define CN_MQTT_EP_NOTEID "321321321321" //设备标识码,不是Device ID #define CN_MQTT_EP_PASSWD "4ac51ec23edeb3eb34e4" //设备秘钥 static int task_reportmsg_entry(void *args) { int ret = -1; /* oc_mqtt 连接信息配置结构体 */ oc_mqtt_config_t config; /* 设置连接信息 */ config.boot_mode = en_oc_mqtt_mode_nobs_static_nodeid_hmacsha256_notimecheck_json; config.msg_deal = NULL; config.msg_deal_arg = NULL; config.lifetime = DEFAULT_LIFETIME; config.server_addr = DEFAULT_SERVER_IPV4; config.server_port = DEFAULT_SERVER_PORT; config.id = CN_MQTT_EP_NOTEID; config.pwd= CN_MQTT_EP_PASSWD; config.sec_type = en_mqtt_al_security_cas; /* 配置并对接云平台 */ ret = oc_mqtt_config(&config); if(ret != en_oc_mqtt_err_ok) { printf("config and connect error, ret = %d.\r\n", ret); return -1; } else { printf("config and connect success.\r\n"); } while(1) { printf("config ok.\r\n"); osal_task_sleep(2000); } } int standard_app_demo_main() { osal_task_create("task_reportmsg",task_reportmsg_entry,NULL,0x800,NULL,8); return 0; } ``` 测试结果:  
-
使用 MQTT 协议与平台对接可能出现的问题其实只需要简单理解mqtt的消息订阅发布机制,就能用mqtt的方式和平台对接常见问题(1)OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failedagentLite 证书校验失败,请检查证书是否配置正确,证书一般是放置在demo中的conf目录下的rootcert.pem 文件,如果该目录下已经存在证书文件,请点击下载更换证书(2)我现在使用移远的EC20模块连接贵平台,通过使用MQTT3.1.1协议,那我该以什么方式向贵平台发送证书参考:https://github.com/LiteOS/LiteOS/blob/develop/demos/agenttiny_mqtt/agent_tiny_demo.c(3)请问mqtt可以不使用证书连接平台吗?不可以,平台目前只支持MQTTS接入,原生接口参考:https://support.huaweicloud.com/api-IoT/iot_06_3002.html(4)移远BC2模块使用MQTT协议连接NB-iot平台后,如何使用MQTT的消息订阅和发布功能,以及查看发出的数据订阅设备上报数据的topic(https://support.huaweicloud.com/api-IoT/iot_06_3010.html),往平台发送数据订阅设备接收命令的topic(https://support.huaweicloud.com/api-IoT/iot_06_3011.html),接收平台下发给设备的数据(5)请问,设备接入那块,支持mqtt接入,我用java写了一个mqtt客户端去连接设备接入给我分配的地址和端口,一直连不上这个mqtt服务器,请问是不支持这种做法接入设备吗?还是只能通过设备本身烧写代码接入设备自己写的客户端是可以连接到平台的,一直连不上得看下具体的报错Java 代码示例参考:https://bbs.huaweicloud.com/forum/thread-27358-1-1.html(6)mqtt直连订阅主题,下发命令接收不到,调用设备服务调用接口失败设备想要收到下发的命令,必须订阅设备接收命令的topic(https://support.huaweicloud.com/api-IoT/iot_06_3011.html)调用接口失败,请参考接口返回的错误码和错误描述解决问题(7)物联网平台能支持物联网设备使用MQTT协议接入吗,我看使用MQTT.fx接入时要是用证书,能不用证书的接入吗?参考问题(3)(8)教程文档里存在mqtt接入华为云的方式,但是现在我公司的使用的模组不支持mqtts,只支持mqtt,请问如何使用mqtt接入华为云模组作为客户端连接华为云mqtt服务器,是否是mqtts的连接应该是服务端所决定,参考问题(3)(9)ERROR MqttBase: MqttBase_onConnectFailure() error, messageId 0, code -1, message TCP/TLS connect failure参考问题(1)(10)我用mqtt推送消息到华为云平台消息收到了,但是她没有向我设备的回调接口发送数据问题理解,我用mqtt协议发送数据到平台,然后我设置了回调,数据到达平台的时候应该进入到我设置的回调,告诉我数据发送出去了。最终的问题是,使用mqtt.fx模拟器发送数据,然后订阅推送数据到应用服务器(就是问题所描述的回调)。原因:订阅了设备信息变化(deviceInfoChanged),数据一直收不到,得订阅 设备数据变化(deviceDataChanged)(11)设备通过MQTT连接平台成功后,订阅主题 /huawei/v1/devices/c9c645c9-56a2-4d2b-a299-40d4aeb2e537/command/json,但是平台给该设备发送命令,设备没有收到消息,可能是什么原因?可以直接调接口 设备服务调用(https://support.huaweicloud.com/api-IoT/iot_06_0052.html) 给mqtt设备下发命令就能收到命令了(12)使用paho mqtt模拟设备上报数据,代码如下:xxx 最终报证书错误。请问改如何在Python中设置证书?Python示例:https://bbs.huaweicloud.com/forum/thread-27362-1-1.html(13)我已经用MQTT.fx模拟接入了Iot平台,并实现了数据上报到平台。请问怎样能从平台上下发数据给MQTT.fx?我订阅了/huawei/v1/devices/{deviceId}/command/json这个topic,但不知道怎样从平台把数据下发到设备端,谢谢!参考问题(11)(14)使用MQTT方式连接物联网平台,必须加载ca证书才能连接上华为云,但是我看平台支持MQTT(S),不知道是怎么才能MQTT连接(不用加载CA证书)必须得加证书,参考 https://support.huaweicloud.com/api-IoT/iot_06_3009.html(15)原生MQTT接口连接,控制台总是报无效客户机标识经排查代码,发现心跳时间要设置30s以上,即options.setKeepAliveInterval(30);这个值 改为30以上(16)1、通过原生MQTT协议接入平台,能否提供不带证书的方案?像阿里云,onnet云都有不带证书的模式连接。2、是否支持多主题订阅发送。目前都是需要带证书的上报数据的主题就一个(17)使用模拟器快速体验(MQTT设备),按照文档指示:应用对接IP地址,填写从设备接入服务从管理控制台 获取的应用对接IP地址。但进入管理控制台,并未看到对应的IP,我尝试使用ping 对应的域名获取IP,填入依然连接失败。设备连接应该使用 设备对接信息中的IP,且是8943和8843对应的IP地址(18)设备管理服务采用MQTT协议接入,消息格数为二进制码流 模拟设备调试可以成功 问真实设备怎么调试,是否支持二进制码流mqtt一般来说上去的数据都是json,推荐直接以json的形式上报;如果报二进制的话topic中的codecMode要变成 binary,上报的消息要转成binary上报可以参考java demo 示例未完持续更新。。。有关于 MQTT 的问题欢迎补充!!!
-
说明: 用原生MQTT连接鉴权(https://support.huaweicloud.com/api-IoT/iot_06_3009.html)的时候要构建Password, 好多同学不知道这个Password如何生成,下面列举几种方法,其实是归纳已经存在的方法,生成正确的Password1. 使用MQTT模拟器该模拟器当前仅支持 JDK10及以下版本,这个模拟器不用直接填写Password,只需要填写设备ID(deviceID)和设备密钥(secret),Password由模拟器内部自己实现,即可建立连接使设备在线文档参考地址:https://support.huaweicloud.com/qs-iothub/iothub_05_0003.html#section42. MqttClientIdGenerator.jar该模拟器需要本地配置 JDK 环境,填写deviceID(设备ID)和deviceSecret(设备密钥),点击Generate,即可生成需要的 Password文档参考地址:https://support.huaweicloud.com/qs-IoT/iot_05_0005.html#section33. 代码生成Javapublic static String makePwd(String secret, String curTimeStamp) { String passWord = null; try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(curTimeStamp.getBytes(), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] bytes = sha256_HMAC.doFinal(secret.getBytes()); passWord = byteArrayToHexString(bytes); } catch (Exception e) { System.out.println("Error HmacSHA256 ===========" + e.getMessage()); } return passWord;}public static String byteArrayToHexString(byte[] b) { StringBuilder hs = new StringBuilder(); String stmp; for (int n = 0; b != null && n < b.length; n++) { stmp = Integer.toHexString(b[n] & 0XFF); if (stmp.length() == 1) hs.append('0'); hs.append(stmp); } return hs.toString().toLowerCase();}Pythonclass Getpara(): def __init__(self, deviceId, deviceSecret): self.DeviceId = deviceId self.DeviceSecret = deviceSecret def get_para(self): ClientId = self.DeviceId DeviceId = self.DeviceId DeviceSecret = self.DeviceSecret timestamp = time.strftime('%Y%m%d%H', time.localtime(time.time())) # clientID参考API文档拼装 clientId = "".join((ClientId, "_0", "_0", "_", timestamp)) username = DeviceId deviceSecret = DeviceSecret.encode('utf-8') password = hmac.new(timestamp.encode('utf-8'), deviceSecret, digestmod=hashlib.sha256).hexdigest() return clientId, username, password4. 网页工具加密网站:http://tool.oschina.net/encrypt?type=2使用HMACSHA256算法以时间戳为秘钥,对secret进行加密后的值
-
> **说明:阅读该文档之前需要对Mqtt有一定的了解,这里不对Mqtt知识作介绍,对Mqtt的了解请自行搜索学习。主要说明一下用一个简单的Demo样例,实现和IoT平台的对接,上报数据,下发命令等** ### 一、注册设备 #### 1. 开发中心 注册设备 ##### (1)查看产品信息 > 产品信息中的 协议类型 必须为MQTT  ##### (2)注册设备 > 设备管理—>新增真实设备—>选择上面开发好的产品—>接入方式选择 直连  ##### (3)注册设备成功之后需要保存的信息 > 保存设备ID和密钥,利用其构建clientID  #### 2. 设备管理/设备接入 注册设备 ##### (1)查看产品模型 > 进入设备管理界面—>产品模型 > > 如果没有产品模型,可以点击右上角,从产品中心导入或者是本地导入 > > 注意:产品的协议类型必须为MQTT  ##### (2)注册设备 > 进入设备管理界面—>设备—>设备注册—>创建  ##### (3)注册设备成功之后需要保存的信息 > 保存设备ID和密钥,利用其构建clientID  #### 3. 北向接口 注册设备 > 注册设备(密码方式) > > https://support.huaweicloud.com/api-IoT/iot_06_0005.html ### 二、IoT平台提供的原生MQTT接口 > https://support.huaweicloud.com/api-IoT/iot_06_3002.html 本篇文档基于eclipse的paho框架,该框架网上资料较多,可自行百度搜索学习。 - Python 库: paho_mqtt-1.4.0-py3.7.egg-info #### 1.MQTT CONNECT连接鉴权 (1) 主要是证书的配置,ca_certs就是证书的路径 (2) 其他参数的配置请参考源码:) * Python ```python # 连接地址每个局点不一样,比如开发中心是:iot-acc-dev.huaweicloud.com host = "xx.xx.xx.xx" port = 8883 # 注册直连设备的时候返回的设备ID deviceId = "9a57a-***-***-816b3e" # 注册直连设备的时候返回的秘钥 DeviceSecret = "cbd*******3abv" ca_certs = '../rootcert.pem' para = get_para.Getpara(deviceId, DeviceSecret) paras = para.get_para() clientId = paras[0] username = paras[1] password = paras[2] mqtt = mqtt.Client(clientId, clean_session=True) def connect(): # callback mqtt.on_connect = on_connect mqtt.on_disconnect = on_disconnect mqtt.on_publish = on_publish mqtt.on_message = on_message mqtt.username_pw_set(username, password) mqtt.tls_set(ca_certs, cert_reqs=ssl.CERT_NONE) mqtt.connect(host, port, 60) mqtt.loop_forever() ``` #### 2.设备上报数据 > 数据上报就是往平台指定的topic上发布数据 * Python ```python def publish(): pubTopic = "/huawei/v1/devices/" + deviceId + "/data/json" payload = { "msgType": "deviceReq", "data": [ { "serviceId": "Storage", "serviceData": { "storage": "1" } } ] } message = json.dumps(payload) mqtt.publish(pubTopic, message, 1) ``` #### 3.设备接收命令 > 命令接收就是订阅平台指定的topic,平台往该topic发送命令时,设备端就能收到 * Python ```python def subscribe(): subtopic = "/huawei/v1/devices/" + deviceId + "/command/json" mqtt.subscribe(subtopic) def on_message(client, userdata, msg): print("\n===== The command is received from the platform ===== \n", msg.payload.decode("utf-8")) receiveMes= json.loads(msg.payload.decode("utf-8")) mid = receiveMes['mid'] commandRsp(mid) ``` #### 4.设备响应命令 > 1. 应用服务器要需要调用“订阅平台业务数据”API订阅**“commandRsp”**类型的通知后,才能接收到设备对控制命令的应答; > 2. 先订阅topic(**/huawei/v1/devices/{deviceId}/command/{codecMode}**)接收到命令,然后往另外一个topic(**/huawei/v1/devices/{deviceId}/data/{codecMode}**)发数据响应给平台,就视为对这条命令的响应,但是要注意,数据上报和命令响应的topic虽然是相同的,但是他们上报的结构体是有区别的 * Python ```python def commandRsp(mid): RspTopic = "/huawei/v1/devices/" + deviceId + "/data/json" payload = { "msgType": "deviceRsp", "mid": mid, "errcode": 0, "body": { "result": 0 } } message = json.dumps(payload) mqtt.publish(RspTopic, message, 1) ``` #### 5.工具类 > 生成 clientId, username, password ```python class Getpara(): def __init__(self, deviceId, deviceSecret): self.DeviceId = deviceId self.DeviceSecret = deviceSecret def get_para(self): ClientId = self.DeviceId DeviceId = self.DeviceId DeviceSecret = self.DeviceSecret timestamp = time.strftime('%Y%m%d%H', time.localtime(time.time())) # clientID参考API文档拼装 clientId = "".join((ClientId, "_0", "_0", "_", timestamp)) username = DeviceId deviceSecret = DeviceSecret.encode('utf-8') password = hmac.new(timestamp.encode('utf-8'), deviceSecret, digestmod=hashlib.sha256).hexdigest() return clientId, username, password ```
-
> **说明:阅读该文档之前需要对Mqtt有一定的了解,这里不对Mqtt知识作介绍,对Mqtt的了解请自行搜索学习。主要说明一下用一个简单的Demo样例,实现和IoT平台的对接,上报数据,下发命令等** ### 一、注册设备 #### 1. 开发中心 注册设备 ##### (1)查看产品信息 > 产品信息中的 协议类型 必须为MQTT  ##### (2)注册设备 > 设备管理—>新增真实设备—>选择上面开发好的产品—>接入方式选择 直连  ##### (3)注册设备成功之后需要保存的信息 > 保存设备ID和密钥,利用其构建clientID  #### 2. 设备管理/设备接入 注册设备 ##### (1)查看产品模型 > 进入设备管理界面—>产品模型 > > 如果没有产品模型,可以点击右上角,从产品中心导入或者是本地导入 > > 注意:产品的协议类型必须为MQTT  ##### (2)注册设备 > 进入设备管理界面—>设备—>设备注册—>创建  ##### (3)注册设备成功之后需要保存的信息 > 保存设备ID和密钥,利用其构建clientID  #### 3. 北向接口 注册设备 > 注册设备(密码方式) > > https://support.huaweicloud.com/api-IoT/iot_06_0005.html ### 二、IoT平台提供的原生MQTT接口 > https://support.huaweicloud.com/api-IoT/iot_06_3002.html - Java 本篇文档基于eclipse的paho框架,该框架网上资料较多,可自行百度搜索学习。 代码中在Maven依赖上加载: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> ``` 或者直接引用jar包:org.eclipse.paho.client.mqttv3-1.2.0.jar #### 1.MQTT CONNECT连接鉴权 (1) 主要是证书的配置,certFile就是证书的路径 (2) 其他参数的配置请参考源码:) * Java ~~~java private static MqttClient mqttClient; //连接地址每个局点不一样,比如开发中心是:"ssl://iot-acc-dev.huaweicloud.com:8883" private static String url = "ssl://xx.xx.xx.xx:8883"; //注册直连设备的时候返回的设备ID private static String deviceID = "9a57a-***-***-816b3e"; //注册直连设备的时候返回的秘钥 private static String secret = "cbd*******3abv"; private static String curTime = curTimeStamp(); private static String password = makePwd(secret, curTime); //clientID参考API文档拼装 private static String clientId = deviceID + "_0_0_" + curTime; mqttClient = new MqttClient(url, clientId, new MemoryPersistence()); // 设置回调,这里主要写了接收消息之后的响应 mqttClient.setCallback(new MqttCallback() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { String content = new String(message.getPayload(), "utf-8"); System.out.println("收到mqtt消息,topic: " + topic + " ,content: " + content); // 设备响应命令 commandRsp(); } @Override public void deliveryComplete(IMqttDeliveryToken arg0) { System.out.println("mqtt 发送完成!"); } @Override public void connectionLost(Throwable arg0) { System.out.println("mqtt 失去了连接!"); } }); // 连接(MQTT CONNECT连接鉴权) mqttConnection(); // 发布(设备上报数据) publish(); // 订阅(设备接收命令) subscribe(); public static MqttClient mqttConnection() { if (mqttClient != null) { try { MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(true); options.setKeepAliveInterval(20); options.setConnectionTimeout(100); options.setUserName(deviceID); options.setPassword(password.toCharArray()); //证书配置,mqtt.jks是平台提供的证书 String certFile = "../ca.jks"; String certPWD = "IoT@2019"; InputStream stream = new FileInputStream(certFile); SSLContext sslContext = SSLContext.getInstance("TLS"); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(stream, certPWD.toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); TrustManager[] tm = tmf.getTrustManagers(); sslContext.init(null, tm, new SecureRandom()); SocketFactory factory = sslContext.getSocketFactory(); options.setSocketFactory(factory); mqttClient.connect(options); } catch (Exception e) { e.printStackTrace(); } } return mqttClient; } ~~~ #### 2.设备上报数据 > **数据上报就是往平台指定的topic上发布数据** * **Java** ```java public static void publish() { try { String message = "" + "{ \n" + "\"msgType\":\"deviceReq\", \n" + "\"data\": [{ \n"+ "\"serviceId\":\"Storage\", \n" + "\"serviceData\":{\n" + "\"storage\": 22\n" + "}\n" + "}] \n"+ "}"; MqttMessage mqttMessage = new MqttMessage(); mqttMessage.setQos(1); mqttMessage.setPayload(message.getBytes()); String pubTopic = "/huawei/v1/devices/" + deviceID + "/data/json"; mqttClient.publish(pubTopic, mqttMessage, null, null); } catch (Exception e) { e.printStackTrace(); } } ``` #### 3.设备接收命令 > 命令接收就是订阅平台指定的topic,平台往该topic发送命令时,设备端就能收到 * Java ```java //先订阅平台的topic public static void subscribe() { String subtopic = "/huawei/v1/devices/" + deviceID + "/command/json"; mqttClient.subscribe(subtopic, 1); } // 在回调函数里面重写messageArrived方法,打印收到的消息 @Override public void messageArrived(String topic, MqttMessage message) throws Exception { String content = new String(message.getPayload(), "utf-8"); System.out.println("content:" + content); // 设备响应命令 commandRsp(); } } ``` #### 4.设备响应命令 > 1. 应用服务器要需要调用“订阅平台业务数据”API订阅**“commandRsp”**类型的通知后,才能接收到设备对控制命令的应答; > > 2. 先订阅topic(**/huawei/v1/devices/{deviceId}/command/{codecMode}**)接收到命令,然后往另外一个topic(**/huawei/v1/devices/{deviceId}/data/{codecMode}**)发数据响应给平台,就视为对这条命令的响应,但是要注意,数据上报和命令响应的topic虽然是相同的,但是他们上报的结构体是有区别的 * Java ```java public static void commandRsp() { try { String message = "\n" + "{ \n" + "\"msgType\":\"deviceRsp\", \n" + "\"mid\":1,\n\"errcode\":0, \n"+ "\"body\":{\n" + "\"result\": 0\n" + "}\n" + "}"; MqttMessage mqttMessage = new MqttMessage(); mqttMessage.setQos(1); mqttMessage.setPayload(message.getBytes()); System.out.println("message" + message); String RspTopic = "/huawei/v1/devices/" + deviceID + "/data/json"; mqttClient.publish(RspTopic, mqttMessage, null, null); } catch (Exception e) { e.printStackTrace(); } } ``` #### 5.工具类 > 获取当前时间 ```java public static String curTimeStamp() { String TIMESTAMP_FORMAT = "yyyyMMddHH"; SimpleDateFormat sdf = new SimpleDateFormat(TIMESTAMP_FORMAT); String curTimeStamp = sdf.format(new Date(System.currentTimeMillis())); return curTimeStamp; } ``` > 生成 password ```java public static String makePwd(String secret, String curTimeStamp) { String passWord = null; try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(curTimeStamp.getBytes(), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] bytes = sha256_HMAC.doFinal(secret.getBytes()); passWord = byteArrayToHexString(bytes); } catch (Exception e) { System.out.println("Error HmacSHA256 ===========" + e.getMessage()); } return passWord; } public static String byteArrayToHexString(byte[] b) { StringBuilder hs = new StringBuilder(); String stmp; for (int n = 0; b != null && n < b.length; n++) { stmp = Integer.toHexString(b[n] & 0XFF); if (stmp.length() == 1) hs.append('0'); hs.append(stmp); } return hs.toString().toLowerCase(); } ```
-
开发工具Visual Studio 2019,.net core 2.2和.net framework 4.7.2都一样的情况MQTTnet版本v3.0.8项目产品的Profile和AgentLiteSdk Demo一样的,C语言的Demo成功连接添加设备时选择的直连设备配置信息设备名称 agentlite_demo_0015 设备ID 00b1db5e-5331-4ade-8b62-6c670e6c8d98 密钥 9e4fbd64f6be2337732a完整代码class Program { private static IMqttClient mqttClient; private static async Task ConnectMqttServerAsync() { if (mqttClient == null) { mqttClient = new MqttFactory().CreateMqttClient(); mqttClient.UseConnectedHandler(handle => { mqttClient.SubscribeAsync(new TopicFilter() { Topic = "/huawei/v1/devices/00b1db5e-5331-4ade-8b62-6c670e6c8d98/data/json", QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce }); Console.WriteLine(handle.AuthenticateResult.RetainAvailable); }); mqttClient.UseApplicationMessageReceivedHandler(handle => { Console.WriteLine(Encoding.Default.GetString(handle.ApplicationMessage.Payload)); }); } try { var utctime = DateTime.UtcNow.ToString("yyyyMMddhh"); var pwd = Encrypt("9e4fbd64f6be2337732a", utctime); var options = new MqttClientOptionsBuilder() .WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311) .WithClientId($"00b1db5e-5331-4ade-8b62-6c670e6c8d98_0_1_{utctime}") .WithTcpServer("49.4.93.24", 8883) .WithCredentials("00b1db5e-5331-4ade-8b62-6c670e6c8d98", pwd ) .WithTls(new MqttClientOptionsBuilderTlsParameters() { AllowUntrustedCertificates = false, UseTls = true, Certificates = new List<byte[]> { new X509Certificate2("rootcert.pem").Export(X509ContentType.Cert) }, CertificateValidationCallback = delegate { return true; }, IgnoreCertificateChainErrors = false, IgnoreCertificateRevocationErrors = false }) .WithCleanSession() .Build(); var options1 = new MqttClientOptions() { ProtocolVersion = MQTTnet.Formatter.MqttProtocolVersion.V311, ClientId = $"00b1db5e-5331-4ade-8b62-6c670e6c8d98_2_1_{utctime}", Credentials = new MqttClientCredentials() { Username = "agentlite_demo_0015", Password = Encrypt2("9e4fbd64f6be2337732a", utctime) }, ChannelOptions = new MqttClientTcpOptions { Server = "49.4.93.24", Port = 8883, TlsOptions = new MqttClientTlsOptions() { Certificates = new List<byte[]> { new X509Certificate2("rootcert.pem").Export(X509ContentType.Cert) }, CertificateValidationCallback = delegate { return true; }, UseTls = true } }, }; var result = await mqttClient.ConnectAsync(options); //var result = await mqttClient.ConnectAsync(options1); Console.WriteLine(result.ResultCode); } catch (Exception ex) { Console.WriteLine(ex.Message); } } public static byte[] Encrypt2(string message, string secret) { secret = secret ?? ""; var encoding = new System.Text.UTF8Encoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(message); using (var hmacsha256 = new HMACSHA256(keyByte)) { return hmacsha256.ComputeHash(messageBytes); } } public static string Encrypt(string message, string secret) { secret = secret ?? ""; //var encoding = new System.Text.ASCIIEncoding(); var encoding = new System.Text.UTF8Encoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(message); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return Convert.ToBase64String(hashmessage); } } static async Task Main(string[] args) { try { _ = Task.Run(async () => { await ConnectMqttServerAsync(); }); while (mqttClient?.IsConnected != true) { await Task.Delay(1000); } var result = await mqttClient.PublishAsync(topic: "/huawei/v1/devices/00b1db5e-5331-4ade-8b62-6c670e6c8d98/command/json", payload: ""); } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); } } }返回的错误是:Connecting with MQTT server failed (BadUserNameOrPassword).
-
【问题】hi,我看到MQTT原生协议接入OC平台,是否有Lwm2m原生协议的模拟接入器?MQTT.fx模拟设备接入更新时间: 2019/08/19 14:33查看PDF分享本文档以MQTT.fx为例,介绍以MQTT原生协议接入IoT平台。MQTT.fx 是目前主流的 MQTT 客户端,可以快速验证是否可以与 IoT平台服务交互发布或订阅消息。
-
Demo、教程可以下载附件方法1:开发板以太网口经过网线使用笔记本wifi作为网关上网一:笔记本使用wifi连接热点上网二:在网络连接界面中,将以太网设置为自动获取ip地址。三:在笔记本的网络连接管理界面,右键点击WLAN,选择属性 进入WLAN属性页面后,选择共享,然后勾选上页面中的 "允许其他网络用户通过此计算机的 Internet来拿节来连接(N)" 并且在家庭网络连接的下拉框中选择 "以太网"。四:步骤二完成后,查看以太网的IPV4属性。 在其中IPV4的属性会变成 使用下面的ip地址 例如:ip 192.168.137.1 netmask 255.255.255.0 说明: 获取得到的ip根据笔记本的不同可能有所不同,请根据实际情况使用。五:在LiteOS的工程中,找到Src\net_driver.c修改IP_ADDRESS[0] IP_ADDRESS[1] IP_ADDRESS[2] IP_ADDRESS[3] 这4个宏的值,其值修改为跟笔记本的以太网ip同一个ip段的地址即可, 比如修改为 192 168 137 2同步修改 NETMASK_ADDRESS[0] [1] [2] [3] 修改 GATEWAY_ADDRESS[0] GATEWAY_ADDRESS[1] GATEWAY_ADDRESS[2] GATEWAY_ADDRESS[3] 的值为笔记本的以太网的ip地址 即我们步骤四中得到的ip 192 168 137 1六:以上步骤完成后,重新编译LiteOS工程,然后使用sw4stm32直接烧录运行。 如果连接云平台成功,则串口调试助手会输出LOG信息,华为云IOT平台也会接收到数据。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签