-
之前分享了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 协议与平台对接可能出现的问题其实只需要简单理解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平台服务交互发布或订阅消息。
-
参考帖子使用MQTT.FX接入公有云开发者环境1.MQTT.FX帖子https://bbs.huaweicloud.com/blogs/ca6a27ee34c311e9bd5a7ca23e93a8912.业务流程 一机一密1)注册设备获取设备ID及接入秘钥设备IDaae7e2fc-ae09-468f-91ea-c487b59710a9密钥0c2962ccceb159dcf5312)使用jar获取ClientID及登录username+passwordGenerate success.Save the following message.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -clientId:aae7e2fc-ae09-468f-91ea-c487b59710a9_0_0_2019072611username:aae7e2fc-ae09-468f-91ea-c487b59710a9password:daaa847c42168f3d6d651661b05b38dea45ec86c985a8e2fe64062e204270dd7- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -3)使用MQTT.FX对接上报输入:对接信息IP或域名 对接端口8883使用参考帖子提供的设备CA证书使用对应的mqtt通道输入topic进行publictopic:/huawei/v1/devices/#deviceID#/data/json/huawei/v1/devices/aae7e2fc-ae09-468f-91ea-c487b59710a9/data/jsonMessage:{"msgType":"deviceReq","data":[{"serviceId":"#serviceId#","serviceData":{"#property#":"#reportValue#"}}],"hasMore":0}/data/jsonProfile定义的属性参数如下,拼接Message消息如下serviceID Storage属性名 :storage参数值:1属性名 :usedPersent参数值:2 {"msgType":"deviceReq","data":[{"serviceId":"Storage","serviceData":{"storage":"1",":usedPersent":"2"}}],"hasMore":0} 上报后可登录IoT平台SP 检查数据是否正常。 注意事项: 1)设备需要现在平台注册获取设备id+秘钥 2)调测环境需要使用公网网络,不要使用代理 3)jar运行失败请检查是否有中文路径或java环境变量未配置
-
创建了一个MQTT协议设备,按照文档https://support.huaweicloud.com/api-IoT/iot-api.pdf的8.2.2章节MQTT CONNECT 连接鉴权的说明client Id为 {设备的deviceId}_0_0_时间戳 具体到我的设备是 8598553f-1f3d-47e6-a7b4-bbdabce316ba_0_0_2019070314其中时间戳按照说明是YYYYMMDDHH格式User name为deviceId,具体为 8598553f-1f3d-47e6-a7b4-bbdabce316baPassword的值为使用“HMACSHA256”算法以时间戳为秘 钥,对secret进行加密后的值。 secret为注册设备时平台返回的secret:9254********a137c0e4按照这个说明,时间戳选择2019070314也是YYYYMMDDHH格式对吗?用这个在线工具http://tool.oschina.net/encrypt?type=2使用HMACSHA256”算法以时间戳为秘 钥,对secret进行加密后的值作为密码然后使用MQTT.fx 软件模拟设备链接服务器 49.4.93.24 端口 8883 ,无法建立链接。请问专家上述步骤有什么问题?为何链接不上MQTTS服务器?还需要什么设置吗?谢谢!在博客中找到一篇文章,完美解决了我的这个问题:参见:使用MQTT.fx工具连接IoT平台--源码附件:回复可见******https://bbs.huaweicloud.com/blogs/ca6a27ee34c311e9bd5a7ca23e93a891感谢大神IOBOhttps://bbs.huaweicloud.com/community/usersnew/id_1539070194174500感谢华为梁工的回复。很关键的指点,是证书的问题。证书没找对。谢谢!
-
物联网大赛需要,可是官方又不给文档,简直无语了
-
今天继续学习,继续研读OceanConnect平台知识点发现一个问题请教一下各位!在设备连接层中有两个很重要的功能:设备管理和设备信息管理,教程中提到,在设备管理(网关管理)中,用户的管理命令通过COAP/HTTPS协议传输至网关,完成设备管理。在设备通信管理中,网关到OceanConnect之间的数据通信则基于MQTT。我在这里不理解的是,同样都是网关到平台之间的数据通信,只是走向上有区别,通信协议就有区别么?那么我可以理解为传输协议是单向的么?
-
以下博客将持续更新模拟器及使用方法:https://bbs.huaweicloud.com/blogs/acc3919d038911e9bd5a7ca23e93a891
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签