基于阿里云 Haas510 制作数据转发服务

简介: 通过Haas-510制作Lora 无线发射器,只有 Javascript 的开发背景,是否可以完成这项任务呢?答案是肯定的!接下来内容将说明如何使用 Haas-510 ,完成数据转发的过程;本篇内容需要简单的 终端、Nodejs 知识,代码量很少,前端程序员、nodejs 程序员很容易上手。

如题,公司需求一个 Lora 无线发射器,通过串口发送数据,只有 Javascript 的开发背景,是否可以完成这项任务呢?答案是肯定的!接下来内容将说明如何使用 Haas510,完成 4G 数据接收,Uart 串口转发的过程;

  • 原理图:确定技术线路,明确思路
  • 准备工作:准备物料、必要的软件工具
  • 单元测试:拆解不同功能、步骤,一一实现
  • 合并代码:合并单元测试环节代码
  • 参考资料:Haas SDK、相关资源

1、原理图

「呼叫 api」->「mqtt server」-> 「haas mqtt client」-> 「haas uart」-> 「lora 发射模组」

原理图-美特互动大力

负责硬件的同事已完成 lora 模组,本篇仅介绍 Haas510 的使用;

2、准备工作

配合物料、调试工具、以及一些软件框架。JS 程序员对硬件一般比较陌生,好在难度并不大,都是使用现成的配件连接调试;

2.1、物料配置

Haas510 已经附赠了基本配件,仅需要添置一些必要的连接线就可以进行单元测试,以下是物料清单;

[ 物料准备图示 ]

物料准备-美特互动大力

[ 物料清单 ]

物料 说明
Haas510 AS 数据转发核心板
USB 转 TTL 将杜邦线连接到MacOS的工具,并生成设备标志
杜邦线 每个连接用到 3 根并联的线材 ,建议长度规格 > 30CM
MiniUSB 数据线 开发期间供电 ,充电头规格 5V2A,保证线材良好
Nano 卡 一般手机内使用的 SIM 卡就对了

为了连接多个USB,还需要 USB 一拖多 小工具

2.2、连接物料

下图标出 ①②③④⑤⑥ 位置,物料按序号进行连接;

连接物料示意图-美特互动大力

[ 三组数据线说明 ]

分组 说明
用于主板宿主平台的调试输出,以及JS代码的console.log输出
将 JS 编写的代码,从 Mac 传送到 Haas510 主板
serial.write 数据输出,单元测试期间,通过 comtool 终端 观察数据

连接的位置已经用红色位置信息标注;

[ 杜邦线连接线序 ]

一般 USB2TTL 与 Haas510 的 TXD、RXD 需要反接,少部分例外,具体请咨询 【USB 转 TTL】 供应商

2.3、准备软件工具

本人的常用操作系统是 Mac, windows 系统请参考操作;

[ amp 下载 ]

Haas 命令行工具,将编写的 JS 代码上传到 Haas510

MacOS 版本
Windows 版本

[ comtool 安装 ]

Mac上运行的串口终端,用于 的数据调试

brew install --cask comtool
通过 Terminal 输入 open -n /Applications/comtool.app 可以多开

[ mqtt server ]

mosquitto 提供的免费服务器

项目 内容
服务器 test.mosquitto.org
通信类型 TCP
端口 1883
账号密码 任意
客户端 ID 任意

3、单元测试

这里将任务进行分解,每个单元单独完成,最后合并起来就可以了,还是上任务表吧:

单元 内容
端口确认 确定USB在Mac中的设备名称
代码调试 演示如何在桌面端通过串口工具打印信息
amp 讲解 amp 基本使用,以及演示如何通过 amp 将代码写入 Haas510
数据监听 与 mqtt 服务器通信,并获取主题消息
串口输出 Haas510 如何通过串口输出数据

3.1、端口确认

现在开始验证 ③ ④ ⑤ 是否正确接入, 使用 ls 指令及简单的拔插来确认设备名称;

ls -1 /dev/cu.wch*

目前我的配置是:

编号 用途 设备名称
代码调试 /dev/cu.wchusbserial14410
写入代码 /dev/cu.wchusbserial14420
串口输出 /dev/cu.wchusbserial14430
USB 需要 WCH 驱动支持,链接在文章最后
Windows 系统打开设备管理器,可以看到 COM1、COM2 这样设备

3.2、代码调试

启动 comtool 工具,Port 选择 /dev/cu.wchusbserial14410, Baudrate 选择 115200,其他默认;

按一次 Haas510 上的 RESET 按键,接收区滚动起来,就代表调试状态 OK 了;

comtool-DEBUG界面-美特互动大力

以下内容这个窗口称为 DEBUG 窗口

3.3、amp 使用

[ 基本配置 ]

2.3章节 下载好压缩包解压,进入目录可以看到:

├── README.md         说明
├── amp               执行文件
├── app               开发目录
│   ├── app.js
│   └── app.json
└── bindings.node     驱动文件

amp 修改为可执行文件

chmod +x amp

打印帮助

