前言

我去年发过一个SDDC嗅探器的文章,这次学习其他协议的时候发现,官方又没有相关的开发调试工具,于是我又自己写了一个,除了之前的SDDC协议外,这次我也将LoraMqtt以及Coap协议的通信测试加入了其中,让整个工具功能变得更加丰富全面,这个工具应用测试完成后将会去申请到爱智世界中进行一个发布,大家到时候感兴趣的话可以去下载一下,当然有任何问题也欢迎大家可以积极的反馈给本人,在此先感谢一下大家!*

界面&描述

下面这张图就是最新的嵌入式设备开发与设备进行通信测试的工具Eap
和之前的相比,Device模块通信测试放在了Sddc/Zddc选项中,用户可以通过切换tab标签来进行功能模块的切换。如果有嵌入式终端设备开发的小伙伴,想要在开发过程中测试与精灵一号的连接通信状态,可以用这个工具协助开发,具体使用方法基本上在每个tab标签页中大家都能看懂,这里就不过多啰嗦了。

爱智设备开发通信测试工具-LMLPHP

应用代码

​ 关于应用涉及的相关代码,前端部分不再给大家演示了,中规中矩的VUE应用,主要还是给大家看一下JSRE给我们提供的一些协议通信模块相关代码,这里的话,我在写的过程中也发现了一些小问题,已经和官方沟通过了,基本的功能大致是有了,等本人后面有时间的话,会再优化下应用,同时丰富应用的其他功能。

Coap使用】:

​ 按照爱智官网的描述,JSRE提供的Coap模块是基于基本的RESTful风格的请求/响应模式,支持GETPOSTPUTDELETE

​ 在测试工具中,主要提供了俩个入口,一个通过GET来获取指定路径内容,另一个就是通过PUT来对指定路径的内容进行修改,具体可以参考以下代码,可以看出通过JSRE开发物联网通信的话还是比较方便的;

...

/* 获取coap服务指定路径的内容 */
  get(url: string, path = '/', cb: ICallBack) {
    coap.request(url, (client) => {
      client.on('response', ({ }, res: any) => {
        const data = Buffer.isBuffer(res.payload) ? res.payload.toString() : res.payload
        cb({ result: true, message: '操作成功!', data })
      })

      client.on('error', (e) => {
        console.log('coap error.', e)
        cb({ result: false, message: '获取Coap指定路径内容失败!' })
      })
    }, { method: 'GET', path })
  }

  /* 修改coap服务指定路径的内容 */
  put(url: string, path = '/', data: string, cb: ICallBack) {
    coap.request(url, (client) => {
      client.on('response', ({ }, res: any) => {
        const data = Buffer.isBuffer(res.payload) ? res.payload.toString() : res.payload
        cb({ result: true, message: '操作成功!' })
      })

      client.on('error', (e) => {
        console.log('coap put error.', e)
        cb({ result: false, message: '修改Coap指定路径内容失败!' })
      })
    }, { method: 'PUT', path, payload: data })
  }

...

Sddc/Zddc使用】:

​这里在之前的嗅探器文章中已经详细的介绍过了,大家如果感兴趣的话可以去翻一下往期的文章。

Lora使用】:

​ 待补充...

Mqtt使用】:

Mqtt 被设计为一个极其轻量级的发布/订阅消息传输。JSRE为大家提供的Mqtt模块是一个客户端模块,主要用来实例化连接到爱智中配置的Mqtt服务,并且连接爱智的Mqtt终端设备也是作为客户端进行通信,我们的应用与终端设备作为订阅者,而爱智内部的Mqtt服务就是被订阅的主题对象。
​首先我们需要在默认设备Eap中配置好Mqtt服务。

爱智设备开发通信测试工具-LMLPHP

配置好之后我们就可以在应用后端中连接上我们的Mqtt服务,这样当Mqtt服务接收到数据后,会向所有订阅的客户端发布message事件,在事件回调中会携带当前的消息主题和消息内容等。

我在测试工具中默认订阅了message主题(是主题,不是事件,仅仅同名而已)进行测试。

...

/* 连接MQTT服务 */
connectServer(params: IMqttConnectParames = { hostname: '192.168.128.1', port: 1883, client: 'Spirit', user: 'user', passwd: 'passwd' }, cb: ICallBack) {
    if (this.getMqttClientStatus()) {
      return cb && cb({ result: true, message: 'Successfully connected to mqtt' })
    }
    const { hostname, port } = params
    try {
      const res = this.openMqtt(hostname, port)
      if (res.result) {
        this.client = res.data
        this.client.connect(params, () => {
          console.log(`${hostname}:${port} MQTT server connected!`);
        });

        this.client.on('connect', () => {
          this.emit('connect')
          this.client.subscribe('message', { qos: 1 }, (error: any) => {
            if (error) {
              // 说明mqtt监听message事件失败!
              console.log('[MQTT subscribe message]: error')
            } else {
              console.log(`${hostname}:${port} MQTT server subscribed!`);
            }
          });
          cb && cb({ result: true, message: 'Successfully connected to mqtt' })
        });

        this.client.on('disconnect', () => {
          this.emit('disconnect')
          this.connectServer(params, null)
          const t = setTimeout(() => {
            if (!this.client || !this.client.isConnected()) {
              this.connectServer(params, null)
            } else {
              clearTimeout(t)
            }
          }, 3000);
        });

        this.client.on('close', () => {
          console.info('mqtt client close!');
        });

        this.client.on('error', () => {
          console.error('mqtt client error!');
        });

        this.client.on('message', (data) => {
          console.log(`recevied a message from mqtt: ${JSON.stringify(data)}`);
          this.emit(data.topic, data.message.toString())
        });
      } else {
        cb && cb(res)
      }

    } catch (error) {
      console.error('[MQTT connectServer]: ', error)
      cb && cb({ result: false, message: 'Failed to connect to mqtt.' })
    }
  }

  /* 打开MQTT */
  private openMqtt(hostname = '192.168.128.1', port = 1883) {
    console.log('start open mqtt: ', hostname, port)
    try {
      const serAddr = socket.sockaddr(hostname, port);
      const client = mqtt.open(serAddr, undefined, 5000);
      if (!client) {
        return { result: false, message: 'Can not connect to broker!' }
      }
      return { result: true, message: 'connect success!', data: client }
    } catch (error) {
      console.error('[MQTT open]: ', error)
      return { result: false, message: 'Failed to connect to broker!' }
    }
  }

  /* 发布消息 */
  sendMessage(topic: string, message: string) {
    this.client && this.client.publish(topic, message, { qos: 1 }, (error) => {
      if (error) {
        console.error('MQTT publish error:', error);
      } else {
        console.log('MQTT publish success: ', topic, message);
      }
    });
  }

...

总结

上面就是通信测试工具涉及的JSRE的物联网通信协议模块的相关内容了,由于这个测试工具的用途,它的总体功能比较单一,大家后面可以在爱智世界中下载下来尝试一下,我平常开发设备的时候都会去用这个工具进行测试。

​以上内容如有描述错误,可以在下面留言评论哈!

04-06 10:12