当前位置: 首页 > article >正文

如何在鸿蒙API9和x86模拟器中使用MQTT

引言

虽然我的课主要是OpenHarmony南向开发的,但是结课时有个同学说他在写鸿蒙APP时无法将MQTT库加入到设备中,希望我帮忙看看。由于他没有鸿蒙的真机,只能用DevEco Studio中通过的模拟器来实现,而自带的模拟器只支持API9和API6,而下载的MQTT库是支持API11的。今天就来说说在API9中如何实现MQTT客户端,使用的DevEco Studio版本是3.11。

安装MQTT软件包

官方有个MQTT软件包:ohpm/mqtt,我写作时最新的版本是2.14,针对的是API12。虽然可以将其降级为2.0.5-rc.0或者2.0.6使其支持API9,但是由于其是从C语言版本移植过来的,依赖C语言的库文件(.so),而官方仓库中只提供了ARM版本的,所以在真机上可以用,但是在基于x86的本机模拟器上没法用,会出现”Failure[ERR_INSTALL_PARSE_NATIVE_SO_FAILED]“错误。如果要使用就需要使用SDK重新编译C语言文件产生x86可以用的库文件,有点麻烦。

今天推荐使用paho-mqtt: paho-mqtt移植,这个库是从js版本移植过来的,没有C语言编译的问题。当然这个库的限制是其使用的是websocket通信,因此只支持ws或wss开头的websocket连接方式的MQttBooker服务。 好在现在支持wss的服务器比较多,像巴法云、华为IoTDA、emqx都支持,因为小程序多使用wss。

安装软件包,可以在Terminal中使用如下命令:

ohpm  install @yyz116/paho-mqtt 

 安装后要修改oh_modules/@yyz116/paho-mqtt/src/main/module.json文件,将其中的minAPIVersion和targetAPIVersion版本号都改为9。

{
	"app": {
		"bundleName": "com.yyz116.paho.mqtt",
		"debug": true,
		"versionCode": 1000000,
		"versionName": "1.0.0",
		"minAPIVersion": 9,
		"targetAPIVersion": 9,
		"apiReleaseType": "Release",
		"compileSdkVersion": "5.0.0.65",
		"compileSdkType": "HarmonyOS",
		"appEnvironments": [],
		"bundleType": "app"
	},
	"module": {
		"name": "library",
		"type": "har",
		"deviceTypes": [
			"default",
			"tablet"
		],
		"packageName": "@yyz116/paho-mqtt",
		"installationFree": false,
		"virtualMachine": "ark12.0.2.0",
		"compileMode": "esmodule",
		"dependencies": []
	}
}

避免MQTT软件包自动升级

上面的操作中修改了module.json文件,但是当三方包发布新版本后,点击同步工程,会出现默认更新安装的三方包版本情况。为了避免这种情况,手工修改oh-package.json5,将其中@yyz116/paho-mqtt一行版本号前面的“^"符号删除掉,这样保证安装固定版本的三方包。

{
  "name": "myapplication",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "",
  "author": "",
  "license": "",
  "dependencies": {
    "@yyz116/paho-mqtt": "^1.0.1"
  },
  "devDependencies": {
    "@ohos/hypium": "1.0.6"
  },
  "dynamicDependencies": {}
}

程序的编写

我编写了一个简单的测试程序,在前面先加上引用。

import MQTT from '@yyz116/paho-mqtt'

然后在按钮点击的事件函数中加入代码:

  buttonClick()
  {
    let client = new MQTT.Client("bemfa.com", 9504, "/wss",
        "xxxxxxxx");
    client.trace = msg => {
      console.log(msg.message);
    };
    client.connect({
      timeout: 10,

      keepAliveInterval: 60,
      cleanSession: true,
      useSSL: true,
      // invocationContext: {
      //   asdf: true,
      // },
      onSuccess: o => {
        //console.log("connected: ", o.invocationContext.asdf);
        console.log("connected: ");
        promptAction.showToast({
          message: '连接到服务器!' //弹窗内容
        });
        client.send("light002", "123456", 0, true);
      },
      mqttVersion: 3,
      onFailure: e => {
        console.error("could not connect: ", e.errorMessage);
        promptAction.showToast({
          message: '无法连接到服务器!' //弹窗内容
        });
      },
      reconnect: false,
    });

  }

这里需要注意巴法云加密websocket协议端口:9504 ,path:/wss。这和TCP端口是不同的。

为程序加入访问网络的权限,修改src/main/module.json5文件,加入requestPermissions这一段。

......
    "pages": "$profile:main_pages",
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
        "usedScene": {
          "when": "always"
        }
      }
    ],
    "abilities": [
......

运行测试

启动模拟器,运行程序如下。点击Connect按钮就可以了。

d0519c03da7d4e99869b99a989d3b7f4.png

登录到巴法云后台,可以看到light002设备的值已经被更新。

c7b4f86a8cf349508c91d1975f121633.png

结语

至此,基本完成了在API9和x86模拟器上运行MQTT客户端的要求。如果各位有更好的办法,欢迎留言。

 


http://www.kler.cn/a/419688.html

相关文章:

  • 昇腾CANN 8.0基于LLM P-D分离部署方案发布LLM-DataDist组件:高效低成本,简单易集成
  • 前端 如何用 div 标签实现 步骤审批
  • leetcode102:二叉树的层序遍历
  • 【力扣热题100】—— Day3.反转链表
  • xiaolin coding 图解 MySQL笔记——索引篇
  • Unity Ads常见问题:投放、变现、安装等注意事项
  • AI智护视听生活,飞利浦PUF8160震撼上市!
  • go的web框架介绍
  • Kafka2.2.0集群安装
  • Vue.js 与 TypeScript(3):tsconfig.json详细配置
  • 期末复习-Hadoop名词解释+简答题纯享版
  • 基于神经网络的弹弹堂类游戏弹道快速预测
  • 【机器学习】数据操作与数据预处理
  • 新手参加2025年CTF大赛——Web题目的基本解题流程
  • 界面控件DevExpress WPF v24.2新功能预览 - 人工智能(AI)集成
  • 网络安全技术详解:防火墙与入侵检测和防御系统(IDS/IPS)
  • 《C++ Primer Plus》学习笔记|第10章 对象和类 (24-12-2更新)
  • 【学习笔记】GoFrame框架
  • DepthAI 2.29版本 发布
  • CLIP-LoRA: Low-Rank Few-Shot Adaptation of Vision-Language Models