./amp help
Usage: amp [options]

AliOS Things Mini Program PC CLI tool

Options:
  -V, --version                             output the version number
  -h, --help                                output usage information

Commands:
  login|ln <token>                          login
  devicelist|dl                             list bind devices
  put|pt <filepath> <deviceName>            upload file to device
  pack|pk [options] <filepath>              pack file
  seriallist|sl                             list serial port
  serialput|sp [options] <filepath> <port>  put file to device via serial port

Example call:
  $ amp pt ./app 3JvyRjXOoQLQUYzGzAy0 -b 9600

[ 编辑 app.js ]

修改 app/app.js, 新版的 Haas510 内置了 quickjs,支持 ES6 规范,可以直接使用箭头函数等新的语法

console.log('amp version is: ' + system.version())
console.log('amp platform is: ' + system.platform())
console.log('amp heapTotal is: ' + system.memory().heapTotal)
console.log('amp heapUsed is: ' + system.memory().heapUsed)

// 写个定时器
let i = 0
setInterval(() => {
  console.log('i is ', ++i)
}, 2000)

准备在控制台上传

./amp serialput ./app /dev/cu.wchusbserial14420

回车后提示 reboot 时,按一次 Haas510 上的 RESET 按钮

generating app package...
Wait shakehand with board ...
Please reboot board now
Putting: ██████████████████████████████ 2/2
put complete!
  • 如果 接入正常,会看到一个上传进度
  • 同时可在调试窗口观察到系统加载的数据瀑布流,最后执行 app.js 代码

3.4、数据监听

本项目数据转发有实时性的要求, MQTT 是最佳选择;
Haas510 已经内置这个模块,支持两种连接方式:

这里选择第 2 种方案,确认已经安装好 SIM 卡及天线;

[ 编辑 app.js ]

import * as network from 'network'
import * as mqtt from 'mqtt'

const topic = '/haas510/as'
const config = {
  host: 'test.mosquitto.org',
  port: 1883,
  username: '',
  password: ''
}
// 这个函数只用于 console.log 打印,实际转发串口数据是不需要的
function ArrayToString(fileData) {
  let dataString = ''
  for (let i = 0; i < fileData.length; i++) {
    dataString += String.fromCharCode(fileData[i])
  }
  return dataString
}
function createMqttClient() {
  const mqttClient = mqtt.createClient(config)
  mqttClient.on('connect', () => {
    console.log('----------------------------: connect')
    // 此时进行订阅设置
    mqttClient.subscribe({ topic })
  })
  mqttClient.on('disconnect', () => {
    console.log('----------------------------: disconnect')
  })
  mqttClient.on('message', (topic, payload) => {
    // 监听消息并打印,payload 是 Array[Number]
    let content = ArrayToString(payload)
    console.log('----------------------------: mqtt message')
    console.log('[' + topic + ']  message: ' + content)
  })
}

const net = network.openNetWorkClient()
net.on('connect', () => createMqttClient())

[ 消息测试 ]

编写一个简单的 mqtt 客户端来发送测试消息,新建目录并安装依赖;本地需要有 nodejs 环境;

# 建立文件夹
mkdir -p /path/to/mqttclient && cd /path/to/mqttclient
# npm 初始化及依赖
npm init -y && npm install mqtt
# 创建 index.js
touch index.js

将代码贴入 index.js

const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://test.mosquitto.org:1883')
const topic = '/haas510/as'
client.on('connect', () => {
  client.publish(topic, 'Hello Haas510')
  client.end()
})

然后执行 node index.js,在 DEBUG 窗口 可观察到打印 Hello Haas510

3.5、串口输出

本单元测试的时候直接输出到 Mac,通过观察串口工具显示,直观了解数据是否符合预期需求

[ 串口工具配置 ]

启动串口工具 comtool,这里速率根据 Lora 模组要求来设定的

  • 端口选择 /dev/cu.wchusbserial14430
  • 速率选择 9600

[ 配置 app/app.json ]

需要告诉 Haas510 连接什么类型端口、以及配置

{
  "version": "1.0.0",
  "io": {
    "UART1": {
      "type": "UART",
      "port": 1,
      "dataWidth": 8,
      "baudRate": 9600,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none"
    }
  },
  "debugLevel": "DEBUG"
}

其中 io.UART1 就是 位置标注的 567 三个接线位

[ 编辑 app/app.js ]

import * as uart from 'uart'
const serial = uart.open({ id: 'UART1' })
setInterval(() => {
  // 输出字符串 123
  serial.write([49, 50, 51])
}, 2000)

需要注意的是:

  • id 就是 app.json 里头的 io.UART1
  • serial.write 参数是 Array[Number],其中 Number 是字符的 ASCII 码
  • mqtt 的 message 默认就是 Array[Number],无需做转换

执行上传

./amp serialput ./app /dev/cu.wchusbserial14420

Haas510 启动完毕后,就可以在 comtool 工具上看到字符串被定时打印;

comtool-UART界面-美特互动大力

4、合并代码

