如何在鸿蒙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客户端的要求。如果各位有更好的办法,欢迎留言。

相关推荐
Debroon29 分钟前
应华为 AI 医疗军团之战,各方动态和反应
人工智能·华为
鸿蒙布道师32 分钟前
鸿蒙NEXT开发对象工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
zhang10620934 分钟前
HarmonyOS 基础组件和基础布局的介绍
harmonyos·基础组件·基础布局
桃子酱紫君35 分钟前
华为配置篇-BGP实验
开发语言·华为·php
马剑威(威哥爱编程)1 小时前
在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面
华为·harmonyos·arkts
GeniuswongAir2 小时前
Flutter极速接入IM聊天功能并支持鸿蒙
flutter·华为·harmonyos
国货崛起3 小时前
华为2024年营收逼近历史峰值:终端业务复苏、智能汽车爆发式增长
华为·汽车
90后的晨仔6 小时前
鸿蒙ArkUI框架中的状态管理
harmonyos
文火冰糖的硅基工坊17 小时前
[创业之路-343]:创业:一场认知重构与组织进化的双向奔赴
华为·架构·创业·公司·治理
别说我什么都不会1 天前
OpenHarmony 5.0(API 12)关系型数据库relationalStore 新增本地数据变化监听接口介绍
api·harmonyos