如何在鸿蒙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按钮就可以了。

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

结语

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

相关推荐
HarmonyOS小助手1 小时前
HEIF:更高质量、更小体积,开启 HarmonyOS 图像新体验
harmonyos·鸿蒙·鸿蒙生态
嘿嘿-g2 小时前
华为IP(9)
网络·华为
self_myth3 小时前
[特殊字符] 深入理解操作系统核心特性:从并发到分布式,从单核到多核的全面解析
windows·macos·wpf·harmonyos
安卓开发者11 小时前
鸿蒙NEXT主题设置指南:应用级与页面级主题定制详解
华为·harmonyos
深盾科技17 小时前
鸿蒙ABC开发中的名称混淆与反射处理策略:安全与效率的平衡
安全·华为·harmonyos
2501_9197490318 小时前
鸿蒙:获取UIContext实例的方法
华为·harmonyos
王佳斌21 小时前
tp报错解决
harmonyos
coooliang21 小时前
【鸿蒙 NEXT】V1迁移V2状态管理
java·前端·harmonyos
江拥羡橙1 天前
【目录-单选】鸿蒙HarmonyOS开发者基础
前端·ui·华为·typescript·harmonyos
爱笑的眼睛111 天前
HarmonyOS应用开发:深入ArkUI声明式开发范式与最佳实践
华为·harmonyos