import * as network from 'network'
import * as mqtt from 'mqtt'
import * as uart from 'uart'

const serial = uart.open({ id: 'UART1' })

const createMqttClient = () => {
  const mqttClient = mqtt.createClient({
    host: 'test.mosquitto.org',
    port: 1883,
    username: '',
    password: ''
  })
  mqttClient.on('connect', () => {
    mqttClient.subscribe({ topic: '/haas510/as' })
  })
  mqttClient.on('disconnect', () => {
    system.reboot()
  })
  mqttClient.on('message', (_, payload) => {
    if (payload.length) {
      serial.write(payload)
    }
  })
}

const net = network.openNetWorkClient()
net.on('connect', () => createMqttClient())

这里 system.reboot() 是 Haas510 隐藏功能,当 mqtt 断开时,重启主板;

至此,从 mqtt 监听获取数据,到串口输出的工作已经完成;

5、参考资料

[ Haas510 JS Api 参考 ]

名称 详细
uart https://iotmp.yuque.com/books/share/b4b9fa49-a30b-4e6f-b40f-3864e9a531a8/gsb9gg
network https://iotmp.yuque.com/books/share/b4b9fa49-a30b-4e6f-b40f-3864e9a531a8/komh3c
mqtt https://iotmp.yuque.com/books/share/b4b9fa49-a30b-4e6f-b40f-3864e9a531a8/ty8g2d

[ Mqtt server 自建 ]

名称 详细
aedes https://github.com/moscajs/aedes
https://awesomelists.net/1-Node.js/17-Real-time/266-mcollina-aedes
https://www.tabnine.com/code/javascript/modules/aedes
mosquitto https://mosquitto.org/
http://www.steves-internet-guide.com/mosquitto-broker/

[ 工具下载 ]

名称 链接
WCH 驱动 https://www.wch.cn/download/CH341SER_EXE.html
https://drive.google.com/drive/folders/1-MezxWgkZTLfTrMj0g-8kIdik0OIDz26
mqttbox https://chrome.google.com/webstore/detail/kaajoficamnjijhkeomgfljpicifbkaf
comtool https://github.com/Neutree/COMTool/releases
amp 工具 https://hli.aliyuncs.com/o/config/amp/3.0.0/macos/amp-macos.zip
https://hli.aliyuncs.com/o/config/amp/3.0.0/windows/amp-win.zip

6、外壳制作篇

https://developer.aliyun.com/article/1008875


期待 Haas 推出更多 JS 技术栈的产品,欢迎共同学习。

Haas510官方群、大力的钉钉和大力的微信

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
《阿里云产品手册2022-2023 版》——音视频通信
《阿里云产品手册2022-2023 版》——音视频通信
|
Java 测试技术 Android开发
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解(下)
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
436 0
|
Web App开发 JavaScript Java
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解(上)
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
526 0
|
运维 监控 AliOS-Things
4_7_Haas 连接云端实验_演示篇|学习笔记
快速学习4_7_Haas 连接云端实验_演示篇。
123 0
4_7_Haas 连接云端实验_演示篇|学习笔记
|
移动开发 监控 算法
5_1_3_HaaS 首页信息屏_网络状态_网络对时|学习笔记
快速学习5_1_3_HaaS 首页信息屏_网络状态_网络对时。
168 0
5_1_3_HaaS 首页信息屏_网络状态_网络对时|学习笔记
|
网络虚拟化 网络架构
【eNSP 华为模拟器】三层交换技术及操作步骤【图文】
【eNSP 华为模拟器】三层交换技术及操作步骤【图文】
1677 0
【eNSP 华为模拟器】三层交换技术及操作步骤【图文】
|
网络虚拟化 网络架构
【eNSP 华为模拟器】单臂路由及操作步骤【图文】
【eNSP 华为模拟器】单臂路由及操作步骤【图文】
680 0
【eNSP 华为模拟器】单臂路由及操作步骤【图文】
5个值得安利的PC软件,建议收藏转发
其实有许多工具,知名度不高,用的人也很少,不过并不代表它们不好用,小编励志做一个合格的搬运工,让大家都能用上好用的软件。
134 1
5个值得安利的PC软件,建议收藏转发
|
人工智能
电脑端sip软电话免费下载地址与使用说明(eyebeam)
VOS一件安装文档 与我联系 下载地址: 国内下载 http://47.98.241.45/outbound/Public/sip/eyeBeam.zip(eyebeam) 国内下载 sipphone.cc/phone_lite_… 国外下载 phone.ddrj.com/phone_lite_… 百度云下载 pan.baidu.com/s/1hs64Nbu 使用说明 启动软件 双击 phone.exe AI源码,VOS,SIP软件
2019 0
|
安全 机器人 数据安全/隐私保护
基于小米4C路由器无障碍搭建机器人嵌入式环境(2021.08.17)
基于小米4C路由器无障碍搭建机器人嵌入式环境(2021.08.17)
基于小米4C路由器无障碍搭建机器人嵌入式环境(2021.08.17)